单片机原理及应用-第4章汇编语言程序设计.ppt

上传人:牧羊曲112 文档编号:5937865 上传时间:2023-09-06 格式:PPT 页数:42 大小:322.61KB
返回 下载 相关 举报
单片机原理及应用-第4章汇编语言程序设计.ppt_第1页
第1页 / 共42页
单片机原理及应用-第4章汇编语言程序设计.ppt_第2页
第2页 / 共42页
单片机原理及应用-第4章汇编语言程序设计.ppt_第3页
第3页 / 共42页
单片机原理及应用-第4章汇编语言程序设计.ppt_第4页
第4页 / 共42页
单片机原理及应用-第4章汇编语言程序设计.ppt_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《单片机原理及应用-第4章汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《单片机原理及应用-第4章汇编语言程序设计.ppt(42页珍藏版)》请在三一办公上搜索。

1、第4章汇编语言程序设计,本章学习目标:了解汇编语言程序设计步骤。掌握简单的顺序程序设计。掌握简单的分支程序设计。掌握简单的循环程序设计。掌握简单的子程序设计。掌握一些常用程序设计。,4.1 汇编语言程序设计概述,4.1.1 程序设计语言1机器语言 机器语言是计算机唯一能识别和执行的语言,用其编写的程序执行效率最高,速度最快,但由于指令的二进制代码很难记忆和辨认,给程序的编写、阅读和修改带来很多困难,所以几乎没有人直接使用用机器语言来编写程序。,2汇编语言 为了容易理解和记忆计算机的指令,人们用英文助记符表示指令,用助记符表示的指令就是符号语言或汇编语言。汇编语言特点:(1)面向机器的语言,程序

2、设计员须对MCS-51的硬件有相当深入的了解。(2)助记符指令和机器指令一一对应,用汇编语言编写的程序效率高,占用存储空间小,运行速度快,用汇编语言能编写出最优化的程序。能直接管理和控制硬件设备(功能部件),它能处理中断,也能直接访问存储器及I/O接口电路。(3)汇编语言和机器语言都脱离不开具体机器的硬件,均是面向“机器”的语言,缺乏通用性。,3高级语言 高级语言是一种面向算法、过程和对象的程序设计语言,它采用更接近人们自然语言和习惯的数学表达式及直接命令的方法来描述算法、过程和对象。高级语言的语句直观、易学、通用性强,便于推广、交流,但高级语言编写的程序经编译后所产生的目标程序大,占用内存多

3、,运行速度较慢。,4.1.2 汇编语言程序设计步骤 1分析题意,明确要求。2确定算法。根据实际问题的要求、给出的条件及特点,找出规律性,最后确定所采用的计算公式和计算方法,这就是一般所说的算法。算法是进行程序设计的依据,它决定了程序的正确性和程序的指令。处理框流程线判断框起止框3画程序流程图,用图解来描述和说明解题步骤。,4分配内存工作单元,确定程序与数据区存放地址。5编写源程序。6程序优化。7上机调试、修改和最后确定源程序。,4.1.3 汇编语言格式与伪指令1汇编程序格式标号:操作码助记符 目的操作数,源操作数;注释例如:CLEAR:MOV A,#00H;将0送入A中,2伪指令 伪指令不能命

4、令CPU执行某种操作,也没有对应的机器代码,它的作用仅用来给汇编程序提供某种信息。,(1)ORG 汇编起始地址命令 在汇编语言源程序的开始,通常都用一条ORG伪指令来实现规定程序的起始地址。例如 ORG 2000HSTART:MOV A,#00H规定标号START代表地址为2000H开始。,(2)END 汇编终止命令 汇编语言源程序的结束标志,用于终止源程序的汇编工作。在整个源程序中只能有一条END命令,且位于程序的最后。,(3)DB(Define Byte)定义字节命令在程序存储器的连续单元中定义字节数据。例如ORG 2000HDB 30H,40H,24,“C”,“B”汇编后:(2000H)

5、=30H(2001H)=40H(2002H)=18H(10进制数24)(2003H)=43H(字符“C”的ASCII码)(2004H)=42H(字符“B”的ASCII码),(4)DW(Define Word)定义数据字命令从指定的地址开始,在程序存储器的连续单元中定义16位的数据字。例如ORG 2000HDW 1246H,7BH,10汇编后:(2000H)=12H;第1个字(2001H)=46H(2002H)=00H;第2个字(2003H)=7BH(2004H)=00H;第3个字(2005H)=0AH(2005H)=0AH,(5)EQU(Equate)赋值命令 用于给标号赋值。赋值以后,其标号

6、值在整个程序有效。例如:TEST EQU 2000H 表示标号TEST=2000H,在汇编时,凡是遇到标号TEST时,均以2000H来代替。,(6)BIT(位地址赋值)伪指令 该语句的功能是把BIT右边的位地址赋给它左边的“字符名称”。因此,BIT语句定义过的“字符名称”是一个符号位地址。例如:ORG 0030HA1 BIT 00HA2 BIT P0.0,4.2 顺序程序设计,例4-1 有两个三字节无符号数,其中一个加数在内部RAM的50H、51H、52H单元中,另一个加数在内部RAM的53H、54H和55H单元中,要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区00H位中

7、。,解:ORG 0010H MOV R0,#52H;一个加数的低字节地址 MOV R1,#55H;另一个加数的低字节地址 MOV A,R0 ADD A,R1;低字节相加 MOV R0,A;存放低字节相加结果 DEC R0 DEC R1 MOV A,R0 ADDC A,R1;中间字节带进位相加 MOV R0,A;存放中间字节相加结果 DEC R0 DEC R1 MOV A,R0 ADDC A,R1;高字节带进位相加 MOV R0,A;存放高字节相加结果 MOV 00H,C;进位送00H位保存 SJMP$END,4.3 分支程序设计,例4-2 累加器A中有一单字节有符号数,求其二进制补码。解:正数

8、补码是其本身,负数补码是其反码加1。因此,程序应首先判断被转换数的符号,负数进行转换,正数即为补码。ORG 0020H JNB ACC.7,RETURN;A0,不需要转换 MOV C,ACC.7;符号位保存 CPL A;A求反,加1 ADD A,#1 MOV ACC.7,C;符号位存A的最高位RETURN:RET,例4-3 设自变量为一无符号数,存放在内部RAM的VAX单元,函数Y存放在FUNC单元。请编写满足如下关系的程序:,ORG 0200H VAR DATA 20H FUNC DATA 21H MOV A,VAR;A(20H)CJNE A,#50,NEXT1;建立CyNEXT1:JNC

9、DONE;若X50,则DONE CJNE A,#20H,NEXT2;建立CyNEXT2:JC NEXT3;若X20,则NEXT3 RL A RL A ADD A,20H;A5X SJMP DONE NEXT3:RL A;A2X DONE:MOV FUNC,A;21HA SJMP$END,4.4 循环程序设计,例4-4 设单片机8031内部RAM起始地址30H的数据块中有64个无符号数。试编写程序使它们按从小到大的顺序排列。,ORG 1000HBUBBLE:MOV R0,#30H;置数据块指针R0 MOV R2,#64;块长送R2 CLR 7FH;交换标志2FH.7清零 DEC R2;块长1为比

10、较次数BULOOP:MOV 20H,R0;eN送20H MOV A,R0;eN送A INC R0 MOV 21H,R0;eN-1送21H DEC A CJNE A,21H,LOOP;(20H)和(21H)比较 LOOP:JC BUNEXT;若(20H)(21H),则BUNEXT MOV R0,20H;若(20H)(21H),则两者交换 DEC R0 MOV R0,21H INC R0;恢复数据块指针 SETB 7FH;置“1”交换标志位BUNEXT:DJNZ R2,BULOOP;若一次冒泡未完,则BULOOP JB 7FH,BUBBLE;若交换标志位为1,则BUBBLE SJMP$;停机 EN

11、D,例4-5 外部RAM从2000H到2100H有一数据块,请编写将它们传送到从3000H到3100H区域的程序。,ORG 0500HMOV DPTR,#3000H;目标地址送3000HPUSH DPL;目标地址送栈PUSH DPHMOV DPTR,#2000H;源地址送DPTRMOV R2,#01H;块长送R3R2MOV R3,#01HLOOP:MOVX A,DPTR;源数送AINC DPTRMOV R5,DPH;源针加1后送R5R4MOV R4,DPLPOP DPH;目标地址送DPTR POP DPLMOVX DPTR,A;送数 INC DPTR;目标地址加1PUSH DPL;送栈PUSH

12、 DPHMOV DPH,R5;源针送DPTRMOV DPL,R4CLR C;Cy清零MOV A,R2;R2-1送R2SUBB A,#01HMOV R2,AMOV A,R3;R3-Cy送R3SUBB A,#00HMOV R3,AORL A,R2;R3R2送AJNZ LOOP;R3R20,则LOOPSJMP$;否则,停机END,例4-6 设晶振频率为6MHz,试编写能延时20ms的子程序。解:ORG 0D00HDELAY:MOV R7,#49DELAY2:MOV R6,#64HDELAY1:DJNZ R6,DELAY1 NOP DJNZ R7,DELAY2 NOP RET,4.5 子程序的设计,例

13、4-7 设MDA和MDB内有两数a和b,请编写求c=并把c送入MDC的程序。设a和b皆为小于10的整数。,ORG 1000H MDA DATA 20H MDB DATA 21H MDC DATA 22H MOV A,MDA;入口参数a送A ACALL SQR;求a2 MOV R1,A;a2送R1 MOV A,MDB;入口参数b送A ACALL SQR;求a2 ADD A,R1;a2+b2送A MOV MDC,A;存入MDC SJMP$;停机 SQR:ADD A,#01H;地址调整 MOVC A,A+PC;查平方表 RET;返回SQRTAB:DB 0,1,4,9,16 DB 25,36,49,6

14、4,81 END,例4-8 求两个无符号数据块中的最大值。数据块的起始地址分别为内部RAM20H、30H,20H、30H中存放数据块的长度(长度不大于15),把两个数据块中的最大值分别存入51H、52H中。,ORG 2000H MOV SP,#2FH;设堆栈指针 MOV R1,#20H;取第一数据块起始地址送入R1 ACALL QMAX;第一次调用求最大值子程序 MOV 51H,A;第一数据块最大值存入51H中 MOV R1,#30H;取第二数据块起始地址送入R1 ACALL QMAX;第二次调用求最大值子程序 MOV 52H,A;第二数据块最大值存入52H中 ORG 2200HQMAX:MO

15、V A,R1;取数据块长度 MOV R2,A;R2做计数器 CLR A;A清零,准备作比较LOOP1:INC R1;指向下一个数据地址 CLR C;Cy清零,准备做减法 SUBB A,R1;用减法作比较 JNC LOOP2;若A大,则转入LOOP3 MOV A,R1;若A小,则将大数送入A中 SJMP LOOP3;无条件转LOOP3LOOP2:ADD A,R1;恢复A中值LOOP3:DJNZ R2,LOOP1;计数器减1,不为零,继续比较 RET;比较完,子程序返回,4.6 常用程序设计,4.6.1 查表程序设计 查表就是根据自变量x,在表格中寻找y,使y=f(x)。对于MCS-51单片机,数

16、据表格一般存放于程序存储器内。采用MCS-51汇编语言进行查表尤为方便,它有两条专门的查表指令:MOVC A,A+DPTRMOVC A,A+PC,例4-9 设在片外RAM的20H单元中有一数x,其值范围为09,要求利用查表方法求此数的平方值y并把结果存入片外RAM的21H,试编写相应程序。解:ORG 0400HMOV R0,#20H;R020HMOVX A,R0;AxMOV DPTR,#TABMOVC A,A+DPTR;AyMOV R0,#21H;R021HMOVX R0,A;y值送21H单元SJMP$;停机TAB:DB 0,1,4,9,16 DB 25,36,49,64,81END,例4-1

17、1 设有一个巡回检测报警装置,需对16路输入进行检测,每路有一个最大允许值,为双字节。装置运行时,需根据测量的路数,找出每路的最大允许值。看输入值是否大于最大允许值,如大于就报警。根据上述要求,编制一个查表程序。,解:TB3:MOV A,R2ADD A,R2;A(R2)2MOV R3,A;保存指针ADD A,#6;查第一字节MOVC A,A+PCXCH A,R3ADD A,#3MOVC A,A+PC;查第二字节MOV R4,ARETTAB3:DW 1520,3456,2456,2567;最大值表 DW 5560,23366,9756,3457 DW 2694,2567,4753,4673 DW

18、 2577,8989,25475,36553,4.6.2 运算程序设计 例4-12 已知以内部RAM中BLOCK1和BLOCK2为起始地址的存储区中分别有5字节无符号被减数和减数(低位在前,高位在后)。请编写减法子程序令他们相减,并把差放入BLOCK1为起始地址的存储单元。,解:ORG 0A00H SBY:MOV R0,#BLOCK1;被减数起始地址送R0 MOV R1,#BLOCK2;减数起始地址送R1 MOV R2,#05H;字长送R2 CLR C;Cy清零LOOP:MOV A,R0;被减数送A SUBB A,R1;相减,形成Cy MOV R0,A;存差 INC R0;修改被减数地址指针

19、INC R1;修改减数地址指针 DJNZ R2,LOOP;若未完,则LOOP RET END,例4-13 已知两个8位无符号乘数分别放在30H和31H单元中,试编出令它们相乘并把积的低8位放入32H单元、积的高8位放入33H单元的程序。,解:ORG 0100HMOV R0,#30HMOV A,R0INC R0MOV B,R0MUL ABINC R0MOV R0,AINC R0MOV R0,BSJMP$END,4.6.3 码制转换程序设计,例4-14 已知R0低4位有一个十六进制数(0F中的一个),请编写能把它转换成相应ASCII码并送入R0的程序。解:由ASCII码字符表可知09的ASCII码

20、为30H39H,AF的ASCII码为41H46H。因此,计算求解的思路是:若R09,则R0需加37H。,ORG 0400H MOV A,R0;取转换值A ANL A,#0FH;屏蔽高4位 CJNE A,#10,NEXT1;A和10比较NEXT1:JNC NEXT2;若A9,则转NEXT2NEXT2:ADD A,#30H;若A10,AA+30H SJMP DONE;转DONENEXT2:ADD A,#37H;AA+37HDONE:MOV R0,A;存结果 SJMP$END,例4-15 已知20H单元有一个单字节二进制数,请编程把它转换为3位BCD码,百位BCD数放在21H单元,十位和个位BCD数放在22H单元,十位BCD数放在22H单元中的高4位。解:二进制数转换为BCD码的一般方法是把二进制数除以1000、100、10等10的各次幂,所得的商即为千、百、十位数,余数为个位数。,ORG 0200HMOV A,20H;被除数送AMOV B,#100;除数100送BDIV AB;A除以B,商放入A余数放入BMOV 21H,A;百位BCD送21H单元MOV A,B;余数送AMOV B,#10;除数10送BDIV AB;A除以B,商放入A余数放入BSWAP A;十位BCD数交换到A的高4位ADD A,B;十位BCD数与个位BCD数相加送入AMOV 22H,A;存入22H单元END,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号