




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、51单片机实现对24C02进行页写、顺序读取并显示验证(I2C协议带详细注释)一年多以前写的个小程序,放上来吧,能赚点积分更好,要不也没法下载别人的好资源(唉,哪里都需要 积分啊)。参看过类似程序,自己编写了这个程序。I2C虽是较简单的通信协议,但要完全理解透彻可也并非 那么轻而易举,自己也是在不断加深对它的理解。这个程序已通过实验验证,并加上个人非常详细的注释(复 制过来显示有点乱,没时间一一调整了),但如果使用它还是请慎重。/好程序名称:51单片机实现对24C02进行贞写、顺序读取并显示验证/*编写人:海右愚叟修改人:海右愚叟/*程序H的:熟悉I2C总线协议,实现51模拟I2C时序和24C
2、02通信/决功能描述:51单片机将8个字节数据写入24C02的一页中,然后顺序读出,毎隔1秒送P0口 LED显示好其他说明:本程序是采用某51开发板,若在其他地方验证可更改柑关端口及延时程序等。/*程序编写前曾参考过多个教程,最终自己编程通过,并详加注释。/*可供初学者参考,并不对程序的可靠性等作保证。/好开发工具:keil 7.50 (C51)日期:2009- 1 1 -21#include <REGX51.H>#include <intr ins.h> /因为用到_nop_();typedef unsigned char uchar;sbit SCL = P3A3;
3、/注:g:Pl、P2、P3口有内部上拉电阻,可直接连SDA和SCL,若想用P0需外接上拉电阻,否则连上无法输出髙电平!sbit SDA = P3A4;uchar j ;/用计数50ms的个数的全局变量uchar code ToSDAdataBuffer8 = 0xfe,0xfc,0xf8,0:<f0,OxeO, OxcO, 0x80, 0:<00;/写入24C02的一组数据,8个字节对应24C02的一页(共32贞),这里把这些要验证的常数放到程序存储区uchar ReceivedData8 ;/用尸存储接收的8个字节数据(1页)的数组/本例51为单主机,24C02为从机,不需要总线
4、裁决/延时5us子程序void de 1 ay5us(void)_nop_();/时序图要求开始建立时间tSU.STA大于4.7us,开始保持时间tHD.STA大于4us。51中每个_nop_();延时 1 个CPU cycle,即lus。_nop_();/如考虑不同CPU频率不同,可用带参数的延时,参数在前面宏左义。_nop_();_nop_();_nop_();/50ms定时器0屮断函数void timerOO interrupt 1j是个全局变量,不是返回值,所以这里还是void。THO = (65536-46080)/256; /II.0592MHz 时每 50ms 一 次定时器中断T
5、LO = (65536-46080)X256;j卄;/也可以把判断j到20,并给P0口送显示数据的程序放在中断里处理延时1秒的子程序,用于将读取的数据毎隔一秒显示在LED上void delayls(void)j = o;TMOD = 0x01;/方式1的16位计数器THO = (65536-46080)/256;TLO = (65536-46080)X256;EA = 1;ETO = 1;TRO = 1;启动定时器0工作while(j < 20) j达到20之前空操作,达到20时说明已到1$,下面关中断和定时器0EA = 0;ETO = 0;TRO = 0;/约2ms的延时void de
6、lay(uchar t)uchar x,y;for (x=0;x<t ;x 卄)for(y=0;y<250;yH)/I2C初始化void Ini tI2C(void)SDA = 1;/总线空闲时,因各设备都是集电极或漏极开路,上拉电阻使SDA和S仇线都保持高电平。SCL = 1;delay5u$();/产生I2C开始信号void StartI2C(void)SDA = 1;/SDA在SCL为髙期间山高变低表示开始,所以先要高SCL = 1;delay5us();时序图要求tSU. STA(Start Set-up Time)大于4.7usSDA = 0;/注意SD.A拉低前后都要维
7、持5us以上!delay5u$(); /tHD. STA(Start Hold Time)大于4usSCL = 0;/拉低SCL,准备发送或接收数据(这两句也可在写或读字节的程序中先将SCLS0,延时)delay5us();/产生I2C结束信号void 5topI2C(void)SDA = 0;/SDA在SCL为高期间由低变高,说明结束SCL = 1;delay5us();SDA = 1;delay5us();发送方在发完一个字节后检测接收方有没有应答。返回应答成功否。 bit ChkAck(void)bi t SDAtemp;SDA = 1; 释放SDA (置1),然后等待接收方应答将它拉低
8、。确切的说,应是24C02发送字节最后一 位的第8个时钟周期下降沿后经tAA/ (SCL变低到SDA OUT有效的时间)约0.1-4.5US后拉低SDA,并随第9个时钟后结束。所以24C02正常时,SDA 为1并不体现/ (第8脉冲后马上被拉低了),但若器件坏了,就需要靠这个置1后不变来判断!(若不置1而上次发的数据 最后一位为0就不好判断了)/从24C02的Block Diagram看,它只能在SDA为1时通过控制内部的Do叽来把SDA拉低,但不能在SDA为0时将其 置高!故主机要常将$DA置1, iftJSCl置0。SCL = 1; /WriteI2CByte中写完一字节后乂将SCL拉低,
9、这里拉高产生第9个时钟上升沿,然后在$CL 为高期间对SDA进行检测delay5us();SDAtemp = SDA; /如果不用暂存变量,直接return SDA,就不会执行后面的SCL = 0,检测期间的第9个时钟 就不完整了SCL = 0;delay5us();return SDAtemp;/51作为主机时,如果接收数据,模拟产生应答时序。形参Ack为0,则应答0,为1不应答。void AckAsMaster(bi t Ack)if(!Ack)SDA = 0; e 1 seSDA = 1;delay5us();SCL = 1;/丄机控制SCL时序。关键是保证在SCL脉冲上升沿之前SDA数
10、据已稳定即可。delay5us();SCL = 0;delay5u$();void Wr1teI2CByte(uchar);uchar ReadI2CByte();/页写。输入两参数,一个为首字地址,另一个是指向待写入数据数组的指针(括号内第二个参数也可写作 uchar ToSDAdataBuf ferQ ,即数组名代表首地址)。bit PageWr i te(ucha r Wo rdAdd re $s,ucha r *ToSDAda taBu f fe ri/下面的程序我用的if嵌套,网上有些程序是顺序结构,但因为遇到return就返回主程序不再往下执行, 所以效果是一样的。uchar i;
11、StartI2C();Wri teI2CByte(OxaO) ;/之所以没设DeviceAddress这个参数,是因为最后一位不属于地址。E2PR0M一般前四 位为1010,这里A2-A0接地,为0,最后一位0表示写if(!ChkAck()/检查应答函数返回0说明从机应答0成功。WriteI2CByte(WordAddress); 写8-bit data word address,即写到哪个存储单元(24C02有2kbits,所以数据字有2048/8 = 256个,故地址线有8位)if(!ChkAck()for(i = 0; i < 8; i+)Wri teI2CBy te(ToSDAd
12、ataBuf fer 订);if(ChkAck()/这里可添加错谋处理代码。如用几个LED的亮灭组合表示此I2C器件有问题,类似上板错 误提示。return 1 ;一般返回1表示异常,且遇到return就退出整个子程序。StopI2C() ;/写完发送结束涪号。return 0;/一般返回0表示程序正當elsereturn 1;/之前可添加错误处理代码。el$ereturn 1;/不能用Current Address Read,因为那是24C02数据字地址计数器上次操作后加1的值;而SEQUENTIAL_READ 如果不给一个要读取的开始地址,会从头输出,/所以需要Random Read的开始
13、部分,但不要停止信号。bit SequentialRead(uchar WordAdd ress)uchar i;StartI2C();WriteI2CByte(0xa0);if (!ChkAck()Wf i teI2CByte(WordAddress);if (!ChkAck()StartI2C() ; /the microcontroller must gene rate anothe r start cond i t ionWriteI2CByte(0xal); /Device Address后紧跟的那一位R/W足1说明足读,24C02内部就是根据最后这位 来判断是从SDA上读数,还是往
14、SDA上送数/之所以设为1是读,是因为根据WriteI2CByte子程序,最后给SDA赋1, P3A4就维持1,这样24C02内部Dout为高就将SDA拉低;如果最后一位是0, 24C02没能力拉高!if (!ChkAck()for(i = 0;i < 8;i+)ReceivedDatai = ReadI2CByte();AckAsMaster(O); 51此时接收数据,调用应答的函数(置SDA为0)AckAsMaster(l); /NO ACK.The microcontroller does not respond wi th a zero but does generate a f
15、ol lowing stop cond i t ion.StopI2C();return 0;el se return 1;/之前可添加错谋处理代码。el se return 1;e 1 se return 1; int main(void)uchar i;P0 = Oxff;InitI2C();/注意在24C02屮用到的页写和顺序读的地址是同一个,11必须是8的整数倍,即每页的首地址才行,如0x08, 0x20等。因为24C02页写时后三位地址自动加1,/When the word add ress,interna 1 ly generated, reaches the page bound
16、ary, the fol lowing byte i s placed at the beginning of the same page./而顺序读时只有在达到整个存储区边界时才会roll overo所以,如读写都用0x32这个地址,由不是8的 整数倍,只有前6个数显示是正确的,最后两个数/虽然乂从头写在了该页的前面,但SequentialRead确读到了该贞之外的两个存储单元,造成错误。if (PageWrite(0x08,ToSDAdataBuffer) = 0) /先执行页写操作,设从地址00开始,没问题就延迟一下 再从同一地址读回来。delay(lOO);/等待24C02页写操作完毕
17、if(SequentialRead(0x08) = 0)如果顺序读操作成功,则每隔1秒送P0 口显示一个字节for(i = 0; i < 8; i+)P0 = Rece ivedDa tai;d e 1 a y 1 s ();wh iIe(1)>return 0;/往I2C总线写一个字节的数据(即将一个字节的数据发送到SDA上)void Wr i teI2CByte(ucha r ByteData)ucha r i,temp;temp = ByteDa ta;/(StartI2C()最后已经先将SCL变0了):for( i=0; i<8; i卄)temp «= 1;
18、 左移一位,I2C要求由MSB最高位开始,移出的CY即要发送到SDA上的数据。下面考虑时序:SDA = CY; /此时SCL已为低,每次移一位送出去(下次进循环后SDA还保持着上次发出去的数据) delay5us(); /SDA IN数据变化中点SCL上升沿中点的一段时间是tSU.DAT,即数据建立时间Data In Setup Time,需大于200ns,多延无所谓SCL= 1;delay5us(); /"HIGH即Clock Pulse Width High,最小4u$SCL= 0 ;delay5us(); /tLOW即Clock Pulse Width Low,最小4.7us读取12C总线一个字节的数据uchar ReadI2CByte()/串行总线,51 位位接收从机发送到SDA上的数据,这里只考虑数据已在SDA上时如何存下来这几位,组成一个字节uchar i,ByteData;SDA = 1;/S仇在ChkAck屮已经置0了。注总SCL时序仍然山主机控制! 24C02只能将SDA山高拉低,象橡皮筋松手乂恢复高,而下面只是读SDA,没赋值/其实程序屮多处给SDA置1都可省,因为检查应答时为0就正常,无所谓,写字节时也无所谓,就是在 读之前要保证SDA为1!
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初级烹调考试题及答案
- 分级检验考试题及答案
- 谷歌运营面试题库及答案
- 方城医疗面试题及答案
- T/CAEPI 62-2023颗粒活性炭吸附-氮气脱附溶剂回收装置技术要求
- T/CAEPI 24-2019袋式除尘用超细面层滤料技术要求
- 《小学美术新课标》心得体会模版
- T/CADBM 7-2018墙布
- 定制家具定货合同范本
- 个人商铺转让合同范本
- 沪教版(牛津英语)二年级英语下册全册单元试题
- 折弯工艺培训
- 大学生干部竞选学生会干部竞选207
- 2025-2030年煤炭贸易产业发展分析及发展趋势与投资前景预测报告
- 农业灌溉系统全掌握-故障排查与维护实战指南
- 中国金融黑灰产治理研究报告 2024
- 行政管理专科公共安全管理试题及答案
- 高碳铬铁生产流程
- 学校“校园餐”专项整治推进工作情况汇报范文
- 委托清算协议书范本
- 福州教育学院附属中学2025年高三全真四模数学试题试卷
评论
0/150
提交评论