指令系统及汇编语言程序设计.ppt

上传人:创****公 文档编号:2356448 上传时间:2020-03-03 格式:PPT 页数:68 大小:3MB
返回 下载 相关 举报
指令系统及汇编语言程序设计.ppt_第1页
第1页 / 共68页
指令系统及汇编语言程序设计.ppt_第2页
第2页 / 共68页
点击查看更多>>
资源描述

《指令系统及汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《指令系统及汇编语言程序设计.ppt(68页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第四章指令系统及汇编语言程序设计,任课教师:刘忠国山东大学课程中心网站:,2,第四章指令系统及汇编语言程序设计,本章学习目标了解助记符、指令格式掌握单片机寻址方式掌握单片机指令系统掌握单片机汇编语言程序设计及开发环境参考资料:keilVision软件的帮助文件,3,21:07:34,第四章指令系统及汇编语言程序设计语言,4.1编程语言简介4.2指令和伪指令4.3汇编语言程序调试4.4利用STC-ISP工具将程序下载到单片机中验证程序4.5各类指令详解4.5.1数据传送类指令4.5.2逻辑操作类指令4.5.3算术运算类指令4.5.4位操作指令4.5.5控制类转移指令4.6汇编语言程序设计4.6.

2、1汇编语言程序设计的一般步骤和基本框架4.6.2汇编语言程序设计举例,4,21:07:34,4.6汇编语言程序设计,汇编语言程序设计的一般步骤是:分析课题,确定算法或解题思路。根据算法或思路画出流程图。根据算法要求分配资源,包括内部RAM、定时器、中断等资源的分配。根据流程图编写程序。上机调试源程序,进而确定源程序。对复杂的程序可按功能分为不同的模块,按模块功能确定结构,编写程序时应采用模块化的程序设计方法。,5,21:07:34,4.6.1汇编语言程序设计的一般步骤和基本框架,4.6.1汇编语言程序设计的一般步骤和基本框架,6,21:07:34,$INCLUDE(STC15.INC);下面是

3、汇编语言程序的框架;本语句包含IAP15W4K58S4单片机寄存器定义头文件;-这里可以编写程序中用到的一些符号定义(使用EQU,DATA,BIT等伪指令)ORG0000HSTART:LJMPMAIN;跳转到主程序ORG0003HLJMPINT0_ISR;外部中断0入口ORG000BHLJMPT0_ISR;定时器0中断入口ORG0013HLJMPINT1_ISR;外部中断1入口ORG001BHLJMPT1_ISR;定时器1中断入口ORG0023HLJMPUART1_ISR;串口1中断入口,COLUMNEQU32HBUFFERDATA40H,4.6.1汇编语言程序设计的一般步骤和基本框架,ORG

4、002BHLJMPADC_ISR;ADC中断服务程序入口ORG0033HLJMPLVD_ISR;低电压检测中断服务程序入口ORG003BHLJMPPCA_ISR;PCA中断服务程序入口ORG0043HLJMPUART2_ISR;串口2中断服务程序入口ORG004BHLJMPSPI_ISR;SPI中断服务程序入口,7,21:07:34,4.6.1汇编语言程序设计的一般步骤和基本框架,ORG0053HLJMPINT2_ISR;INT2中断服务程序入口ORG005BHLJMPINT3_ISR;INT3中断服务程序入口ORG0063HLJMPT2_ISR;定时器2中断服务程序入口ORG0083HLJM

5、PINT4_ISR;INT4中断服务程序入口,8,21:07:34,IAP15W4K58S4的以上中断与STC15F2K60S2的相同,4.6.1汇编语言程序设计的一般步骤和基本框架,9/198,ORG008BHLJMPUART3_ISR;UART3中断服务程序入口ORG0093HLJMPUART4_ISR;UART4中断服务程序入口ORG009BHLJMPT3_ISR;T3中断服务程序入口ORG00A3HLJMPT4_ISR;T4中断服务程序入口ORG00ABHLJMPCOMP_ISR;比较器中断服务程序入口ORG00B3HLJMPPWM_ISR;PWM中断服务程序入口ORG00BBHLJM

6、PPWMFD_ISR;PWM异常检测(PWMFaultDetection),IAP15W4K58S4的以下中断对STC15F2K60S2不存在,4.6.1汇编语言程序设计的一般步骤和基本框架,ORG0100HMAIN:MOVSP,#70H;设置堆栈指针(可根据实际情况进行修改);初始化内存区域内容;设置有关特殊功能寄存器(SFR)的控制字;根据需要开放相应的中断控制MAINLOOP:;主程序循环LJMPMAINLOOP,10,21:07:34,4.6.1汇编语言程序设计的一般步骤和基本框架,;下面是各个中断服务子程序的入口INT0_ISR:;外部中断0服务子程序;根据需要填入适当的内容RETI

7、INT1_ISR:;外部中断1服务子程序;根据需要填入适当的内容RETIT0_ISR:;定时器0中断服务子程序;根据需要填入适当的内容RETIT1_ISR:;定时器1中断服务子程序;根据需要填入适当的内容RETIUART1_ISR:;串口1中断服务子程序;根据需要填入适当内容(注意中断请求标志位清零)RETI,11,21:07:34,4.6.1汇编语言程序设计的一般步骤和基本框架,12,21:07:34,UART2_ISR:;串口2中断服务子程序;根据需要填入适当内容(注意中断请求标志位清零)RETIADC_ISR:;ADC中断服务子程序;根据需要填入适当内容(注意中断请求标志位清零)RETI

8、SPI_ISR:;SPI通信中断服务子程序;根据需要填入适当内容(注意中断请求标志位清零)RETILVD_ISR:;低电压检测服务子程序;根据需要填入适当内容(注意中断请求标志位清零)RETIPCA_ISR:;PCA和PWM中断服务子程序;根据需要填入适当内容(注意中断请求标志位清零)RETI,4.6.1汇编语言程序设计的一般步骤和基本框架,INT2_ISR:;INT2中断服务子程序;根据需要填入适当的内容RETIINT3_ISR:;INT3中断服务子程序;根据需要填入适当的内容RETIT2_ISR:;定时器2中断服务子程序;根据需要填入适当的内容RETIINT4_ISR:;INT4中断服务子

9、程序;根据需要填入适当的内容RETI;IAP15W4K58S4的以上中断服务程序同STC15F2K60S2,13,21:07:34,14/198,4.6.1汇编语言程序设计的一般步骤和基本框架,T3_ISR:;定时器3中断服务子程序;根据需要填入适当的内容RETIT4_ISR:;定时器4中断服务子程序;根据需要填入适当的内容RETIUART3_ISR:;串口3中断服务子程序;根据需要填入适当的内容(注意中断请求标志位的清0)RETIUART4_ISR:;串口4中断服务子程序;根据需要填入适当的内容(注意中断请求标志位的清0)RETICOMP_ISR:;比较器中断服务子程序;根据需要填入适当的内

10、容(注意中断请求标志位的清0)RETIPWM_ISR:;PWM中断服务子程序;根据需要填入适当的内容(注意中断请求标志位的清0)RETIPWMFD_ISR:;PWM异常检测中断服务子程序;根据需要填入适当的内容(注意中断请求标志位的清0)RETI;下面可以编写其他子程序或者定义程序中所用的常数END,IAP15W4K58S4的以下中断中断服务程序对STC15F2K60S2不存在,4.6.1汇编语言程序设计的一般步骤和基本框架,注意:由于地址0003H、000BH、0013H、001BH、0023H、002BH、0033H、003BH、0043H、004BH、0053H、005BH、0063H、

11、0083H、0033H、008BH、0093H、009BH、00A3H、00ABH、00B3H和00BBH是专门为中断处理子程序分别预留的入口地址,所以第一条指令是一条长跳转指令,跳到避开上述中断处理子程序入口地址的0100H的地址,主程序MAIN从这个地址开始存放;MAIN语句前面的伪指令“ORG0100H”表示,以标号MAIN表示的主程序放在0100H开始的区域,当然也可以是跳到能够避开上述入口地址的其他地址。,15,21:07:34,4.6.1汇编语言程序设计的一般步骤和基本框架,如果用户系统根本没有任何中断源,或者没有使用全部中断源,就可以不用或者少用中断的功能;0003H到00BBH

12、的区域也就无须全部或部分用于中断处理。没有任何中断的情况下,主程序甚至可以从0000H开始连续存放下去。主程序的末尾是一条长跳转指令,跳转到某个合适的地方反复执行主程序。一般的子程序不可形成死循环,但是作为整个主程序却应该是一个最大的死循环。无论执行哪个子程序,之后都要回到主程序,反复循环运行。,16,21:07:34,4.6.1汇编语言程序设计的一般步骤和基本框架,程序流程图在程序编制以前,先根据系统方案绘制程序流程图是一个很好的方法。程序流程图可以简洁清晰地将程序的分支走向标示清楚,尤其是在程序复杂,编写人员较多相互衔接容易出错的的情况下,利用流程图理顺各部分关系显得尤为重要。,17,21

13、:07:34,画流程图有两个常用的结构:顺序执行的矩形框和条件分支的菱形框。,画流程图两结构:顺序执行矩形框和条件分支菱形框,顺序执行:某个局部功能或者顺序执行的语句使用矩形方框表示,矩形方框内注明程序的功能,各方框之间用箭头表示执行顺序,一目了然;条件分支:遇到需要根据条件判断是否转移时,使用菱形方框表示,菱形框内注明分支条件,不同出口表明分支的去向:可以向后跳转,也可向前跳转。,18,21:07:34,顺序结构,分支结构,分支结构另种画法,例:DJNZR0,L1,图4-47典型循环程序结构的流程图,程序流程图,循环程序设计当程序处理的对象具有重复性规律时,可以使用循环程序设计。一个循环表示

14、重复执行一组指令(程序段)。,19,21:07:34,画流程图两结构:顺序执行矩形框和条件分支菱形框,条件分支:菱形框内注明分支条件,不同出口表明分支的去向:可以向后跳转,也可向前跳转。一般框图如下所示:,20,21:07:34,二分支结构,多分支结构,用:CJNZ,JZ,J(N)C,J(N)B等,4.6.2典型汇编语言程序设计举例,1、分支程序设计2、查表程序设计3、循环程序设计4、定点数运算子程序设计5、数据排序程序设计6、代码转换程序设计,21,21:07:34,1、分支程序设计,程序分支是通过条件转移指令实现的,即根据条件进行判断后决定程序的走向。条件满足则进行程序转移,不满足就顺序执

15、行程序。通过条件判断实现单分支程序转移的指令有JZ、JNZ、CJNE(4条)和DJNZ(2条)等。以位状态为条件,进行程序分支的指令JC、JNC、JB、JNB和JBC等。,22,21:07:34,1、分支程序设计,【例4-10】编程实现下面的比较函数。设变量x存放在R0,求得的y值存入SIGN单元。,23,21:07:34,解:可以利用比较转移CJNE指令和进位位C状态控制转移(JC指令)来实现三分支转移。,2)比较转移指令(4条),CJNE(目的字节),(源字节),rel,24,21:07:34,比较转移指令有4条:CJNEA,#data8,relCJNEA,addr8,rel,CJNERi

16、,#data8,relCJNERn,#data8,rel,该指令比较前面两个操作数的大小,如果它们的值不相等则转移,相等则继续执行。三字节指令,PC当前值(PC3PC)与指令第三字节带符号的偏移量相加即得到转移地址。对进位位CY有影响:如果目的字节的无符号整数值小于源字节的无符号整数值,则置位进位标志,否则清“0”进位位,指令不影响任何一个操作数。,机器码:B8BF,【例4-10】程序,SIGNEQU50H;求得的y值存入SIGN单元ORG0000HLJMPMAINORG0100HMAIN:CJNER0,#37,NOTEQ;R0与37比较,不相等则转NOTEQMOVSIGN,#00H;若比较相

17、等,则SIGN0LJMPENDM;转到程序结束NOTEQ:JCNEG;两数不相等,若R037则C=1,转NEG处理MOVSIGN,#01H;R037时,SIGN+1LJMPENDM;转到程序结束NEG:MOVSIGN,#0FFH;R037时,SIGN-1ENDM:NOPEND,25,21:07:34,设变量x值存放在R0,2、查表程序设计,查表法产生的背景参数的计算非常复杂;公式计算法计算程序长,难于计算;需要耗费大量时间;非线性参数,无法用一般算术运算就可以计算出来,如指数、对数、三角函数以及积分、微分等运算;数学计算无法建立相应的数学模型。查表法定义就是把事先计算或测得的数据按一定顺序编制

18、成表格,查表程序根据被测参数的值或中间结果,查出最终所需的结果。它具有程序简单,执行速度快等优点。,26,21:07:34,2、查表程序设计,应用:在键盘处理程序中,查找按键相应的命令处理子程序的入口地址;在一些快速计算的场合,根据自变量的值,从函数表上查找出相应的函数值以及实现非线性修正、代码转换等等。常用MOVCA,ADPTR查找程序存储器空间的代码或常数,每次传送一个字节。举例:在LED显示程序中,获得LED数码管显示字模;,27,21:07:34,2、查表程序设计,28,21:07:35,例如,假如要显示的数据需放到累加器A中,采用共阳极LED显示,则可采用下面查表法程序获得LED显示

19、字模:MOVDPTR,#SEGTAB;获得字模表的首地址MOVCA,A+DPTR;查表获得字模;下面可以送出字模进行显示SEGTAB:DB0C0H;0的字模DB0F9H;1的字模DB0A4H;2的字模DB0B0H;3的字模DB99H;4的字模DB92H;5的字模DB82H;6的字模DB0F8H;7的字模DB80H;8的字模DB90H;9的字模,A中存要显示的09的数字,如何转换?,数字的字模,3、循环程序设计,29,21:07:35,延时程序是典型的循环程序。下面就以延时程序为例,说明循环程序的设计方法。流程图如图所示。,图4-48延时程序流程图,DJNZR7,LOOP,3、循环程序设计,简单

20、延时子程序如下(注释部分为指令的时钟周期数):DELAY100US:;11.0592MHzPUSH30H;指令的时钟周期数3TMOV30H,#218;3TDLY_LOOP:DJNZ30H,DLY_LOOP;5T;30H(30H)-1,若(30H)0,则转到DLY_LOOP执行POP30H;2TRET;4TIAP15W4K58S4为1T的8051单片机,当系统时钟为11.0592MHz时,上述程序可延时约0.1ms。若需加长延时时间,可采用多重循环延时程序方法。,30,21:07:35,3、循环程序设计,创建延时程序最简单的方法是利用宏晶公司的下载工具STC-ISP的“软件延时计算器”获得延时程

21、序代码,如图4-49所示。上述延时0.1ms的程序即可用此法得到。在工具中选择“软件延时计算器”标签页,设置系统频率,定时长度和8051指令集,最后单击“生成ASM代码”按钮即可生成延时子程序汇编代码。也可生成C程序代码。,31,21:07:35,3、循环程序设计,简单延时子程序如下(注释部分为指令的时钟周期数):MOVR7,#150;2TLOOP:DJNZR7,LOOP;4T,;R7R7-1,若R70,则转到LOOP执行RETSTC15F2K60S2为1T的8051单片机,当系统时钟为6MHz时,每时钟周期为1/6us,上述程序可延时约0.1ms。为达到准确延时的目的,可在适当地方加入NOP

22、指令。,32,21:07:35,延时时间:15041/6s=100s,第一版程序代码,3、循环程序设计,若需加长延时时间,可采用多重循环延时程序方法。以下程序,内循环延时0.1ms,外循环次数可在调用前(入口)设定,根据设定值不同,可在0.125.5ms间延时。入口:设置延时时间N(以0.1ms为单位)送入R0。出口:若延时到(R0减到0),则退出程序,无参数传递。MOVR0,#100;2T,R0控制外循环次数DELAY:MOVR7,#150;2T,R7控制内循环次数LOOP:DJNZR7,LOOP;4T,当6MHz时钟时,延时约0.1msDJNZR0,DELAY;4T,外循环次数0.1ms延

23、时时间RET,33,21:07:35,延时时间:1002+(1504)+41/6s=10100s=10.1ms1000.1ms,第一版程序代码,4、定点数运算子程序设计,多字节无符号加法子程序和减法子程序设计较简单,在此介绍有代表性的多字节BCD码减法程序和多字节乘法程序的设计。(1)多字节十进制BCD码减法因指令系统中只有十进制加法调整指令DAA,也即该指令只有在加法指令(ADD、ADDC)后,才能得到正确的结果。为了用十进制加法调整指令对十进制减法进行调整,必须采用补码相加的办法,用9AH(100)减去减数即得以10(100)为模的减数的补码。,34,21:07:35,参考例4-9,GO,

24、(1)多字节十进制BCD码减法,求BCD码8943H-7649H=?编程前由实例测算计算过程。先对低位字节运算43H-49H:10011010模9A-)01001001减数4901010001得49对100补码51+)01000011加被减数43010010100差94,35,21:07:35,再对高字节运算89H-76H-C:100110109A-)011101107600100100得76对100补码为24-)00000001减去借位位C=100100011减借位1后的值为23+)10001001加被减数8910101100结果0AC+)01100110对结果加66修正100010010差

25、为12,C=0无进位,表示二者相减有借位。应对借位C求反使C=1。,DAA调整,高字节减数变补与被减数相加调整后有进位1,表示两者相减无借位,为正确反映借位情况应对进位C求反使C=0(减法时C=1,表示有借位;C=0,表示无借位)。最后结果为1294H,且无借位,计算正确。,43向高位借位与49相减的结果,应理解为,以十六进制形式表示,后C=0,(1)多字节十进制BCD码减法,程序说明(减法运算化成100的补码加法运算)程序中,减数求补后与被减数相加,方可利用DAA指令进行调整;若二者相加调整(DAA)后结果无进位(C=0),实际上表示二者相减有借位;若二者相加调整(DAA)后有进位(C=1)

26、,实际上表示二者相减没有借位(教材加文字);参考例4-9因此,都需对进位位C进行求反操作。,36,21:07:35,BCD码减法程序举例:采用补码相加的办法,用9AH(100)减去减数即得以10(100)为模的减数的补码。,(1)多字节十进制BCD码减法,入口:被减数低字节地址存放于R1,减数低字节地址存放于R0,字节数存放于R2。出口:差(补码)的低字节地址存放于R0,字节数存放于R3。07H为符号位。0表示结果为正,1表示结果为负。,37,21:07:35,多字节十进制BCD码在RAM中存放地址:,(1)多字节十进制BCD码减法编程代码:,38,21:07:35,R1:被减数低字节地址;R

27、2:字节数;R3:差的字节数。R0:减数低字节地址;也是最后结果差(BCD码)的低字节地址07H位地址存最终结果符号位。0表示结果为正,1表示结果为负。,SUBCD:MOVR3,#00H;差的字节数置0CLR07H;符号位单元清0CLRC;下面用带进位减法指令SUBB,借位位C清0SUBCD1:MOVA,#9AHSUBBA,R0;求减数的100的补码ADDA,R1;补码与被减数相加DAA;十进制加法调整指令MOVR0,A;结果差送到R0间接寻址单元INCR0;减数地址值增1,指向高字节INCR1;被减数地址值增1,指向高字节INCR3;差的字节数增1,CPLC;进位求反,以形成正确借位DJNZ

28、R2,SUBCD1;每字节减法算法相同,未完循环,减完顺序执行,JNCSUBCD2;无借位去SUBCD2返主,否则继续SETB07H;差为负置符号位07H为“1”SUBCD2:RET;返回,(2)多字节乘法运算子程序,单片机指令系统中只有单字节乘法指令MULAB,而工程应用中常需8位乘16位、两个16位数相乘的运算。,39,21:07:35,以两个16位无符号数相乘为例说明多字节乘法程序设计。设被乘数放在R2、R3两单元(高字节在前),乘数放在R6、R7两单元,两个双字节无符号数相乘,结果送33H、32H、31H、30H。,(R3R7)L表示R3R7的低8位,(R3R7)H表示R3R7的高8位

29、,其余几项的含义类似。程序如下:,算法示意图如图所示。,GO,(2)多字节乘法运算子程序,DMUL:MOVA,R3MOVB,R7MULAB;R3R7MOV30H,A;(30H)(R3R7)LMOV31H,B;(31H)(R3R7)HMOVA,R2MOVB,R7MULAB;R2R7ADDA,31H;(R3R7)H+(R2R7)LMOV31H,ACLRAADDCA,B;进位位C与(R2R7)H加MOV32H,A;(32H)(R2R7)H,40,21:07:35,(2)多字节乘法运算子程序,MOVA,R3MOVB,R6MULAB;R3R6ADDA,31HMOV31H,AMOVA,BADDCA,32H

30、;(R2R7)H+(R3R6)HMOV32H,AMOVF0,C;暂存Cy;因下面乘法使C清0;也可CLRA,ADDCA,#0,MOV33H,A;下面程序相应修改,41,21:07:35,程序状态标志寄存器PSW,F0:用户标志位,(2)多字节乘法运算子程序,42,21:07:35,MOVA,R2MOVB,R6MULAB;R2R6ADDA,32HMOV32H,ACLRAMOVACC.0,C;或ADDCA,#0MOVC,F0;前次加法进位送C,为ADDC加(R2R6)H准备ADDCA,BMOV33H,ARET,MOVF0,C;暂存Cy,程序状态标志寄存器PSW,F0:用户标志位,5、数据排序程序设

31、计,数据排序是将数据块中的数据按升序或降序排列。下面以数据升序排序为例,说明数据排序程序设计方法。数据升序排列常采用冒泡法。冒泡法是一种相邻数据互换的排列方法,同查找极大值方法一样,一次冒泡即找到数据块的极大值放到数据块最后,,43,21:07:35,例,将片内RAM30H37H中的数据从小到大升序排列。设R6为循环次数计数器,R7为比较次数计数器。F0为冒泡过程中是否有数据交换的状态标志,F0=0表示无交换发生,F0=1表示有互换发生,须继续循环。R0为指向RAM单元的地址指针初值为30H。,再一次冒泡,次大数排在倒数第二位置,多次冒泡实现升序排列。,冒泡法数据排序程序流程图,44,21:0

32、7:35,数据在30H37H中;R6为循环次数计数器R7为比较次数计数器;F0为数据交换状态标志;R0地址指针.,比较次数,循环次数,冒泡法数据排序程序,SORT:MOVR6,#07H;循环次数送到R6GOON:CLRF0;交换标志清0MOVR0,#30H;数据首址送R0MOVA,R6MOVR7,A;各次冒泡比较次数送R7LOOP:MOVA,R0;取前数MOV3BH,A;3BH单元存前数INCR0MOV3AH,R0;取后数送3AH单元CLRCCJNEA,3AH,EXCHLJMPNEXT,45,21:07:35,A3AH时清C,A3AH时置C,冒泡法数据排序程序,EXCH:JCNEXT;前数(3

33、BH)小于后数(3AH)不交换MOVR0,3BH;3BH单元内前数存后数地址DECR0;R0指向前数MOVR0,3AH;3AH单元后数存前数地址INCR0;R0指向后数地址SETBF0;置交换标志位NEXT:DJNZR7,LOOP;未比较完,进行下一次比较JNBF0,DONE;一次也没交换,说明已按顺序排列DJNZR6,GOON;循环次数减1,不为0进下一轮循环DONE:RET;返回,46,21:07:35,CJNEA,3AH,EXCHLJMPNEXT,A3AH清C,A3AH置C,6、代码转换程序设计,在汇编语言程序设计中,数据输入/输出、A/D、D/A转换等常采用BCD码,字符的存储用ASC

34、II码,算术逻辑运算又采用二进制数。除了用硬件逻辑实现转换外,可采用算法处理和查表方法软件实现。,47,21:07:35,(1)4位二进制数转换为ASCII代码从ASCII编码表可知,若4位二进制数小于10,则此二进制数加上30H即变为相应的ASCII码,若大于10(包括等于10,是字符ABCDEF),则应加37H。入口:转换前4位二进制数存R2。出口:转换后的ASCII码存R2。,37H+0AH=41H,ASCII字码表,48,21:07:35,(1)4位二进制数转换为ASCII代码,ASCB1:MOVA,R2ANLA,#0FH;取出4位二进制数CJNEA,#0AH,NOTA;影响CY标志,

35、但是不改变A中的值NOTA:JCLOOP;该数10去LOOPADDA,#07H;否则加37H(下面还加30H)LOOP:ADDA,#30H;加30HMOVR2,A;转换之ASCII码送R2中RET;返回,49,21:07:35,(3)BCD码转换为二进制码子程序,例:设有用BCD码表示的4位十进制数分别存于R1,R2中,其中R2存千位和百位数,R1存拾位和个位数,要把其转换成二进制码。解决思路:可用由高位到低位逐位检查BCD码的数值,然后累加各十进制位(乘权值)对应的二进制数来实现。其中,100003E8H,100=0064H,10=000AH(个位数的BCD码与二进制码相同)。,50,21:

36、07:35,入口:待转换的BCD码存于R1,R2中,分配如下:低位字节:R1;高位字节:R2出口:结果存在20H,21H单元中,其中20H存低字节,21H存高字节。,(3)BCD码转换为二进制码子程序,BCDB11:MOV20H,#00HMOV21H,#00H;存结果单元清0MOVR3,#0E8HMOVR4,#03H;1千的二进制数03E8H送R3,R4MOVA,R2ANLA,#0F0H;取千位数SWAPA;将千位数移至低四位JZBRAN1;千位数为0则转BRAN1,去处理百位数LOOP1:DECALCALLADDT;千位数不为0,加千位数二进制权码;千位数是n,就加n次千位数二进制码03E8

37、HJNZLOOP1;本循环即实现千位数n乘权值03E8H,51,21:07:35,BRAN1:MOVR3,#64H;下面实现百位数转二进制码MOVR4,#00H;百位数的二进制码64H送R3,R4MOVA,R2ANLA,#0FH;取百位数JZBRAN2;百位数是0转BRAN2,去处理十位数LOOP2:DECALCALLADDT;加百位数二进制权码JNZLOOP2;百位数是n,就加n次64H,52,21:07:35,BRAN2:MOVR3,#0AH;十位数权值0AH送R3,R4=00HMOVA,R1;下面实现十位数转二进制码ANLA,#0F0H;取十位数SWAPAJZBRAN3;十位数为0转BR

38、AN3,去处理个位数LOOP3:DECALCALLADDT;十位数不为0,加十位数二进制权码JNZLOOP3;十位数是n,就加n次0AH,53,21:07:35,BRAN3:MOVA,R1ANLA,#0FH;取个位数MOVR3,A;个位数(权值是自身)送R3,R4=00HLCALLADDT;加个位数二进制码RET,ADDT:PUSHPSWPUSHACCCLRCMOVA,20H;20H(低),21H单元存累加的转换结果ADDA,R3;累加转换结果MOV20H,AMOVA,21HADDCA,R4MOV21H,APOPACCPOPPSWRET,;R3,R4存1千(百,十)的二进制数权值03E8H(0

39、064H,000AH),7、IAP15W4K58S4单片机双数据指针的使用,两个16位的数据指针:DPTR0和DPTR1。它们的逻辑地址相同,但是物理上是独立的。功能:利用这两个数据指针,可以方便地进行数据的迁移和拷贝。使用方法:这两个数据指针在指令中只能以DPTR的形式出现,因此,在使用中,需进行切换。这种切换是通过设置辅助寄存器AUXR1中的DPS位实现的。当DPS选择位为0时,选择DPTR0;当DPS选择位为1时,选择DPTR1。,54,21:07:35,AUXR1各位定义:,7、IAP15W4K58S4单片机双数据指针的使用,DPS:DPTR寄存器选择位。0:选择DPTR0;1:选择D

40、PTR1,55,21:07:35,例4-11编程实现将单片机内部扩展RAM中0000H000FH单元中内容传送到0040H004FH单元中。思路:可以分别由DPTR0和DPTR1分别指向源数据地址和目的数据地址。,AUXR1各位定义,7、IAP15W4K58S4单片机双数据指针的使用,编程如下:AUXR1DATA0A2H;定义辅助寄存器AUXR1直接地址ORG0000HLJMPMAINORG0100HMAIN:MOVSP,#30H;设置堆栈指针MOVR2,#10H;设置计数值(传送的字节数16)ANLAUXR1,#0FEH;令DPS.0=0,选择DPTR0MOVDPTR,#0000H;置源数据

41、地址指针DPTR0=0HORLAUXR1,#01H;令DPS.0=1,选择DPTR1;该句可用INCAUXR1代替(思考:为何?)MOVDPTR,#0040H;置目的数据地址指针DPTR1=40H,56,21:07:35,或$INCLUDE(STC15.INC);包含STC15寄存器定义头文件,7、IAP15W4K58S4单片机双数据指针的使用,LOOP:ANLAUXR1,#0FEH;该句可用INCDECAUXR1代替MOVXA,DPTR;A(DPTR0)INCDPTR;修正源数据地址指针DPTR0+1ORLAUXR1,#01H;该句可用INCAUXR1代替,MOVXDPTR,A;(DPTR1

42、)AINCDPTR;修正目的数据地址指针DPTR1+1DJNZR2,LOOP;传送字节数16没完,继续循环传送SJMP$;$表示本条语句地址,本指令是死循环等待;SJMP$相当于HERE:SJMPHEREEND,57,21:07:35,选DPTR1,选DPTR0,3-2-1单片机的内部结构2、存储器的结构(3)数据Flash存储器1)相关特殊功能寄存器,ISP/IAP命令寄存器IAP_CMDISP/IAP命令寄存器IAP_CMD(地址C5H,复位值xxxxx000B)的各位定义如下:,21:07,MS1和MS0组合形成不同的命令。,表4-6ISP/IAP命令选择,58,ISP/IAP控制寄存器

43、IAP_CONTR,ISP/IAP控制寄存器IAP_CONTR(地址:C7H,复位值为0000 x000B)各位的定义如下:,21:07,IAPEN:ISP/IAP功能允许位。0:禁止IAP读/写/擦除DataFlash/EEPROM1:允许IAP读/写/擦除DataFlash/EEPROMSWBS和SWRST用于设置单片机的软件复位。(见11章),IAPEN,SWBS,SWRST,59,CMD_FAIL:若送了ISP/IAP命令,并对IAP_TRIG送5AH/A5H触发失败,则为1,需由软件清零。,CMD_FAIL,ISP/IAP控制寄存器IAP_CONTR,WT2WT0设置IAP/ISP时

44、的,CPU等待时间,CPU读数据Flash的等待时间固定为2个时钟。其他等待时间见表4-7。,21:07,WT2,WT1,WT0,60,表4-7IAP/ISP时的CPU等待时间,8、IAP15W4K58S4单片机数据Flash(EEPROM)的使用,IAP15W4K58S4单片机片内集成1KB的数据Flash存储器,可作为EEPROM使用,用来保存程序的设置参数。,61,21:07:35,【例4-12】一个完整的数据Flash操作实例。$INCLUDE(STC15.INC);包含IAP15W4K58S4寄存器定义文件;定义ISP/IAP命令ISP_IAP_BYTE_READEQU1H;字节读I

45、SP_IAP_BYTE_PROGRAMEQU2H;字节编程ISP_IAP_SECTOR_ERASEEQU3H;扇区擦除;定义Flash操作等待时间及允许IAP/ISP操作的常数(设置IAP_CONTR)ENABLE_IAPEQU82H;系统工作时钟20MHz时DEBUG_DATAEQU5AH;EEPROM单元的测试值,如正确应等于该值START_ADDRESSEQU0000H;EEPROM测试起始地址,GO,例4-12一个完整的数据Flash操作实例(续),ORG0000HLJMPMAINORG0100HMAIN:MOVSP,#70H;堆栈指针指向70H单元LCALLDelay;延时;下面程序

46、读出EEPROM测试起始地址单元的内容MAIN1:MOVDPTR,#START_ADDRESS;将EEPROM测试起始地址0H送DPTR数据指针LCALLByte_Read;调子程读数据经IAP_DATA送入累加器AMOV40H,A;将EEPROM的值送40H单元保存CJNEA,#DEBUG_DATA,NOT_EQU_DEBUG_DATA;若数据不正确(非5AH),就跳转;数据正确(5AH)时,顺序执行LCALLDelay;延时SJMP$;数据正确,CPU在此无限循环执行此句,62,21:07:35,例4-12一个完整的数据Flash操作实例(续),NOT_EQU_DEBUG_DATA:;下面

47、代码是当EEPROM里的数据错误时,需进行的处理程序;即将该EEPROM所在的扇区整个擦除,将正确的数据写入LCALLDelay;延时MOVDPTR,#START_ADDRESS;将EEPROM测试起始地址0H送DPTR数据指针LCALLSector_Erase;调擦除整个扇区子程序MOVDPTR,#START_ADDRESS;将EEPROM测试起始地址送DPTR数据指针MOVA,#DEBUG_DATA;写入EEPROM数据#DEBUG_DATA(5A)LCALLByte_Program;字节编程SJMP$;字节编程后,CPU在此无限循环执行此句,63,21:07:35,例4-12一个完整的数

48、据Flash操作实例(续),;下面程序是读一字节,调用前需打开IAP功能,Byte_Read:;入口:DPTR=字节地址,返回:A=读出字节MOVIAP_CONTR,#ENABLE_IAP;IAP_CONTR82H,打开IAP功能,设置Flash操作等待时间MOVIAP_CMD,#ISP_IAP_BYTE_READ;IAP_CMD01H,设置为IAP/ISP字节读模式命令MOVIAP_ADDRH,DPH;设置目标单元地址的高8位地址0HMOVIAP_ADDRL,DPL;设置目标单元地址的低8位地址0HMOVIAP_TRIG,#5AH;先送5AH,再送A5H到ISP/IAP触发寄存器MOVIAP

49、_TRIG,#0A5H;送A5H后,ISP/IAP命令即被触发启动NOPMOVA,IAP_DATA;读出数据在IAP_DATA单元,送累加器ALCALLIAP_Disable;关闭IAP功能,清相关特殊功能寄存器RET,64,21:07:35,字节读操作也可用MOVC指令,用MOVC访问数据Flash存储器时,其地址范围为F000HF3FFH。,例4-12一个完整的数据Flash操作实例(续),;下面程序是字节编程,调用前需打开IAP功能,Byte_Program:;入口:DPTR=字节地址,A=需写入的数据MOVIAP_CONTR,#ENABLE_IAP;IAP_CONTR82H,打开IAP功能,设置Flash操作等待时间MOVIAP_CMD,#ISP_IAP_BYTE_PROGRAM;IAP_CMD02H,设置为IAP/ISP字节读模式命令MOVIAP_ADDRH,DPH;设置目标单元地址的高8位地址0HMOVIAP_ADDRL,DPL;设

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

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁