tag 标签: 单片机,eeprom,掉电保存

相关博文
  • 热度 6
    2014-8-27 21:03
    2017 次阅读|
    0 个评论
    参考郭天祥程序,写了一个掉电保存实验,按键数码管显示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 ; 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_CONTR0X18; ISP_CONTR=ISP_CONTR|waittime; //写入硬件延时 ISP_CONTR=ISP_CONTR|0x80; //ispen=1 }   //************关闭ISP功能*************** void ISP_disen() { ISP_CONTR=ISP_CONTR0x7f; //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)(byte8); //地址赋值 ISP_ADDRL=(uchar)(byte0x00ff); ISP_CMD=ISP_CMD0XF8; //清除低3位 ISP_CMD=ISP_CMD|RDCMD; //写入命令 ISPgoon(); ISP_disen(); //关闭功能 return (ISP_DATA); }   //**********扇区擦除*********************** void sectorErase(uint sector) { uint isector; isector=(sector 0xfe00); //取扇区地址 ISP_ADDRH=(uchar)(isector8); //地址赋值 ISP_ADDRL=0X00; ISP_CMD=ISP_CMD0XF8; //清除低3位 ISP_CMD=ISP_CMD|ERACMD; //擦除命令3 ISPgoon(); ISP_disen(); //关闭功能 }   //**********字节写************************** void byte_write(uint addr,uchar dat) { ISP_ADDRH=(uchar)(addr8); //取地址 ISP_ADDRL=(uchar)(addr0x00ff); ISP_CMD=ISP_CMD0XF8; //清除低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 ; P2=0XFE; //显示个位 delay_ms(1);   P0=table ; 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++)