单片机汇编语言程序设计.ppt
《单片机汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《单片机汇编语言程序设计.ppt(72页珍藏版)》请在课桌文档上搜索。
1、第4章 MCS-51汇编语言程序设计,教学基本要求:(1)、了解MCS-51汇编语言程序设计的特点;(2)、熟悉MCS-51汇编语言伪指令的功能及用法;(3)、掌握顺序、分支、循环程序的设计方法;(4)、掌握KEIL软件的使用方法。教学重点:(1)、KEIL软件的使用方法;(2)、分支、循环程序的设计方法;(3)、定时、查表程序的设计方法;教学难点:(1)、KEIL软件调试程序的方法;(2)、利用JMP A+DPTR指令实现程序多分支;(3)、查表程序的设计方法;(4)、子程序结构与堆栈的关系。,4.1 单片机程序程序设计语言概述,4.1.1 机器语言和汇编语言4.1.2 单片机使用的高级语言
2、(1)BASIC语言(2)C语言(3)PL/M语言 4.1.3 80C51单片机汇编语言的语句格式,汇编语言程序设计必须注意如下特点:(1)设计人员必须详细了解单片机的硬件结构,以便在程序设计中熟练使用;(2)必须熟悉汇编语言指令的功能和用法;(3)在程序设计前,必须分析设计任务,确定所用算法,确定程序结构,确定数据的类型、数据的结构,必须对数据的存放、寄存器和工作单元的使用以及所用硬件资源等作出具体安排;(4)根据分析,画出程序设计流程图;(5)根据程序设计流程图编写程序。,4.2 汇编语言程序的基本结构形式,单片机汇编语言程序设计的基本结构形式一般分为以下4种形式,即顺序结构、分支结构、循
3、环结构和子程序结构。4.2.1 顺序程序结构 顺序程序是最简单的程序结构,在顺序程序中,既无分支,循环,也不调用子程序,程序执行时一条一条地按顺序执行指令 例:假定三字节无符号数相加,其中一个加数在内部RAM的50H、51H和52H单元中,另一个加数在内部RAM的53H、54H和55H单元中,要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的00H位中。解:(1)分析任务:求两数之和(2)算法:加法运算(ADD或ADDC),(3)程序结构:顺序或循环结构(4)数据类型:三字节、二进制、无符号数(5)数据结构:升序或降序排列(6)RAM单元安排:(内部RAM字节单元、位地址空
4、间)(7)采用寄存器间接寻址方式(R0、R1),(8)程序设计流程框图;,(9)程序清单;ORG 1000H MOV RO,#52H;加数N1的低字节地址送地址指针R0 MOV R1,#55H;加数N2的低字节地址送地址指针R1 MOV A,R0;取N1的低字节 ADD A,R1;N1、N2低字节相加 MOV R0,A;保存N1、N2低字节和 DEC R0;修改加数N1的地址指针内容 DEC R1;修改加数N2的地址指针内容 MOV A,R0;取N1的中间字节 ADDC A,R1;N1、N2中间字节带低字节和进位相加 MOV R0,A;保存N1、N2中间字节和 DEC R0;修改加数N1的地址
5、指针内容,DEC R1;修改加数N2的地址指针内容 MOV A,R0;取N1的高字节 ADDC A,R1;N1、N2高字节带中间字节和进位相加 MOV R0,A;保存N1、N2高字节和 MOV 00H,C;高字节和的进位送00H位保存 END 思考题:1)上述程序中,如果只采用ADDC指令,应如何修改程序?2)如果N1、N2,N3均为十进制数,应如何修改程序?3)如果加数N1在内部RAM 50H、51H和52H单元中,而加数N2与和N3均在外部RAM0053H、0054H和0055H单元中,其它条件不变,应如何修改程序?4)如果N1、N2,N3均存放在外部RAM单元,应如何修改程序?,思考题:
6、1)ORG 1000H MOV RO,#52H;加数N1的低字节地址送地址指针R0 MOV R1,#55H;加数N2的低字节地址送地址指针R1 MOV A,R0;取N1的低字节 CLR C;清原来进位位CY的内容 ADDC A,R1;N1、N2低字节相加 MOV R0,A;保存N1、N2低字节和 DEC R0;修改加数N1的地址指针内容 DEC R1;修改加数N2的地址指针内容 MOV A,R0;取N1的中间字节 ADDC A,R1;N1、N2中间字节带低字节和进位相加 MOV R0,A;保存N1、N2中间字节和 DEC R0;修改加数N1的地址指针内容,DEC R1;修改加数N2的地址指针内
7、容 MOV A,R0;取N1的高字节 ADDC A,R1;N1、N2高字节带中间字节和进位相加 MOV R0,A;保存N1、N2高字节和 MOV 00H,C;高字节和的进位送00H位保存 END 思考题:2)ORG 1000H MOV RO,#52H;加数N1的低字节地址送地址指针R0 MOV R1,#55H;加数N2的低字节地址送地址指针R1 MOV A,R0;取N1的低字节 ADD A,R1;N1、N2低字节相加 DA A;N1、N2低字节和十进制调整 MOV R0,A;保存N1、N2低字节和,DEC R0;修改加数N1的地址指针内容 DEC R1;修改加数N2的地址指针内容 MOV A,
8、R0;取N1的中间字节 ADDC A,R1;N1、N2中间字节带低字节和进位相加 DA A;N1、N2中间字节和十进制调整 MOV R0,A;保存N1、N2中间字节和 DEC R0;修改加数N1的地址指针内容 DEC R1;修改加数N2的地址指针内容 MOV A,R0;取N1的高字节 ADDC A,R1;N1、N2高字节带中间字节和进位相加 DA A;N1、N2高字节和十进制调整 MOV R0,A;保存N1、N2高字节和 MOV 00H,C;高字节和的进位送00H位保存 END,思考题3)ORG 1000H MOV RO,#52H;加数N1的低字节地址送地址指针R0 MOV R1,#55H;加
9、数N2的低字节地址送地址指针R1 MOVX A,R1;取N2的低字节 ADD A,R0;N1、N2低字节相加 MOVX R1,A;保存N1、N2低字节和 DEC R0;修改加数N1的地址指针内容 DEC R1;修改加数N2的地址指针内容 MOVX A,R1;取N2的中间字节 ADDC A,R0;N1、N2中间字节带低字节和进位相加 MOVX R1,A;保存N1、N2中间字节和 DEC R0;修改加数N1的地址指针内容,DEC R1;修改加数N2的地址指针内容 MOVX A,R1;取N2的高字节 ADDC A,R0;N1、N2高字节带中间字节和进位相加 MOVX R1,A;保存N1、N2高字节和
10、 MOV 00H,C;高字节和的进位送00H位保存 END 如果N2、N3的数据地址指针采用DPTR,则程序修改如下:ORG 1000H MOV RO,#52H;加数N1的低字节地址送地址指针R0 MOV DPTR,#0055H;加数N2的低字节地址送DPTR MOVX A,DPTR;取N2的低字节 ADD A,R0;N1、N2低字节相加 MOVX DPTR,A;保存N1、N2低字节和 DEC R0;修改加数N1的地址指针内容,MOV DPTR,#0054H;修改加数N2的地址指针内容 MOVX A,DPTR;取N2的中间字节 ADDC A,R0;N1、N2中间字节带低字节和进位相加 MOVX
11、 DPTR,A;保存N1、N2中间字节和 DEC R0;修改加数N1的地址指针内容 MOV DPTR,#0053H;修改加数N2的地址指针内容 MOVX A,DPTR;取N2的高字节 ADDC A,R0;N1、N2高字节带中间字节和进位相加 MOVX DPTR,A;保存N1、N2高字节和 MOV 00H,C;高字节和的进位送00H位保存 END 思考:修改加数N2的数据地址指针DPTR的内容可否采用 DEC DPTR指令?,例:设内部RAM 40H,41H单元中分别存放8位二进制数,现分别取这两个单元中的半个字节,合并成一个新字节存放在42H单元中。要求如下:42H单元新字节的低半字节取自40
12、H单元的低半字节,而高半字节取自41H单元的低半字节。解:(1)分析任务:拆字、合字,(2)算法:逻辑运算(3)程序结构:顺序(4)数据类型:单字节、二进制、无符号数(5)数据结构:升序或降序排列(6)程序设计流程框图;,(7)程序清单;ORG 2000H START:MOV R1,#40H;初始化数据指针R1的内容 MOV A,R1;取40H单元内容送A ANL A,#0FH;保留40H单元内容低4位 INC R1;修改数据指针R1的内容 XCH A,R1;(A)与R1内容互换 ANL A,#0FH;保留41H单元内容低四位 SWAP A;41H单元内容高低半字节互换 ORL A,R1;合字
13、生成新字节 INC R1;修改数据指针R1的内容 MOV R1,A;新字节送42H单元保存 END作业题:上例中其它条件不变,要求如下:42H单元新字节的低半字节取自40H单元的低半字节,而高半字节取自41H单元的高半字节。,(1)单分支程序 单分支程序是通过条件转移指令实现的,即根据条件对程序的执行进行判断,满足条件则进行程序转移,不满足条件程序就顺序执行。在MCS-51指令系统中,可利用JZ,JNZ,CJNE,DJNZ,JC,JNC,JB,JNB,JBC等指令,完成为0、为1、为正、为负以及相等、不相等等各种条件判断。例:两个8位无符号二进制数比较大小。假设在外部RAM中有ST1、ST2和
14、ST3共3个连续单元(单元地址从小到大),其中ST1、ST2单元中存放着两个8位无符号二进制数N1,N2,要求找出其中的大数并存入ST3单元中。,4.2.2 分支程序结构,解:(1)分析任务:比较两个数的大小(2)算法:算术运算、控制转移(3)程序结构:单分支(4)数据类型:单字节、二进制、无符号数(5)数据结构:单元地址升序排列(6)RAM单元安排:外部RAM单元(7)采用寄存器间接寻址方式(R0、R1或DPTR)(8)程序设计流程框图;(9)程序清单;思考题(补充作业题):上例中,如果采用CJNE A,direct,rel指令,应如何修改程序?,返回,ORG 8000H START:CLR
15、 C;进位清0 MOV DPTR,#ST1;设数据指针 MOVX A,DPTR;A(ST1),取N1 MOV R2,A;暂存N1 INC DPTR;DPTR ST2(指向N2单元)MOVX A,DPTR;取N2存于A中 SUBB A,R2;N1,N2比较(N2-N1,差在A中)JNC BIG1;N2N1,转BIG1,N2N1,顺序执行 XCH A,R2;N1,N2互换,A N1 SJMP BIG0 BIG1:MOVX A,DPTR;A N2 BIGO:INC DPTR;DPTR ST3(指向N3单元)MOVX DPTR,A;ST3 大数 END,返回,(2)多分支程序 假设多分支程序中,分支序
16、号的最大值为n,则多分支转移结构如图所示:MCS-51指令系统没有多分支转移指令,无法使用单条指令完成多分支转移。要实现多分支转移,可采用以下几种方法:,假设分支序号值保存在累加器A中,则可使用CJNE A,#data,rel指令,其分支流程如图所示:,(a)使用多条CJNE指令,通过逐次比较,实现分支程序转移,例:已知:127X-128,求Y。设X,Y分别存放在外部RAM 1000H和2000H单元中。解:(1)分析任务:解方程(2)算法:控制转移(3)程序结构:多分支(4)数据类型:单字节、二进制、有符号数(5)RAM单元安排:外部RAM单元(6)采用寄存器间接寻址方式(R0、R1或DPT
17、R)(7)程序设计流程框图(8)程序清单;思考题(补充作业题):上例中,如果采用CJNE指令,应如何修改程序?,返回,ARE EQU 1000H;BUF EQU 2000H;ORG 1000HSTART:MOV DPTR,#ARE;数据X的地址送数据指针DPTR MOVX A,DPTR;A取数据X JZ SUL;X0转SUL JB ACC.7,NEG;X0转NEG,否则,X0 MOV A,#01H;SJMP SUL;NEG:MOV A,#0FFH;(0FFH为-1补码)SUL:MOV DPTR,#BUF;数据Y的地址送数据指针DPTR MOVX DPTR,A;保存Y值 END,返回,首先,在程
18、序中建立一个转移指令表,在表格中存放转移指令,然后,通过查转移指令表的方式实现多分支程序转移。这种方法主要利用散转指令JMP A+DPTR,此指令采用变址寻址方式,操作过程:(PC)(A)+(DPTR),CPU根据PC的内容来实现多分支程序转移。DPTR中送转移指令表的表首地址(常用转移指令表的名称标号代替),而A中送转移指令表中存放的转移指令的序号(常常从第0条开始)。例如,有多个分支程序,如要通过AJMP转移指令进行转移,则应把这些转移指令按序写入转移指令表中,并设置一个序号指针(例如R3),序号往往从0开始,然后可使用以下查表程序实现程序转移。,(b)使用查转移指令表的方法实现多分支程序
19、转移,MOV A,R3;分支程序序号送A RL A;分支程序序号乘2 MOV DPTR,#BRTAB;BRTAB为转移指令表名称标号,JMP A+DPTR;也为转移指令表首地址BRTAB:AJMP ROUT0;分支程序0的转移指令 AJMP ROUT1;分支程序1的转移指令 AJMP ROUT2;AJMP ROUT127;分支程序127的转移指令ROUT0:;分支程序0ROUT1:;ROUT127:;分支程序127,由于AJMP指令是二字节指令,因此,程序中通过RL A指令将分支序号乘2。转移指令表中最多只能安排128条分支转移指令,如需多于128条,则必须另行修改程序。由于AJMP指令转移范
20、围是2KB,因此,分支程序应安排在以JMP A+DPTR指令为中心的2KB范围之内,否则会出错。如果转移指令表中的转移指令是LJMP指令,则分支程序可安排在64KB ROM空间的任何地方。但转移指令表中的转移指令的条数最多为85条(LJMP指令是三字节指令),上述程序应作相应的修改。MOV A,R3;MOV B,#03H;MUL AB;,MOV DPTR,#BRTAB;BRTAB为转移指令表名称标号,JMP A+DPTR;也为转移指令表首地址BRTAB:LJMP ROUT0;分支程序0的转移指令 LJMP ROUT1;分支程序1的转移指令 LJMP ROUT2;LJMP ROUT85;分支程序
21、85的转移指令ROUT0:;分支程序0ROUT1:;ROUT85:;分支程序85,例:假设键盘上有4个按键,功能说明如下表:程序流程框图,假设转移指令表名称为BRTAB,分支程序序号已在A 中。MOV DPTR,#BRTAB CLR C RLC A JMP A+DPTR;ORG 3000H3000H BRTAB:AJMP ER;转删除分支程序,3000H BRTAB:AJMP ER;转删除分支程序3001H 3002H AJMP DS;转读数据分支程序3003H3004H AJMP XS;转写数据分支程序3005H3006H AJMP CR;转插入分支程序3007H ORG 3100H3100
22、H ER:;删除分支程序 ORG 3200H3200H DS:;读数据分支程序 ORG 3300H3300H XS:;写数据分支程序 ORG 3400H3400H CR:;插入分支程序 END,返回,4.2.3 循环程序结构,MCS-51汇编语言指令系统没有专用的循环指令,但可以使用条件转移指令通过条件判断来控制循环是继续还是结束。循环程序一般由四个主要部分组成:(1)初始化部分:为循环程序做准备,如规定循环次数、给各变量和地址指针预置初值。(2)处理部分:为反复执行的程序段,是循环程序的实体,也是循环程序的主体。(3)循环控制部分:其作用是修改循环变量和控制变量,并判断循环是否结束,直到符合
23、结束条件时,跳出循环为止。(4)结束部分:这部分主要是对循环程序的结果进行分析、处理和存放。,单循环程序一般有以下两种典型结构:,双重循环程序的结构:,在应用系统程序设计时,有时经常需要将数据存储器中各部分地址单元作为工作单元,以存放程序执行的中间值或执行结果,因此,在使用这些工作单元之前,必须将工作单元清零。工作单元清零可用循环程序完成。例:假设在内部RAM区,开辟96个工作单元,工作单元首地址为20H,则工作单元清零程序子程序如下:ORG 1000H CLR0:MOV R0,#20H;循环初始化部分 MOV R7,#96;CLR A LOOP:MOV R0,A;循环体部分 INC R0;修
24、改变量 DJNZ R7,LOOP;循环控制部分 RET END思考题(补充作业题):如采用CJNE指令,应如何修改程序?,例:两个三字节二进制无符号数相加,被加数放在内部RAM 20H22H单元(低字节存放在低地址单元,高字节存放在高地址单元,即低位在前,高位在后),加数放在2AH2CH单元,和放在20H22H单元,最高位如有进位,则放在23H单元中。解:数据类型(二、十进制数,有、无符号数);数据结构(升、降序排列),被加数 N1 高字节(8位)中字节(8位)低字节(8位)加数 N2 高字节(8位)中字节(8位)低字节(8位)+)进位位(CY)进位位(CY)进位位(CY)和 N3 进位 高字
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 汇编语言 程序设计
链接地址:https://www.desk33.com/p-246786.html