文档库 最新最全的文档下载
当前位置:文档库 › 51单片机EEPROM实验程序

51单片机EEPROM实验程序

#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90 };

#define RDcommand 0x01 //宏定义即设置:RDcommand=0x01
#define Prgcommand 0x02
#define Erasecommand 0x03

sfr ISP_DATA=0xe2; //定义与EEPROM相关的六个寄存器
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;

uint a,num;

void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}

void display(uchar dat) //数码管显示子程序
{
P0=0xfe;
P1=table[dat/1000];
delay(1);

P0=0xfd;
P1=table[dat%1000/100];
delay(1);

P0=0xfb;
P1=table[dat%100/10];
delay(1);

P0=0xf7;
P1=table[dat%10];
delay(1);
}

void ISP_enable() //设置允许对ISP进行操作,即允许对EEPROM进行操作
{
EA=0; //关闭总中断
ISP_CONTR=0x83; //设置ISPEN位和EEPROM操作等待时间
}

void ISP_disable() //设置禁止操作EEPROM
{
ISP_CONTR=0x00;
ISP_TRIG=0x00;
EA=1;
}

void ISP_goon() //运行EEPROM相应操作
{
ISP_enable();
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
delay(1);
}

uchar byte_read(uint addr) //读EEPROM
{
ISP_ADDRH=addr>>8;
ISP_ADDRL=addr&0x00ff;
ISP_CMD=ISP_CMD&0xf8;
ISP_CMD=ISP_CMD|RDcommand;
ISP_goon();
ISP_disable();
return(ISP_DATA);
}

void bytr_write(uint addr,uchar dat) //写EEPROM
{
ISP_ADDRH=addr>>8;
ISP_ADDRL=addr&0x00ff;
ISP_CMD=ISP_CMD&0xf8;
ISP_CMD=ISP_CMD|Prgcommand;
ISP_DATA=dat;
ISP_goon();
ISP_disable();
}

void sector_erase(uint addr) //EEPROM删除
{
ISP_ADDRH=addr>>8;
ISP_ADDRL=0x00;
ISP_CMD=ISP_CMD&0xf8;
ISP_CMD=ISP_CMD|Erasecommand;
ISP_goon();
ISP_disable();
}

void main()
{
TMOD=0x01; //定时器设置,完成秒表功能
EA=1;
ET0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;

num=byte_read(0x2000); //读取EEPROM第一扇区保存的数据
if(num>255)
num=0;

while(1)
{
if(a>=20)
{
a=0;
num++;
if(num>255)
num=0;
sector_erase(0x2000); //每秒向第一扇区写入数据,写之前要先对扇区进行删除操作
bytr_write(0x2000,num); //向扇区写入数据
display(num); //同时将收据通过数码管显示
}

}
}

void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
}

/*
EEPROM读过程:设置ISP_CMD为0x01即读EEPEOM,设置读取地址,设置允许对EEPROM进行操作,写触发寄存器0x46、0xb9,设置关闭EEPROM操作。
EEPROM写过程:设置ISP_CMD为0x02即写EEPEOM,设置写地址,设置写的数据,设置允许对EEPROM进行操作,写触发寄存器0x46、0xb9,设置关闭EEPROM操作。
EEPROM读过程:设置ISP_CMD为0x03即EEPEOM删除,设置删除地址,设置允许对EEPROM进行操作,写触发寄存器0x46、0xb9,

设置关闭EEPROM操作。

注:在对EEPROM进行写时先对其进行删除操作,然后再向其中写数据。
本程序主要完成用定时器来控制要写入EEPROM的数据,但系统掉电重启时,程序会从EEPROM中读取掉电前存入EEPROM中的数据。继续上次的数在数码管上显示

实验课所写实验的程序,只是完成了EEPROM的基本操作,再掌握基本操作过后,可适当进行扩展,比如上面的程序
程序综合的实验有:数码管显示、定时器秒表实验、EEPROM读写删除操作
*/

相关文档
相关文档 最新文档