




免费预览已结束,剩余40页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
此文档共包含三个程序。第一个程序最简单易懂,看懂了基本就会读写51单片机内部EEPROM了。第二个程序和第一个读写EEPROM原理差不多,包含有LCD1602操作方法,有写字符串的方法。第三个程序在原有基础上增加了外部中断功能,细心的人会发现,操作内部EEPROM过程会将总中断关闭,实际上程序要用到中断时只需在原有的EEPROM操作后加上开总中断即可。验证第二、第三个程序时需按程序内主程序中的操作说明进行烧录单片机,以验证是否成功操作单片机内部EEPROM。程序1:/* 作品:EEPROM实验,开机还原关电前LED的亮灭状况 单片机:STC89C52RC 晶振:12M编译环境:Keil uVision4 V9.00*/ /#include #include #include #define uchar unsigned char #define uint unsigned int /*特殊功能寄存器声明*/sfr ISP_DATA = 0xe2; sfr ISP_ADDRH = 0xe3; sfr ISP_ADDRL = 0xe4; sfr ISP_CMD = 0xe5; sfr ISP_TRIG = 0xe6; sfr ISP_CONTR = 0xe7;sbit LED1 = P20;sbit LED2 = P21;sbit K1 = P32; /按钮1sbit K2 = P33; /按钮2void cc(uint addr);void xcx(uint addr,uchar dat);uchar dcx(uint addr);void Q0();/*函数:主程序*/*void main(void) uchar V; V = dcx(0x2002); / 开机读取EEPROM区2002h数据,还原关电前LED的亮灭状况 if(V = 2) LED1=0;LED2=1; else if(V = 6)LED1=0;LED2=0; while(1) if(!K1) while(!K1); LED1=0;LED2=1; cc(0x2000); / 擦除第1个扇区(2000h21FFh) xcx(0x2002,2); / 对EEPROM区2002h写入2 if(!K2) while(!K2); LED1=0;LED2=0; cc(0x2000); / 擦除第1个扇区(2000h21FFh) xcx(0x2002,6); / 对EEPROM区2002h写入6 */*函数:擦除某一扇区(每个扇区512字节)入口:addr = 某一扇区首地址 */void cc(uint addr)/ 打开 IAP 功能(ISP_CONTR.7)=1:允许编程改变Flash, 设置Flash操作等待时间/ 0x83(晶振5M) 0x82(晶振10M) 0x81(晶振20M) 0x80(晶振8; / ISP/IAP操作时的地址寄存器高八位。 EA =0; ISP_TRIG = 0x46; / 在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h, ISP_TRIG = 0xB9; / 再写入B9h,ISP/IAP命令才会生效。 _nop_(); Q0(); / 关闭ISP/IAP/*函数:写一字节入口:addr = 扇区单元地址 , dat = 待写入数据*/void xcx(uint addr,uchar dat) ISP_CONTR = 0x81; ISP_CMD = 0x02; / 用户可以对Data Flash/EEPROM区进行字节编程 ISP_ADDRL = addr; ISP_ADDRH = addr8; ISP_DATA = dat; / 数据进ISP_DATA EA = 0; ISP_TRIG = 0x46; ISP_TRIG = 0xB9; _nop_(); Q0(); / 关闭ISP/IAP/*函数:读一字节入口:addr = 扇区单元地址出口:dat = 读出的数据*/uchar dcx(uint addr) uchar dat;ISP_CONTR = 0x81; ISP_CMD = 0x01; / 用户可以对Data Flash/EEPROM区进行字节读 ISP_ADDRL = addr; ISP_ADDRH = addr8; EA = 0; ISP_TRIG = 0x46; ISP_TRIG = 0xB9; _nop_(); dat = ISP_DATA; / 取出数据Q0(); / 关闭ISP/IAP return dat;/*函数:关闭ISP/IAP操作*/void Q0() ISP_CONTR = 0; / 关闭IAP功能 ISP_CMD = 0; / 待机模式,无ISP操作 ISP_TRIG = 0; / 关闭IAP功能, 清与ISP有关的特殊功能寄存器 /*STC89C52RC内部EEPROM详细地址表:第一扇区 第二扇区 第三扇区 第四扇区起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址2000h 21FFh 2200h 23FFh 2400h 25FFh 2600h 27FFH第五扇区 第六扇区 第七扇区 第八扇区起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址2800h 29FFh 2A00h 2BFFh 2C00h 2DFFh 2E00h 2FFFh*/程序2:/* 作品:EEPROM实验,开机还原关电前LED的亮灭状况 单片机:STC89C52RC 晶振:12M编译环境:Keil uVision4 V9.00*/ /#include #include #include #define uchar unsigned char #define uint unsigned int /*特殊功能寄存器声明*/sfr ISP_DATA = 0xe2; sfr ISP_ADDRH = 0xe3; sfr ISP_ADDRL = 0xe4; sfr ISP_CMD = 0xe5; sfr ISP_TRIG = 0xe6; sfr ISP_CONTR = 0xe7;sbit LED1 = P20;sbit LED2 = P21;sbit K1 = P32; /按钮1sbit K2 = P33; /按钮2void cc(uint addr);void xcx(uint addr,uchar dat);uchar dcx(uint addr);void Q0();#ifndef uchar#define uchar unsigned char#endif#ifndef uint #define uint unsigned int#endif/*PIN口定义*/#define LCD1602_DATAPINS P0sbit LCD1602_E=P27;sbit LCD1602_RW=P25;sbit LCD1602_RS=P26;/*函数声明*/*在51单片机12MHZ时钟下的延时函数*/void Lcd1602_Delay1ms(uint c); /误差 0us/*LCD1602写入8位命令子函数*/void LcdWriteCom(uchar com);/*LCD1602写入8位数据子函数*/void LcdWriteData(uchar dat);/*LCD1602初始化子程序*/void LcdInit();/*LCD1602写入字符串*/void LCDWrite_String(uchar x, uchar y,uchar z, uchar *s);/*设置LCD1602写入字符串的位置*/void LCD_set_xy(uchar x, uchar y, uchar z);uchar ON_Hour=0x07; /初始开灯时间 07:00 1uchar Warning_TempH=32; /高温报警温度 5/*函数:主程序*/*void main(void) uchar V; V = dcx(0x2002); / 开机读取EEPROM区2002h数据,还原关电前LED的亮灭状况 if(V = 2) LED1=0;LED2=1; else if(V = 6)LED1=0;LED2=0; while(1) if(!K1) while(!K1); LED1=0;LED2=1; cc(0x2000); / 擦除第1个扇区(2000h21FFh) xcx(0x2002,2); / 对EEPROM区2002h写入2 if(!K2) while(!K2); LED1=0;LED2=0; cc(0x2000); / 擦除第1个扇区(2000h21FFh) xcx(0x2002,6); / 对EEPROM区2002h写入6 */void main(void) LcdInit();/不注销下面三句,烧录一次/注销小面三句,再烧录一次/若两次烧录后现象一致,则操作内部EEPROM成功/ cc(0x2000); / 擦除第1个扇区(2000h21FFh) xcx(0x2000,ON_Hour); / 对EEPROM区2002h写入2 xcx(0x2001,Warning_TempH); / 对EEPROM区2002h写入2/ ON_Hour = dcx(0x2000); Warning_TempH = dcx(0x2001); if(ON_Hour=0x07)|(Warning_TempH=32) LcdWriteCom(0x80); LCDWrite_String(0, 1, 7, SUCCESS); else LCDWrite_String(0, 1, 5, ERROR); while(1);/*函数:擦除某一扇区(每个扇区512字节)入口:addr = 某一扇区首地址 */void cc(uint addr)/ 打开 IAP 功能(ISP_CONTR.7)=1:允许编程改变Flash, 设置Flash操作等待时间/ 0x83(晶振5M) 0x82(晶振10M) 0x81(晶振20M) 0x80(晶振8; / ISP/IAP操作时的地址寄存器高八位。 EA =0; ISP_TRIG = 0x46; / 在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h, ISP_TRIG = 0xB9; / 再写入B9h,ISP/IAP命令才会生效。 _nop_(); Q0(); / 关闭ISP/IAP/*函数:写一字节入口:addr = 扇区单元地址 , dat = 待写入数据*/void xcx(uint addr,uchar dat) ISP_CONTR = 0x81; ISP_CMD = 0x02; / 用户可以对Data Flash/EEPROM区进行字节编程 ISP_ADDRL = addr; ISP_ADDRH = addr8; ISP_DATA = dat; / 数据进ISP_DATA EA = 0; ISP_TRIG = 0x46; ISP_TRIG = 0xB9; _nop_(); Q0(); / 关闭ISP/IAP/*函数:读一字节入口:addr = 扇区单元地址出口:dat = 读出的数据*/uchar dcx(uint addr) uchar dat;ISP_CONTR = 0x81; ISP_CMD = 0x01; / 用户可以对Data Flash/EEPROM区进行字节读 ISP_ADDRL = addr; ISP_ADDRH = addr8; EA = 0; ISP_TRIG = 0x46; ISP_TRIG = 0xB9; _nop_(); dat = ISP_DATA; / 取出数据Q0(); / 关闭ISP/IAP return dat;/*函数:关闭ISP/IAP操作*/void Q0() ISP_CONTR = 0; / 关闭IAP功能 ISP_CMD = 0; / 待机模式,无ISP操作 ISP_TRIG = 0; / 关闭IAP功能, 清与ISP有关的特殊功能寄存器 /*STC89C52RC内部EEPROM详细地址表:第一扇区 第二扇区 第三扇区 第四扇区起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址2000h 21FFh 2200h 23FFh 2400h 25FFh 2600h 27FFH第五扇区 第六扇区 第七扇区 第八扇区起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址2800h 29FFh 2A00h 2BFFh 2C00h 2DFFh 2E00h 2FFFh*/* 函 数 名 : Lcd1602_Delay1ms* 函数功能 : 延时函数,延时1ms* 输 入 : c* 输 出 : 无* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。*/void Lcd1602_Delay1ms(uint c) /误差 0us uchar a,b;for (; c0; c-) for (b=199;b0;b-) for(a=1;a0;a-); /* 函 数 名 : void LCDWrite_String(uchar x, uchar y, uchar *s)* 函数功能 : 向LCD写入一个字符串* 输 入 : x,y,*s* 输 出 : 无*/void LCDWrite_String(uchar x, uchar y, uchar z, uchar *s)/x 015 , y 0,1,2,3 LCD_set_xy(x,y,z);while(*s)LcdWriteData(*s);s+;/* 函 数 名 : void LCD_set_xy(uchar x, uchar y,uchar z)* 函数功能 : 指定向LCD写入字符串的位置* 输 入 : x,y,z /x:横坐标 y:纵坐标 z:字符串长度* 输 出 : 无*/void LCD_set_xy(uchar x,uchar y,uchar z)uchar i;if(y=0)LcdWriteCom(0x80+x);for(i=0;iz;i+)LcdWriteData( );LcdWriteCom(0x80+x);if(y=1)LcdWriteCom(0xc0+x);for(i=0;iz;i+)LcdWriteData( );LcdWriteCom(0xc0+x);if(y=2)LcdWriteCom(0x94+x);for(i=0;iz;i+)LcdWriteData( );LcdWriteCom(0x94+x);if(y=3)LcdWriteCom(0xd4+x);for(i=0;iz;i+)LcdWriteData( );LcdWriteCom(0xd4+x);/* 函 数 名 : LcdWriteCom* 函数功能 : 向LCD写入一个字节的命令* 输 入 : com* 输 出 : 无*/#ifndef LCD1602_4PINS /当没有定义这个LCD1602_4PINS时void LcdWriteCom(uchar com) /写入命令LCD1602_E = 0; /使能LCD1602_RS = 0; /选择发送命令LCD1602_RW = 0; /选择写入LCD1602_DATAPINS = com; /放入命令Lcd1602_Delay1ms(1);/等待数据稳定LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5); /保持时间LCD1602_E = 0;#else void LcdWriteCom(uchar com) /写入命令LCD1602_E = 0; /使能清零LCD1602_RS = 0; /选择写入命令LCD1602_RW = 0; /选择写入LCD1602_DATAPINS = com;/由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;/Lcd1602_Delay1ms(1);LCD1602_DATAPINS = com 4; /发送低四位Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;#endif/* 函 数 名 : LcdWriteData* 函数功能 : 向LCD写入一个字节的数据* 输 入 : dat* 输 出 : 无*/ #ifndef LCD1602_4PINS void LcdWriteData(uchar dat)/写入数据LCD1602_E = 0;/使能清零LCD1602_RS = 1;/选择输入数据LCD1602_RW = 0;/选择写入LCD1602_DATAPINS = dat; /写入数据Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5); /保持时间LCD1602_E = 0;#elsevoid LcdWriteData(uchar dat)/写入数据LCD1602_E = 0; /使能清零LCD1602_RS = 1; /选择写入数据LCD1602_RW = 0; /选择写入LCD1602_DATAPINS = dat;/由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = dat 4; /写入低四位Lcd1602_Delay1ms(1);LCD1602_E = 1; /写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;#endif/* 函 数 名 : LcdInit()* 函数功能 : 初始化LCD屏* 输 入 : 无* 输 出 : 无*/ #ifndefLCD1602_4PINSvoid LcdInit() /LCD初始化子程序 LcdWriteCom(0x38); /开显示LcdWriteCom(0x0c); /开显示不显示光标LcdWriteCom(0x06); /写一个指针加1LcdWriteCom(0x01); /清屏LcdWriteCom(0x80); /设置数据指针起点#elsevoid LcdInit() /LCD初始化子程序LcdWriteCom(0x32); /将8位总线转为4位总线LcdWriteCom(0x28); /在四位线下的初始化LcdWriteCom(0x0c); /开显示不显示光标LcdWriteCom(0x06); /写一个指针加1LcdWriteCom(0x01); /清屏LcdWriteCom(0x80); /设置数据指针起点#endif程序3:/* 作品:EEPROM实验,开机还原关电前LED的亮灭状况 单片机:STC89C52RC 晶振:12M编译环境:Keil uVision4 V9.00*/ /#include #include #include #define uchar unsigned char #define uint unsigned int /*特殊功能寄存器声明*/sfr ISP_DATA = 0xe2; sfr ISP_ADDRH = 0xe3; sfr ISP_ADDRL = 0xe4; sfr ISP_CMD = 0xe5; sfr ISP_TRIG = 0xe6; sfr ISP_CONTR = 0xe7;sbit LED1 = P20;sbit LED2 = P21;sbit K1 = P32; /按钮1sbit K2 = P33; /按钮2void cc(uint addr);void xcx(uint addr,uchar dat);uchar dcx(uint addr);void Q0();#ifndef uchar#define uchar unsigned char#endif#ifndef uint #define uint unsigned int#endif/*PIN口定义*/#define LCD1602_DATAPINS P0sbit LCD1602_E=P27;sbit LCD1602_RW=P25;sbit LCD1602_RS=P26;/*函数声明*/*在51单片机12MHZ时钟下的延时函数*/void Lcd1602_Delay1ms(uint c); /误差 0us/*LCD1602写入8位命令子函数*/void LcdWriteCom(uchar com);/*LCD1602写入8位数据子函数*/void LcdWriteData(uchar dat);/*LCD1602初始化子程序*/void LcdInit();/*LCD1602写入字符串*/void LCDWrite_String(uchar x, uchar y,uchar z, uchar *s);/*设置LCD1602写入字符串的位置*/void LCD_set_xy(uchar x, uchar y, uchar z);void IntConfiguration();/*uchar ON_Hour=0x07; /初始开灯时间 07:00 1uchar Warning_TempH=32; /高温报警温度 5*/uchar ON_Hour; /初始开灯时间 07:00 1uchar Warning_TempH; /高温报警温度/*函数:主程序*/void main(void) LcdInit(); IntConfiguration();/* cc(0x2000); / 擦除第1个扇区(2000h21FFh) xcx(0x2000,ON_Hour); / 对EEPROM区2002h写入2 xcx(0x2001,Warning_TempH); / 对EEPROM区2002h写入2*/ while(1) ON_Hour = dcx(0x2000); Warning_TempH = dcx(0x2001); if(ON_Hour=0x07)|(Warning_TempH=32) LcdWriteCom(0x80); LCDWrite_String(0, 1, 7, SUCCESS); else LcdWriteCom(0x80); LCDWrite_String(0, 1, 5, ERROR); /* uchar V; V = dcx(0x2002); / 开机读取EEPROM区2002h数据,还原关电前LED的亮灭状况 if(V = 2) LED1=0;LED2=1; else if(V = 6)LED1=0;LED2=0; while(1) if(!K1) while(!K1); LED1=0;LED2=1; cc(0x2000); / 擦除第1个扇区(2000h21FFh) xcx(0x2002,2); / 对EEPROM区2002h写入2 if(!K2) while(!K2); LED1=0;LED2=0; cc(0x2000); / 擦除第1个扇区(2000h21FFh) xcx(0x2002,6); / 对EEPROM区2002h写入6 */*函数:擦除某一扇区(每个扇区512字节)入口:addr = 某一扇区首地址 */void cc(uint addr)/ 打开 IAP 功能(ISP_CONTR.7)=1:允许编程改变Flash, 设置Flash操作等待时间/ 0x83(晶振5M) 0x82(晶振10M) 0x81(晶振20M) 0x80(晶振8; / ISP/IAP操作时的地址寄存器高八位。 EA =0; ISP_TRIG = 0x46; / 在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h, ISP_TRIG = 0xB9; / 再写入B9h,ISP/IAP命令才会生效。 _nop_(); Q0(); / 关闭ISP/IAP/*函数:写一字节入口:addr = 扇区单元地址 , dat = 待写入数据*/void xcx(uint addr,uchar dat) ISP_CONTR = 0x81; ISP_CMD = 0x02; / 用户可以对Da
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农村信用社赤峰市喀喇沁旗2025秋招结构化面试经典题及参考答案
- 2025年药师考试临床药物经济学试题及答案
- 2025年乡村医生考试题库基础医学知识深度解析与实战演练试卷及答案
- xk数据库考试题及答案
- 2025年护师考试试卷与答案
- 2025年废旧电子产品回收处理与资源循环利用案例分析报告
- 企业培训材料编写模板
- 2025年文学概论试题及答案
- 2025年全国安全知识竞赛抢答题库及参考答案
- 2025年健康管理师备考模拟题及答案解析
- 学习解读《调查研究的重要论述》专题PPT
- 短视频编辑与制作(第2版)PPT完整全套教学课件
- 领导干部个人有关事项报告表(模板)
- 《中国近现代史纲要》 课件 第十一章 中国特色社会主义进入新时代
- 《最优化方法》研究生配套教学课件
- EN61238-1额定电压36kV电力电缆用压接和机械连接器 试验方法和要求
- 专利法全套ppt课件(完整版)
- 自动插件机操作指导书
- 培智三年级上册生活数学全册教案
- 高考作文卷面书写
- 船舶驾驶台资源管理bridge team management
评论
0/150
提交评论