51单片机模拟I2C总线的C语言实现

上传人:s9****2 文档编号:494225961 上传时间:2024-01-04 格式:DOCX 页数:10 大小:12.59KB
返回 下载 相关 举报
51单片机模拟I2C总线的C语言实现_第1页
第1页 / 共10页
51单片机模拟I2C总线的C语言实现_第2页
第2页 / 共10页
51单片机模拟I2C总线的C语言实现_第3页
第3页 / 共10页
51单片机模拟I2C总线的C语言实现_第4页
第4页 / 共10页
51单片机模拟I2C总线的C语言实现_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《51单片机模拟I2C总线的C语言实现》由会员分享,可在线阅读,更多相关《51单片机模拟I2C总线的C语言实现(10页珍藏版)》请在金锄头文库上搜索。

1、51单片机模拟I2C总线的C语言实现电路原理图F3 EEEPROM为ATMEL公司的AT24C01A。单片机为ATMEL公司的AT89C51。软件说明C语言为Franklin C V3.2。将源程序另存为testi2c.c,用命令C51testi2c.cL51TESTI2C.OBJOHS51TESTI2C编译,连接,得到TESTI2C.HEX文件,即可由编程器读入并进行写片,实验。3源程序#include #include #define uchar unsigned char#define uint unsigned int#define AddWr OxaO/*器件地址选择及写标志*/#d

2、efine AddRd Oxal/*器件地址选择及读标志*/#define Hidden 0x0e /*显示器的消隐码*/*有关全局变量*/sbit Sda=P3人7;/*串行数据*/sbit Scl=P3A6;/*串行时钟*/sbit WP=P3A5;/* 硬件写保护*/void mDelay(uchar j)uint i;for(;jO;j-)for(i=O;il25;i-);/*发送起始条件*/void Start(void)/* 起始条件*/Sda=l;Scl=l;_nop_();_nop_();_nop_();_nop_();Sda=0;_nop_();_nop_();_nop_()

3、;_nop_();void Stop(void)/* 停止条件 */Sda=0;Scl=1;_nop_();_nop_();_nop_();_nop_();Sda=1;_nop_();_nop_();_nop_();_nop_();void Ack(void)/*应答位 */Sda=0;_nop_();_nop_();_nop_();_nop_();Scl=1;_nop_();_nop_();_nop_();_nop_();Scl=0;void NoAck(void)/* 反向应答位 */Sda=1;_nop_();_nop_();_nop_();_nop_();Scl=l;_nop_();_

4、nop_();_nop_();_nop_();Scl=0;void Send(uchar Data)/*发送数据子程序,Data为要求发送的数据*/uchar BitCounter=8;/* 位数控制*/uchar temp;/*中间变量控制*/dotemp=Data;Scl=0;_nop_();_nop_();_nop_();_nop_();if(temp&0x80)=0x80)/* 如果最高位是 1*/Sda=l;elseSda=0;Scl=1;temp=Data1;/*RLC*/Data=temp;BitCounter-;while(BitCounter);Scl=0;uchar Rea

5、d(void)/*读一个字节的数据,并返回该字节值*/uchar temp=0;uchar temp1=0;uchar BitCounter=8;Sda=1;doScl=0;_nop_();_nop_();_nop_();_nop_();Scl=1;_nop_();_nop_();_nop_();_nop_();if(Sda)/*如果 Sda=l;*/temp=templOxOl;/*temp 的最低位置 1*/elsetemp=temp&0xfe;/*否则 temp 的最低位清 0*/if(BitCounter-1)temp1=temp1;temp=temp1;BitCounter-;whi

6、le(BitCounter);return(temp);void WrToROM(uchar Data,uchar Address,uchar Num)uchar i;uchar *PData;PData=Data;for(i=0;iNum;i+)Start();/*发送启动信号*/Send(OxaO);/*发送 SLA+W*/Ack();Send(Address+i);/* 发送地址*/Ack();Send(*(PData+i);Ack();Stop();mDelay(20);void RdFromROM(uchar Data,uchar Address,uchar Num)uchar i;

7、uchar *PData;PData=Data;for(i=0;ivNum;i+)Start();Send(0xa0);Ack();Send(Address+i);Ack();Start();Send(0xa1);Ack();*(PData+i)=Read();Scl=0;NoAck();Stop();void main()uchar Number4=1,2,3,4;WP=1;WrToROM(Number,4,4);/*将初始化后的数值写入EEPROM*/mDelay(20);Number0=0;Number1=0;Number2=0;Number3=0;/*将数组中的值清掉,以验证读出的数是否正确*/RdFromROM(Number,4,4);问题:本程序中未采用块读写的方法,显得有点笨,这是由于项目原因,现项目已完成,程序已写好, 短时不会修改,也不会花上一定的精力去做,虽然理论上已很成熟,就这样写一下,未必不对,但与我的 本栏目要求不符,所以就未做上去,如果以后我做了,将再补上。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号