还剩8页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
实验七EEPROM读写实验实验报告姓名学号:~实验内谷在实验七的基础上实现把串口发送的控制码保存在EEPROM型号为AT24co2中,下次开机或复位后可以从AT24C02中读出上次保存的控制码,并根据控制码执行相应的控制功能串口通信的控制功能不变,控制功能表见表8-1表8-1控制功能表
二、相关知识
1、IIC总线的五个核心函数声明函数并说明功能voidI2cDelay;〃约4us的延迟voidI2cStartvoid;//产生起始信号voidI2cStopvoid;〃产生终止信号bitI2cWriteByteunsignedchardat;〃总线写操作unsignedcharI2cReadBytebitACK;//总线读操作
2、简述AT24C02的地址控制字格式,它的容量是多大AT24co2的芯片地址为1010其地址控制字格式为1010A2A1A0R/W其中A
2、AlA0为可编程的地址选择位,A
2、AkA0引脚接高、低电平后得到确定的3位编码,与1010组成7位编码即该器件的地址码RAV为芯片读写控制位,该位为0表示对芯片进行写操作;该位为1表示对芯片进行读操作AT24co2存储容量为2Kb
3、简要说明EEPROM芯片AT24c02单字节读写原理单字节写入方式1首先是12c的起始信号,接着是首字节,也就是前边所讲的PC的器件地址并且在读写方向上选择“写”操作2发送数据的存储地址AT24C02共256B的存储空间,地址从0x00~0xF、需要把数据存储在哪个位置,此刻写的就是哪个地址3发送要存储的8位数据注意,在写数据的过程中,EEPROM每个字节都会回应个“应答位0”,用以提示写EEPROM数据成功如果没有回应应答位,则说明写入不成功指定地址单字节读操作1首先是12c的起始信号,接着是首字节,也就是前边所讲的12c的器件地址,并且在读写方向上选择“写”操作注意,这一步依然是“写”,之所以选择写操作,是为了把所要读的数据的存储地址先写进去,告诉EEPROM要读取哪个地址的数据2发送要读取的数据的地址,注意是地址而非存在于EEPROM中的数据3重新发送12c起始信号和器件地址,并且在方向位选择“读”操作前3步中,每一个字节实际上都是在“写”,所以每一个字节EEPROM都会回应一个应答位0”4读取从器件发回的数据,读一个字节,并发送非应答位ACKl
六、心得体会本次实验学习了12c总线和EEPROM读写实验学习12c总线时我注意到12c总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高进行EEPROM读写实验时我注意到在写数据的过程中,每成功写入一个字节,EEPROM存储空间的地址就会自动加1当加到OxFF后,再写一个字节,地址就会溢出又变成0x00o我还注意到EEPROM是先写到缓冲区,然后再“搬运到”到掉也非易失区所以这个过程需要一定的时间,AT24co2这个过程是不超过5ms如果在这个时候去让它应答是没有响应的所以,当我们在写多个字节时,写入一个字节之后,再写入下一个字节之前,必须等待EEPROM再次响应才可以
4、根据教材P176页图9-5写出AT24C02单字节写程序voidAt24cO2WriteByteunsignedcharaddrunsignedchardatI2cStart;I2cWriteByte0xa0;I2cWriteByteaddr;I2cWriteBytedat;I2cStop;}
5、根据教材P177页图9・7写出AT24C02从指定地址中读取数据程序unsignedcharAt24cO2ReadByteunsignedcharaddr{unsignedcharnum;I2cStart;I2cWriteByte0xa0;I2cWriteByteaddr;I2cStart;I2cWriteByte0xal;num=I2cReadByte1;I2cStop;returnnum;}
三、硬件电路请画出单片机与AT24c02的接口电路,并对电路进行分析U1VCCciAT24C02Jo.1u:1TGND6SCL5SDAGND其中A
2、AKA0与WP都接地,SDA接单片机P
3.6引脚,SCL接单片机P
3.7引脚SDA与SCL分别于VCC之间接一
4.7k的上拉电阻,因为AT24C02总线内部是漏极开漏形式,不接上拉电阻无法确定总线空闲时的电平状态U1画出主程序流程图:主程序及注释#includenreg
52.hH#includedelay.h#includenintrins.hinclude“EEPROM.h”#includeuart.h#includendecoder.hnvoidReadAt24c02void;voidmainSelectHC1380;ConfigUART9600;ReadAt24cO2;whilel;voidReadAt24c02voidswitchAt24c02ReadByte0x00caseO:PO=OXff;break;caseT:P0=0X7f;BEEP=1;whileAt24c02ReadByte0==Tdelay_ms100;P0=_cror_P0l;break;PO=OXFE;BEEP=1;whileAt24c02ReadByte0=2delay_ms100;PO=_crol_POl;break;BEEP=1;whileAt24c02ReadByte0=3PO=OXFF;delay_ms100;PO=OXOO;delay_ms100;break;case4:whileAt24c02ReadByte0==4PO=OXff;BEEP=0;break;voidInterruptUARTvoidinterrupt4switchSBUFcaseO:At24c02WriteByte0x00;0f;ifRI{RI=0;BEEP=1;SendByteCO1;P0=0XFF;break;caseT:At24c02WriteByte0x00;r;ifRIRI=0;P0=0X7f;BEEP=1;SendBytefT;whileSBUF==Tdelay_ms100;P0=_cror_P0l;break;At24c02WriteByte0x00;2f;ifRIRI=O;PO=OXFE;BEEP=1;SendByte”;whileSBUF==2delay_ms100;PO=_crol_POl;break;At24c02WriteByte0x00;3;ifRIRI=O;BEEP=1;SendByteC3f;whileSBUF==3PO=OXFF;delay_ms100;PO=OXOO;delay_ms100;break;case4:At24co2WriteByteOxOO4;ifRI{RI=O;SendByte4;whileSBUF==4BEEP=0;PO=OXff;break;]其它自定义的头文件程序及注释datatype.h文件#ifndefDATA_TYPE_H#defineDATA_TYPE_Htypedefbit_bool;//布尔型变量typedefunsignedcharuint8;//无符号8位整型变量typedefsignedcharint8;//有符号8位整型变量typedefunsignedshortuintl6;//无符号16位整型变量typedefsignedshortintl6;//有符号16位整型变量typedefunsignedintuint32;//无符号32位整型变量typedefsignedintint32;//有符号32位整型变量typedeffloatfp32;//单精度浮点数32位长度typedefdoublefp64;〃双精度浮点数64位长度#endifi
2.h文件#ifndef_I2C_H_#define_I2C_H_#includereg
52.hsbitSCL=P3A7;sbitSDA=P3A6;voidI2cStartvoid;voidI2cStopvoid;bitI2cWriteByteunsignedchardat;unsignedcharI2cReadBytebitACK;#endifi
2.c文件includeni2c.hn#includeintrins.h#defineI2cDelay{_nop_;_nop_;_nop_;_nop_;}voidI2cStartvoid{SDA=1;SCL=1;I2cDelay;SDA=0;I2cDelay;SCL=0;I2cDelay;voidI2cStopvoidSDA=0;SCL=0;I2cDelay;SCL=1;I2cDelay;SDA=1;I2cDelay;bit12cWriteByteunsignedchardatunsignedchari=0;bitack;fori=0;i8;i++SDA=dat»7;dat=dat«1;12cDelay;SCL=1;I2cDelay;SCL=O;I2cDelay;SDA=1;I2cDelay;SCL=1;ack=SDA;I2cDelay;SCL=O;return〜ack;unsignedcharI2cReadBytebitACKunsignedchari=Odat=O;SDA=1;I2cDelay;fori=0;i8;i++SCL=1;T2cDelay;dat«=1;dat|=SDA;I2cDelay;SCL=O;I2cDelay;SDA=ACK;I2cDelay;SCL=1;I2cDelay;SCL=O;returndat;uart.h文件#ifndef_UART_H_#define_UART_H_#includedatatype}”voidSendByteuint8dat;voidConfigUARTuintl6baud;#endifuart.c文件#includenuart.hn#includereg
52.h”#includendatatype.hnvoidSendByteuint8datSBUF=dat;while!TI;TI=O;voidConfigUARTuintl6baud{SCON=0X50;//8位数据,可变波特率TMOD=OXOF;〃设定定时器1为16位自动重装方式TMOD|=0X20;TH1=256-11059200/12/32/baud;TLl=THl;〃设定定时器初值ET1=O;〃静止定时器1中断TR1=1;ES=1;〃打开串口中断EA=1;delay.h文件#ifndefDELAY_H#defineDELAY_H/*********类型定义*********/typedefunsignedcharu8;typedefunsignedintul6;voiddelay_msul6ms;#endifdelay.c文件#includedelay.h/*********毫秒延□寸*********/voiddelay_msul6msul6xy;forx=ms;x0;x-fory=114;y0;y—;decoder.h文件#ifndef_DECODE_H_#define_DECODE_H_#includendatatype.hnvoidSelectHC138uint8channel;#endifdecoder.c文件#include”reg
52.h#includedecoder.h#includedatatype.hnvoidSelectHC138uint8channelswitchchannelcase0:Pl=Pl0xlf|0x00;break;//发光二极管LEDSOEEPROM.h文件#ifndef_I2C_H_#define_I2C_H_#includereg
52.hsbitSCL=P3A7;sbitSDA=P3八6;voidI2cStartvoid;voidI2cStopvoid;bitI2cWriteByteunsignedchardat;unsignedcharI2cReadBytebitACK;#endifEEPROM.c文件include“EEPROM.hinclude”i2c.h”voidAt24cO2WriteByteunsignedcharaddrunsignedchardatI2cStart;I2cWriteByte0xa0;I2cWriteByteaddr;I2cWriteBytedat;I2cStop;unsignedcharAt24cO2ReadByteunsignedcharaddrunsignedcharnum;I2cStart;I2cWriteByte0xa0;I2cWriteByteaddr;I2cStart;I2cWriteByte0xa1;num=I2cReadByte1;I2cStop;returnnum;}
五、思考题程序首次运行时,从AT24C02读出的可能是非法数据,这种情况应该如何处理给这些数据加上校验信息,如果检测校验信息错误,就可以认为是第一次上电,把默认值写进去,如果校验值正确,就读取出来控制码控制功能0熄灭1LED从上往下循环2LED从下往上循环3LED闪烁4蜂鸣器响。