51单片机读取IIC总线的问题
51单片机读取IIC总线的问题 -
scl=0 scl=1 用来产后时钟脉冲发送时SDA = 1是发1 SDA = 0是发0 接收时SDA = 1是进入读取状态(弱上拉,不接负载时读取是1,但很容易被拉低成0)具体读取得到的是1还是0,是由24C02存储的数据决定的,如果存储的数据的当前位是0,SDA总线上的1会被拉低成0,这时读取得到的就是0 说完了。
因为开始读取完或者写完一组数据需要一个开始信号和一个终止信号,而这个信号就是数据线的上升下降沿。而后面数据线拉高的原因是为了能正确读取到数据,因为单片机如果是低电平外部器件很有可能不能拉高而一直读到低。手机纯打,往采纳。
scl=0 scl=1 用来产后时钟脉冲发送时SDA = 1是发1 SDA = 0是发0 接收时SDA = 1是进入读取状态(弱上拉,不接负载时读取是1,但很容易被拉低成0)具体读取得到的是1还是0,是由24C02存储的数据决定的,如果存储的数据的当前位是0,SDA总线上的1会被拉低成0,这时读取得到的就是0 说完了。
因为开始读取完或者写完一组数据需要一个开始信号和一个终止信号,而这个信号就是数据线的上升下降沿。而后面数据线拉高的原因是为了能正确读取到数据,因为单片机如果是低电平外部器件很有可能不能拉高而一直读到低。手机纯打,往采纳。
IIC总线的时序,好像是:最高频率在400KHz。单片机指令的执行时间,速度快,所以要加延时。停止函数,是在SCL=1期间,SDA出现上升,那么SDA先要为0,这个0,要在SCL=0实现。
void start() //启动I2C总线{sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();} void stop() //停止I2C总线{sda=0; flash(); scl=1; flash(); sda=1; flash();} void writex(unsigned char j) //写一个字节{ unsigned char i,temp;temp=说完了。
51单片机模拟IIC总线问题 -
在硬件上提供过IIC地址的你可以直接选择他的地址进行发送像你这种情况的话可以自己定义地址:假设你有两台或者以上的S3C2410,单片机作为主机,然后单片机发送数据,所有S3C接收(接收的前提是他的接收端口上获得IIC的开始信号,你可以选择利用中断进行检测),然后你在软件里可以预先设置好每台S3C的地址,即说完了。
void iicwr_byte(uchar dat)这个函数里面if(dat&&0x80) 应该是if(dat&0x80),按位与不是逻辑与。void delay1(void)延时时间可能有点短,应该延时10ms,多调用两次或在建个延时函数延时10ms都可以。
51单片机写程序 24c02 iic总线 程序下载后不正确 求错误原因...
时序控制的不好,经过调试将P2=read_eeprom(0x10);放到while循环里面可以实现,或者是连续读两次,第一次读取的数值是不正确的!
write_date(shi); write_date(ge);是不是这两个地方不对啊,shi,ge这两个数转换成ASII值之后再传给屏才能正常显示吧?
求51单片机大神指教IIC总线AT24C02使用。有某个地方不懂。//是关于开...
sec=read_add(2);//问题就在此处,无论写什么地址,都在数码管上面没有显示。if(sec>100) //若将此处去掉,则没有记忆功能。sec=0; // TMOD=0x01;ET0=1;EA=1;/ sec = read_add(2); //这里是sec 读取I2C指定2地址的数据,仔细看下面代码write_add(2,sec); //这里是到此结束了?。
你可以先看一下I2C时序。在I2C读时序中,start--->器件地址--->ACK--->内存地址--->ACK--->START--->器件地址--->ACK--->数据--- --->ACK 后面会介绍。--->STOP 其实读时序中包含一个写操作,因为必须告诉从机你要读的地址以及从机后面会介绍。