博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51单片机实现对24C02进行页写、顺序读取并显示验证
阅读量:6500 次
发布时间:2019-06-24

本文共 4259 字,大约阅读时间需要 14 分钟。

源:

//*************************************************************************************//**程序名称:51单片机实现对24C02进行页写、顺序读取并显示验证//**编写人:**** //**修改人:****//**程序目的:熟悉I2C总线协议,实现51模拟I2C时序和24C02通信//**功能描述:51单片机将8个字节数据写入24C02的一页中,然后顺序读出,每隔1秒送P0口LED显示//**其他说明:本程序是采用某51开发板,若在其他地方验证可更改相关端口及延时程序等。//** 程序编写前曾参考过多个教程,最终自己编程通过,并详加注释。//** 可供初学者参考,并不对程序的可靠性等作保证。//**开发工具:keil 7.50 (C51) //**日期://*************************************************************************************#include 
#include
//因为用到_nop_();typedef unsigned char uchar;sbit SCL = P3^3; //注意P1、P2、P3口有内部上拉电阻,可直接连SDA和SCL,若想用P0需外接上拉电阻,否则连上无法输出高电平!sbit SDA = P3^4;uchar j; //用于计数50ms的个数的全局变量uchar code ToSDAdataBuffer[8] = {
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; //写入24C02的一组数据,8个字节对应24C02的一页(共32页),这里把这些要验证的常数放到程序存储区uchar ReceivedData[8]; //用于存储接收的8个字节数据(1页)的数组//本例51为单主机,24C02为从机,不需要总线裁决//延时5us子程序void delay5us(void){ _nop_(); //时序图要求开始建立时间tSU.STA大于4.7us,开始保持时间tHD.STA大于4us。51中每个_nop_();延时1个CPU cycle,即1us。 _nop_(); //如考虑不同CPU频率不同,可用带参数的延时,参数在前面宏定义。 _nop_(); _nop_(); _nop_();}//50ms定时器0中断函数void timer0() interrupt 1 //j是个全局变量,不是返回值,所以这里还是void。{ TH0 = (65536-46080)/256; //11.0592MHz时每50ms一次定时器中断 TL0 = (65536-46080)%256; j++; //也可以把判断j到20,并给P0口送显示数据的程序放在中断里处理}//延时1秒的子程序,用于将读取的数据每隔一秒显示在LED上void delay1s(void){ j = 0; TMOD = 0x01; //方式1的16位计数器 TH0 = (65536-46080)/256; TL0 = (65536-46080)%256; EA = 1; ET0 = 1; TR0 = 1; //启动定时器0工作 while(j < 20) //j达到20之前空操作,达到20时说明已到1s,下面关中断和定时器0 ; EA = 0; ET0 = 0; TR0 = 0;}//约2ms的延时void delay(uchar t){ uchar x,y; for(x=0;x
< 8;i++){ ReceivedData[i] = ReadI2CByte(); AckAsMaster(0); //51此时接收数据,调用应答的函数(置SDA为0) } AckAsMaster(1); //NO ACK.The microcontroller does not respond with a zero but does generate a following stop condition. StopI2C(); return 0; } else{ return 1; //之前可添加错误处理代码。 } } else{ return 1; } } else{ return 1; }}int main(void){ uchar i; P0 = 0xff; InitI2C(); //注意在24C02中用到的页写和顺序读的地址是同一个,且必须是8的整数倍,即每页的首地址才行,如0x08,0x20等。因为24C02页写时后三位地址自动加1, //When the word address,internally generated, reaches the page boundary, the following byte is placed at the beginning of the same page. //而顺序读时只有在达到整个存储区边界时才会roll over。所以,如读写都用0x32这个地址,由于不是8的整数倍,只有前6个数显示是正确的,最后两个数 //虽然又从头写在了该页的前面,但SequentialRead确读到了该页之外的两个存储单元,造成错误。 if (PageWrite(0x08,ToSDAdataBuffer) == 0) { //先执行页写操作,设从地址00开始,没问题就延迟一下再从同一地址读回来。 delay(100); //等待24C02页写操作完毕 if(SequentialRead(0x08) == 0){ //如果顺序读操作成功,则每隔1秒送P0口显示一个字节 for(i = 0; i < 8; i++){ P0 = ReceivedData[i]; delay1s(); } } } while(1) ; return 0;}//往I2C总线写一个字节的数据(即将一个字节的数据发送到SDA上)void WriteI2CByte(uchar ByteData){ uchar i,temp; temp = ByteData; // (StartI2C()最后已经先将SCL变0了): for(i=0;i<8;i++){ temp <<= 1; //左移一位,I2C要求由MSB最高位开始,移出的CY即要发送到SDA上的数据。下面考虑时序: SDA = CY; //此时SCL已为低,每次移一位送出去(下次进循环后SDA还保持着上次发出去的数据) delay5us(); //SDA IN数据变化中点SCL上升沿中点的一段时间是tSU.DAT,即数据建立时间Data In Setup Time,需大于200ns,多延无所谓 SCL = 1; delay5us(); //tHIGH即Clock Pulse Width High,最小4us SCL = 0; delay5us(); //tLOW即Clock Pulse Width Low,最小4.7us }}//读取I2C总线一个字节的数据uchar ReadI2CByte() //串行总线,51一位位接收从机发送到SDA上的数据,这里只考虑数据已在SDA上时如何存下来这几位,组成一个字节{ uchar i,ByteData; SDA = 1; //SCL在ChkAck中已经置0了。注意SCL时序仍然由主机控制!24C02只能将SDA由高拉低,象橡皮筋松手又恢复高,而下面只是读SDA,没赋值             //其实程序中多处给SDA置1都可省,因为检查应答时为0就正常,无所谓,写字节时也无所谓,就是在读之前要保证SDA为1!             //因之前有WriteI2CByte(0xa1); 其实这句也可省略。 delay5us();      //24C02作为发送方在第9个时钟的negative edge clocks data out of each device,所以现在SDA上为新数据 for(i=0;i<8;i++){ SCL = 1; //置时钟线为高使数据线上数据有效 delay5us(); ByteData = (ByteData<<1)|SDA; //SDA上已是新数据了,读之。data不管以前多少,左移后最右边为0,和SDA“按位或”后MLB就是SDA SCL = 0; delay5us(); } return ByteData;}

 

转载地址:http://bbvyo.baihongyu.com/

你可能感兴趣的文章
获取文件最后修改时间的VC代码
查看>>
适用于0基础小伙伴的HTML知识点总结 先到先得哟
查看>>
ThinkPHP子类继承Controller类的注意事项
查看>>
iphone UIView的一些基本方法理解
查看>>
sys.check_constraints
查看>>
vue问题
查看>>
Linux常用命令大全
查看>>
ThinkPHP 框架学习
查看>>
yii1框架,事务使用方法
查看>>
css3箭头效果
查看>>
(原创)JAVA注解应用——实现属性的自动检测
查看>>
Python学习笔记【第一篇】:认识python和基础知识
查看>>
this关键字
查看>>
【C#小知识】C#中一些易混淆概念总结(三)---------结构,GC,静态成员,静态类...
查看>>
the folder is already a source folder.
查看>>
2014年度加班时间
查看>>
MathType在手,公式不求人!
查看>>
测试用例设计
查看>>
三层架构
查看>>
Python变量类型(l整型,长整形,浮点型,复数,列表,元组,字典)学习
查看>>