80C51软件模拟I2C通信出现问题,SDA电平不对,请大神帮忙看下

2019-07-18 09:20发布

本帖最后由 chenyan9 于 2017-8-10 13:52 编辑

各位大大:

      小弟这两天在研究8051软件模拟I2C通信,碰到一个很奇怪的问题,如果仿真代码里向24C02写数据的WRITE()函数用到addr=addr<<1左移指令的话,SDA线电平在刚上电的时候总是达不到5V,老是低电平或者2.5V,如果删掉左移指令,刚上电时就可以为5V。研究了好几天,没搞懂为什么?麻烦大大们帮忙看下!谢谢!

  1. #include <reg51.h>
  2. #include <stdio.h>
  3. #include <intrins.h>
  4. #define uchar unsigned char

  5. sbit scl=P2^0;
  6. sbit sda=P2^1;

  7. void delay(uchar i)
  8. {
  9.    uchar k;
  10.    for (k=0;k<i;k++)
  11.     _nop_();
  12.    
  13. }

  14. void start()
  15. {
  16.         
  17.         sda=0;
  18.         _nop_();
  19.         _nop_();
  20.         scl=0;
  21.         _nop_();
  22. }

  23. void stop()
  24. {
  25.         scl=1;
  26.         _nop_();
  27.         _nop_();
  28.         sda=1;
  29. }

  30. void write(uchar addr)
  31. {
  32.    uchar i,k;
  33.    addr=0xa0;
  34.    for(i=0;i<8;i++)
  35.    {
  36.       if(addr&0x80)
  37.          sda=1;
  38.       else
  39.          sda=0;
  40.       _nop_();
  41.       addr=addr<<1;
  42.       scl=1;
  43.       _nop_();
  44.       _nop_();
  45.       scl=0;
  46.       _nop_();
  47.       sda=0;
  48.    }
  49. }

  50. void main()
  51. {

  52.     start();
  53.     write();
  54.     stop();
  55.     delay(1000);
  56.         
  57. }   

复制代码

新建位图图像 (2).png
新建位图图像 (3).png
新建位图图像.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。