EEPROM器件读写例程设计.docx
- 文档编号:12691314
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:25
- 大小:275.98KB
EEPROM器件读写例程设计.docx
《EEPROM器件读写例程设计.docx》由会员分享,可在线阅读,更多相关《EEPROM器件读写例程设计.docx(25页珍藏版)》请在冰豆网上搜索。
EEPROM器件读写例程设计
EEPROM器件读写例程设计
1问题描述
本次课设是EEPROM器件读写例程的设计,即在电可擦除存储器件上实现数据的读和写。
硬件方面,使用AT24C02芯片作为EEPROM器件,并为了达到实验结果的可见性,以便测试软件代码的正确性,实验中使用了LED数码显示芯片CH451来控制显示AT24C02芯片中写/读数据。
软件代码方面,需要实现的功能是通过实验平台上的按键来引发中断,并通过I2C总线向AT24C02写入或读出某个数据,同时将该数据显示在数码管上。
设计主要的要求有以下几点:
(1)能正常操作LED数码显示
(2)能通过中断方式接收按键信息
(3)能正确读写EEPROM芯片
2需求分析
2.1硬件条件
程序设计中涉及到的所有硬件设备的明细表如表所示。
表2.1硬件设备明细表
序号
名称
1
PC机一台;ZG-211单片机系统实验板一块
2
实验连接线若干
3
并口编程线一根
4
配套电源1个
5
CH451,89S52,CD4052,AT24C02各一个
2.2软件要求
本次设计涉及到的软件主要有以下几个:
(1)操作系统:
windowsXP(HardWare)
(2)软件代码开发环境:
KEILCUVISION2集成开发环境
(3)联机下载软件:
中格电子在线编程V10
2.3程序设计内容概述
程序设计中主要分4个模块来实现,包括初始化模块、EEPROM数据读写操作模块、数据显示模块以及总体模块。
初始化模块主要是用来对硬件部分进行初始化。
如对MCU进行初始化,选择4052的通道号,为了提示硬件开始运行,在初始化模块设计中特意加入了蜂鸣器的工作,蜂鸣声响起则表示硬件开始工作。
其中使用并行可编程芯片8255控制蜂鸣器的开关,所以这里还要实现对芯片8255的初始化。
EEPROM数据读写操作模块则是用来实现对AT24C02进行数据读写操作的,由于设计中的数据读写操作都是通过I2C总线来实现的,所以操作过程要遵循I2C总线协议。
首先要发送启动信号,然后再发送从器件地址,收到响应信号之后再开始从I2C总线上读/写数据,最后还要发送一个结束信号,表示数据操作的结束。
数据显示模块则是将每次操作的数据在LED上显示,以便测试代码的正确性,该模块的设计中不仅要包含对数据的显示功能的实现,还要实现对按键中断的功能,即时刻检测实验平台上5个按键的状态,以便对不同状态做出不同的操作。
最后是总体模块的设计,即将上述的所有模块联系起来,达到相应的设计要求,如对按键进行检测,如果有相应按键按下,则产生中断,将某个数据写入到AT24C02芯片中(或者从AT24C02中读出一个数据),并将该数据显示出来。
3接口芯片介绍
3.1AT24C02芯片介绍
AT24C02是一个2K位串行CMOSEEPROM,内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。
AT24C02有一个16字节页写缓冲器。
该器件通过I2C总线接口进行操作,有一个专门的写保护功能。
AT24C02支持I2C总线数据传送协议,总线协议规定任何将数据传送到总线的器件作为发送器。
任何从总线接收数据的器件为接收器。
数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。
主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式,通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上。
其芯片引脚图如下图所示。
图3.1AT24C02引脚图
3.2AT89S52芯片介绍
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
其芯片引脚图如下图所示。
图3.2AT89S52引脚图DIP封装
3.3CH451芯片介绍
CH451是一个整合了数码管显示驱动和键盘扫描控制以及μP监控的多功能外围芯片。
CH451内置RC振荡电路,可以动态驱动8位数码管或者64位LED,具有BCD译码、闪烁、移位等功能;同时还可以进行64键的键盘扫描;CH451通过可以级联的串行接口与单片机等交换数据;并且提供上电复位和看门狗等监控功能。
CH451是一个多功能外围芯片,通过可以级联的4线串行接口与单片机、DSP、微处理器等控制器交换数据。
CH451包含三个功能:
数码管显示驱动、键盘扫描控制、μP监控,三个功能之间相互独立,控制器可以通过操作命令分别启用、关闭、设定CH451的任何一个功能。
CH451的串行接口是由硬件实现的,控制器可以频繁地通过串行接口进行高速操作,而绝对不会降低CH451的工作效率。
其芯片引脚图如下图所示。
图3.3CH451引脚图
3.4CD4052芯片介绍
CD4052是一个差分4通道数字控制模拟开关,有A0、A1两个二进制控制输入端和INH输入,具有低导通阻抗和很低的截止漏电流。
幅值为4.5~20V的数字信号可控制峰-峰值至20V的模拟信号。
例如,若VDD=+5V,VSS=0,VEE=-13.5V,则0~5V的数字信号可控制-13.5~4.5V的模拟信号。
这些开关电路在整个VDD-VSS和VDD-VEE电源范围内具有极低的静态功耗,与控制信号的逻辑状态无关。
当INH输入端=“1”时,所有的通道截止。
二位二进制信号选通4通道中的一通道,可连接该输入端至输出。
其芯片引脚图如下图所示。
图3.4CD4052引脚图
3.5AT24C02芯片数据读写原理
3.5.1AT24C02芯片工作原理
AT24C02芯片可存储256个字节,重复擦写1000000次,数据保存100年以上。
该芯片通过I2C总线接口进行操作,并且符合I2C总线的协议。
其原理图如下图所示:
图3.5AT24C02原理图
AT24C02各引脚的功能如下表所示:
表3.1AT24C02引脚说明
管脚名称
功能
A0,A1,A2
器件地址选择
SDA
串行数据地址/数据
SCL
串行时钟
WP
写保护
VCC
+1.8~6.0工作电压
VSS
地
3.5.2I2C总线
I2C总线协议:
1、只有在总线空闲时才允许启动数据传送。
2、在数据传送过程中当时钟线为高电平时数据线必须保持稳定状态不允许有跳变时钟线为高电平时数据线的任何电平变化将被看作总线的起始或停止信号。
起始信号:
时钟线保持高电平期间数据线电平从高到低的跳变为I2C总线的起始信号。
停止信号:
时钟线保持高电平期间数据线电平从低到高的跳变为I2C总线的停止信号。
时序图
根据总线的协议规则,设计如下图所示的总线时序图。
图3.6总线时序图
根据总线的时序要求设计总线的读写周期时序如下图所示。
图3.7总线写时序
图3.8立即读时序
在总线的读写时序中反映了起始信号和停止信号。
在写周期时序中,STOPCONDITION表示在SCL是高电平的时候SDA由低电平到高电平的转变表示停止信号;STARTCONDITION表示在SCL是高电平的时候SDA由高电平到低电平的转变表示其实信号。
图3.9起始/停止信号时序
在进行I2C总线操作时,请将所有中断关闭,以防中断程序,打乱其时序,操作完成再将中断恢复。
4硬件设计
根据各芯片的接口特性和功能,设计了如下所示的硬件连线原理图。
在实验板上主要涉及到如下几个要接线模块:
J1_4052、J4_24C64、J5_89S52、J23_CH451。
图4.1是AT89S52与AT24C02和CD4052的连线图。
图4.2是AT89S52与CH451的连线图。
硬件的设计共需连接7根导线,图中双箭头表示为需要接线的地方。
图4.1AT89S52与AT24C02和CD4052的连线图
图4.2是AT89S52与CH451的连线图
图4.3实物电路连接
5软件模块设计
5.1初始化模块设计
初始化模块设计中主要包括芯片初始化和蜂鸣器的启动,其实现代码如下所示:
初始化MCU
voidInitMCU()
{
TMOD=0x21;
TCON=0x00;
PCON=0x80;
SCON=0x50;
IE=0x90;
}
毫秒级延时程序,主要用在执行一条对硬件进行操作的语句之后,给硬件工作以缓冲时间。
确保相应操作有足够时间完成。
voiddelay_1ms(unsignedint_1ms)
{
unsignedchari,j;
for(;_1ms>0;_1ms--)
{
for(i=0;i<10;i++)
{
for(j=0;j<30;j++)
;
}
}
}
CD4052选择通道,设计中选择的是2号通道
voidchang_4052(unsignedchari)
{
switch(i)
{
case0:
EXA=0;
EXB=0;
break;
case1:
EXA=1;
EXB=0;
break;
case2:
EXA=0;
EXB=1;
break;
case3:
EXA=1;
EXB=1;
break;
default:
EXA=0;
EXB=0;
break;
}
}
初始化芯片8255
voidset_8255()
{
delay_1ms(1000);
COMM8255=0x82;
PA8255=0x80;
PC8255=0xfc;
}
打开蜂鸣器
voidspeak_on()
{
PC8255&=0xF7;//将8255PC口的第3位置0
}
关闭蜂鸣器
voidspeak_off()
{
PC8255|=0x08;//将8255PC口的第3位置1
}
蜂鸣器的开关是由芯片8255的C口第三位来控制的。
当将该位置0时,蜂鸣器开始工作;当置1时,蜂鸣器停止工作。
这样就可以提示硬件马上开始工作。
5.2EEPROM数据读写操作模块
该模块的设计主要是实现对AT24C02芯片的读写操作,代码如下所示。
从AT24C02读数据的函数代码如下所示:
charAT24C02Read(unsignedchar*_data,unsignedcharaddr,unsignedcharleng)
{//参数_data表示数据存放的缓冲区地址,addr表示偏移地址,leng表示数据长度
unsignedcharn;
chang_4052
(2);//选择4052芯片的通道2
//判断向I2C总线发送开始信号和从地址之后,有无响应信号
if(AT24C02DummyWrite(addr)==NOK)
{returnNOK;
}
AT24C02Start();//向I2C总线发送一个开始信号
if(AT24C02Nack()==NOK)//检查从器件是否接受一BYTE的数据
{
returnNOK;
}
//开始从I2C总线上接受数据
for(n=0;n { _data[n]=AT24C02GetByte(); AT24C02Ack();//向I2C总线发送一个数据接受完成信号 } AT24C02Stop();//向I2C总线发送一个停止信号 delay_1ms(30);//操作完成后调用延时程序,延时30ms returnOK; } 向AT24C02写入数据的函数实现代码如下所示: charAT24C02Write(unsignedchar*_data,unsignedcharaddr,unsignedcharleng) {//参数_data表示数据存放的缓冲区地址,addr表示偏移地址,leng表示数据长度 unsignedcharn; chang_4052 (2);//选择4052芯片的2号通道 AT24C02WP=0;//打开写保护 if(AT24C02DummyWrite(addr)==NOK) { returnNOK; } //开始向I2C总线上发送数据 for(n=0;n { AT24C02OutByte(_data[n]); if(AT24C02Nack()==NOK)//检查从器件是否接受一BYTE的数据 { returnNOK; } } AT24C02Stop();//向I2C总线发送一个停止信号 AT24C02WP=1;//关闭写保护 delay_1ms(30); returnOK; } 5.3数据显示模块 数据显示模块的设计就是将操作的数据显示出来,以便观察,来确定数据操作过程是否正确。 其实现代码如下所示。 4052芯片运行之前先要对其进行初始化,实现函数如下所示: voiddisp_initialize() { chang_4052 (1);//选择40522号通道 DIN=0; DIN=1; DCLK=1; LOAD=1; DOUT=1; send_disp_data(CH451_SETSYS,0x03);//设定系统参数 send_disp_data(CH451_SETDIS,0x80);//设定显示参数 } 数码显示过程就是向4052发送命令的过程,其中命令包括两部分,一部分是命令体,确定在那个LED上显示;另一部分是命令参数部分,确定要显示的数据值,其实现函数如下所示: voidsend_disp_data(unsignedcharcomm,unsignedchar_data) {//参数comm指定命令体,参数_data指定命令参数 unsignedchari; //送8BIT数据 for(i=0;i<8;i++) { DIN=(_data>>i)&0x01; DCLK=1; DCLK=0; DCLK=1; } //送4BIT命令 for(i=0;i<4;i++) { DIN=(comm>>i)&0x01; DCLK=1; DCLK=0; DCLK=1; } LOAD=1; LOAD=0; LOAD=1; } 在实际操作中,传送的都是一个整数,所以必须实现LED显示整数的功能,在这里用三个LED来显示一个8位二进制数。 其实现函数如下所示: voiddisplay_int(unsignedintm)//显示整数m { //用LOAD1、LOAD2和LOAD3来显示数 send_disp_data(CH451_LOAD0,0x10); send_disp_data(CH451_LOAD1,0x10); send_disp_data(CH451_LOAD2,0x10); if(m/10000) { send_disp_data(CH451_LOAD3,m/10000); } else { send_disp_data(CH451_LOAD3,0x10); } if((! (m/1000)%10)&&(! (m/10000))) { send_disp_data(CH451_LOAD4,0x10); } else { send_disp_data(CH451_LOAD4,(m/1000)%10); } send_disp_data(CH451_LOAD5,(m/100)%10); send_disp_data(CH451_LOAD6,(m/10)%10); send_disp_data(CH451_LOAD7,m%10); } 除了上述对数据的操作实现之外还要实现对按键中断的操作,key_data变量用来记录有按下操作的按键对应的值,这样就可以通过不同的按钮按下实现不同的数据操作,KEY1-KEY5的键值分别为: 0X40,0X49,0X52,0X5B,0X64。 按键中断实现代码如下所示。 voidkey()interrupt0 { unsignedchari,temp; EX0=0;//关中断 key_data=0; temp=0; send_comm(CH451_KEY); for(i=0;i<7;i++) { temp=DOUT; key_data=key_data|(temp<<(6-i)); DCLK=1; DCLK=0; DCLK=1; } EX0=1;//中断 } 5.4总体模块 总体模块的设计就是讲之前的所有模块整合起来,共同完成设计所要求的功能。 其代码实现如下所示。 unsignedcharkey_data=0;//记录有按下操作的按键对应的值 main() { unsignedchareep_temp[2]; unsignedchartemp=0; //MCU初始化 InitMCU(); set_8255();//初始化8255 //开关蜂鸣器,表示开始工作 speak_on(); delay_1ms(1000);//蜂鸣器发音延时 speak_off(); Display_TEST();//显示测试数据“12345678” eep_temp[1]=0x02; while (1) { if(key_data! =0)//若有键按下 { eep_temp[0]=0x01;//测试值 temp=key_data; key_data=0; switch(temp) { case0x40: //如果是KEY1按下 //将测试值写入EEPROM AT24C02Write(eep_temp,0,1); //并将测试值显示在LED上 display_int((int)(eep_temp[0])); break; case0x49: //如果是KEY2按下 AT24C02Read(eep_temp,0,1);//从EEPROM中读出数据 display_int((int)(eep_temp[0]));//并将读出的数据显示在LED上 break; case0x52: //如果是KEY3按下 AT24C02Write(eep_temp,1,1); display_int((int)(eep_temp[1])); break; case0x5B: //如果是KEY4按下 AT24C02Read(eep_temp,1,1); display_int((int)(eep_temp[1])); break; default: break; } } } } 5.5程序流程图 开始 初始化MCU 蜂鸣器开和关 显示初始化数据 键按下? 否 是 KEY4 KEY3 KEY2 KEY1 是是是是 向AT24C02写入eep_temp[1] 中的内容 从AT24C02读出数据,放入eep_temp[1] 中的内容 从AT24C02读出数据,放入eep_temp[0] 中的内容 向AT24C02写入eep_temp[0] 中的内容 图5.1程序流程图 6调试过程与测试结果 6.1调试过程 6.1.1程序编辑过程 进入KEILC开发环境。 首先根据I2C协议内容,编写I2C函数,由于AT24C02的I2C接口最大频率是400KHZ,所以在程序中对一个IO口操作完后,请延时2.5us(实验板上CPU晶振为11.0592MHZ,一个指令周期为1.08us)。 写好I2C读写函数后,可以对AT24C02进行操作。 AT24C02的写从地址为0XA0,写时WP要置0(打开写保护),写完后置为1;读从地址为0XA1。 先将CD4052的通道选为2,连接CPU与AT24C02。 将上述软件设计中的各模块设计编写成C文件,并添加到KEILC工程文件中,进行调试,如果有错误,则会在构造显示框中提示,找到错误并修改完成之后,编译成功后就会提示正在从“ExpBoard”产生HEX文件,并提示没有出错信息,则说明代码编写成功。 图6.1KEILC开发环境 6.1.2程序下载 程序成功编译成功生产HEX文件之后,打开联机下载软件,将HEX文件下载到89S52中,观看程序运行结果。 图6.2联机下载 6.2测试结果 如果程序编写正确,当将程序下载到89S52中后,则应该出现如下结果: 首先会听到蜂鸣器发音,之后8个LED就会显示预先加入的测试数据“12345678”,短暂显示之后就全部复位到0; 如果按下KEY1,则LOAD1~LOAD3会显示数001(这时相应的操作就是将eep_temp[0]中的数写入到AT24C02中)。 如果按下KEY2,LOAD1~LOAD3同样应该显示数001(这里相应的操作是从AT24C02中读出一个数,放入eep_temp[0]),这两次操作显示的数应该完全一样,否则数据读写出现错误。 如果按下KEY3,则LOAD1~LOAD3会显示数002(这时相应的操作就是将eep_temp[1]中的数写入到AT24C02中)。 如果按下KEY2,LOAD1~LOAD3同样应该显示数001(这里相应的操作是从AT24C02中读出一个数,放入eep_temp[1]),这两次操作显示的数应该完全一样,否则数据读写出现错误。 7总结与展望 这次课设其实对于我们来说是很难的,因为我们对硬件编
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EEPROM 器件 读写 例程 设计