51单片机的模拟IIC总线程序_第1页
51单片机的模拟IIC总线程序_第2页
51单片机的模拟IIC总线程序_第3页
51单片机的模拟IIC总线程序_第4页
51单片机的模拟IIC总线程序_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/VI2C_C51.C此程序是I2C操作平台(主方式的软件平台)的底层的C000,如发送数据及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的与用户程序连接并扩展注意:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作一定的修改.(本例是lus机器周期,即晶振频率要小于12MHZ)*11*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*/voidSt

2、art_I2c()SDA=l;/*发送起始条件的数据信号*/*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*/#include/*头文件的包含*/#include#defineucharunsignedchar/*宏定义*/#defineuintunsignedint#define_Nop()_nop_()/*定义空指令*/*常,变量定义区*/*端口位定义*/sbitSDA二

3、P3;/*模拟I2C数据传送位*/sbitSCL=P2;/*模拟I2C时钟控制位*/*状态标志*/bitack;/*应答标志位*/起动总线函数函数原型:voidStart_I2c();功能:启动I2C总线,即发送I2C起始条件._Nop();SCL=1;4.7us,延时*/4ps*/_Nop();/1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*/voidStop_I2c(

4、)SDA=0;/*发送结束条件的数据信号*/_Nop();/*发送结束条件的时钟信号*/SCL=1;/*结束条件建立时间大于4ps*/_Nop();_Nop();_Nop();_Nop();_Nop();SDA=1;/*发送I2C总线结束信号*/_Nop();_Nop();_Nop();_Nop();起始条件建立时间大于_Nop();_Nop();_Nop();_Nop();SDA=0;/*发送起始信号*/_Nop();/*起始条件锁定时间大于_Nop();_Nop();_Nop();_Nop();SCL=O;/*钳住I2C总线,准备发送或接收数据*/_Nop();_Nop();/结束总线函数

5、函数原型:voidStop_I2c();功能:结束I2C总线,即发送I2C结束条件./jsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjs/字节数据传送函数函数原型:voidSendByte(ucharc);功能:将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答或非应答都使ack=0假)发送数据正常,ack=l;ack=O表示被控器无应答或

6、损坏。*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*/voidSendByte(ucharc)ucharBitCnt;TOC o 1-5 h zfor(BitCnt=0;BitCnt8;BitCnt+)/*要传送的数据长度为8位*/if(cBitCnt)&0 x80)SDA=1;/*判断发送位*/elseSDA=0;_Nop();SCL=1;/*置时钟线为高,通知被控器

7、开始接收数据位*/_Nop();_Nop();/*保证时钟高电平周期大于4ps*/_Nop();_Nop();_Nop();SCL=0;_Nop();_Nop();SDA=1;/*8位发送完后释放数据线,准备接收应答位*/_Nop();_Nop();SCL=1;_Nop();_Nop();_Nop();if(SDA=1)ack=0;elseack=1;/*判断是否接收到应答信号*/SCL=0;_Nop();_Nop();/jsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsj

8、sjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjs*/*/4.7ps*/*/,接收的数据位放入retc中*/字节数据传送函数函数原型:ucharRcvByte();功能:用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数。*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*/ucharRcvByte()

9、ucharretc;ucharBitCnt;retc=0;SDA=1;/*置数据线为输入方式for(BitCnt=0;BitCnt8;BitCnt+)_Nop();SCL=0;/*置时钟线为低,准备接收数据位_Nop();_Nop();/*时钟低电平周期大于_Nop();_Nop();_Nop();SCL=1;/*置时钟线为高使数据线上数据有效_Nop();_Nop();retc=retc1;if(SDA=1)retc=retc+1;/*读数据位_Nop();_Nop();SCL=0;_Nop();_Nop();return(retc);/jsjsjsjsjsjsjsjsjsjsjsjsjsj

10、sjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjs/应答子函数原型:voidAck_I2c(bita);功能:主控器进行应答信号,(可以是应答或非应答信号)*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*/

11、voidAck_I2c(bita)if(a=0)SDA=0;/*在此发出应答或非应答信号*/elseSDA=1;_Nop();_Nop();_Nop();SCL=1;_Nop();_Nop();_Nop();_Nop();_Nop();SCL=0;_Nop();_Nop();/*时钟低电平周期大于4ps*/*清时钟线,钳住I2C总线以便继续接收*/jsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsj

12、sjsjsjsjsjs/jsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjs/向无子地址器件发送字节数据函数函数原型:bitISendByte(ucharsla,ucahrc);功能:从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.如果返回1表示操作成功,否则操作有误。注意:使用前必须已结束总线。*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*

13、1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*/bitISendByte(ucharsla,ucharc)TOC o 1-5 h zStart_I2c();/*启动总线*/SendByte(sla);/*发送器件地址*/if(ack=0)return(0);SendByte(c);/*发送数据*/if(ack=0)return(0);址sla,返回值在c.Stop_I2c();return(1);/*结束总线*/jsjsjsjsjsj

14、sjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjs向有子地址器件发送多字节数据函数函数原型:bitISendStr(ucharsla,ucharsuba,ucahr*s,ucharno);功能:从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。如果返回1表示操作成功,否则操作有误。注意:使用前必须已结束总线。*1*1*1*1

15、*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*/bitISendStr(ucharsla,ucharsuba,uchar*s,ucharno)uchari;Start_I2c();SendByte(sla);if(ack=0)return(0);SendByte(suba);if(ack=0)return(0);for(i=0;ino;i+)SendByte(*s);if(ack=0)

16、return(0);s+;Stop_I2c();/*启动总线/*发送器件地址/*发送器件子地址*/*/*/*发送数据*/*结束总线*/return(1);/函数原型功能:向无子地址器件读字节数据函数:bitIRcvByte(ucharsla,ucahr*c);从启动总线到发送地址,读数据,结束总线的全过程,从器件地如果返回1表示操作成功,否则操作有误。注意:使用前必须已结束总线。*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*

17、1*1*1*1*1*1*1*1*1*1*1*1*1*1*/bitIRcvByte(ucharsla,uchar*c)/*启动总线/*发送器件地址*/*/Start_I2c();SendByte(sla+1);/*读取数据/*发送非就答位/*结束总线if(ack=0)return(0);*/*/*/*c=RcvByte();Ack_I2c(1);Stop_I2c();return(1);/向有子地址器件读取多字节数据函数函数原型:bitISendStr(ucharsla,ucharsuba,ucahr*s,ucharno);功能:从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。如果返回1表示操作成功,否则操作有误。注意:使用前必须已结束总线。*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*/bitIRcvStr(ucharsla,ucharsuba,uchar*s,ucharno)uchari;TOC o 1-5 h zSt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论