IIC总线驱动程序

来源:百度知道 编辑:UC知道 时间:2024/06/08 20:33:11
#include <reg52.h>
#define uchar unsigned char
bit ackk;
sbit sda=P1^4;
sbit scl=P1^5;
void init()
{
sda=1;
scl=1;
}
void delay()
{
uchar i=10;
while(i>0)
i--;

}
void delay1()
{
uchar i=100;
while(i>0)
i--;
}
void start()
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
scl=0;
}
void stop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
scl=0;
}
uchar ack()
{
uchar wait;
wait=255;
sda=1;
delay();
scl=1;
delay();
if(sda==0)
{
return 1;
delay();
sda=1;
delay();
}
else
{
for(wait=255;wait>0;wait--);
return 0;
delay();<

只看代码也不好发现问题,最好用示波器调试,看看iic是否通信正常,在考虑其他的问题。你的ack函数有问题,你在判断sda的值以后,直接就return了,后面的代码其实都没有执行到。而且函数中for(wait=255;wait>0;wait--);这一句就是干等,什么作用也不起。可以这样写:
SDA=1;
SCL=1;
delay();
for(wait=0;wait<10;wait++)
{
if(!SDA)
{
wait = 0;
break;
}
}
SCL = 0;
_nop_();
return wait;

程序要一步一步的调试,可以加一些调试信息(如串口输出或显示等),另外,也有可能是硬件问题。
本人也是初学,不对的地方多多指教。