参考郭天祥程序,写了一个掉电保存实验,按键数码管显示1-60,可复位
使用stc89c52单片机
//****************EEPROM.h文件**********
#ifndef __EEROM_H_
#define __EEROM_H_
#include"eerom.h"
#include"common.h"
#include"reg51.h"
// ********定义ISP的寄存器地址
sfr ISP_DATA=0XE2;
sfr ISP_ADDRH=0XE3;
sfr ISP_ADDRL=0XE4;
sfr ISP_CMD=0XE5;
sfr ISP_TRIG=0XE6;
sfr ISP_CONTR=0XE7;
//*************定义ISP的操作命令************
#define RDCMD 0X01 //读命令
#define PRGCMD 0X02 //写命令
#define ERACMD 0X03 //擦除命令
#define error 1
#define ok 0
#define waittime 0x01 //定义CPU等待时间
extern uchar code table[10];
extern uchar byte_read(uint byte); //eeprom字节读取
extern void sectorErase(uint sector); //擦除扇区
extern void ISPgoon();
extern void ISP_disen();
extern void byte_write(uint addr,uchar dat); //写
#endif
*******************************************************************
*************eeprom.文件**********************
#include"EEROM.h"
#include
//************eerom掉电保存程序***********
//************打开ISP,IAP功能************
void ISP_en()
{
EA=0;
ISP_CONTR=ISP_CONTR&0X18;
ISP_CONTR=ISP_CONTR|waittime; //写入硬件延时
ISP_CONTR=ISP_CONTR|0x80; //ispen=1
}
//************关闭ISP功能***************
void ISP_disen()
{
ISP_CONTR=ISP_CONTR&0x7f; //ispen=0
ISP_TRIG=0X00;
EA=1;
}
//***********公用触发代码*************
void ISPgoon()
{
ISP_en(); //打开ISP功能
ISP_TRIG=0X46; //触发ISP命令字节1
ISP_TRIG=0Xb9; //触发命令字节2
_nop_();
}
//************字节读******************
uchar byte_read(uint byte)
{
ISP_ADDRH=(uchar)(byte>>8); //地址赋值
ISP_ADDRL=(uchar)(byte&0x00ff);
ISP_CMD=ISP_CMD&0XF8; //清除低3位
ISP_CMD=ISP_CMD|RDCMD; //写入命令
ISPgoon();
ISP_disen(); //关闭功能
return (ISP_DATA);
}
//**********扇区擦除***********************
void sectorErase(uint sector)
{
uint isector;
isector=(sector &0xfe00); //取扇区地址
ISP_ADDRH=(uchar)(isector>>8); //地址赋值
ISP_ADDRL=0X00;
ISP_CMD=ISP_CMD&0XF8; //清除低3位
ISP_CMD=ISP_CMD|ERACMD; //擦除命令3
ISPgoon();
ISP_disen(); //关闭功能
}
//**********字节写**************************
void byte_write(uint addr,uchar dat)
{
ISP_ADDRH=(uchar)(addr>>8); //取地址
ISP_ADDRL=(uchar)(addr&0x00ff);
ISP_CMD=ISP_CMD&0XF8; //清除低3位
ISP_CMD=ISP_CMD|PRGCMD; //写命令
ISP_DATA=dat; //写入数据准备
ISPgoon();
ISP_disen(); //关闭功能
}
**********************************************************
***************common.h文件**************************
#ifndef __COMMON_H_
#define __COMMON_H_
typedef unsigned char uchar;
typedef unsigned int uint;
#endif
*******************************************************
**************delay.c文件**************************
#include "delay.h"
#include
//********************************************
//* 1ms延时,晶振采用11.0592MHZ,根据需要更改
//********************************************
static void Delay1ms() //@11.0592MHz
{
uchar i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
//*************ms延时函数**********************
void delay_ms(uint ms)
{
uint t;
for(t=0;t
{
Delay1ms();
}
}
***************************************************
**************main.c文件*************************
#include"EEROM.h"
#include"delay.h"
#include
//**********单片机eeprom掉电保存实验******
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar num;
sbit key =P1^0; //计数复位按键
//*********定时器0初始化
void time0_init()
{
TMOD=0X01;
TH0=0X4C;
TL0=0X00; //50MS定时
EA=1; //开放总中断
ET0=1; //定时器0中断启动
TR0=1; //开放T0运行控制位
}
//************数码管显示函数******
void dis(uchar t,uchar b)
{
P0=table;
P2=0XFE; //显示个位
delay_ms(1);
P0=table[t];
P2=0xfd; //显示十位
delay_ms(1);
}
void main()
{
uchar a,b, num1=0;
time0_init(); //定时器T0初始化
num1=byte_read(0x2000); //开始读EEROM数据
if(num1>=60) //防止首次上电时出错
num1=0;
while(1)
{
if(num>=20) //1s时间到
{
num=0;
num1++;
if(!key) //按键按下
{
delay_ms(10); //消抖
if(!key)
{
num1=0;
while(!key); //直至松手
}
}
sectorErase(0x2000); //擦除扇区
byte_write(0x2000,num1); //写数据
if(num1==60) //写到60时归0
{
num1=0;
}
a=num1/10;
b=num1%10;
}
dis(a,b);
}
}
// *****定时器0中断服务函数
void time0()interrupt 1
{
TH0=0x4c; //50ms定时
TL0=0x00;
num++;
}
大功告成
;t++)<>
文章评论(0条评论)
登录后参与讨论