eeprom试验报告.docx
《eeprom试验报告.docx》由会员分享,可在线阅读,更多相关《eeprom试验报告.docx(18页珍藏版)》请在冰豆网上搜索。
eeprom试验报告
EEPROM实验报告
1实验目的
1.1Eeprom的应用
Eeprom是单片中的一个存储空间,一般用来存储在处理过程中可读写而且在断电之后希望保存的信息,这样就可以通过把数据写在eeprom中达到上述目的
1.2Eeprom的原理
Eeprom的中文名称是电可擦除可编程只读存储器。
通过他的中文名称就很容易的知道了它的作用了。
它和MCU之间是通过I2C来连接的,因为在51单片机中没有I2C接口所以是用两个I/O来模拟I2C的接口的,这样来实现eeprom和MCU之间的通信
2实验原理
2.1用I/O口模拟I2C
这次实验的最主要的部分就是利用I/O口来实现I2C的功能,这样来实现MCU和eeprom之间的通信。
在我们组的单片机中利用的实P1.5和P1.6来模拟I2C的SCL和SDA两根线。
其中SCL是时钟线,SDA是数据线,
2.2I2C读取数据的时序图
图1开始&结束信号
图2数据变化的位置
图3确认信号的位置
图4片选信号的值
图5写一个字节的时序图
图6读取特定地址数据的时序图
2.3实验流程图
2.3.1主函数流程图
图7主函数流程图
2.3.2数据读取流程图
图8数据读取流程图
2.3.3数据发送流程图
图9数据发送流程图
2.3.4定时器0中断流程图
图10定时器0中断流程图
2.3.5Change()函数流程图
图11Change()函数流程图
3实验过程
3.1编写并编译eeprom的程序
程序是通过在单片机上的四个LED分成两组,前两个用来显示地址,后两位用来显示地址中的数据,在通过四个剑客以调节这四个数据,然后在单片机的键盘上设定两个键,一个键是读数据的还有一个键是写数据的
3.2下载程序到控制器并观察现象
先把数据写入eeprom中,在复位之后再把地址为数据调到刚刚写时候的那个地址,在按下读数据键,如果显示的是刚才写进去的数据的话,就说明读写已经成功。
3.3程序代码
#include
#include
#defineucharunsignedchar
#defineTime(65537-1000)
#defineN20
voidINIT(void);
ucharReadByte(ucharByte);
voidDelay(uchari);
voidStart(void);
voidStop(void);
bitSendByte(ucharByte);
voidDisplay(void);
voidCheckLow(void);
voidChange(void);
voidWack(void);
voidWNack(void);
ucharReceiveData(void);
voidWriteByte(ucharAddr,ucharData);
bitCheckAck(void);
bitLowFlag;
bitFlag;
bitHighFlag;
bitHHighFlag;
bitCon_Flag;
bitCon_Flag;
bitChangeFlag;
ucharReData;
ucharLedNO;
ucharKeyValue;
ucharCount;
ucharCount2;
uchari;
ucharBuffer[4];
sbitSCL=P1^5;
sbitSDA=P1^6;
ucharcodeLedData[16]={0xaf,0x0a,0xc7,0x4f,0x6a,0x6d,0xed,0x0b,0xef,0x6f,0xeb,0xec,0xa5,0xcf,0xf1};
ucharcodeKeyNO[3]={0x30,0x28,0x18};
voidmain(void)
{
INIT();
for(;;)
{
if(Con_Flag&&ChangeFlag)
{
Change();
Con_Flag=0;
ChangeFlag=0;
}
}
}
voidStart(void)
{
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
SCL=0;
}
voidStop(void)
{
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
SCL=0;
}
bitSendByte(ucharByte)
{
ucharByte_num;
for(Byte_num=0;Byte_num<8;Byte_num++)
{
if(((Byte<{
SCL=0;
_nop_();
_nop_();
SDA=1;
_nop_();
SCL=1;
}
else
{
SCL=0;
_nop_();
_nop_();
SDA=0;
_nop_();
SCL=1;
}
}
_nop_();
_nop_();
_nop_();
SCL=0;
returnCheckAck();
}
voidWack(void)
{
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
SCL=0;
SDA=1;
}
voidWNack(void)
{
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
SCL=0;
SDA=0;
}
bitCheckAck(void)
{
bitflag;
SDA=1;
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
flag=SDA;
SCL=0;
_nop_();
returnflag;
}
ucharReceiveData(void)
{
ucharByte_num;
uchartemp;
for(Byte_num=0;Byte_num<8;Byte_num++)
{
temp<<=1;
SDA=1;
SCL=1;
_nop_();
_nop_();
if(SDA)temp|=0x01;
SCL=0;
}
Wack();
returntemp;
}
ucharReadByte(ucharADDR)
{
uchartemp;
loop:
Start();
if(SendByte(0xa0)==0)
{
if(SendByte(ADDR)==0)
{
Start();
if(SendByte(0xa1)==0)
temp=ReceiveData();
elsegotoloop;
}
elsegotoloop;
}
elsegotoloop;
WNack();
Stop();
returntemp;
}
voidWriteByte(ucharAddr,ucharData)
{
next:
Start();
if(SendByte(0xa0)==0)
{
if(SendByte(Addr)==0)
{
if(SendByte(Data)!
=0)gotonext;
}
else
gotonext;
}
else
gotonext;
Stop();
}
voidINIT(void)
{
TMOD=0x01;
EA=1;
TR0=1;
ET0=1;
SCL=1;
SDA=1;
}
/*voidReACK(void)
{
}
*/
voidTimer0(void)interrupt1
{
TL0+=Time;
if(CY)TH0++;
TH0+=Time>>8;
Display();
CheckLow();
if(Flag)LowFlag=1;
if(LowFlag&&((Count++)>=N)&&Flag)
{
Con_Flag=1;
LowFlag=0;
Count=0;
}
if(HighFlag)HHighFlag=1;
if(HHighFlag&&((Count2++)>=N)&&Flag)
{
ChangeFlag=1;
HHighFlag=0;
Count2=0;
}
}
voidDisplay(void)
{
ucharPOSI=0x01;
P1&=0xf0;
P1|=(POSI<if(LedNO==1)P2=LedData[Buffer[1]]+0x10;
elseP2=LedData[Buffer[LedNO]];
if((LedNO++)>=3)LedNO=0;
}
voidCheckLow(void)
{
ucharChk_Sgl=0x01;
uchartemp;
uchari,j;
Flag=0;
for(i=0;i<3;i++)
{
P0|=0x3f;
P0^=Chk_Sgl;
Chk_Sgl<<=1;
temp=P0;
temp&=0x38;
if((temp^0x38))
{
for(j=0;j<3;j++)
if(temp==KeyNO[j])
{
KeyValue=3*i+j;
Flag=1;
}
}
}
if(!
Flag)HighFlag=1;
elseHighFlag=0;
}
voidChange(void)
{
ucharAddr1;
ucharAddr2;
ucharData2;
{
if(KeyValue<4&&(Buffer[KeyValue]++)>=15)Buffer[KeyValue]=0;
if(KeyValue==7)
{
Addr1=Buffer[1]*16+Buffer[0];
ReData=ReadByte(Addr1);
Buffer[3]=ReData/16;
Buffer[2]=ReData%16;
}
if(KeyValue==8)
{
Addr2=Buffer[1]*16+Buffer[0];
Data2=Buffer[3]*16+Buffer[2];
WriteByte(Addr2,Data2);
}
}
}
4遇到的问题及心得
这次实验的过程太激动人心了,直到29日11点都基本没有任何进展,就在我们快要绝望的时候,我们决定放弃修改各自的程序,转为修改队友的程序。
到11点半,所有的问题都解决了!
从这次实验,我们明白了任何时候都不要放弃。
就算还有一丝希望,事情就会有转机。
如果我们在11点的时候就放弃了,那我们永远都不能品尝这次实验成功带来的巨大喜悦,我们也会在微机原理课上记录下永恒的败笔。
还有就是合作的重要性。
由于我们都想彻底学好单片机,所以对于每个实验,我们都有各自的程序,实际每次实验,我们组都有两个不同的程序。
但当我们有困难的时候,不能只顾着自己攻关。
一个人的力量毕竟有限,而随着任务难度的增加,肯定会出现一个人不能解决的问题,这时候就需要分工合作了。
由此看来,我们组的合作一直存在一个误区,这也是我们组以后需要改进的地方。
从技术的角度来说,这次我们组程序的编写并没有走错方向,都是一些小错误,但由于这个程序经较复杂,所以严重影响了我们的心态。
其实如果心态好的话,可以想出检测方案,而不会无从下手。
最后我们的解决方法是软硬结合,结合示波器显示的波形,对照软件来逐步解决问题。
所以如果有无法确定的错误,首先要考虑的是如何确定错误的地方,把可能性缩小到一个很小的范围,这样就能很快解决问题。