单片机读写 24C01~24C16程序 51 单片机 2009-08-14 10:13 阅读150 评论0 字号: 大 中 小 单片机读写24C01~ 24C16 程序 AT89S52 晶振频率为11.0592MHz 指令周期:1.0852us 功能说明:24C01-16 程序,能读写:24C01、24C02、24C04、24C08、24C16 读出的数据 送 P1 口显示 #include "reg52.h" #include "intrins.h" #define uchar unsigned char #define uint unsigned int sbit sda=P3^7;//;模拟 I2C 数据传送位 sbit scl=P3^6;//;模拟 I2C 时钟控制状态标志 void delay1(uint z)//延时为 1ms { uchar x,x1; for(;z>0;z--) { for(x=0;x<114;x++) { for(x1=0;x1<1;x1++); } } } void delay()//5us 延时 { _nop_(); _nop_(); _nop_(); } void star()//开始 { sda=1; delay();//5us 延时 scl=1; delay();//5us 延时 sda=0; delay();//5us 延时 } void stop()//停止 { sda=0; delay();//5us 延时 scl=1; delay();//5us 延时 sda=1; delay();//5us 延时 } void ack()//应答 { uchar z=0; while((sda==1)&&(z<50))z++;//条件判断, sda=1,则没有应答。如果没有应答则延时:z<50,z++;后返回 scl=0; delay();//5us 延时 } ///写一个数据函数 //器件写地址 slave_write_address //字节地址 byte_address //待写入数据 data_data void write(uchar slave_write_address,uchar byte_address,uchar data_data)//写一个数据 { uchar temp,temp1,i,ii; star();//开始 for(ii=0;ii<3;ii++)//根据 24CXX 文档资料,和时序图,按顺序送:器件写地址,字节地址,数据 { if(ii==0) { temp=slave_write_address;//送 器件写地址 temp1=slave_write_address; } else if(ii==1) { temp=byte_address;//送 字节地址 temp1=byte_address; } else if(ii==2) { temp=data_data;//送 数据 temp1=data_data; } for(i=0;i<8;i++) { scl=0; delay();//5us 延时 temp=temp1; temp=temp&0x80;// 相 与 后,把不相关的位清零 if(temp==0x80)//根据前面 相 与 后,判断 temp 是否等于0x80,是则该位为 1 sda=1; else sda=0; delay();//5us 延时 scl=1; delay();//5us 延时 scl=0; delay();//5us 延时 temp1=temp1<<1;//向左移出1 位 } sda=1; delay();//5us 延时 scl=1; delay();//5us 延时...