本帖最后由 chenyan9 于 2017-8-10 13:52 编辑
各位大大:
小弟这两天在研究8051软件模拟I2C
通信,碰到一个很奇怪的问题,如果
仿真代码里向24C02写数据的WRITE()函数用到addr=addr<<1左移指令的话,SDA线电平在刚上电的时候总是达不到5V,老是低电平或者2.5V,如果删掉左移指令,刚上电时就可以为5V。研究了好几天,没搞懂为什么?麻烦大大们帮忙看下!谢谢!
- #include <reg51.h>
- #include <stdio.h>
- #include <intrins.h>
- #define uchar unsigned char
- sbit scl=P2^0;
- sbit sda=P2^1;
- void delay(uchar i)
- {
- uchar k;
- for (k=0;k<i;k++)
- _nop_();
-
- }
- void start()
- {
-
- sda=0;
- _nop_();
- _nop_();
- scl=0;
- _nop_();
- }
- void stop()
- {
- scl=1;
- _nop_();
- _nop_();
- sda=1;
- }
- void write(uchar addr)
- {
- uchar i,k;
- addr=0xa0;
- for(i=0;i<8;i++)
- {
- if(addr&0x80)
- sda=1;
- else
- sda=0;
- _nop_();
- addr=addr<<1;
- scl=1;
- _nop_();
- _nop_();
- scl=0;
- _nop_();
- sda=0;
- }
- }
- void main()
- {
-
- start();
- write();
- stop();
- delay(1000);
-
- }
-
复制代码
-
-
-
一周热门 更多>