单片机技术及应用_第四章_MCS-51程序设计[1].ppt

上传人:s****8 文档编号:69174931 上传时间:2022-12-31 格式:PPT 页数:45 大小:775KB
返回 下载 相关 举报
单片机技术及应用_第四章_MCS-51程序设计[1].ppt_第1页
第1页 / 共45页
单片机技术及应用_第四章_MCS-51程序设计[1].ppt_第2页
第2页 / 共45页
点击查看更多>>
资源描述

《单片机技术及应用_第四章_MCS-51程序设计[1].ppt》由会员分享,可在线阅读,更多相关《单片机技术及应用_第四章_MCS-51程序设计[1].ppt(45页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、单片机技术及应用 单 片 机 技 术 及 应 用第4章 MCS-51程序设计单片机技术及应用教学提示本章重、难点在于单片机MCS-51汇编语言程序的3种基本结构形式、常用汇编语言程序设计。教学目标掌握汇编语言程序基本结构。掌握程序设计的步骤和方法。学会具体程序的应用。单片机技术及应用4.1 三种基本程序结构程序设计是为了解决某一个问题,将指令有序地组合在一起。程序有简有繁,有些复杂程序往往是由简单的基本程序所构成。本章将通过一些基本程序,介绍部分常用程序设计方法。程序设计的过程大致可以分为以下几个步骤:(1)编制说明要解决问题的程序框图。(2)确定数据结构、算法、工作单元、变量设定。(3)根据

2、所用计算机的指令系统,按照已编制的程序框图,用汇编语言编制出源程序。(4)将编制出的程序在计算机上调试,直至实现预定的功能。单片机技术及应用4.1.1 顺序程序顺序程序是指按顺序依次执行的程序,也称为简单程序或直线程序。计算机是按指令在存储器中存放的先后次序来顺序执行程序的。除非用特殊指令让它跳转,不然它会在PC控制下执行。顺序程序结构虽然比较简单,但也能完成一定的功能任务,是构成复杂程序的基础。单片机技术及应用【例例4-1】已知16位二进制负数存放在R1、R0中,试求其补码,并将结果存放在R3、R2中。解:二进制负数的求补方法可归结为“求反加1”,符号位不变。利用CPL指令实现求反;加1时,

3、则应低8位先加1,高8位再加上低位的进位。注意这里不能用INC指令,因为INC指令不影响标志位。程序如下:CONT:MOVA,R0;读低8位CPLA;取反ADDA,#1;加1MOVR2,A;存低8位MOVA,R1;读高8位CPLA;取反ADDC A,#80H;加进位及符号位MOVR3,A;存高8位RET;返回单片机技术及应用【例例4-2】将两个半字节数合并成一个1字节数。解:设内部RAM的40H、41H单元中分别存放着8位二进制数。要求取出两个单元中的低半字节,合并成一个字节后,存放在42H单元中。程序如下:ORG 0000HSTART:MOV R1,#40H MOV A,R1 ANL A,#

4、0FH ;取第一个半字节 SWAP A INC R1 XCH A,R1 ;取第二字节 ANLA,#0FH ;取第二个半字节 ORL A,R1 ;拼字 INC R1 MOV R1,A ;存放结果 SJMP$END单片机技术及应用【例例4-3】拆字程序。ORG 0000HSTART:MOV R1,#40H MOV A,R1 MOV B,A ;暂存B中 ANL A,#0FH ;取第一个半字节 INC R1 MOV R1,A ;存放第一个半字节 MOV A,B SWAPA ANL A,#0FH ;取第二个半字节 INC R1 MOV R1,A ;存放第二个半字节 SJMP$END单片机技术及应用4.1

5、.2 分支程序分支程序比顺序程序的结构复杂得多,其主要特点是程序的流向有两个或两个以上的出口,根据指定的条件进行选择确定。编程的关键是如何确定供判断或选择的条件以及选择合理的分支指令。通常根据分支程序中出口的个数,分为单分支结构程序(两个出口)和多分支结构程序(3个或3个以上出口)。在处理实际事务中,只用简单程序设计的方法是不够的,因为大部分程序总包含有判断、比较等情况。根据判断、比较的结果转向不同的分支。单片机技术及应用【例例4-4】求单字节有符号二进制数的补码。解:正数的补码是其本身,负数的补码是其反码加1。因此,程序首先判断被转换数的符号,负数进行转换,正数即为补码。设二进制数放在累加器

6、A中,其补码放回到A中。程序如下:ORG 0000H CMPT:JNB ACC.7,NCH ;(A)0,不需转换 CPL A ADD A,#1 SETB ACC.7 ;保存符号 NCH:SJMP$END 单片机技术及应用【例例4-5】两个无符号数比较大小。解:设两个连续外部RAM单元ST1和ST2中存放不带符号的二进制数,找出其中的大数存入ST3单元中。程序如下:ORG 8000H ST1 EQU 8040H START1:CLRC ;进位位清零 MOV DPTR,#ST1;设数据指针 MOVXA,DPTR ;取第一个数 MOV R2,A ;暂存R2 INC DPTR MOVXA,DTPR ;

7、取第二个数 SUBBA,R2 ;两数比较 JNC BIG1 XCH A,R2 ;第一个数大BIG0:INC DPTR MOVXDPTR,A ;存大数 SJMP$BIG1:MOVX A,DPTR;第二个数大 SJMP BIG0 END 单片机技术及应用4.1.3 循环程序在程序设计中,只有简单程序和分支程序是不够的。因为简单程序的每条指令只执行一次,而分支程序则根据条件的不同,会跳过一些指令,执行另一些指令。它们的特点是,每一条指令至多执行一次。在处理实际事务时,有时会遇到多次重复处理的问题,用循环程序的方法来解决就比较合适。循环程序中的某些指令可以反复执行多次。采用循环程序,可使程序缩短,从而

8、节省存储单元。重复次数越多,循环程序的优越性就越明显。但是程序的执行时间并不节省。由于要有循环准备、结束判断等指令,其速度要比简单程序稍慢些。单片机技术及应用循环程序一般由4个部分组成:(1)置循环初值,即确立循环开始时的状态。(2)循环体(工作部分),要求重复执行的部分。(3)循环修改,循环程序必须在一定条件下结束,否则就要变成死循环。(4)循环控制部分,根据循环结束条件,判断是否结束循环。循环程序的结构一般有两种形式:(1)先进入处理部分,再控制循环。即至少执行一次循环体。(2)先控制循环,后进入处理部分。即先根据判断结果,控制循环的执行与否,有时可以不进入循环体就退出循环程序 单片机技术

9、及应用1.单循环程序【例例4-6】多个单字节数据求和。已知有10个单字节数据,依次存放在以内部RAM的50H单元开始的连续单元中。要求把计算结果存入R2、R3中(高位存R2,低位存R3)。单片机技术及应用解:程序如下:ORG 8000HSAD:MOV R0,#50H ;设数据指针 MOV R5,#0AH;计数值0AHR5SAD1:MOV R2,#0 ;和的高8位清零 MOV R3,#0 ;和的低8位清零LOOP:MOV A,R3 ;取加数 ADD A,R0 MOV R3,A ;存和的低8位 JNC LOP1 INC R2 ;有进位,和的高8位+1LOP1:INC R0 ;指向下一个数据地址 D

10、JNZR5,LOOP SJMP$END 单片机技术及应用【例例4-7】内部RAM单元清零。要求:将60H为起点的9个单元清“0”。解:程序如下:ORG 0000HCLEAR:CLR A ;A清0 MOV R0,#60H ;确定清0单元起始地址 MOV R6,#09 ;确定要清除的单元个数LOOP:MOV R0,A ;清单元 INC R0 ;指向下一个单元 DJNZ R6,LOOP ;控制循环 SJMP$END单片机技术及应用【例例4-8】外部RAM单元清零。要求:设有40个外部RAM单元要清“0”,即为循环次数存放在R2寄存器中,其首地址存放在DPTR中,设为3000H。解:方法一:程序如下:

11、ORG 0000HMOV DPTR,#3000HCLEAR:CLRAMOV R2,#28H;置计数值LOOP:MOVXDPTR,AINCDPTR;修改地址指针DJNZ R2,LOOP;控制循环END单片机技术及应用方法二:此程序也可写成通用子程序的形式:CLEAR:CLRALOOP:MOVXDPTR,AINCDPTR;修改地址指针DJNZR2,LOOP;控制循环RET使用时只要给定入口参数及被清零单元个数,再调用此子程序即可:ORG 0000HMOVDPTR,#3000HMOVR2,#40ACALLCLEARSJMP$CLEAR:CLRALOOP:MOVXDPTR,AINCDPTR;修改地址指

12、针DJNZR2,LOOP;控制循环RETEND单片机技术及应用2.多重循环程序如果在一个循环体中又包含了其他的循环程序,即循环中还套着循环,这种程序称为多重循环程序。【例例4-9】10秒延时程序。延时程序与MCS-51执行指令的时间有关,如果使用6MHz晶振,一个机器周期为2s,计算出执行一条指令以至一个循环所需要的时间,给出相应的循环次数,便能达到延时的目的。程序如下:DEL:MOVR5,#100DEL0:MOVR6,#100DEL1:MOVR7,#249DEL2:DJNZR7,DEL2;248*2+4DJNZR6,DEL1;(248*2+4)*200+4DJNZR5,DEL0;(248*2

13、+4)*200+4)*100+4RET单片机技术及应用使用多重循环程序时,必须注意以下几点:(1)循环嵌套,必须层次分明,不允许产生内外层循环交叉。(2)外循环可以一层层向内循环进入,结束时由里往外一层层退出。(3)内循环体可以直接转入外循环体,实现一个循环由多个条件控制的循环结构方式。单片机技术及应用4.2 子程序和参数传递方法在实际程序中,常常会多次进行一些相同的计算和操作,如数制转换、函数式计算等。如果每次都从头开始编制一段程序,不仅麻烦,而且浪费存储空间。因此对一些常用的程序段,以子程序的形式,事先存放在存储器的某一区域。当主程序运行过程中需要用子程序时,只要执行调用子程序的指令,使程

14、序转至子程序即可。子程序处理完毕,返回主程序,继续进行以后的操作。调用子程序有以下优点:(1)避免对相同程序段的重复编制。(2)简化程序的逻辑结构,同时也便于子程序调试。(3)节省存储器空间。单片机技术及应用4.2.1 工作寄存器或累加器传递参数此方法是把入口参数或出口参数放在工作寄存器或累加器中的方法。使用这种方法可使程序最简单,运算速度也最高。它的缺点是:工作寄存器数量有限,不能传递太多的数据;主程序必须先把数据送到工作寄存器;参数个数固定,不能由主程序任意设定。单片机技术及应用【例例4-10】请编出能把20H单元内两个BCD数变换成相应ASCII码放在21H(高位BCD数的ASCII码)

15、和22H(低位BCD数的ASCII码)单元的程序。解:根据ASCII字符表,09的BCD数和它们的ASCII码之间仅相差30H。因此,仅需把20H单元中两个BCD数拆开,分别和30H相加即可,可以编出程序如下:ORG0000HASC1:MOVR0,#22HMOVR0,#00HMOVA,20HXCHD A,R0ORL22H,#30HSWAP AORLA,#30HMOV21H,ASJMP$END 单片机技术及应用4.2.2 用指针寄存器来传递参数由于数据一般存放在存储器中,而不是工作寄存器中,故可用指针来指示数据的位置,这样可以大大节省传递数据的工作量,并可实现可变长度运算。一般如参数在内部RAM

16、 中,可用R0或R1作指针。进行可变长度运算时,可用一个寄存器来指出数据长度,也可在数据中指出其长度(如使用结束标记符)。单片机技术及应用4.2.3 用堆栈来传递参数堆栈可以用于传递参数。调用时,主程序可用PUSH指令把参数压入堆栈中。之后子程序可按栈指针访问堆栈中的参数,同时可把结果参数送回堆栈中。返回主程序后,可用POP指令得到这些结果参数。这种方法的优点是:简单;能传递大量参数;不必为特定的参数分配存储单元。使用这种方法时,由于参数在堆栈中,故大大简化了中断响应时的现场保护。实际使用时,不同的调用程序可使用不同的技术来决定或处理这些参数。下面以几个简单的例子说明用堆栈来传递参数的方法。单

17、片机技术及应用【例例4-11】一位十六进制数转换为ASCII码子程序。解:程序如下:HASC:MOVR0,SPDECR0DECR0;R0为参数指针XCHA,R0;保护ACC,取出参数ANLA,#0FHADDA,#2;加偏移量MOVC A,A+PCXCHA,R0;将查表结果放回堆栈中RETDB0123456789;十六进制数的ASCII字符表DBABCDEFEND单片机技术及应用【例例4-12】把内部RAM中50H、51H的双字节十六进制数转换为4位ASCII码,存放于(R1)指向的4个内部RAM单元。解:编写程序时可以将例4-10当作子程序调用,子程序名为HASC。HA24:MOVA,50HS

18、WAPAPUSH ACCACALLHASCPOPACCMOV R1,AINCR1PUSH 50HACALLHASCPOPACC单片机技术及应用MOVR1,AINCR1MOVA,51HSWAP APUSHACCACALL HASCPOPACCMOVR1,AINCR1PUSH51HACALL HASCPOPACCMOVR1,AEND单片机技术及应用【例例4-13】一个字节的两位十六进制数转换为两个ASCII码子程序。解:参考程序如下:ORG 0000HHTA2:MOV R0,SPDECR0DECR0PUSH ACC;保护累加器内容MOV A,R0;取出参数ANLA,#0FHADDA,#14;加偏移

19、量MOVCA,A+PCXCHA,R0;低位HEX的ASCII码放入堆栈中单片机技术及应用SWAPAANLA,#0FH ADDA,#7;加偏移量MOVCA,A+PCINCR0XCHA,R0;高位HEX的ASCII码放入堆栈中INCR0XCHA,R0;高位返回地址放入堆栈,并恢复累加器内容RETDB0123456789DBABCDEFEND单片机技术及应用【例例4-14】将内部RAM中50H、51H单元的内容以4位十六进制数的ASCII形式串行发送出去,可调用HTA2子程序。解:参考程序如下:ORG 0000HSCOT4:PUSH50HACALLHTA2POPACCACALLCOUTPOPACCA

20、CALLCOUTPUSH51HACALLHTA2POPACCACALLCOUTPOPACCACALLCOUTCOUT:JNBTI,COUT;字符发送子程序CLRTIMOVSBUF,ARETEND单片机技术及应用4.2.4 程序段参数传递以上这些参数传递方法,多数是在调用子程序前,把值装入适当的寄存器传递参数。如果有许多常数参数,则这种技术不太有效,因为每个参数需要一个寄存器传递,并且在每次调用子程序时需分别用指令把它们装入寄存器中。如果需要大量参数,并且这些参数均为常数时,程序段参数传递方法(有时也称为直接参数传递)是传递常数的有效方法。调用时,常数作为程序代码的一部分,紧跟在调用子程序后面。

21、子程序根据栈内的返回地址,决定从何处找到这些常数,然后在需要时从程序存储器中读出这些参数。单片机技术及应用【例例4-15】字符串发送子程序。解:ORG 0000HSOUT:POPDPH;栈中指针POPDPLSOT1:CLRAMOVC A,A+DPTRINCDPTRJZSENDJNBTI,$;$为本条指令地址CLRTIMOVSBUF,ASJMPSOT1SEND:JMPA+DPTREND单片机技术及应用4.3 查表程序设计查表程序是一种常用程序,它广泛应用于LED显示器控制、打印机打印及数据补偿、计算、转换等功能程序中,具有程序简单、执行速度快等优点。查表,就是根据变量x在表格中查找y,使y=f(

22、x)。x有各种结构,例如,有时x可取小于n(n为定值)的自然数子集;有时x取值范围较大,并且不会取到该范围中的所有值,即对某些x,f(x)无定义。例如,x为不定长的字符串或x为某些ASCII字符。y也有各种结构,如有时y可取定字长的数,但不是所有该字长的数都有对应的x;有时y可取小于m(m为定值)的自然数子集。单片机技术及应用1.用MOVC A,A+PC查表指令编程【例例4-16】用查表方法编写彩灯控制程序,编程使彩灯先顺次点亮,再逆次点亮,然后连闪3下,反复循环。解:程序如下:START:MOV R0,#00HLOOP:CLR AMOV A,R0ADD A,#0CHMOVCA,A+PCCJN

23、EA,#03H,LOOP1JMP START单片机技术及应用LOOP1:MOVP1,AACALL DELINCR0JMPLOOPTAB:DB01H,02H,04H,08H,10H,20H,40H,80HDB80H,40H,20H,10H,08H,04H,02H,01HDB00H,0FFH,00H,0FFH,00H,0FFH,03HDEL:MOVR7,#0FFHDEL1:MOVR6,#0FFHDEL2:DJNZR6,DEL2DJNZR7,DEL1RETEND单片机技术及应用2.用MOVC A,A+DPTR查表指令编程【例例4-17】用查表方法编写彩灯控制程序,编程使彩灯先顺次点亮,再逆次点亮,然

24、后连闪3下,反复循环。解:程序如下:START:MOVDPTR,#TABLELOOP:CLRAMOVC A,A+DPTRCJNEA,#03H,LOOP1JMPSTARTLOOP1:MOVP1,AACALL DELINCDPTRJMPLOOP 单片机技术及应用TAB:DB01H,02H,04H,08H,10H,20H,40H,80HDB80H,40H,20H,10H,08H,04H,02H,01HDB00H,0FFH,00H,0FFH,00H,0FFH,03HDEL:MOV R7,#0FFHDEL1:MOV R6,#0FFHDEL2:DJNZR6,DEL2DJNZR7,DEL1RETEND单片机

25、技术及应用4.4 散转程序设计散转程序是分支程序的一种,它由输入条件或运算结果来确定转入各自的处理程序。有多种方法能实现散转程序,但通常用逐次比较法,即把所有各种情况逐一进行比较,若有符合条件的便转向对应的处理程序。由于每一种情况都有判断和转移,如对n种情况,需要n个判断和转移,因此它的缺点是程序比较长。MCS-51指令系统中有一条跳转指令 JMP A+DPTR,用它可很容易地实现散转功能。该指令是把累加器A的8位无符号数(作地址的低8位)与16位数据指针的内容相加,其和送入程序计数器,作为转移指令的地址。执行JMP A+DPTR指令后,累加器和16位数据指针的内容均不受影响。单片机技术及应用

26、4.4.1 用转移指令表实现散转在许多场合中,要根据某一单元的值0,1,2,n分别转向处理程序0,处理程序1,,处理程序n。这时可以用转移指令AJMP(或LJMP)组成一个转移表。【例例4-18】根据R6的内容,转向各个处理程序。R6=0,转LOP0R6=1,转LOP1R6=2,转LOP2把转移标志送累加器A,转移表首地址送DPTR,利用JMP A+DPTR实现转移。标号为LOP0的程序为由P1口控制的彩灯两端向中间点亮,标号为LOP1的程序为由P1口控制的彩灯左移顺次点亮,标号为LOP2的程序为由P1口控制的彩灯右移顺次点亮。单片机技术及应用解:分析题意可编写出以下程序:START:MOV

27、DPTR,#TAB1MOV A,R6ADD A,R6JNC PADINC DPHPAD:JMP A+DPTRTAB1:AJMP LOP0AJMP LOP1AJMP LOP2LOP1:MOVA,#0FEHLP1:MOVP1,AACALL DELRLAAJMP LP1RET单片机技术及应用LOP2:MOV A,#7FHLP2:MOV P1,AACALLDELRRAAJMP LP2RETLOP0:MOV R0,#00HLOOP:CLRAMOV A,R0ADD A,#0CHMOVC A,A+PCCJNE A,#03H,LOOP1JMP START单片机技术及应用LOOP1:MOV P1,AACALLD

28、ELINCR0JMPLOOPTAB:DB81H,42H,24H,18H,03HDEL:MOV R4,#0FFHDEL1:MOV R3,#0FFHDEL2:DJNZ R3,DEL2DJNZ R4,DEL1RETEND单片机技术及应用4.4.2 用转移地址表实现散转当转向范围比较大时,可直接使用转向地址表方法,即把每个处理程序的入口地址直接置于地址表内。用查表指令,找到对应的转向地址,把它装入DPTR中。将累加器清零后用JMP A+DPTR直接转向各个处理程序的入口。单片机技术及应用【例例4-19】根据R3的内容转向对应处理程序。处理程序的入口分别是LOP0LOP2。解:参考程序如下:ORG 0000HPJ3:MOV DPTR,#TAB3MOV A,R3ADD A,R3;R3*2JNC CADINCDPH;有进位DPTR高位加1CAD:MOV R2,A;暂存R2单片机技术及应用MOVCA,A+DPTRXCHA,R2;处理程序入口地址高8位暂存R2INCAMOVCA,A+DPTRMOV DPL,A;处理程序入口地址低8位暂存DPLMOV DPH,R2CLRAJMPA+DPTRTAB3:DWLOP0DWLOP1DWLOP2END

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

当前位置:首页 > 生活休闲 > 生活常识

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

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