收藏 分享(赏)

MCS-51汇编语言程序设计.doc

上传人:dreamzhangning 文档编号:2726649 上传时间:2018-09-26 格式:DOC 页数:11 大小:2.59MB
下载 相关 举报
MCS-51汇编语言程序设计.doc_第1页
第1页 / 共11页
MCS-51汇编语言程序设计.doc_第2页
第2页 / 共11页
MCS-51汇编语言程序设计.doc_第3页
第3页 / 共11页
MCS-51汇编语言程序设计.doc_第4页
第4页 / 共11页
MCS-51汇编语言程序设计.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、优秀文档,精彩无限!优质文档,精彩无限!第四章 MCS-51 汇编语言程序设计重点及难点:单片机汇编语言程序设计的基本概念、伪指令、单片机汇编语言程序的三种基本结构形式、常用汇编语言程序设计。教学基本要求:1、掌握汇编语言程序设计的基本概念;2、掌握伪指令的格式、功能和使用方法;3、掌握顺序结构、分支结构和循环结构程序设计的步骤和方法;4、掌握常用汇编语言程序设计步骤和方法。教学内容4.1 汇编语言程序设计概述一、汇编语言的特点(1)助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。(2)使用汇编语言编程比使用高级语言困

2、难,因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。(3)汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能够直接管理和控制硬件设备。(4)汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用;但是掌握了一种计算机系统的汇编语言后,学习其他的汇编语言就不太困难了。二、汇编语言的语句格式: ;三、汇编语言程序设计的步骤与特点(1)建立数学模型 (2)确定算法(3)制定程序流程图(4)确定数据结构(5)写出源程序(6)上机调试程序4.2 伪 指 令伪指令是程序员发给汇编程序的命令,也称为汇编命令或汇编

3、程序控制指令。MCS- 51 常见汇编语言程序中常用的伪指令:第四章 MCS-51 汇编语言程序设计 911ORG (ORiGin) 汇编起始地址命令 ORG 2END ( END of assembly) 汇编终止命令 END 3EQU (EQUate ) 赋值命令EQU 4DB (Define Byte) 定义字节命令 DB 5DW (Define Word ) 定义数据字命令 DW 6DS (Define Stonage ) 定义存储区命令 DW 7BIT 位定义命令BIT 8DATA 数据地址赋值命令DATA 4.3 单片机汇编语言程序的基本结构形式一、顺序程序例 4-1 三字节无符号

4、数相加,其中被加数在内部 RAM 的 50H、51H 和 52H 单元中;加数在内部 RAM 的 53H、5414 和 55H 单元中;要求把相加之和存放在 50H、51H 和52H 单元中,进位存放在位寻址区的 00H 位中。 MOV R0 , # 52H ;被加数的低字节地址MOV R1 , # 55H ;加数的低字节地址MOV A , R0ADD A , R1 ;低字节相加MOV R0 , A ;存低字节相加结果DEC R0DEC R1MOV A , R0ADDC A , R1 ;中间字节带进位相加MOV R0 , A ;存中间字节相加结果DEC R0DEC R1MOV A , R0AD

5、DC A , R1 ;高字节带进位相加MOV R0 , A ;存高字节相加结果CLR A优秀文档,精彩无限!优质文档,精彩无限!ADDC A , # 00H ;存放进位的单元地址MOV R0 , A ;进位送 00H 位保存二、分支程序1单分支程序例 4-2 变量 X 存放在 VAR 单元内,函数值 Y 存放在 FUNC 单元中,试按下式的要求给 Y 赋值。 01本题的程序流程见图 4-1(a) 。参考程序: ORG 1000HVAR DATA 30HFUNC DATA 31HMOV A , VAR ;A XJZ DONE ;若 X=0,则转 DONEJNB ACC.7 , POSI ;若 X

6、0,则转 POSIMOV A , # 0FFH ;若 X0,则 Y = 1DONE: MOVE FUNC , A ;存函数值SJMP $END第四章 MCS-51 汇编语言程序设计 93图 4-1 例 4-2 的分支流程图这个程序的特征是先比较判断,然后按比较结果赋值,这实际是三分支而归一的流程图,因此,至少要用两个转移指令。初学者很容易犯的一个错误是:漏掉了其中的SJMP DONE 语句,因为流程图中没有明显的转移痕迹。这个程序也可以按图 4-1(b)的流程图来编写,其特征是先赋值,后比较判断,然后修改赋值并结束。参考程序: ORG 1000HVAR DATA 30HFUNC DATA 31

7、HMOV A , VAR ;A XJZ DONE ;若 X=0,则转 DONEMOV R0 , # 0FFH ;先设 X0,R0 = 1NEG: MOV A , # 01H ;若 X0,则 Y = 1DONE: MOV FUNC , A ;存函数值SJMP $END2多分支程序图 4-2 多分支程序转移三、循环程序循环程序一般由 4 部分组成:(1)置循环初值,即确立循环开始时的状态。(2)循环体(工作部分) ,要求重复执行的部分。 (3)循环修改,循环程序必须在一定条件下结束,否则就要变成死循环。(4)循环控制部分,根据循环结束条件,判断是否结束循环。以上 4 个部分可以有两种组织方式。例

8、4-3 从 BLOCK 单元开始存放一组无符号数,一般称为一个数据块。数据块长度放在 LEN 单元,编写一个求和程序,将和存入 SUM 单元,假设和不超过 8 位二进制数。在置初值时,将数据块长度置入一个工作寄存器,将数据块首地址送入另一个工作优秀文档,精彩无限!优质文档,精彩无限!寄存器,一般称它为数据块地址指针。每做一次加法之后,修改地址指针,以便取出下一个数来相加,并且使计数器减 1。到计数器减到 0 时,求和结束,把和存入 SUM 即可。参考程序:各单元的地址是任意的。LEN DATA 20HSUM DATA 21HBLOCK DATA 22HCLR A ;清累加器MOV R2 , L

9、EN ;数据块长度送 R2MOV R1 , # BLOCK ;数据块首址送 RlLOOP: ADD A , R1 ;循环做加法INC R1 ;修改地址指针DJNZ R2 , LOOP ;修改计数器并判断MOV SUM , A ;存和以上程序在计数器初值不为零时是没有问题的,但若是数据块的长度有可能为零,则将出现问题。当 R2 初值为零,减 1 之后将为 FFH,故要做 256 次加法之后才会停止,显然和题意不符。若考虑到这种情况,则可按图 4-3(b)的方式来编写程序。在做加法之前,先判断一次 R2 的初值是否为零。整个程序仍基本套用原来的形式:CLR A ;清累加器MOV R2 , LEN

10、;数据块长度送 R2MOV R1 , # BLOCK ;数据块首址送 RlINC R2SJMP CHECKLOOP: ADD A , R1 ;循环做加法INC R1 ;修改地址指针CHECK: DJNZ R2 , LOOPMOV SUM , A ;存和4.4 MCS-51 单片机汇编语言程序设计举例一、算术运算程序例 4-4 假定 R2、R3 和 R4、R5 分别存放两个 16 位的带符号二进制数,其中 R2 和 R4的最高位为两数的符号位。请编写带符号双字节二进制数的加减法运算程序,以 BSUB为减法程序入口,以 BADD 为加法程序入口,以 R6、R7 保存运算结果。参考程序:BSUB:

11、MOV A , R4 ;取减数高字节CPL ACC.7 ;减数符号取反以进行加法MOV R4 , A第四章 MCS-51 汇编语言程序设计 95BADD: MOV A , R ;取被加数MOV C , ACC.7MOV F0 , C ;被加数符号保存在 F0 中XRL A , R4 ;两数高字节异或MOV C , ACC.7 ;两数同号 CY=0,两数异号CY=1MOV A , R2CLR ACC.7 ;高字节符号位清“0”MOV R2 , A ;取其数值部分MOV A , R4CLR ACC.7 ;低字节符号位清“0”MO V R4 , A ;取其数值部分JC JIAN ;两数异号转 JIA

12、NJIA: MOV A , R3 ;两数同号进行加法ADD A , R5 ;低字节相加MOV R7 , A ;保存和MOV A , R2ADDC A , R4 ;高字节相加MOV R6 , A ;保存和JB ACC.7 , QAZ ;符号位为“1”转溢出处理QWE: MOV C , F0 ;结果符号处理MOV ACC.7, C MOV R6 , ARETJIAN: MOV A , R3 ;两数异号进行减法CLR CSUBB A , R5 ;低字节相减MOV R7 , A ;保存差MOV A , R2SUBB A , R4 ;高字节相减MOV R6 , A ;保存差JNB ACC.7 , QWE

13、 ;判断差的符号,为“0”转 QWEBMP: MOV A , R7 ;为“1”进行低字节取补CPL AADD A , #1MOV R7 , AMOV A , R6 ;高字节取补CPL AADDC A , # 0优秀文档,精彩无限!优质文档,精彩无限!MOV R6 , ACPL F0 ;保存在 F0 中的符号取反SJMP QWE ;转结果符号处理QAZ: ;溢出处理二、数制转换程序例 4-5 在内部 RAM 的 hex 单元中存有 2 位十六进制数,试将其转换为 ASCII 码,并存放于 asc 和 asc+1 两个单元中。主程序(MAIN): MOV SP , # 3FHMAIN: PUSH

14、hex ;十六进制数进栈ACALL HASC ;调用转换子程序POP asc ;第一位转换结果送 asc 单元MOV A , hex ;再取原十六进制数SWAP A ;高低半字节交换PUSH ACC ;交换后的十六进制数进栈ACALL HASCPOP asc+l ;第二位转换结果送 asc+l 单元子程序(HASC):HASC: DEC SP ;跨过断点保护内容DEC SPPOP ACC ;弹出转换数据ANL A , # 0FH ;屏蔽高位ADD A , # 7 ;修改变址寄存器内容MOVC A , A+PC ;查表PUSH ACC ;查表结果进栈INC SP ;修改堆栈指针回到断点保护内容I

15、NC SPRET SPASCTAB: DB“0,1,2,3,4,5,6,7” ;ASCII 码表DB “8,9,A,B,C,D,E,F”三、定时程序有多个定时需要,我们可以先设计一个基本的延时程序,使其延迟时间为各定时时间的最大公约数,然后就以此基本程序作为子程序,通过调用的方法实现所需要的不同定时。例如要求的定时时间分别为 5s 、l0s 和 20s 并设计一个 1s 延时子程序DELAY,则不同定时的调用情况表示如下:第四章 MCS-51 汇编语言程序设计 97MOV R0 , # 05H ;5s 延时LOOP1: LCALL DELAYDJNZ R0 , LOOP1MOV R0 , #

16、0AH ;10s 延时LOOP2: LCALL DELAYDJNZ R0 , LOOP2MOV R0 , # 14H ;20s 延时LOOP3: LCALL DELAYDJNZ R0 , LOOP3四、查表程序一个查表程序的例子。假定有 4 4 键盘,键扫描后把被按键的键码放在累加器 A 中,键码与处理子程序入口地址的对应关系为:并假定处理子程序在 ROM64KB 的范围内分布。要求以查表方法,按键码转向对应的处理子程序。参考程序如下:MOV DPTR , # BS ;子程序入口地址表首址RL A ;键码值乘以 2MOV R2 , A ;暂存 AMOVC A , A+DPTR ;取得入口地址低

17、位PUSH A ;进栈暂存INC AMOVC A , A+DPTR ;取得入口地址高位MOV DPH , APOP DPLCLR AJMP A+DPTR ;转向键处理子程序BS: DB RK0L ;处理子程序入口地址表DB RK0HDB RK1LDB RK1H键码 入口地址0 RK01 RKl2 RK2 优秀文档,精彩无限!优质文档,精彩无限!DB RK2LDB RK2H五、数据极值查找程序例 4-6 内部 RAM20H 单元开始存放 8 个无符号 8 位二进制数,找出其中的最大数。极值查找操作的主要内容是进行数值大小的比较。假定在比较过程中,以 A 存放大数,与之逐个比较的另一个数放在 2A

18、H 单元中。比较结束后,把查找到的最大数送 2BH单元中。程序流程如图所示。参考程序如下:MOV R0 , # 20H ;数据区首地址MOV R7 , # 08H ;数据区长度MOV A , R0 ;读第一个数DEC R7LOOP: INC R0MOV 2AH , R0 ;读下一个数CJNE A ,2AH , CHK;数值比较CHK: JNC LOOP1 ;A 值大转移MOV A , R0 ;大数送 ALOOP1: DJNZ R7 , LOOP ;继续MOV 2BH , A ;极值送 2BH 单元HERE: AJMP HERE ;停止图 4-8 极值查找程序流程图 4-8 极值查找程序流程第四

19、章 MCS-51 汇编语言程序设计 99六、数据排序程序例 4-7 假定 8 个数连续存放在 20H 为首地址的内部 RAM 单元中,使用冒泡法进行升序排序编程。设 R7 为比较次数计数器,初始值为 07H。TR0 为冒泡过程中是否有数据互换的状态标志,TR0 = 0 表明无互换发生, TR0 = 1 表明有互换发生。参考程序:SORT: MOV R0 , # 20H ;数据存储区首单元地址MOV R7 , # 07H ;各次冒泡比较次数CLR TR0 ;互换标志清“0”LOOP: MOV A , R0 ;取前数MOV 2BH , A ;存前数INC R0MOV 2AH , R0 ;取后数CL

20、R CSUBB A , R0 ;前数减后数冒泡法排序程序流程优秀文档,精彩无限!优质文档,精彩无限!JC NEXT ;前数小于后数,不互换MOV R0 , 2BHDEC R0MOV R0 , 2AH ;两个数交换位置INC. R0 ;准备下一次比较SETB TR0 ;置互换标志NEXT: DJNZ R7 , LOOP ;返回,进行下一次比较JB TR0 , SORT ;返回,进行下一轮冒泡HERE: SJMP $ ;排序结束本章小结:本章首先介绍了单片机汇编语言程序设计的基本概念,单片机汇编语言伪指令;详细的讲述了三种汇编语言程序设计的基本结构,即:顺序结构、分支结构和循环结构程序设计的步骤和方法;然后介绍了几种汇编语言程序设计实例。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报