#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit sck=P0^3;
sbit sda=P0^2;
void Delay()
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
void Delay1ms(unsigned int count)
{
unsigned int i,j;
for(i=0;i
for(j=0;j<250;j++);
}
void initial()
{
sck=1;
sda=1; Delay();
}
void start()
{
sda=1;
Delay();sck=1; Delay();
sda=0; Delay(); //sck=0;
}
void stop()
{
sda=0;Delay();sck=1;
Delay();
sda=1; Delay();
}
void ack()
{
uchar i;
sck=1; Delay();
while(sda==1&&i<200) i++;
sck=0;
Delay();
}
void uack()
{
sck=1;
sda=1;
Delay();
sck=0; Delay();
}
void word_wr(uchar value)
{
uchar i;
sck=0;Delay();
for(i=0;i<8;i++)
{
if(value&0x80) sda=1;
else sda=0;
value<<=1;Delay();
sck=1;Delay(); sck=0;Delay();
}
sda=1;Delay();
}
uchar word_rd()
{
uchar i,value;
sck=0;sda=1;Delay();
for(i=0;i<8;i++)
{
sck=1;Delay();
value<<=1;
if(sda==1) value++;
sck=0;Delay();
}
return value ;
}
void write_byte(uchar add,uchar value)
{
start(); word_wr(0xa0);ack();
word_wr(add);ack();
word_wr(value);ack(); stop(); Delay1ms(3);
}
uchar read_byte(uchar add)
{
uchar unite;
start(); word_wr(0xa0);ack();
word_wr(add);ack(); start();
word_wr(0xa1);ack();unite=word_rd();
uack();stop(); Delay1ms(3);
return unite;
}
main()
{
initial();
write_byte(10,0x55);
Delay1ms(3);
initial(); P3=read_byte(10);
while(1);
}
本来是可以看见p3口出现0x55,但是就是没结果,看了几遍也没啥岀误,仿真完全能通过。
-
IIC程序还是比较简单的,你在网上多找几个现成的程序,一般都不会有大问题,
对比一下你自己的程序就能看出哪里错了,
另外,我觉得像这类简单接口的调试没有必要软件仿真,
我有个师弟什么都想用软件仿真,总问我哪个仿真软件好用,有那功夫都调通了。
赞同楼上的,仿真感觉真的没必要,还不如直接做电路来得实际!!
51的P0口需要接外接上拉电阻 现在的P0口仿真时你会发现没有高电平
把程序下载到单片机里,用示波器看引脚波形就可以了。和协议对比。有你折腾的时间,硬件已经调通了