单片微机原理与接口技术-基于STC15系列单片机(第3版)6 STC15F2K60S2单片机的存储器与应用编程 例题_第1页
单片微机原理与接口技术-基于STC15系列单片机(第3版)6 STC15F2K60S2单片机的存储器与应用编程 例题_第2页
单片微机原理与接口技术-基于STC15系列单片机(第3版)6 STC15F2K60S2单片机的存储器与应用编程 例题_第3页
单片微机原理与接口技术-基于STC15系列单片机(第3版)6 STC15F2K60S2单片机的存储器与应用编程 例题_第4页
单片微机原理与接口技术-基于STC15系列单片机(第3版)6 STC15F2K60S2单片机的存储器与应用编程 例题_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

PAGEPAGE134第6章STC15F2K60S2单片机存储器的应用6.1STC15F2K60S2单片机的程序存储器例6.1设P1口驱动8只LED灯,低电平有效。从P1口顺序输出“E7H、DBH、BDH、7EH、3EH、18H、00H、FFH”等8组数据,周而复始。解:首先将这8组数据要存放程序存储器中,在汇编编程时,采用“DB”伪指令对这8组数据进行存储定义;在C51编程时,采用数组并定义为“code”存储类型。汇编语言参考程序ORG 0000HLJMP MAINORG 0100HMAIN:MOVDPTR,#ADDR;DPTR指向数据存放首址MOVR3,#08H;顺序输出显示数据次数,分8次传送LOOP:CLRA;A清零,DPTR直接指向读取数据所在地址处MOVCA,@A+DPTR;取数MOVP1,A;送P1口显示INCDPTR;DPTR指向下一个数据LCALLDELAY;调延时子程序DJNZR3,LOOP;判断一个循环是否结束,若没有,取、送下一个数据;SJMPMAIN;若结束,重新开始DELAY:…;延时子程序,由读者自己完成。…RET;子程序必须由RET指令结束ADDR:DB0E7H,0DBH,0BDH,7EH,3EH,18H,00H,0FFH;定义存储字节数据ENDC51参考程序#include<REG51.H> unsignedcharcodedis[8]={0xe7,0xdb,0xbd,0x7e,0x3e,0x18,0x00,0xff}; //定义显示数据/*――――――――延时子函数――――――――――*/voiddelay(unsignedintk) /*定义延时子函数*/{ unsignedinti,j; for(i=0;i<k;i++){ for(j=0;j<121;j++) {;}} } /*――――――――主函数――――――――――*/voidmain(void) { unsignedchari;while(1) //无限循环{ for(i=0;i<8;i++)//顺序输出8此{ P1=dis[i];//取存在程序存储器中的数据 delay(50);//设置显示间隔,晶振频率不同时,时间可能不一样,自行调整}} } 6.2STC15F2K60S2单片机的基本RAM例6.2采用不同的寻址方式,将数据00H写入低128字节00H单元。解:寄存器寻址(RS1RS0=00)CLRRS0;令工作寄存器处于0区,R0就等效于00H单元CLRRS1MOVR0,#00H直接寻址MOV00H,#00H;直接将数据00H送入00H单元(3)寄存器间接寻址MOVR0,#00H;R0指向00H单元MOV@R0,#00H;数据00H传送R0所指的存储单元中在C51编程中,若采用直接寻址访问低128字节,则变量的数据类型定义为“data”;若采用寄存器间接寻址访问低128字节,则变量的数据类型定义为“idata”。例6.3编程分别对高128字节80H单元和特殊功能寄存器80H单元(P0)写入数据20H。解:对高128字节80H单元编程MOVR0,#80HMOV@R0,#20H(2)对特殊功能寄存器80H单元编程MOV80H,#20H或MOVP1,#20H若要在C51编程中采用高128字节RAM存储数据,则在定义变量时,要将变量的存储类型定义为“idata”,而特殊功能寄存器的操作是直接用寄存器名称进行存取操作即可。6.3STC15F2K60S2单片机的扩展RAM(XRAM)例6.4STC15F2K60S2单片机内部扩展RAM的测试,在内部扩展RAM的0000H和0200H起始处分别存入相同的数据,然后对两组数据一一进行校验,若都相同,说明内部扩展RAM完好无损,正确指示灯亮;只要有一组数据不同,停止校验,错误指示灯亮。要求用汇编语言编写。解:STC15F2K60S2单片机共有1792字节扩展RAM,在此,仅对在0000H和0200H起始处前256个字节进行校验。程序说明:P1.7控制LED灯为正确指示灯,P1.5控制LED灯为错误指示。参考程序如下:AUXREQU8EH;定义STC15F2K60S2单片机新增特殊功能寄存器符号AUXR1EQU0A2HERROR_LEDBITP1.5;定义位字符名称OK_LEDBITP1.7ORG 0000HLJMP MAINORG 0100HMAIN:MOVR0,#00H;R0指向校验RAM的低8位的起始地址MOVR4,#00H;R4指向校验RAM1的高8位地址MOVR5,#02H;R5指向校验RAM2的高8位地址MOVR3,#00H;用R3循环计数器,循环256次CLRA;清0赋值寄存器LOOP0:MOVP2,R4;P2指向校验RAM1MOVX@R0,A;存入校验RAM1MOVP2,R5;P2指向校验RAM2MOVX@R0,A;存入校验RAM2INCR0;R0加1INCA;存入数据值加1DJNZR3,LOOP0;判断存储数据是否结束,若没有,转LOOP0;LOOP1:MOVP2,R4;进入校验,P2指向校验RAM1MOVXA,@R0;取第一组数据MOV20H,A;暂存在20H单元MOVP2,R5;P2指向校验RAM1MOVXA,@R0;取第二组数据INCR0;DPTR1加1CJNEA,20H,ERROR;第一组数据与第二组数据比较,若不相等,转错误处理DJNZR3,LOOP1;若相等,判断校验是否结束CLROK_LED;全部校验正确,点亮正确指示灯SETBERROR_LEDSJMPFINISH;转结束处理ERROR:CLRERROR_LED;点亮错误指示灯SETBOK_LEDFINISH:SJMP$;原地踏步,表示结束END例6.5利用ISP下载电路(串行口)与PC机通信,将存入STC15F2K60S2单片机内部扩展RAM的数据送PC机(下载程序的串口调试界面)显示,以验证存入数据是否正确。要求用C51编写。解:STC15F2K60S2单片机共有1792字节扩展RAM,在此,仅对对256个字节进行操作。参考程序如下:#include<reg51.h>sfrT2H=0xd6; //自定义特殊功能寄存器,sfrT2L=0xd7;sfrAUXR=0x8e;unsignedcharxdataram256[256];//定义片内ram,256个字节unsignedinti;/*与PC机串行通信口初始化子函数*/voidserial_initial(void){ SCON=0x50; //方式1,8位可变波特率,无奇偶校验 T2H=0xff; //晶振是18.324MHz,设置115200bps波特率定时器初始值T2L=0xd8; AUXR=0x14; //T2为1T模式,并启动T2AUXR|=1;//选择T2为串行口1波特率发生器; ES=0; //不允许串口中断 EA=0; //关总中断}/*主函数*/voidmain(void){serial_initial();//串行口初始化for(i=0;i<256;i++) //先把ram数组以0--255填满{ram256[i]=i;}for(i=0;i<256;i++) //通过串口把数据送到电脑显示{SBUF=ram256[i];while(TI==0);//等待前一个数据发送完成TI=0;}while(1);//结束}6.4STC15F2K60S2单片机的EEPROM(数据Flash)例6.6EEPROM测试。用P1口连接8只LED灯,低电平有效。当程序开始运行时,点亮P1.0控制的LED灯,接着进行扇区擦除并检验,若擦除成功再点亮P1.1控制的LED灯,接着从EEPROM0000H开始写入数据,写完后再点亮P1.2控制的LED灯,接着进行数据校验,若校验成功再点亮P1.3控制的LED灯,测试成功,否则,点亮P1.7控制的LED灯,表示测试失败,同时P2、P1口显示出错位置。解:本测试是一个简单测试,目的是学习如何对EEPROM进行扇区删除、字节编程、字节读的ISP/IAP操作。设晶振频率为18.432MHZ。(1)汇编语言参考程序;声明与IAP/ISP/EEPROM有关的特殊功能寄存器的地址IAP_DATA EQU0C2HIAP_ADDRH EQU0C3HIAP_ADDRL EQU0C4HIAP_CMD EQU0C5HIAP_TRIG EQU0C6HIAP_CONTR EQU0C7H;定义ISP/IAP命令CMD_READ EQU0;无效CMD_READ EQUl;字节读CMD_PROGRAM EQU2;字节编程,但先要删除原有的内容CMD_ERASE EQU3;扇区擦除;定义Flash操作等待时间及测试常数ENABLE_IAP EQU82H;系统工作时钟为18.324MHzIAP_ADDRESS EQU0000H;测试起始地址ORG 0000HLJMP MAINORG 0l00HMAIN:MOVPl,#0FEH;演示程序开始工作,点亮P1.0控制的LED灯LCALLDELAY;延时MOVDPTR,#IAP_ADDRESS;设置擦除地址LCALLIAP_ERASE;调用扇区擦除子程序MOVDPTR,#IAP_ADDRESS;设置检测擦除首地址MOVR0,#0MOVR1,#2CHECK1:LCALLIAP_READ;检测擦除是否成功CJNEA,#0FFH,ERROR;擦除不成功,点亮P1.7控制的LED灯INCDPTRDJNZR0,CHECK1DJNZR1,CHECK1MOVPl,#0FCH;擦除成功,再点亮P1.1控制的LED灯LCALLDELAY;延时MOVDPTR,#IAP_ADDRESS;设置编程首地址MOVR0,#0MOVR1,#2MOVR2,#0PROGRAM:MOVA,R2LCALLIAP_PROGRAM;调用编程子程序INCDPTRINCR2DJNZR0,PROGRAMDJNZR1,PROGRAMMOVPl,#0F8H;编程成功,再点亮P1.2控制的LED灯LCALLDELAY;延时MOVDPTR,#IAP_ADDRESS;设置校验首地址MOVR0,#0MOVR1,#2MOVR2,#0CHECK2:LCALLIAP_READ;调用编程子程序CJNEA,02H,ERROR;检验不成功,点亮P1.7控制的LED灯INCDPTRINCR2DJNZR0,CHECK2DJNZR1,CHECK2MOVPl,#0F0H;检验成功,再点亮P1.3控制的LED灯SJMP$;程序结束ERROR:MOVP0,R0;出错时,显示出错位置MOVP2,R1CLRP1.7;出错时,点亮P1.7控制的LED灯SJMP$;测试结束;读一字节,调用前需打开IAP功能,入口:DPTR=字节地址,返回:A=读出字节IAP_READ∶MOVIAP_ADDRH,DPH;设置目标单元地址的高8位地址MOVIAP_ADDRL,DPL;设置目标单元地址的低8位地址MOVIAP_CONTR,#ENABLE_IAP;打开IAP功能,设置Flash操作等待时间MOVIAP_CMD,#CMD_READ;设置为EEPROM字节读模式命令MOVIAP_TRIG,#5AH;先送5AH到ISP/IAP触发寄存器MOVIAP_TRIG,#0A5H;再送A5H,ISP/IAP命令立即被触发 启动NOPMOVA,IAP_DATA;读出的数据在IAP_DATA寄存器中,送入累加器ALCALLIAP_IDLE;关闭IAP功能、清相关的特殊功能寄存器,使CPU处于安全状态、RET;字节编程,调用前需打开IAP功能,入口:DPTRR=字节地址,A=须编程字节的数据IAP_PROGRAM∶MOVIAP_ADDRH,DPH;设置目标单元地址的高8位地址MOVIAP_ADDRL,DPL;设置目标单元地址的低8位地址MOVIAP_CONTR,#ENABLE_IAP;打开IAP功能,设置Flash操作等待时间MOVIAP_CMD,#CMD_PROGRAM;设置为EEPROM字节编程模式命令MOVIAP_DATA,A;编程数据送IAP_DATAMOVIAP_TRIG,#5AH;先送5AH到ISP/IAP触发寄存器MOVIAP_TRIG,#0A5H;再送A5H,ISP/IAP命令立即被触发 启动NOPLCALLIAP_IDLE;关闭IAP功能、清相关的特殊功能寄存器,使CPU处于安全状态RET;擦除扇区,入口:DPTR=扇区起始地址IAP_ERASE∶MOVIAP_ADDRH,DPH;设置目标单元地址的高8位地址MOVIAP_ADDRL,DPL;设置目标单元地址的低8位地址MOVIAP_CONTR,#ENABLE_IAP;打开IAP功能,设置Flash操作等待时间MOVIAP_CMD,#CMD_ERASE;设置为EEPROM扇区删除模式命令MOVIAP_TRIG,#5AH;先送5AH到ISP/IAP触发寄存器MOVIAP_TRIG,#0A5H;再送A5H,ISP/IAP命令立即被触发启动NOPLCALLIAP_IDLE;关闭IAP功能,清相关的特殊功能寄存器,使CPU处于安全状态RET;关闭ISP/IAP操作功能,清相关的特殊功能寄存器,使CPU处于安全状态IAP_IDLE∶MOVIAP_CONTR,#0;关闭IAP功能MOVIAP_CMD,#0;清命令寄存器,使命令寄存器无命令,此句可不用MOVIAP_TRIG,#0;清命令触发寄存器,使命令触发寄存器无触发,此句可不用MOVIAP_ADDRH,#80H;送地址高字节单元为80H,指向非EEPROM区MOVIAP_ADDRL,#00H;送地址低字节单元为00H,防止误操作RET;延时子程序DELAY∶CLRAMOVR0,AMOVR1,AMOVR2,#20HDelay_Loop∶DJNZR0,Delay_LoopDJNZR1,Delay_LoopDJNZR2,Delay_LoopRETEND(2)C语言参考程序#include<reg52.h>#include<intrins.h>/*特殊寄存器定义*/sfrIAP_DATA =0xc2; //IAP数据寄存器sfrIAP_ADDRH =0xc3; //IAP高地址寄存器SfrIAP_ADDRL =0xc4; //IAP低地址寄存器sfrIAP_CMD =0xc5; //IAP命令寄存器sfrIAP_TRIG =0xc6; //IAP触发寄存器sfrIAP_CONTR =0xc7; //IAP控制寄存器/*宏定义*/typedfunsignedcharBYTEtypedfunsignedintWORD/*定义IAP操作模式字与测试地址*/#defineCMD_IDLE0//无效模式#defineCMD_READ1//读命令#defineCMD_PROGRAM2//编程命令#defineCMD_ERASE3//擦除命令#defineENABLE_IAP0x82//允许IAP,并设置等待时间#defineIAP_ADDRESS0x0000//擦除命令/*延时子函数*/voidDelay(BYTEn) { WORDx; while(n--) { x=0; while(++x); } }/*读EEPROM字节子函数*/BYTEIapReadByte(WORDaddr) //形参为高位地址和低位地址{ BYTEdat; IAP_CONTR=ENABLE_IAP; //设置等待时间,并允许IAP操作 IAP_CMD=CMD_READ; //送读字节数据命令0x01 IAP_ADDRL=addr;//设置IAP读操作地址 IAP_ADDRH=addr>>8; IAP_TRIG=0x5a; //对IAP_TRIG先送0x5a,再送0xa5触发IAP启动 IAP_TRIG=0xa5;_nop_(); //稍等待操作完成 dat=IAP_DATA; //返回读出数据 IapIdle();//关闭IAPreturndat;}/*写EEPROM字节子函数*/voidIapRrogramByte(WORDaddr,BYTEdat)//对字节地址所在扇区擦除{ IAP_CONTR=ENABLE_IAP; //设置等待时间,并允许IAP操作 IAP_CMD=CMD_PROGRAM; //送编程命令0x02 IAP_ADDRL=addr;//设置IAP编程操作地址 IAP_ADDRL=addr>>8; IAP_DATA=dat;//设置编程数据 IAP_TRIG=0x5a; //对IAP_TRIG先送0x5a,再送0xa5触发IAP启动 IAP_TRIG=0xa5; _nop_(); //稍等待操作完成 IapIdle();}/*扇区擦除*/voidIapEraseSector(WORDaddr){IAP_CONTR=ENABLE_IAP; //设置等待时间3,并允许IAP操作IAP_CMD=CMD_ERASE;

温馨提示

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

评论

0/150

提交评论