#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA=P3^4;
sbit SCL=P3^3;
uchar ack;
void start()
{
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
void stop()
{
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void sendByte(uchar byte)
{
uchar i;
for(i=0;i<8;i++)
{
if(byte&0x80)
SDA=1;
else
SDA=0;
byte=byte<<1;
_nop_();
SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
_nop_();
_nop_(); /*保证时钟高电平周期大于4μs*/
_nop_();
_nop_();
_nop_();
SCL=0;
}
_nop_();
_nop_();
SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
if(SDA==1)ack=0;
else ack=1; /*判断是否接收到应答信号*/
SCL=0;
_nop_();
_nop_();
}
uchar receiveByte()
{
uchar i,byte=0;
SCL=0;
SDA=1;
for(i=0;i<8;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=1;
byte=byte<<1;
if(SDA==1)
byte=byte+1;
SCL=0;
}
return byte;
}
void ackIIC(bit a)
{
SDA=a;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
void main()
{
start();
sendByte(0xa0);
sendByte(0x60);
sendByte(0x55);
stop();
start();
sendByte(0xa0);
sendByte(0x60);
start();
sendByte(0xa1);
P0=receiveByte();
}
我用51单片机的IO口模拟IIC功能,写得这个程序在倒数第二个语句“sendByte(0xa1)”这就写不成功了,前面的语句都写成功了呀,请教大牛这事嘛回事? |