单片机原理与应用第四章

上传人:无*** 文档编号:167852580 上传时间:2022-11-06 格式:PPT 页数:43 大小:538.50KB
收藏 版权申诉 举报 下载
单片机原理与应用第四章_第1页
第1页 / 共43页
单片机原理与应用第四章_第2页
第2页 / 共43页
单片机原理与应用第四章_第3页
第3页 / 共43页
资源描述:

《单片机原理与应用第四章》由会员分享,可在线阅读,更多相关《单片机原理与应用第四章(43页珍藏版)》请在装配图网上搜索。

1、1第四章 汇编语言程序设计汇编语言程序设计 2 所谓程序设计,就是按照给定的任务要求,编写出完整的计算机程序。要完成同样的任务,使用的方法或程序并不是唯一的。因此,程序设计的质量将直接影响到计算机系统的工作效率、运行可靠性。前面我们学过了汇编语言形式的指令系统,本章重点介绍汇编语言程序结构以及如何利用汇编语言指令进行程序设计的方法。4.1 汇编语言程序设计概述34.1.1 汇编语言程序设计步骤 使用汇编语言设计一个程序大致上可分为以下几个步骤。(1)分析题意,明确要求。(2)确定算法。(3)画程序流程图,用图解来描述和说明解题步骤。图4.1 常用的流程图符号 (4)分配内存工作单元,确定程序与

2、数据区的存放地址。(5)编写源程序 (6)程序优化。(7)上机调试、修改和最后确定源程序。44.2.2 伪指令语句 伪指令并不是真正的指令,也不产生相应的机器码,它们只是在计算机将汇编语言转换为机器码时,指导汇编过程,告诉汇编程序如何汇编。下面介绍一些MCS-51汇编程序常用的伪指令。(1)汇编起始伪指令ORG 格式:标号:ORG 16位地址 功能:规定程序块或数据块存放的起始地址。如:ORG 8000H START:MOV A,#30H 该指令规定第一条指令从地址8000H单元开始存放,即标号START的值为8000H。5 (2)汇编结束伪指令END 格式:标号:END 表达式 功能:结束汇

3、编。例如:ORG 2000H START:MOV A,#00H END START 表示标号START开始的程序段结束。(3)等值指令EQU 格式:字符名称 EQU 项 例如,TEST EQU R0 MOV A,TEST 6 (4)定义字节指令DB 格式:标号:DB 8位二进制数表 DB命令是从指定的地址单元开始,定义若干个8位内存单元的内容。例如,ORG 1000H TAB;DB 23H,73,“6”,“B”TABl:DB 110B 以上伪指令经汇编以后,将对从1000H开始的若干内存单元赋值:(1000H)=23H (1001H)=49H (1002H)=36H (1003H)=42H (

4、1004H)=06H 其中36H和42H分别是字符6和B的ASCII码,其余的十进制数(73)和二进制数(110B)也都换算为十六进制数了。7 (5)定义字命令 DW 格式:标号:DW 16位二进制数表 例如,ORG 1000H TAB:DW 1234H,0ABH,10 汇编后:(1000H)=12H (1001H)=34H (1002H)=00H (1003H)=ABH (1004H)=00H (1005H)=0AH DB、DW伪指令都只对程序存储器起作用,不能用来对数据存储器的内容进行赋值或进行其它初始化的工作。84.2 顺序程序设计 顺序结构程序是一种最简单、最基本的程序(也称为简单程序

5、),它是一种无分支的直线形程序,按照程序编写的顺序依次执行。【例4-1】两个8位无符号数相加,和仍为8位。假设两个无符号数X1,X2分别存放于内部RAM60H、61H单元中,求其和并将和送入62H单元。程序如下:ORG0000H CLRC MOVR0,#60H;设R0为数据指针MOVA,R0;取X11NCR0 ADDCA,R0;X1+X21NCR0 MOVR0,A;保存结果END 9 【例4-2】两个无符号双字节数相加。设被加数存放在内部存储器30H(高位字节)、31H(低位字节)单元,加数存放在内部存储器40H(高位字节)、41H(低位字节)单元,和存入30H(高位字节)、31H(低位字节)

6、单元。程序如下:ORG0000H CLRC;将C清零 MOVR0,#31H;送被加数首址 MOVR1,#41H;送加数首址 MOVA,R0;取被加数低字节 ADDA,R1;两个低字节相加 MOVR0,A;低字节和存人被加数低字节 DECR0;修改指针,指向被加数高字节DECR1 ;修改指针,指向加数高字节MOVA,R0;取被加数高字节 ADDCA,R1;高字节相加 MOVR0,A;存结果 END 10 【例4-3】编写16位二进制数求补程序 二进制数的求补可归结为“求反加1”的过程,求反可用CPL指令实现;加1时应注意,加1只能加在低8位的最低位上。因为现在是16位数,有两个字节,因此要考虑进

7、位问题,即低8位取反加1,高8位取反后应加上低8位加1时可能产生的进位,还要注意这里的加1不能用INC指令,因为INC指令不影响CY标志。程序如下:ORG0200H MOVA,R0;低8位送ACPLA;取反ADDA,#01H;加lMOVR2,A;存结果MOVA,R1;高8位送A CPLA;取反ADDCA,#00H;加进位MOVR3,A;存结果END 11 【例4-4】编程将20H单元中的8位无符号二进制数转换成3位BCD码,并存放在22H(百位)和21H(10位,个位)两个单元中。程序如下:ORG1000H MOVA,20H;取数送AMOVB,#64H;除数100送B中DIVAB;商(百位数B

8、CD码)在A中,余数在B中MOV22H,A;百位数送22HMOVA,B ;余数送A做被除数MOVB,#0AH ;除数10送B中DIVAB;十位数BCD码在A中,个位数在B中 SWAPA;十位数BCD码移至高4位 ORLA,B;并入个位数的BCD码MOV21H,A;十位、个位BCD码存人21H END 12 分支程序的结构有两种,如图4.2所示。图4.2 分支程序结构 图4.2(a)结构使用条件转移指令来实现分支,当给出的条件成立时,执行程序段,否则执行程序段。图4.2(b)结构使用散转指令JMP来实现多分支转移,它首先将分支程序按序号的值来实现分支转移。13 【例4-5】设补码X放在内部RAM

9、30H单元中,函数Y与X有如下的关系式:试编写程序,根据X的值求出Y,并放回原单元。解 取出X后先做取值范围的判断,用累加器A状态转移指令判断X是否为0,用位状态转移指令判断X是大于0还是小于0。程序流程图如图4.3所示。程序如下:144.3 分支程序设计MOV A,30HJZ ZER0JNB ACC.7,PLUSADD A,#5MOV 30H,APLUS:SJMP$ZERO:MOV 30H,#20HSJMP$END 开始结束A=0?A0?(30H)A(30H)+5 (30H)20H (30H)图4.3 例4-5程序框图15 【例4-6】内部RAM40H和41H单元中各有一无符号数,比较其大小

10、,将大数存放于内部RAM60H单元,小数存放于内部RAM61H单元,如两数相等,则分别送往这2个单元。解 用比较不等转移指令CJNE比较两个无符号数,先确定它们是否相等,若不相等时再根据借位标志确定这两个无符号数的大小。程序框图如图4.4所示。程序如下:16 Y开始A (41H)A与(61H)交换结束(40H)(60H)A (60H)N图4.4 例4-6程序框图(40H)A MOVA,40H MOV61H,41H CJNEA,4 1 H,LOOP AJMPAGEQ LOOP:JNCAGEQ;A(41H)则无借位 XCHA,61H;A(41H)有借位AGEQ:MOV60H,A;A与(61H)交换

11、 SJMP END 17 【例4-7】某温度控制系统,采集的温度值(Ta)放在累加器A中。此外,在内部RAM54H单元存放控制温度下限制(T54),在55H单元存放控制温度上限制(T55)。若Ta T55,程序转向JW(降温处理程序);若TaT55,转降温处理程序 CJNEA,54H,LOOP2;TaT54,转向LOOP2 AJMPFH;Ta=54,返回LOOP2:JCSW;若(CY)=1,表明Ta09H?(A)10H?F0 1返 回NNNN图 4.5 例 4-8程 序 框 图20 【例4-9】N路分支程序,N8。要求程序根据其运行中所产生的寄存器R3的值,来决定如何进行分支。解:为实现N路分

12、支,可以多次使用比较转移指令:CJNE R3,#data,rel流程图如图4.6所时,但这样比较次数太多,当N较大时,执行速度就较慢。我们可以用变址寻址的转移指令JMPA+DPTR使问题得到解决。首先安排存放一个转移分支入口的地址表,把入口地址表的首地址送到DPTR,再把R3的内容送累加器A。现以4个分支为例写出程序。假设4个分支的不同功能分别是给不同的位置。程序如下:21MOV A,R3MOV DPTR,#BRTABMOVC A,A+DPTRJMP A+DPTRBRTAB DB BR0-BRTABDB BRl-BRTABDB BR2-BRTABDB BR3-BRTABBR0:SETB P1.

13、0SJMP BRKBR1:SETB P1.1SJMP BRKBR2:SETB P1.2SJMP BRKBR3:SETB P1.3BRK:SJMP BRK R3=0R3=2R3=1YYNNNY转向第0分支转向第1分支转向第2分支224.4 循环程序设计 循环程序一般由4部分组成。(1)置循环初值。(2)循环体。(3)循环修改。(4)循环控制。图4.7(a)结构是“先执行后判断”,适用于循环次数已知的情况。图4.7(b)结构是“先判断后执行”,适用于循环次数未知的情况。23 YN开始置循环初值循环处理循环修改结束处理循环结束?结束Y(a)先执行后判断开始结束置循环初值循环结束?循环处理循环修改结束

14、处理N(b)先判断后执行24二、程序清单ORG OOOOHSTART:MOVA,#01H;使L1灯亮,其它不亮LOOP:MOV P1,A;从P1口输出到发光二极管MOV R1,#10H;延时1秒DEL1:MOV R2,#200DEL2:MOVR3,#126DEL3:DJNZ R3,DEL3DJNZR2,DEL2DJNZ R1,DEL1RL A;左移一位,下一个发光二极管亮AJMPLOOP;循环END25 【例4-10】多个单字节数求知。已知有10个单字节数,依次存放在内部RAM 40H单元开始的数据存储区中,求和并将结果存人寄存器R2、R3中(高位存R2,低位存R3)。本题中,要重复进行加法运

15、算,因此采用循环结构程序。循环次数就是数据块字节数,这是已知的。在置初值时,将数据块长度置人寄存器R5;将数据块首地址送人寄存器R0,即以R0作为数据块的地址指针,采用间接寻址方式:每做一次加法之后,修改地址指针,以便取出下一个数来相加,并且使计数器R5减l。到R5减为0时,求和结束。程序流程图如图4.8所示。26 ORG2000H SUM:MOVR0,#40H;设地址指针 MOVR5,#0AH;计数器初值送R5SUM:MOVA,#00H MOVR2,A LP:ADDA,R0 JNCLP1 INCR2;若有进位,和的高八位+1LP1:INCR0;地址指针+1 DJNZR5,LP;判循环结束条件

16、 MOVR3,A;存和的低八位 END 27 【例4-11】从内存BLOCK单元开始有一个无符号数的数据块,其长度为LEN,试求出其最大值,并存入MAX单元。这是一个搜索问题。这里采用依次进行比较和取代的方法来寻找最大值。具体做法是:先取出第一个数作为基准,和第二个数比较,若比较结果基准数大,不作变动;若比较结果基准数小,则用大数来代替原基准数,然后再和下一个数作比较。到比较结束时,基准数就是所求的最大值。为了进行两数的比较,采用两数相减以后判断CY的值来确定哪个数大,这比用CJNE指令更简单。比较时将基准数放在累加器A中。若A中先放人零,比较次数等于LEN;若A中先放人第一个数,则比较次数等

17、于LEN-1。采用R2作为计数器,R1作为地址指针。程序流程如图4.9所示。28 ORG 8000H COMP:CLRA MOVR2,#LEN MOVR1,#BLOCK LOOP:CLRC;清CY SUBBA,R1;用减法作比较 JNCNEXT ;若(A)(R1),转移 MOVA,R1;若(A)(R 1)?(R 1)A(R 1)+1 R 1(R 2)-1=0?存 最 大 数Y30 【例4-12】假设从内存RAM的50H单元,连续存放一串字符,以回车符(其ASCII码为0DH)作为结束标志,要求测出该字符串的长度。测试方法可采用将该字符串的每一个字符与回车符依次相比,若不相等,则将统计字符串长度

18、的计数器加l,继续比较;若比较相等,则表示该字符串结束,这时计数器中的值就是字节符串的长度。程序如下:ORG 8000HCOUNT:MOV R2,#0FFH MOV R0,#4FH LOOP:INC R0 INC R2 CJNE R0,#0DH,LOOP SJMP 31 程序中使用指令CJNE R0,#0DH,LOOP实现字符串比较及控制循环的任务。由于在循环体中比较转移之前,将 R2和R0的内容加,因此R2和R0的初值要减去。循环次数由对于循环条件的判定而定,当循环结束时,R2中的内容就是字符串的长度。【例4-13】编制用软件方法延时S的程序软件延时时间与执行指令的时间有关。如果使用6MHz

19、晶振,一个机器周期为2s。计算出执行每一条指令以及一个循环所需要的时间,根据要求的延时时间确定循环次数,如果单循环时间不够长,可以采用多重循环。32 程序如下:MOV R5,#05HDELY0:MOV R6,#0C8HDELY1:MOV R7,#0F8H NOPDELY2:DJNZ R7,DELY2 DJNZ R6,DELY1 DJNZ R5,DELY0 这是一个三重循环程序。前条指令的机器周期数为,后条指令的机器周期数为。执行内循环所用的机器周期数为2482=496,执行中间循环所用的机器周期数(496+4)200=100000;执行外循环所用的机器周期数为(100000+3)5=50001

20、5,再加上(执行第一条指令)就是执行整段程序所用的机器周期数。因此这段程序的延时时间位(500015+1)2s=1.000032s。33 【例4-14】编写无符号数排序程序。假设在片内RAM中,起始地址为40H的10个单元中存放有10个无符号数。试进行升序排序。解 数据排序常用方法是冒泡排序法。这种方法的过程类似水中气泡上浮,故称冒泡法。执行时从前向后进行相邻数的比较,如数据的大小次序与要求的的顺序不符就将这两个数互换,否则不互换。对于升序排序通过这种相邻数的互换,使小数向前移动,大数向后移动;从前向后进行一次冒泡(相邻数的互换),就会把最大的数换到最后;再进行一次冒泡就会把次大的数排在倒数第

21、二的位置。依此类推,完成由小到大的排序。编程中选用R7做比较次数计数器,初始值为09H,位地址00H作为冒泡过程中是否有数据互换的标志位,若(00H)=0,表明无互换发生,已排序完毕。(00H)=1,表明有互换发生。流程图如图4-11所示。34 ORG0400H START:MOVR0,#40H;数据区首址送R0 MOVR7,#09H;各次冒泡比较次数送R7 CLR00H;互换标志位清零LOOP:MOVA,R0;取前数送A中 MOV2BH,A;暂存到2BH单元中 INCR0;修改地址指针 MOV2AH,R0;取后数暂存到2AH单元中 CLRC;清CY SUBBA,R0;前数减后数 JCNEXT

22、;前数小于后数,则转(不互换)MOVR0,2BH;前数大于后数,两数交换 DECR0 MOVR0,2AH INCR0;地址加1,准备下一次比较 SETB00H;置互换标志NEXT:DJNZR7,LOOP;未比较完,进行下一次比较 JB00H,START;有交换,表示未排完序,进行下一轮冒泡 END;无交换,表示已排好序,结束35 开始数据区受地址 R0比较次数 R7置交换标志取前一个操作数取后一个操作数前数 后数?前数和后数交换置交换标志?本轮比较完毕?本轮有交换?结束YYNYN图4.10 程序流程图364.5 子程序设计 在汇编语言源程序中使用子程序时,一般要注意两个问题:参数传递和现场保护

23、。参数传递一般可采用以下方法:传递数据。将数据通过工作寄存器R0R7或累加器来传送。即主程序和子程序在交接处,上述寄存器和累加器存储的是同一参数。传送地址。数据存放在数据寄存器中,参数传递时只通过R0、R1、DPTR传递数据所存放的地址。通过堆栈传递参数。在调用之前,先把要传送的参数压入堆栈,进入子程序之后,再将压入堆栈的参数弹出到工作寄存器或者其他内存单元。37 通过位地址传送参数。例如:SUBROU:PUSH ACC PUSH B PUSH R0 POP R0 POP B POP PSW POP ACC RET 至于每个具体的子程序是否需要现场保护,以及哪些参数应该保护,则应视具体情况而定

24、。【例4-15】单字节二进制数据转换为BCD码子程序SBTOD。功能:将单字节二进制数转换为三位BCD码。入口:R2中存放要转换的二进制数。38 出口:(R0)给出百位BCD码的存放地址。(R0)+1给出十位和个位BCD码的存放地址,高半字节放十位,低半字节放个位。占用寄存器:A,B,R0,R2。SBTOD:MOVSP,#60H PUSHACC MOVA,R2;取数 MOVB,#64H DIVAB;除以100,(A)为百位数 MOVR0,A;存人(R0)单元 MOVA,#0AH XCHA,B;余数(B)送A DIVA,B;除以10,得十位和个位 SWAPA;十位数放于高半字节 ADDA,B;个

25、位数放于低半字节 INCR0 MOVR0,A;个位存入(R0)+1单元 POPACC RET 39 【例4-16】将内部数据存储器某一单元中的一个字节的十六进制数转换成两位ASCII码,结果存放在内部数据存储器的两个连续单元中。假设一个字节的十六进制数在内部数据存储器40H单元,结果存于41H、42H单元中,用堆栈进行参数传递。MAIN:MOVSP,#55H MOVR1,#41H;R1为存结果指针 MOVA,40H;取要转换的数据 SWAPA;先转换高位字节 PUSHACC;压栈 LCALLHEASC;调用低半字节转换成 ASCII码程序 40 POPACC;要转换的数据出栈 MOV R1,A

26、 ;存高半字节转换结果 INCR1 PUSH40H LCALLHEASC POPACC MOV R1,A;存低半字节转换结果 END HEASC:MOVR0,SP DECR0 DECR0 XCHA,R0;取被转换数据 ANDA,#0FH;保留低半字节 ADDA,#2;修改A MOVCA,A+PC;查表 XCHA,R0;结果送回堆栈 RET TAB:DB 30H,31H,32H,41 【例4-17】求两个无符号数据块中的最大值。数据块的首地址分别为60H和70H,每个数据块的第一个字节都存放数据块的长度,结果存人5FH单元。解 本例可采用分别求出两个数据块的最大值,然后比较其大小的方法,求最大值

27、的过程可采用子程序。子程序名称:QMAX。子程序入口条件:R1中存有数据块首地址。出口 条件:最大值在A中,下面分别编写主程序和子程序。42主程序:ORG2000H MOVSP,#2FH;设堆栈指针 MOVR1,#60H;取第一数据块首地址送R1中 ACALLQMAX;第一次调用求最大值子程序 MOV40H,A;第一个数据块的最大值暂存40H MOVR1,#70H;取第二数据块首地址送R1中 ACALLQMAX;第二次调用求最大值子程序 CJNEA,40H,NEXT;两个最大值进行比较NEXT:JNCLP;A大,则转LP MOVA,40H;A小,则把40H中内容送人ALP:MOV5FH,A SJMP 43子程序:ORG2200H QMAX:MOVA,R1;取数据块长度 MOVR2,A;R2做计数器 CLRA;A清零,准备做比较LP1:INCR1;指向下一个数据地址CLRC;0+cY,准备做减法SUBBA,R1;用减法做比较 JNCLP3;若A大,则转LP3 MOVA,R1;A小,则将大数送A中SJMPLP4;五条件转LP4LP3:ADDA,R1;恢复A中值LP4:DJNZR2,LP1;计数器减1,不为零,转继续比较 RET;比较完,子程序返回

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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