[求助] iic串行总线仿真,为啥不出结果呢,看了好长时间就是没找见岀误

1322685712   2014-10-13 22:03 楼主
#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,但是就是没结果,看了几遍也没啥岀误,仿真完全能通过。
  • 890.gif

回复评论 (5)

IIC程序还是比较简单的,你在网上多找几个现成的程序,一般都不会有大问题,
对比一下你自己的程序就能看出哪里错了,
另外,我觉得像这类简单接口的调试没有必要软件仿真,
我有个师弟什么都想用软件仿真,总问我哪个仿真软件好用,有那功夫都调通了。
把复杂的问题变简单需要智慧
点赞  2014-10-13 23:06
赞同楼上的,仿真感觉真的没必要,还不如直接做电路来得实际!!
只要你心中有梦想,你人在哪里,梦想就在哪里!
点赞  2014-10-13 23:25

4楼 qui 

赞同以上说法。。。。。。。。。。。。。。。。。。
点赞  2014-10-14 07:50
51的P0口需要接外接上拉电阻   现在的P0口仿真时你会发现没有高电平
点赞  2014-10-14 07:57
把程序下载到单片机里,用示波器看引脚波形就可以了。和协议对比。有你折腾的时间,硬件已经调通了
点赞  2014-10-14 20:53
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复