单片机原理与应用-基于汇编、c51及混合编程第10章 stc

上传人:xzh****18 文档编号:53694116 上传时间:2018-09-04 格式:PPT 页数:21 大小:324KB
返回 下载 相关 举报
单片机原理与应用-基于汇编、c51及混合编程第10章 stc_第1页
第1页 / 共21页
单片机原理与应用-基于汇编、c51及混合编程第10章 stc_第2页
第2页 / 共21页
单片机原理与应用-基于汇编、c51及混合编程第10章 stc_第3页
第3页 / 共21页
单片机原理与应用-基于汇编、c51及混合编程第10章 stc_第4页
第4页 / 共21页
单片机原理与应用-基于汇编、c51及混合编程第10章 stc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《单片机原理与应用-基于汇编、c51及混合编程第10章 stc》由会员分享,可在线阅读,更多相关《单片机原理与应用-基于汇编、c51及混合编程第10章 stc(21页珍藏版)》请在金锄头文库上搜索。

1、第10章STC系列单片机片内EEPROM的应用,10.1 EEPROM模块所属特殊功能寄存器 10.2 EEPROM读、写、擦除,第10章STC系列单片机片内EEPROM的应用,STC系列单片机内部不仅集成了用于存储程序的EEPROM,还集成了用于存储数据的EEPROM,不同的型号容量不同,从1KB45KB不等。 EEPROM主要用于保存在掉电时不允许丢失的数据,在应用过程中所采集、运算或通过键盘输入等得到的一些修正参数。 STC系列单片机内部集成的用于存储数据的EEPROM和用于存储程序的EEPROM地址重叠,但属于不同的物理空间。用户程序指令代码是通过串口直接下载至程序存储器,而用于存储数

2、据的EEPROM则通过用户程序进行读写操作。,EEPROM分为若干个扇区,每个扇区的大小为512B,数据存储器的擦除操作是按扇区进行的,可以擦写的次数在10万次以上。 使用时,同一次修改的数据应该存放于同一个扇区,不是同一次修改的数据最好存放在不同的扇区,不一定要存满。内部EEPROM的扇区地址如表101所示。,10.1 EEPROM模块所属特殊功能寄存器,对存储数据的EEPROM读、写、擦除等操作要用到6个特殊功能寄存器,STC11/10Fxx、STC12C5A60S2等单片机的6个特殊功能寄存器的地址分别 为C2C7H;而STC12C56xx、STC12C54xx、STC89/90C51x

3、x等系列单片 机的地址为E2E7H。,1.命令寄存器IAP_CMD,MS1、MS0决定EEPROM的工作方式,2.控制寄存器IAP_CONTR,对IAPEN、SWBS两位,用户只能写入1、0或0、0。,IAPEN:读、写、擦除使能位。清0后禁止对EEPROM进行读、写、擦除;置1后允许对EEPROM进行读、写、擦除。,SWBS:若对该位写入0,则是选择了用户应用程序(IAP)对EEPROM进行操作;该位若写入1,则是选择了单片机内部固化的系统监控程序(ISP)对EEPROM进行操作。,SWRST:若对该位写入1时将产生系统软件复位,复位响应时,硬件自动将该位清零。,CMD_FAIL:若该位为0

4、,表示对EEPROM的读、写、擦除等操作是成功的;若该位为1,表示对EEPROM的读、写、擦除等操作失败,须由软件清0。,WT2、WT1、WT0这三位设置等待时间,写入EEPROM单元的数据需要55s的内部编程时间。如果是对内部扇区擦除,则需要21ms。在此期间,不得对EEPROM的任何单元进行任何访问,否则在此之前写入的命令失效。这三位的值决定等待上述时间所需要的系统时钟周期数,具体情况如表103所示。,10.2 EEPROM读、写、擦除,EEPROM进行读写时,必须按一个字节一个字节地操作。 通过以下程序了解对EEPROM的读、写、擦除的过程。 (1)从STC12C5A60S2单片机片内E

5、EPROM中某单元读取数据(假设系统时钟频率为20MHz)MOV IAP_ADDRH,#BYTE_ADDRH ;送单元地址的高8位MOV IAP_ADDRL,#BYTE_ADDRL ;送单元地址的低8位MOV IAP_CONTR,#10000010B ;设置等待时间且允许 EEPROM进行读、写、擦除操作MOV IAP_CMD,#00000001B ;送字节读指令MOV IAP_TRIG,#5AH ;启动内部读取工作MOV IAP_TRIG,#0A5H NOP ;等待2个时钟周期的时间NOP MOV A,ISP_DATA ;将读出的数据存入A寄存器,对STC10/10Fxx、STC12C5Ax

6、x等系列单片机启动读、写、擦除工作时,先给IAP_TRIG寄存器送立即数5AH,再送A5H作为触发信号;而对STC12C56xx、STC12C54xx、STC89/90C51xx等系列单片机需先送46H,再送B9H作为触发信号。,(2)向STC12C5A60S2单片机片内EEPROM中某单元写入数据(假设系统时钟频率为20MHz): MOV IAP_DATA,#DATA;先将要写入的数据送至IAP_DATA寄存器 MOV IAP_ADDRH,#BYTE_ADDRH;送单元地址的高8位 MOV IAP_ADDRL,#BYTE_ADDRL;送单元地址的低8位 MOV IAP_CONTR,#1000

7、0010B;设置等待时间且允许对EEPROM进行读、写、擦除操作 MOV IAP_CMD,#00000010B;送字节写命令 MOV IAP_TRIG,#5AH;启动内部编程工作 MOV IAP_TRIG,#0A5HLCALL DELAY_55s ;调用延时55s的子程序,等待编程结束 完成读、写操作后,地址不会自动加1,每次执行读、写操作时须重新送地址。,(3)如果在某扇区中已向部分单元写入了数据,要想再改写数据,需对该扇区的所有单元进行全部擦除,即改写数据前先对整个扇区进行擦除,对扇区擦除的程序如下(假设系统时钟频率为20MHz):MOV IAP_ADDRH,#SECTOR _ADDR_H

8、IGH ;送扇区起始地址的高8位MOV IAP_ADDRL,# SECTOR _ADDR_LOW ;送扇区起始地址的低8位MOV IAP_CONTR,#10000010B ;设置等待时间且允许对EEPROM进行读、写、擦除等操作MOV IAP_CMD,#00000011B;送扇区擦除指令MOV IAP_TRIG,#5AH;启动擦除进程MOV IAP_TRIG,#0A5HLCALL DELAY_21ms ;延时21ms,等待擦除结束,【例101】将STC12C5A60S2单片机片内RAM的50H5FH单元的数据依次写入EEPROM的第一扇区的0000H000FH单元。,分析:如果在读、写、擦除的

9、过程中,没有对EEPROM相关的寄存器进行访问,读、写、擦除一般是成功的。为了防止在读、写、擦除的过程中电源发生波动,在读、写、擦除后需要判断操作是否成功。设系统的时钟频率为20MHz,用R0作为指针指向片内RAM的50H5FH单元,DPTR指向EEPROM的0000H000FH地址,要将数据写入EEPROM,首先对整个扇区进行擦除。若擦除不成功,需要重新擦除;若擦除成功,可将片内RAM 50H5FH单元的数据写进EEPROM的0000H000FH单元,然后再读出EEPROM的数据与片内RAM的50H5FH单元的数据比较,若相同,表示写操作成功,若不同,表示写操作失败,需重新擦除后,将数据再次

10、写进EEPROM对应的单元 汇编语言子程序,IAP_DATA EQU 0C2H ;数据寄存器 IAP_ADDRH EQU 0C3H ;高8位地址寄存器 IAP_ADDRL EQU 0C4H ;低8位地址寄存器 IAP_CMD EQU 0C5H ;命令寄存器 IAP_TRIG EQU 0C6H ;触发寄存器 IAP_CONTR EQU 0C7H ;控制寄存器 SECTION_ADDR EQU 0000H ;扇区首地址ORG 0000HLJMP MAINORG 0100H MAIN: MOV SP,#0BFH;初始化堆栈指针 START0: MOV DPTR,#SECTION_ADDR ;第一扇区

11、的首地址送DPTRLCALL SECTION_ERASE;调用扇区擦除子程序MOV A,IAP_CONTR ;读控制寄存控制器JNB ACC.4,START;若此位为0,表示擦除成功,可进行编程 LJMP START0 ;若擦除失败,须重新进行擦除,START: MOV DPTR,#SECTION_ADDR ;第一扇区的首地址送DPTRMOV R0,#50H ;R0作为片内RAM的指针MOV R2,#16 ;R2作为写16个字节的计数器 LOOP: LCALL BYTE_PROGRAM ;调用向EEPROM写数据的子程序LCALL BYTE_READ ;调用读EEPROM子程序 MOV A,R

12、0CJNE A,IAP_DATA,START0 ;如果读到的数据与原数据不等,则重新开始INC DPTR;EEPROM地址加1INC R0;片内RAM地址加1DJNZ R2,LOOP ;计数不为0,跳转至LOOP SJMP $,SECTION_ERASE: ;擦除MOV IAP_CONTR,#82H;设置等待时间且允许对EEPROM进行操作 MOV IAP_CMD,#03H;对EEPROM进行扇区擦除命令MOV IAP_ADDRL,DPL ;送入扇区首地址的低8位MOV IAP_ADDRH,DPH;送入扇区首地址的高8位MOV IAP_TRIG,#5AH ;启动擦除操作MOV IAP_TRIG

13、 ,#0A5H LCALL DELAY_21ms ;延时等待RET,BYTE_PROGRAM: ;写MOV A,R0 ;读取片内RAM单元50H5FH的内容MOV IAP_DATA,A ;将数据送至数据寄存器MOV IAP_CONTR,#82H ;允许对EERPOM操作并设置等待时间MOV IAP_CMD,#02H ;对EEPROM进行写操作指令MOV IAP_ADDRL,DPL;送地址的低8位MOV IAP_ADDRH,DPH;送地址的高8位MOV IAP_TRIG,#5AH;启动写操作MOV IAP_TRIG ,#0A5HLCALL DELAY_55s ;延时等待RET,BYTE_READ

14、: ;读MOV IAP_CONTR,#82H MOV IAP_CMD,#01H ;读EEPROM命令MOV IAP_ADDRL,DPL ;送入地址的低8位MOV IAP_ADDRH,DPH ;送入地址的高8位MOV IAP_TRIG,#5AH;启动读操作MOV IAP_TRIG,#0A5HNOPNOPRET DELAY_55s: ;略 DELAY_21ms: ;略 END,C51程序:,#include #include/声明本征函数库 #define uchar unsigned char #define uint unsigned int #define SECTION_ADDR 0x00

15、00 /定义扇区的首地址 uchar data *dp;/定义指针 uchar Temp; uint i,xdat; long y; void SECTION_ERASE( uint SECTION_ADDR); /扇区擦除函数 void BYTE_PROGRAM(uint byte_addr );/扇区编程函数 uchar BYTE_READ(uint byte_addr );/读扇区内容函数 void Delay_s( ) reentrant; /延时函数,void main( ) uchar flag=0; /定义扇区擦除失败的标记位dp=0x50; /dp指针指向50Hwhile(flag= =0) /若扇区擦除失败,则再次循环擦出 SECTION_ERASE(SECTION_ADDR);/对整个扇区进行擦除for(i=0;i8);/送入扇区地址的高8位IAP_TRIG=0x5A;/启动触发IAP_TRIG=0xA5;for(int i=0;i420;i+)/延时21msDelay(0x01FA) ;dat=(IAP_CONTR,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号