给初学者,stc12xx单片机内部eeprom例程解释.doc

上传人:11****ws 文档编号:3769919 上传时间:2019-07-13 格式:DOC 页数:6 大小:39KB
下载 相关 举报
给初学者,stc12xx单片机内部eeprom例程解释.doc_第1页
第1页 / 共6页
给初学者,stc12xx单片机内部eeprom例程解释.doc_第2页
第2页 / 共6页
给初学者,stc12xx单片机内部eeprom例程解释.doc_第3页
第3页 / 共6页
给初学者,stc12xx单片机内部eeprom例程解释.doc_第4页
第4页 / 共6页
给初学者,stc12xx单片机内部eeprom例程解释.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

1、STC12C5A 的 eeprom 只能按扇区擦除并且只有擦过的才能写数据,很麻烦但是存储一些较大的数组还是很有用的。这是一个示例程序,但是其中使用的部分语句对新手们来说并不常见,我试着解释一下,其中不常见的语句也可以替换,除倾斜字体部分,其余均来自网络。下一篇放上替换过的程序。/*- STC International Limited - 一个完整的 EEPROM 测试程序,用宏晶的下载板可以直接测试STC12C5AxxAD 系列单片机 EEPROM/IAP 功能测试程序演示STC12C52xxAD 系列单片机 EEPROM/IAP 功能测试程序演示STC11xx 系列单片机 EEPROM/

2、IAP 功能测试程序演示STC10xx 系列单片机 EEPROM/IAP 功能测试程序演示- STC International Limited - 宏晶科技 设计 2009/1/12 V1.0 - Mobile: 13922805190 - Fax: 0755-82944243 - Tel: 0755-82948412 - Web: www.MCU-M -本演示程序在 STC-ISP Ver 3.0A.PCB 的下载编程工具上测试通过,EEPROM 的数据在 P1 口上显示, 如果要在程序中使用或在文章中引用该程序,请在程序中或文章中注明使用了宏晶科技的资料及程序*/#include #in

3、clude typedef unsigned char INT8U;/替换为 #define uchar unsigned chartypedef unsigned int INT16U;/替换为 #define uint unsigned intsfr IAP_DATA = 0xC2;sfr IAP_ADDRH = 0xC3;sfr IAP_ADDRL = 0xC4;sfr IAP_CMD = 0xC5;sfr IAP_TRIG = 0xC6;sfr IAP_CONTR = 0xC7;/使用内部 EEPROM 时需要用到的寄存器,宏晶的头文件也有定义/定义 Flash 操作等待时间及允许 I

4、AP/ISP/EEPROM 操作的常数/#define ENABLE_ISP 0x80 /系统工作时钟30MHz 时,对 IAP_CONTR 寄存器设置此值/#define ENABLE_ISP 0x81 /系统工作时钟24MHz 时,对 IAP_CONTR 寄存器设置此值#define ENABLE_ISP 0x82 /系统工作时钟20MHz 时,对 IAP_CONTR 寄存器设置此值/我用的 11.0592 晶振,按照 20 MHz 设置,没问题/#define ENABLE_ISP 0x83 /系统工作时钟12MHz 时,对 IAP_CONTR 寄存器设置此值/#define ENABL

5、E_ISP 0x84 /系统工作时钟6MHz 时,对 IAP_CONTR 寄存器设置此值/#define ENABLE_ISP 0x85 /系统工作时钟3MHz 时,对 IAP_CONTR 寄存器设置此值/#define ENABLE_ISP 0x86 /系统工作时钟2MHz 时,对 IAP_CONTR 寄存器设置此值/#define ENABLE_ISP 0x87 /系统工作时钟1MHz 时,对 IAP_CONTR 寄存器设置此值#define DEBUG_DATA 0x5A /本测试程序最终存储在 EEPROM 单元的数值#define DATA_FLASH_START_ADDRESS 0

6、x00 /STC5Axx 系列 EEPROM 测试起始地址union union_temp16INT16U un_temp16;INT8U un_temp82;my_unTemp16;/为了分离出 EEPROM16 位地址的高位和低位,用除法和求余运算也能实现这个目的/*union 共用体名 数据类型 成员名 ; 数据类型 成员名 ; . 变量名 ;/公用体,百度一下,你就知道。*/INT8U Byte_Read(INT16U add); /读一字节,调用前需打开IAP 功能void Byte_Program(INT16U add, INT8U ch); /字节编程,调用前需打开 IAP 功能

7、void Sector_Erase(INT16U add); /擦除扇区void IAP_Disable(); /关闭 IAP 功能void Delay();/函数声明void main (void)INT16U eeprom_address;/uint eeprom_addressINT8U read_eeprom;/uchar read_eeprom P1 = 0xF0; /演示程序开始,让 P13:0 控制的灯亮Delay(); /延时P1 = 0x0F; /演示程序开始,让 P17:4 控制的灯亮Delay() ; /延时/将 EEPROM 测试起始地址单元的内容读出eeprom_ad

8、dress = DATA_FLASH_START_ADDRESS; /将测试起始地址送给 eeprom_addressread_eeprom = Byte_Read(eeprom_address); /读 EEPROM 的值,存到read_eepromif (DEBUG_DATA = read_eeprom) /数据是对的,亮 P1.7 控制的灯,然后在 P1 口上将 EEPROM 的数据显示出来P1 = 0x80; /”按位取反Delay() ; /延时P1 = read_eeprom;else /数据是错的,亮 P1.3 控制的灯,然后在 P1 口上将 EEPROM 的数据显示出来/再将该

9、 EEPROM 所在的扇区整个擦除,将正确的数据写入后,亮 P1.5 控制的灯P1 = 0x08;Delay() ; /延时P1 = read_eeprom;Delay() ; /延时Sector_Erase(eeprom_address); /擦除整个扇区Byte_Program(eeprom_address, DEBUG_DATA);/将 DEBUG_DATA 写入 EEPROMP1 = 0x20; /熄灭 P1.3 控制的灯,亮 P1.5 控制的灯while (1); /CPU 在此无限循环执行此句/读一字节,调用前需打开 IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字

10、节INT8U Byte_Read(INT16U add)IAP_DATA = 0x00;IAP_CONTR = ENABLE_ISP; /打开 IAP 功能, 设置 Flash 操作等待时间IAP_CMD = 0x01; /IAP/ISP/EEPROM 字节读命令my_unTemp16.un_temp16 = add;/把 add 赋给共用体IAP_ADDRH = my_unTemp16.un_temp80; /设置目标单元地址的高 8 位地址IAP_ADDRL = my_unTemp16.un_temp81; /设置目标单元地址的低 8 位地址/EA = 0;IAP_TRIG = 0x5A;

11、 /先送 5Ah,再送 A5h 到 ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xA5; /送完 A5h 后,ISP/IAP 命令立即被触发起动_nop_();/EA = 1;IAP_Disable(); /关闭 IAP 功能, 清相关的特殊功能寄存器,使 CPU 处于安全状态,/一次连续的 IAP 操作完成之后建议关闭 IAP 功能,不需要每次都关return (IAP_DATA);/字节编程,调用前需打开 IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据void Byte_Program(INT16U add, INT8U ch)IAP_CONTR

12、= ENABLE_ISP; /打开 IAP 功能, 设置 Flash 操作等待时间IAP_CMD = 0x02; /IAP/ISP/EEPROM 字节编程命令my_unTemp16.un_temp16 = add;IAP_ADDRH = my_unTemp16.un_temp80; /设置目标单元地址的高 8 位地址IAP_ADDRL = my_unTemp16.un_temp81; /设置目标单元地址的低 8 位地址IAP_DATA = ch; /要编程的数据先送进 IAP_DATA 寄存器/EA = 0;IAP_TRIG = 0x5A; /先送 5Ah,再送 A5h 到 ISP/IAP 触

13、发寄存器,每次都需如此IAP_TRIG = 0xA5; /送完 A5h 后,ISP/IAP 命令立即被触发起动_nop_();/EA = 1;IAP_Disable(); /关闭 IAP 功能, 清相关的特殊功能寄存器,使 CPU 处于安全状态,/一次连续的 IAP 操作完成之后建议关闭 IAP 功能,不需要每次都关/擦除扇区, 入口:DPTR = 扇区地址void Sector_Erase(INT16U add)IAP_CONTR = ENABLE_ISP; /打开 IAP 功能, 设置 Flash 操作等待时间IAP_CMD = 0x03; /IAP/ISP/EEPROM 扇区擦除命令my

14、_unTemp16.un_temp16 = add;IAP_ADDRH = my_unTemp16.un_temp80; /设置目标单元地址的高 8 位地址IAP_ADDRL = my_unTemp16.un_temp81; /设置目标单元地址的低 8 位地址/EA = 0;IAP_TRIG = 0x5A; /先送 5Ah,再送 A5h 到 ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xA5; /送完 A5h 后,ISP/IAP 命令立即被触发起动_nop_();/EA = 1;IAP_Disable(); /关闭 IAP 功能, 清相关的特殊功能寄存器,使 CPU 处于安

15、全状态,/一次连续的 IAP 操作完成之后建议关闭 IAP 功能,不需要每次都关void IAP_Disable()/关闭 IAP 功能, 清相关的特殊功能寄存器,使 CPU 处于安全状态,/一次连续的 IAP 操作完成之后建议关闭 IAP 功能,不需要每次都关IAP_CONTR = 0; /关闭 IAP 功能IAP_CMD = 0; /清命令寄存器,使命令寄存器无命令,此句可不用IAP_TRIG = 0; /清命令触发寄存器,使命令触发寄存器无触发,此句可不用IAP_ADDRH = 0;IAP_ADDRL = 0;void Delay()INT8U i;INT16U d=5000;while (d-)i=255;while (i-);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。