eeprom试验报告.docx

上传人:b****8 文档编号:9713890 上传时间:2023-02-06 格式:DOCX 页数:18 大小:99.03KB
下载 相关 举报
eeprom试验报告.docx_第1页
第1页 / 共18页
eeprom试验报告.docx_第2页
第2页 / 共18页
eeprom试验报告.docx_第3页
第3页 / 共18页
eeprom试验报告.docx_第4页
第4页 / 共18页
eeprom试验报告.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

eeprom试验报告.docx

《eeprom试验报告.docx》由会员分享,可在线阅读,更多相关《eeprom试验报告.docx(18页珍藏版)》请在冰豆网上搜索。

eeprom试验报告.docx

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点的时候就放弃了,那我们永远都不能品尝这次实验成功带来的巨大喜悦,我们也会在微机原理课上记录下永恒的败笔。

还有就是合作的重要性。

由于我们都想彻底学好单片机,所以对于每个实验,我们都有各自的程序,实际每次实验,我们组都有两个不同的程序。

但当我们有困难的时候,不能只顾着自己攻关。

一个人的力量毕竟有限,而随着任务难度的增加,肯定会出现一个人不能解决的问题,这时候就需要分工合作了。

由此看来,我们组的合作一直存在一个误区,这也是我们组以后需要改进的地方。

从技术的角度来说,这次我们组程序的编写并没有走错方向,都是一些小错误,但由于这个程序经较复杂,所以严重影响了我们的心态。

其实如果心态好的话,可以想出检测方案,而不会无从下手。

最后我们的解决方法是软硬结合,结合示波器显示的波形,对照软件来逐步解决问题。

所以如果有无法确定的错误,首先要考虑的是如何确定错误的地方,把可能性缩小到一个很小的范围,这样就能很快解决问题。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1