单片机原理及应用(3)

上传人:ji****n 文档编号:54824228 上传时间:2018-09-20 格式:PPT 页数:43 大小:506.50KB
返回 下载 相关 举报
单片机原理及应用(3)_第1页
第1页 / 共43页
单片机原理及应用(3)_第2页
第2页 / 共43页
单片机原理及应用(3)_第3页
第3页 / 共43页
单片机原理及应用(3)_第4页
第4页 / 共43页
单片机原理及应用(3)_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《单片机原理及应用(3)》由会员分享,可在线阅读,更多相关《单片机原理及应用(3)(43页珍藏版)》请在金锄头文库上搜索。

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

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

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

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

5、一种无分支的直线形程序,按照程序编写的顺序依次执行。【例4-1】 两个8位无符号数相加,和仍为8位。假设两个无符号数X1, X2分别存放于内部RAM60H、61H单元中,求其和并将和送入62H单元。程序如下:,【例4-2】两个无符号双字节数相加。设被加数存放在内部存储器30H(高位字节)、31H(低位字节)单元,加数存放在内部存储器40H(高位字节)、41H(低位字节)单元,和存入30H(高位字节)、31H(低位字节)单元。程序如下:,【例4-3】编写16位二进制数求补程序二进制数的求补可归结为“求反加1”的过程,求反可用CPL指令实现;加1时应注意,加1只能加在低8位的最低位上。因为现在是1

6、6位数,有两个字节,因此要考虑进位问题,即低8位取反加1,高8位取反后应加上低8位加1时可能产生的进位,还要注意这里的加1不能用INC指令,因为INC指令不影响CY标志。程序如下:,【例4-4】编程将20H单元中的8位无符号二进制数转换成3位BCD码,并存放在22H(百位)和21H(10位,个位)两个单元中。程序如下:,分支程序的结构有两种,如图4.2所示。图4.2 分支程序结构图4.2(a) 结构使用条件转移指令来实现分支,当给出的条件成立时,执行程序段,否则执行程序段。图4.2 (b) 结构使用散转指令JMP来实现多分支转移,它首先将分支程序按序号的值来实现分支转移。,【例4-5】设补码X

7、放在内部RAM30H单元中,函数Y与X有如下的关系式:试编写程序,根据X的值求出Y,并放回原单元。解 取出X后先做取值范围的判断,用累加器A状态转移指令判断X是否为0,用位状态转移指令判断X是大于0还是小于0。程序流程图如图4.3所示。程序如下:,4.3 分支程序设计,MOV A,30H JZ ZER0 JNB ACC.7,PLUS ADD A,#5 MOV 30H,A PLUS: SJMP $ ZERO: MOV 30H,#20H SJMP $ END,【例4-6】内部RAM40H和41H单元中各有一无符号数,比较其大小,将大数存放于内部RAM60H单元,小数存放于内部RAM61H单元,如两

8、数相等,则分别送往这2个单元。解 用比较不等转移指令CJNE比较力两个无符号书,先确定它们是否相等,若不相等时再根据借位标志确定这两个无符号书的大小。程序框图如图4.4所示。程序如下:,【例4-7】某温度控制系统,采集的温度值(Ta)放在累加器A中。此外,在内部RAM54H单元存放控制温度下限制(T54),在55H单元存放控制温度上限制(T55)。若Ta T55,程序转向JW(降温处理程序);若TaT54,则程序转向SW(升温处理程序);T55TaT54,则程序转向FH(返回主程序)。程序如下:,【例4-8】将ASCII码制转换为十六进制数。如果不是十六进制数得ASCII码,用户标志位置1。解

9、:由ASCII码表知,30H39H为09的ASCII码,41H46H为AF的ASCII码。在这一范围的ASCII码减去37H就可以获得对应的十六进制。设ASCII码放在累加器A中,转换结果放回A中。程序流程图如图4.5所示,START:CLC C SUBB A, #30H JC NASC CJNE A, # 0AH,NN MM: JC ASC SUBB A, # 07H CJNE A, # 0AH, NN NN: JC NASC CJNE A, # 10H, LL LL: JC ASC NASC: SETB F0 ASC: RET,【例4-9】N路分支程序,N8。要求程序根据其运行中所产生的寄

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

11、DB BR2-BRTAB DB BR3-BRTAB BR0: SETB P1.0 SJMP BRK BR1: SETB P1.1 SJMP BRK BR2: SETB P1.2 SJMP BRK BR3: SETB P1.3 BRK: SJMP BRK,4.4 循环程序设计,循环程序一般由4部分组成。(1)置循环初值。(2)循环体。(3)循环修改。 (4)循环控制。图4.7(a)结构是“先执行后判断”,适用于循环次数已知的情况。图4.7(b)结构是“先判断后执行”,适用于循环次数未知的情况。,二、程序清单,【例4-10】多个单字节数求知。已知有10个单字节数,依次存放在内部RAM 40H单元开

12、始的数据存储区中,求和并将结果存人寄存器R2、R3中(高位存R2,低位存R3)。本题中,要重复进行加法运算,因此采用循环结构程序。循环次数就是数据块字节数,这是已知的。在置初值时,将数据块长度置人寄存器R5;将数据块首地址送人寄存器R0,即以R0作为数据块的地址指针,采用间接寻址方式:每做一次加法之后,修改地址指针,以便取出下一个数来相加,并且使计数器R5减l。到R5减为0时,求和结束。程序流程图如图4.8所示。,【例4-11】从内存BLOCK单元开始有一个无符号数的数据块,其长度为LEN,试求出其最大值,并存入MAX单元。这是一个搜索问题。这里采用依次进行比较和取代的方法来寻找最大值。具体做

13、法是:先取出第一个数作为基准,和第二个数比较,若比较结果基准数大,不作变动;若比较结果基准数小,则用大数来代替原基准数,然后再和下一个数作比较。到比较结束时,基准数就是所求的最大值。为了进行两数的比较,采用两数相减以后判断CY的值来确定哪个数大,这比用CJNE指令更简单。比较时将基准数放在累加器A中。若A中先放人零,比较次数等于LEN;若A中先放人第一个数,则比较次数等于LEN-1。采用R2作为计数器,R1作为地址指针。程序流程如图4.9所示。,图4.8 程序流程图 图4.9 程序流程图,【例4-12】假设从内存RAM的50H单元,连续存放一串字符,以回车符(其ASCII码为0DH)作为结束标

14、志,要求测出该字符串的长度。测试方法可采用将该字符串的每一个字符与回车符依次相比,若不相等,则将统计字符串长度的计数器加l,继续比较;若比较相等,则表示该字符串结束,这时计数器中的值就是字节符串的长度。程序如下:ORG 8000H COUNT: MOV R2,# 0FFHMOV R0,# 4FHLOOP: INC R0INC R2CJNE R0, #0DH, LOOPSJMP ,程序中使用指令CJNE R0,# 0DH , LOOP实现字符串比较及控制循环的任务。由于在循环体中比较转移之前,将 R2和R0的内容加,因此R2和R0的初值要减去。循环次数由对于循环条件的判定而定,当循环结束时,R2

15、中的内容就是字符串的长度。【例4-13】编制用软件方法延时S的程序软件延时时间与执行指令的时间有关。如果使用6MHz晶振,一个机器周期为2s。计算出执行每一条指令以及一个循环所需要的时间,根据要求的延时时间确定循环次数,如果单循环时间不够长,可以采用多重循环。,程序如下:MOV R5, #05H DELY0: MOV R6, #0C8H DELY1: MOV R7, #0F8HNOP DELY2: DJNZ R7, DELY2DJNZ R6, DELY1DJNZ R5, DELY0这是一个三重循环程序。前条指令的机器周期数为,后条指令的机器周期数为。执行内循环所用的机器周期数为2482=496,执行中间循环所用的机器周期数(496+4)200=100000;执行外循环所用的机器周期数为(100000+3)5=500015,再加上(执行第一条指令)就是执行整段程序所用的机器周期数。因此这段程序的延时时间位(500015+1)2s=1.000032s。,

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

当前位置:首页 > 生活休闲 > 社会民生

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