给初学者,stc12xx单片机内部eeprom例程解释.doc_第1页
给初学者,stc12xx单片机内部eeprom例程解释.doc_第2页
给初学者,stc12xx单片机内部eeprom例程解释.doc_第3页
给初学者,stc12xx单片机内部eeprom例程解释.doc_第4页
给初学者,stc12xx单片机内部eeprom例程解释.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

STC12C5A的eeprom只能按扇区擦除并且只有擦过的才能写数据,很麻烦但是存储一些较大的数组还是很有用的。这是一个示例程序,但是其中使用的部分语句对新手们来说并不常见,我试着解释一下,其中不常见的语句也可以替换,除倾斜字体部分,其余均来自网络。下一篇放上替换过的程序。/*- STC International Limited - 一个完整的EEPROM 测试程序,用宏晶的下载板可以直接测试STC12C5AxxAD 系列单片机 EEPROM/IAP 功能测试程序演示STC12C52xxAD 系列单片机 EEPROM/IAP 功能测试程序演示STC11xx 系列单片机 EEPROM/IAP 功能测试程序演示STC10xx 系列单片机 EEPROM/IAP 功能测试程序演示- STC International Limited - 宏晶科技 设计 2009/1/12 V1.0 - Mobile:- Fax:- Tel:- Web: www.MCU-M -本演示程序在STC-ISP Ver 3.0A.PCB 的下载编程工具上测试通过,EEPROM 的数据在P1 口上显示, 如果要在程序中使用或在文章中引用该程序,请在程序中或文章中注明使用了宏晶科技的资料及程序*/#include #include 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 操作等待时间及允许IAP/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 ENABLE_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 0x00 /STC5Axx 系列 EEPROM 测试起始地址union union_temp16 INT16U un_temp16; INT8U un_temp82;my_unTemp16;/为了分离出EEPROM16位地址的高位和低位,用除法和求余运算也能实现这个目的/*union 共用体名 数据类型 成员名; 数据类型 成员名; . 变量名;/公用体,百度一下,你就知道。*/INT8U Byte_Read(INT16U add); /读一字节,调用前需打开IAP 功能void Byte_Program(INT16U add, INT8U ch); /字节编程,调用前需打开IAP 功能void Sector_Erase(INT16U add); /擦除扇区void IAP_Disable(); /关闭IAP 功能void Delay();/函数声明void main (void) INT16U eeprom_address;/uint eeprom_address INT8U read_eeprom;/uchar read_eeprom P1 = 0xF0; /演示程序开始,让 P13:0 控制的灯亮 Delay(); /延时 P1 = 0x0F; /演示程序开始,让 P17:4 控制的灯亮 Delay() ; /延时 /将EEPROM 测试起始地址单元的内容读出 eeprom_address = DATA_FLASH_START_ADDRESS; /将测试起始地址送给eeprom_address read_eeprom = Byte_Read(eeprom_address); /读EEPROM的值,存到read_eeprom if (DEBUG_DATA = read_eeprom) /数据是对的,亮 P1.7 控制的灯,然后在 P1 口上将 EEPROM 的数据显示出来 P1 = 0x80; /”按位取反 Delay() ; /延时 P1 = read_eeprom; else /数据是错的,亮 P1.3 控制的灯,然后在 P1 口上将 EEPROM 的数据显示出来 /再将该EEPROM所在的扇区整个擦除,将正确的数据写入后,亮 P1.5 控制的灯 P1 = 0x08; Delay() ; /延时 P1 = read_eeprom; Delay() ; /延时 Sector_Erase(eeprom_address); /擦除整个扇区 Byte_Program(eeprom_address, DEBUG_DATA);/将 DEBUG_DATA 写入 EEPROM P1 = 0x20; /熄灭 P1.3 控制的灯,亮 P1.5 控制的灯 while (1); /CPU 在此无限循环执行此句/读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节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; /先送 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 = 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 触发寄存器,每次都需如此 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_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 处于安全状态, /一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关void IAP_Disable() /关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态, /一次连续的IAP

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论