版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4 4章 MCS-51MCS-51汇编语言程序设计教学基本要求:(1 1)、了解MCS-51MCS-51汇编语言程序设计的特点;(2 2)、熟悉MCS-51MCS-51汇编语言伪指令的功能及用法;(3 3)、掌握顺序、分支、循环程序的设计方法;(4 4)、掌握KEILKEIL软件的使用方法。教学重点:(1 1)、KEIL软件的使用方法;(2 2)、分支、循环程序的设计方法;(3 3)、定时、查表程序的设计方法;教学难点:(1 1)、KEIL软件调试程序的方法;(2 2)、利用JMP A+DPTRJMP A+DPTR指令实现程序多分支;(3 3)、查表程序的设计方法;(4 4)、子程序结构与堆
2、栈的关系。第1页/共64页4.1 单片机程序程序设计语言概述4.1.1 4.1.1 机器语言和汇编语言4.1.2 4.1.2 单片机使用的高级语言(1 1)BASICBASIC语言(2 2)C C语言(3 3)PL/MPL/M语言 4.1.3 80C514.1.3 80C51单片机汇编语言的语句格式第2页/共64页汇编语言程序设计必须注意如下特点:(1 1)设计人员必须详细了解单片机的硬件结构,以便在程序设计中熟练使用;(2 2)必须熟悉汇编语言指令的功能和用法;(3 3)在程序设计前,必须分析设计任务,确定所用算法,确定程序结构,确定数据的类型、数据的结构,必须对数据的存放、寄存器和工作单元
3、的使用以及所用硬件资源等作出具体安排;(4 4)根据分析,画出程序设计流程图;(5 5)根据程序设计流程图编写程序。第3页/共64页4.2 汇编语言程序的基本结构形式 单片机汇编语言程序设计的基本结构形式一般分为以下4 4种形式,即顺序结构、分支结构、循环结构和子程序结构。4.2.1 4.2.1 顺序程序结构 顺序程序是最简单的程序结构,在顺序程序中,既无分支,循环,也不调用子程序,程序执行时一条一条地按顺序执行指令 例:假定三字节无符号数相加,其中一个加数在内部RAMRAM的50H50H、51H51H和52H52H单元中,另一个加数在内部RAMRAM的53H53H、54H54H和55H55H
4、单元中,要求把相加之和存放在50H50H、51H51H和52H52H单元中,进位存放在位寻址区的00H00H位中。解:(1 1)分析任务:求两数之和 (2 2)算法:加法运算(ADDADD或ADDCADDC) 第4页/共64页 (3 3)程序结构:顺序或循环结构 (4 4)数据类型:三字节、二进制、无符号数 (5 5)数据结构:升序或降序排列 (6 6)RAMRAM单元安排: (内部RAMRAM字节单元、位地址空间) (7 7)采用寄存器间接寻址方式(R0R0、R1R1)加数(N1N1)高字节(8 8位)中字节(8 8位)低字节(8 8位)加数(N2N2)高字节(8 8位)中字节(8 8位)低
5、字节(8 8位)加数(N1N1)加数(N2N2)和(N3N3)52H52H单元低字节(8 8位)55H55H单元 低字节(8 8位) 52H52H单元 低字节(8 8位)51H51H单元中字节(8 8位)54H54H单元 中字节(8 8位) 51H51H单元 中字节(8 8位)50H50H单元高字节(8 8位)52H52H单元 高字节(8 8位) 50H50H单元 高字节(8 8位)00H00H位进位位第5页/共64页 (8 8)程序设计流程框图;常常用用流流程程框框图图符符号号开开始始结结束束进进程程判判断断判判断断开开始始加加数数N N1 1和和加加数数N N2 2的的低低字字节节相相加加
6、加加数数N N1 1和和加加数数N N2 2的的高高字字节节相相加加加加数数N N1 1和和加加数数N N2 2的的中中字字节节相相加加处处理理进进位位位位结结束束开开始始取取N N1 1低低字字节节取取N N2 2低低字字节节N N1 1和和N N2 2低低字字节节相相加加保保存存N N1 1和和N N2 2低低字字节节和和取取N N1 1中中字字节节取取N N2 2中中字字节节N N1 1和和N N2 2中中字字节节相相加加保保存存N N1 1和和N N2 2中中字字节节和和取取N N1 1高高字字节节取取N N2 2高高字字节节N N1 1和和N N2 2高高字字节节相相加加保保存存N
7、N1 1和和N N2 2高高字字节节和和处处理理进进位位位位结结束束第6页/共64页 (9 9)程序清单; ORG 1000HORG 1000H MOV RO MOV RO, #52H#52H;加数N1N1的低字节地址送地址指针R0R0 MOV R1 MOV R1, #55H#55H;加数N2N2的低字节地址送地址指针R1R1 MOV A MOV A, R0R0; 取N1N1的低字节 ADD AADD A, R1R1; N1N1、N2N2低字节相加 MOV R0MOV R0, A A; 保存N1N1、N2N2低字节和 DEC R0DEC R0; 修改加数N1N1的地址指针内容 DEC R1DE
8、C R1; 修改加数N2N2的地址指针内容 MOV AMOV A, R0R0; 取N1N1的中间字节 ADDC AADDC A, R1R1; N1N1、N2N2中间字节带低字节和进位相加 MOV R0MOV R0, A A; 保存N1N1、N2N2中间字节和 DEC R0DEC R0; 修改加数N1N1的地址指针内容第7页/共64页 DEC R1 DEC R1; 修改加数N2N2的地址指针内容 MOV AMOV A, R0R0; 取N1N1的高字节 ADDC AADDC A, R1R1; N1N1、N2N2高字节带中间字节和进位相加 MOV R0MOV R0, A A; 保存N1N1、N2N2
9、高字节和 MOV 00HMOV 00H, C C; 高字节和的进位送00H00H位保存 ENDEND 思考题: 1 1)上述程序中,如果只采用ADDCADDC指令,应如何修改程序? 2 2)如果N1N1、N2N2,N3N3均为十进制数,应如何修改程序? 3 3)如果加数N1N1在内部RAM RAM 50H50H、51H51H和52H52H单元中,而加数N2N2与和N3N3均在外部RAM00RAM0053H53H、0054H0054H和0055H0055H单元中,其它条件不变,应如何修改程序? 4 4)如果N1N1、N2N2,N3N3均存放在外部RAMRAM单元,应如何修改程序?第8页/共64页
10、例:设内部RAM 40HRAM 40H,41H41H单元中分别存放8 8位二进制数,现分别取这两个单元中的半个字节,合并成一个新字节存放在42H42H单元中。要求如下:42H42H单元新字节的低半字节取自40H40H单元的低半字节,而高半字节取自41H41H单元的低半字节。解:(1 1)分析任务:拆字、合字内内部部R RA AM MN N1 14 40 0H H单单元元N N2 2内内部部R RA AM MN N4 44 42 2H H单单元元N N2 2内内部部R RA AM MN N3 34 41 1H H单单元元N N4 4第9页/共64页 (2 2)算法:逻辑运算 (3 3)程序结构:
11、顺序 (4 4)数据类型:单字节、二进制、无符号数 (5 5)数据结构:升序或降序排列 (6 6)程序设计流程框图;开开始始取取4 40 0H H单单元元内内容容取取4 41 1H H单单元元内内容容保保留留4 40 0H H单单元元低低半半字字节节保保留留4 41 1H H单单元元低低半半字字节节结结束束合合字字并并保保存存第10页/共64页 (7 7)程序清单; ORG 2000HORG 2000H S START: MOV R1TART: MOV R1, #40H#40H;初始化数据指针R1R1的内容 MOV AMOV A, R1R1; 取40H40H单元内容送A A ANL A ANL
12、 A, #0FH#0FH;保留40H40H单元内容低4 4位 INC R1INC R1; 修改数据指针R1R1的内容 XCH AXCH A, R1R1; (A)(A)与R1R1内容互换 ANL AANL A, #0FH#0FH;保留41H41H单元内容低四位 SWAP ASWAP A; 41H41H单元内容高低半字节互换 ORL AORL A, R1R1; 合字生成新字节 INC R1INC R1; 修改数据指针R1R1的内容 MOV R1MOV R1, A A; 新字节送42H42H单元保存 ENDEND作业题: 上例中其它条件不变,要求如下:42H42H单元新字节的低半字节取自40H40H
13、单元的低半字节,而高半字节取自41H41H单元的高半字节。第11页/共64页(1 1)单分支程序 单分支程序是通过条件转移指令实现的,即根据条件对程序的执行进行判断,满足条件则进行程序转移,不满足条件程序就顺序执行。 在MCS-51MCS-51指令系统中,可利用JZJZ,JNZJNZ,CJNECJNE,DJNZDJNZ,JCJC,JNCJNC,JBJB,JNBJNB,JBCJBC等指令,完成为0 0、为1 1、为正、为负以及相等、不相等等各种条件判断。 例:两个8 8位无符号二进制数比较大小。假设在外部RAMRAM中有ST1ST1、ST2ST2和ST3ST3共3 3个连续单元(单元地址从小到大
14、),其中ST1ST1、ST2ST2单元中存放着两个8 8位无符号二进制数N1N1,N2N2,要求找出其中的大数并存入ST3ST3单元中。4.2.2 分支程序结构第12页/共64页解:(1 1)分析任务:比较两个数的大小 (2 2)算法:算术运算、控制转移 (3 3)程序结构:单分支 (4 4)数据类型:单字节、二进制、无符号数 (5 5)数据结构:单元地址升序排列 (6 6)RAMRAM单元安排:外部RAMRAM单元 (7 7)采用寄存器间接寻址方式(R0R0、R1R1或DPTRDPTR) (8 8)程序设计流程框图; (9 9)程序清单;思考题(补充作业题): 上例中,如果采用CJNE AC
15、JNE A, directdirect,relrel指令,应如何修改程序?第13页/共64页开开 始始设设 置置 数数 据据 指指 针针取取 数数 据据 N N2 2取取 数数 据据 N N1 1并并 暂暂 存存结结 束束N N1 1保保 存存 于于 A A中中N N2 2 N N1 1修修 改改 数数 据据 指指 针针保保 存存 大大 数数N N2 2保保 存存 于于 A A中中Y YN N返回第14页/共64页 ORG 8000H ORG 8000H START: CLR C START: CLR C;进位清0 0 MOV DPTR MOV DPTR, #ST1#ST1; 设数据指针 MO
16、VX AMOVX A,DPTRDPTR; AA(ST1ST1),取N1N1 MOV R2 MOV R2, A A; 暂存N1N1 INC DPTR INC DPTR; DPTR ST2DPTR ST2(指向N2N2单元) MOVX AMOVX A, DPTRDPTR; 取N2N2存于A A中 SUBB ASUBB A, R2R2;N1N1,N2N2比较(N2-N1N2-N1,差在A A中) JNC BIG1JNC BIG1;N2N1N2N1,转BIG1BIG1,N2N2N1N1,顺序执行 XCH AXCH A, R2R2;N1N1,N2N2互换,A N1A N1 SJMP BIG0 SJMP
17、BIG0 BIG1: MOVX A BIG1: MOVX A, DPTRDPTR;A N2A N2 BIGO: INC DPTR BIGO: INC DPTR; DPTR ST3DPTR ST3(指向N3N3单元) MOVX DPTRMOVX DPTR, A A;ST3 ST3 大数 ENDEND返回 第15页/共64页(2 2)多分支程序 假设多分支程序中,分支序号的最大值为n n,则多分支转移结构如图所示: MCS-51MCS-51指令系统没有多分支转移指令,无法使用单条指令完成多分支转移。要实现多分支转移,可采用以下几种方法: K K= =? ?转转向向分分支支转转向向n n分分支支转转
18、向向n n- -1 1分分支支转转向向1 1分分支支K K= =0 0K K= =n nK K= = n n- -1 1K K= =1 1第16页/共64页 假设分支序号值保存在累加器A A中,则可使用CJNE ACJNE A, #data#data, relrel指令,其分支流程如图所示: ( (A A) )= =0 0? ?转转向向0 0分分支支( (A A) )= =1 1? ?( (A A) )= =2 2? ?转转向向2 2分分支支转转向向1 1分分支支Y YY YY YN NN NN N(a)使用多条CJNE指令,通过逐次比较,实现分支程序转移第17页/共64页例:已知:12712
19、7X X-128-128,求Y Y。设X X,Y Y分别存放在外部RAM RAM 1000H1000H和2000H2000H单元中。解:(1 1)分析任务:解方程 (2 2)算法:控制转移 (3 3)程序结构:多分支 (4 4)数据类型:单字节、二进制、有符号数 (5 5)RAMRAM单元安排:外部RAMRAM单元 (6 6)采用寄存器间接寻址方式(R0R0、R1R1或DPTRDPTR) (7 7)程序设计流程框图 (8 8)程序清单;思考题(补充作业题): 上例中,如果采用CJNECJNE指令,应如何修改程序?011y000 xxx第18页/共64页开开 始始取取 数数 据据 X X结结 束
20、束X X= =0 0Y Y= =0 0Y YN NX X 0 0Y Y= =- -1 1Y Y= =1 1N NY Y保保 存存 数数 据据 Y Y返回第19页/共64页 ARE EQU 1000H ARE EQU 1000H; BUF EQU 2000HBUF EQU 2000H; ORG 1000HORG 1000HSTARTSTART:MOV DPTRMOV DPTR, #ARE#ARE; 数据X X的地址送数据指针DPTRDPTR MOVX A MOVX A, DPTRDPTR; AA取数据X X JZ SUL JZ SUL; X X0 0转SULSUL, NEGNEG; X X0 0
21、转NEGNEG,否则,X X0 0 MOV A MOV A, #01H#01H; SJMP SULSJMP SUL; NEG: MOV ANEG: MOV A, #0FFH#0FFH; (0FFH(0FFH为-1-1补码) ) SUL: MOV DPTR SUL: MOV DPTR, #BUF#BUF; 数据Y Y的地址送数据指针DPTRDPTR MOVX DPTR MOVX DPTR, A A; 保存Y Y值 ENDEND返回第20页/共64页 首先,在程序中建立一个转移指令表,在表格中存放转移指令,然后,通过查转移指令表的方式实现多分支程序转移。 这种方法主要利用散转指令JMP A+DPT
22、RJMP A+DPTR,此指令采用变址寻址方式,操作过程:(PCPC)(A A)+ +(DPTRDPTR),CPUCPU根据PCPC的内容来实现多分支程序转移。DPTRDPTR中送转移指令表的表首地址(常用转移指令表的名称标号代替),而A A中送转移指令表中存放的转移指令的序号(常常从第0 0条开始)。 例如,有多个分支程序,如要通过AJMPAJMP转移指令进行转移,则应把这些转移指令按序写入转移指令表中,并设置一个序号指针(例如R3R3),序号往往从0 0开始,然后可使用以下查表程序实现程序转移。(b)使用查转移指令表的方法实现多分支程序转移第21页/共64页 MOV A MOV A, R3
23、R3; 分支程序序号送A A RL A RL A; 分支程序序号乘2 2 MOV DPTR MOV DPTR,#BRTAB#BRTAB; BRTABBRTAB为转移指令表名称标号, JMP A+DPTRJMP A+DPTR; 也为转移指令表首地址BRTABBRTAB:AJMP ROUT0AJMP ROUT0; 分支程序0 0的转移指令 AJMP ROUT1AJMP ROUT1; 分支程序1 1的转移指令 AJMP ROUT2AJMP ROUT2; AJMP ROUT127 AJMP ROUT127; 分支程序127127的转移指令ROUT0ROUT0: ; 分支程序0 0ROUT1: ROUT
24、1: ; ROUT127: ROUT127: ; 分支程序127127第22页/共64页 由于AJMPAJMP指令是二字节指令,因此,程序中通过RL ARL A指令将分支序号乘2 2。转移指令表中最多只能安排128128条分支转移指令,如需多于128128条,则必须另行修改程序。 由于AJMPAJMP指令转移范围是2KB2KB,因此,分支程序应安排在以JMP A+DPTRJMP A+DPTR指令为中心的2KB2KB范围之内,否则会出错。 如果转移指令表中的转移指令是LJMPLJMP指令,则分支程序可安排在64KB ROM64KB ROM空间的任何地方。但转移指令表中的转移指令的条数最多为858
25、5条(LJMPLJMP指令是三字节指令),上述程序应作相应的修改。 MOV AMOV A, R3R3; MOV BMOV B, #03H#03H; MUL ABMUL AB;第23页/共64页 MOV DPTR MOV DPTR,#BRTAB#BRTAB; BRTABBRTAB为转移指令表名称标号, JMP A+DPTRJMP A+DPTR; 也为转移指令表首地址BRTABBRTAB:LJMP ROUT0LJMP ROUT0; 分支程序0 0的转移指令 LJMP ROUT1LJMP ROUT1; 分支程序1 1的转移指令 LJMP ROUT2LJMP ROUT2; LJMP ROUT85 LJ
26、MP ROUT85; 分支程序8585的转移指令ROUT0ROUT0: ; 分支程序0 0ROUT1: ROUT1: ; ROUT85ROUT85:; 分支程序8585第24页/共64页J JM MP P A A+ +D DP PT TR RE ER R分分支支程程序序C CR R分分支支程程序序X XS S分分支支程程序序D DS S分分支支程程序序序序号号= =0 00 0H HD DP PT TR R表表首首地地址址A A分分支支序序号号2 2序序号号= =0 03 3H H序序号号= =0 02 2H H序序号号= =0 01 1H H返回第25页/共64页4.2.3 循环程序结构 M
27、CS-51 MCS-51汇编语言指令系统没有专用的循环指令,但可以使用条件转移指令通过条件判断来控制循环是继续还是结束。 循环程序一般由四个主要部分组成: : (1 1)初始化部分:为循环程序做准备,如规定循环次数、给各变量和地址指针预置初值。 (2 2)处理部分: : 为反复执行的程序段,是循环程序的实体, 也是循环程序的主体。 (3 3)循环控制部分: : 其作用是修改循环变量和控制变量,并判断循环是否结束,直到符合结束条件时,跳出循环为止。 (4 4)结束部分: : 这部分主要是对循环程序的结果进行分析、处理和存放。第26页/共64页 单循环程序一般有以下两种典型结构:第27页/共64页
28、 双重循环程序的结构:开开始始外外循循环环初初始始化化结结束束外外循循环环结结束束否否N NY Y内内循循环环初初始始化化内内循循环环处处理理内内循循环环变变量量修修改改外外循循环环处处理理外外循循环环变变量量修修改改结结束束处处理理内内循循环环结结束束否否N NY Y第28页/共64页 在应用系统程序设计时, ,有时经常需要将数据存储器中各部分地址单元作为工作单元,以存放程序执行的中间值或执行结果, , 因此,在使用这些工作单元之前,必须将工作单元清零。工作单元清零可用循环程序完成。 例:假设在内部RAMRAM区,开辟9696个工作单元,工作单元首地址为20H20H,则工作单元清零程序子程序
29、如下: : ORG 1000H ORG 1000H CLR0 CLR0:MOV R0MOV R0, #20H#20H;循环初始化部分 MOV R7MOV R7, #96#96; CLR ACLR A LOOP LOOP:MOV R0MOV R0, A A; 循环体部分 INC R0INC R0; 修改变量 DJNZ R7DJNZ R7, LOOPLOOP;循环控制部分 RETRET END END思考题(补充作业题):如采用CJNECJNE指令,应如何修改程序?第29页/共64页 例:两个三字节二进制无符号数相加,被加数放在内部RAM RAM 20H20H22H22H单元(低字节存放在低地址单
30、元,高字节存放在高地址单元,即低位在前,高位在后),加数放在2AH2AH2CH2CH单元,和放在20H20H22H22H单元,最高位如有进位,则放在23H23H单元中。解:数据类型(二、十进制数,有、无符号数);数据结构(升、降序排列)被加数(N1N1)高字节(8 8位)中字节(8 8位)低字节(8 8位)加数(N2N2)高字节(8 8位)中字节(8 8位)低字节(8 8位)被加数(N1N1)加数(N2N2)和(N3N3)20H20H单元低字节(8 8位)2AH2AH单元 低字节(8 8位) 20H20H单元 低字节(8 8位)21H21H单元中字节(8 8位)2BH2BH单元 中字节(8 8
31、位) 21H21H单元 中字节(8 8位)22H22H单元高字节(8 8位)2CH2CH单元 高字节(8 8位) 22H22H单元 高字节(8 8位)23H23H单元进位位第30页/共64页被加数 N1 N1 高字节(8 8位) 中字节(8 8位) 低字节(8 8位) 加数 N2 N2 高字节(8 8位) 中字节(8 8位) 低字节(8 8位) + +)进位位(CYCY) 进位位(CYCY) 进位位(CYCY) 和 N3 N3 进位 高字节(8 8位) 中字节(8 8位) 低字节(8 8位) 程序流程框图 程序清单思考题:统计正数、负数、零的个数。第31页/共64页 ORG 0030H ORG
32、 0030HADDDUOADDDUO:MOV R0MOV R0, #20H#20H; 循环初始化部分 MOV R1MOV R1, #2AH#2AH; MOV R7MOV R7, #03H#03H; 循环次数 CLR CCLR C; LOOPLOOP:MOV AMOV A, R0R0; 循环体部分 ADDC AADDC A, R1R1; MOV R0MOV R0, A A; INC R0INC R0; 修改指针变量 INC R1INC R1; DJNZ R7DJNZ R7, LOOPLOOP; 循环控制部分 CLR ACLR A; 循环结束处理部分 ADDC AADDC A, #00H#00H;
33、 MOV R0MOV R0, A A; RETRET; END END 返回第32页/共64页开开始始初初始始化化数数据据指指针针结结束束两两数数加加完完否否N NY Y初初始始化化控控制制变变量量取取加加数数N N1 1取取加加数数N N2 2两两数数相相加加并并保保存存修修改改指指针针变变量量数数据据处处理理返回第33页/共64页 例:把内部RAMRAM中起始地址为DATADATA的数据串传送到外部RAMRAM以BUFFERBUFFER为首地址的区域,直到发现“$”$”字符的ASCASC码为止,同时规定数据串最大长度为3232个字节。解:(1 1)分析任务:数据传送;(2 2)算法:比较、
34、控制转移 (3 3)程序结构:分支、循环(4 4)数据类型:多字节字符串 (5 5)RAMRAM单元安排:内部RAMRAM单元、外部RAMRAM单元 (6 6)采用寄存器间接寻址方式(R0R0、R1R1或DPTRDPTR)外外部部R RA AM MX XX X内内部部R RA AM MD DA AT TA A单单元元A AB BU UF FF FE ER R单单元元Y YY Y( (A A) )$ $( (A A) )= =$ $结结束束第34页/共64页 (7 7)程序流程框图;开开始始初初始始化化数数据据指指针针结结束束数数传传送送完完否否N NY Y初初始始化化控控制制变变量量取取数数数
35、数据据传传送送修修改改指指针针变变量量是是$ $吗吗? ?Y YN N第35页/共64页 ORG 0030H ORG 0030H DATACSDATACS:MOV R0MOV R0, #DATA#DATA; DATADATA数据区首地址 MOV DPTRMOV DPTR, #BUFFER#BUFFER;BUFFERBUFFER数据区首地址 MOV R1MOV R1, #20H#20H; 最大数据串长 LOOPLOOP:MOV AMOV A, R0R0; 取数据 SUBB ASUBB A, #24H#24H; 判是否为“$”$”字符 JZ LOOP1JZ LOOP1; 是“$”$”字符,转结束
36、MOVX DPTRMOVX DPTR,A A; 数据传送 INC R0INC R0; INC DPTRINC DPTR; DJNZ R1DJNZ R1, LOOPLOOP; 循环控制 LOOP1LOOP1:RETRET; 结束 ENDEND第36页/共64页4.3 80C51单片机汇编语言程序设计举例 4.3.2 4.3.2 定时程序 在单片机的控制应用中,常有定时的需要,如定时中断、定时检测和定时扫描等。定时功能除可以使用纯硬件电路、可编程定时/ /计数器实现外,还可以使用软件程序(定时程序)完成。 定时程序是典型的循环程序,它是通过执行一个具有固定延迟时间的循环体来实现定时的。(1 1)单
37、循环定时程序 MOV R5MOV R5, #TIME#TIME;LOOP: NOPLOOP: NOP; NOPNOP; DJNZ R5DJNZ R5, LOOPLOOP;开开始始初初始始化化部部分分结结束束循循环环控控制制部部分分N NY Y循循环环体体第37页/共64页 假设单片机晶振频率f foscosc=6MHz=6MHz,则一个机器周期为2s2s,NOPNOP、DJNZDJNZ指令分别是单、双机器周期指令。定时程序的总延迟时间是循环程序段延时时间的整数倍,由于R5R5是8 8位寄存器,因此,这个定时程序的最长定时时间为: 256256(2 28 8)8=20488=2048(ss)(2
38、 2)较长时间的定时程序 (多重循环定时子程序) TIMETIME:MOV R5MOV R5, #TTME1#TTME1; LOOPLOOP:MOV R4MOV R4, #TEME2#TEME2; LOOP1LOOP1:NOPNOP; NOPNOP; DJNZ R4DJNZ R4, LOOP1LOOP1; DJNZ R5DJNZ R5, LOOP2LOOP2; RETRET; 开开始始外外循循环环初初始始化化结结束束内内循循环环控控制制N NY Y内内循循环环初初始始化化外外循循环环控控制制内内循循环环体体N NY Y第38页/共64页 这个定时子程序的最长定时时间为: 256256(2 28
39、 8)4+2+14+2+1256256(2 28 8)2+4=5258282+4=525828(ss)(3 3)调整定时时间 在定时程序中可通过在循环程序段中增减指令的方法对定时时间进行微调。 例: MOV R0MOV R0, #TTME#TTME; LOOPLOOP:ADD AADD A, R1R1; INC DPTRINC DPTR; DJNZ R0DJNZ R0, LOOPLOOP; 由于ADDADD、INCINC、DJNZDJNZ指令的机器周期分别为1 1、2 2、2 2,所以,该程序定时时间为= =(1+2+21+2+2)2s2sTimeTime(ss)。第39页/共64页假定要求定
40、时时间为24us24us。对于这个定时程序,只须增加一条NOPNOP指令即可实现。 MOV R0MOV R0, #TIME#TIME; LOOPLOOP: ADD AADD A, R1R1; INC DPTRINC DPTR; NOPNOP; DJNZ R0DJNZ R0, LOOPLOOP; 只须TIMETIME取2 2,即可得到精确的24s24s定时。(4 4)以一个基本的延时程序满足不同的定时要求 如果一个系统有多个定时需要,我们就可以设计一个基本延时程序,使其延时时间为各定时时间的最大公约数,然后可以以此基本程序作为子程序,通过调用的方法实现所需不同定时。 第40页/共64页 例:在单
41、片机应用系统中,假设需要的定时时间分别为5S5S、10S10S、20S20S,可设计一个1S1S延时子程序DELAYDELAY,则5S5S、10S10S、20S20S的定时时间可通过调用DELAYDELAY实现。 MOV R0MOV R0, #05H#05H; 5S5S定时 LOOP: LCALL DELAYLOOP: LCALL DELAY; DJNZ R0DJNZ R0, LOOP1LOOP1; MOV R0 MOV R0, #0AH#0AH; 10S10S定时 LOOP2: LCALL DELAYLOOP2: LCALL DELAY; DJNZ R0DJNZ R0, LOOP2LOOP2
42、; MOV R0 MOV R0, #14H#14H; 20S20S定时 LOOP3: LCALL DELAYLOOP3: LCALL DELAY; DJNZ R0DJNZ R0, LOOP3LOOP3; 第41页/共64页 4.3.3 4.3.3 查表程序 所谓查表程序,就是指预先把数据以表格形式存放在程序存储器中,然后使用程序读出,这种能读出表格数据的程序就称之为查表程序。 查表操作对单片机的控制应用十分重要,查表程序常用于实现非线性修正,非线性函数转换以及代码转换等场合。 MCS-51MCS-51单片机指令系统中有两条专用查表指令:(1 1)MOVC AMOVC A, A+DPTRA+DP
43、TR;AA(A A)+ +(DPTRDPTR) (2 2)MOVC AMOVC A, A+PCA+PC; AA(A A)+ +(PCPC) 这两条查表指令的功能是完全相同的,其共同优点是:能在不改变PCPC和DPTRDPTR的状态下,只根据A A的内容就可以取出表格中的数据。注意:A A的内容均为8 8位无符号数。第42页/共64页对于第一条指令,适用于64KB ROM64KB ROM范围内查表(即数据表格的大小和位置可以在64KB64KB程序存储器中任意安排,一个数据表格可以被多个程序块使用),编写查表程序时,首先把表的首地址送入DPTRDPTR中,再要将查表的数据序号(或下标值)送入A A
44、中,然后就可以使用该指令进行查表操作,并把结果送A A中。 对于第二条指令,常用于“本地”范围查表(即数据表格只能放在该指令后面256256个地址单元之内,而且表格只能被本程序使用),编写查表程序时,首先把查表数据的序号送入A A中,再把从查表指令的下一条指令的首地址到表的首地址间的偏移量与A A值相加,然后再使用该指令进行查表操作,并把结果送入A A中。 第43页/共64页例:设计一个子程序,其功能为根据x x的内容(0 09 9之间)查平方表,求出相应的结果y y(y=xy=x2 2)。假设x x的内容已存放在内部RAM RAM 30H30H单元中,求出y y的内容存放在内部RAM 40H
45、RAM 40H单元中。 ORG 1000HORG 1000H1000H SQR1000H SQR: MOV AMOV A, 30H30H; AxAx1002H PUSH DPH1002H PUSH DPH; 现场保护1004H PUSH DPL1004H PUSH DPL; 1006H MOV DPTR1006H MOV DPTR,#TAB1#TAB1; DPTRDPTR表首地址TAB1 TAB1 1009H MOVC A1009H MOVC A, A+DPTRA+DPTR;查表得y y100AH MOV 40H100AH MOV 40H, A A; 40Hy40Hy100CH POP DPL
46、100CH POP DPL; 现场恢复100EH POP DPH100EH POP DPH; 1010H RET1010H RET1011H TAB1: DB 00H1011H TAB1: DB 00H,01H01H,04H04H,09H09H,10H10H,19H19H DB 24H DB 24H,31H31H,40H40H,51H51H第44页/共64页上例中,如果使用MOVC AMOVC A,A+PCA+PC指令,则编程如下: ORG 1000HORG 1000H1000H SQR1000H SQR: MOV AMOV A, 30H30H; AxAx1002H PUSH DPH1002H
47、 PUSH DPH; 现场保护1004H PUSH DPL1004H PUSH DPL;1006H ADD A1006H ADD A, #07H#07H; 加偏移量1008H MOVC A1008H MOVC A, A+PCA+PC; 查表得y y1009H MOV 40H1009H MOV 40H, A A; 40Hy40Hy100BH POP DPL100BH POP DPL; 现场恢复100DH POP DPH100DH POP DPH; 100FH RET100FH RET1010H TAB1: DB 00H1010H TAB1: DB 00H,01H01H,04H04H,09H09H
48、,10H10H,19H19H DB 24H DB 24H,31H31H,40H40H,51H51H此题中,偏移量=1010H-1009H=07H=1010H-1009H=07H第45页/共64页4.4 单片机汇编语言源程序的编辑和汇编 4.5 80C51单片机汇编语言伪指令 汇编语言程序必须转换为二进制的机器代码程序,单片机才能够执行。汇编语言程序转换为机器代码程序的过程,称之为汇编。汇编的方法有两种:即机器交叉汇编和手工汇编。 所谓手工汇编,就是指程序设计人员通过查指令编码表,逐个把助记符指令“翻译”成机器码。手工汇编方法通常用于短、小程序的汇编。长程序则必须通过机器交叉汇编的方法进行汇编。
49、 所谓机器交叉汇编,就是指程序设计人员使用一种计算机的汇编程序去汇编另一种计算机的源程序,具体地说就是运行汇编程序进行汇编的是一种计算机,而运行汇编得到的目标程序的则是另一种计算机。 单片机只能采用机器交叉汇编的方法对汇编语言程序进行汇编第46页/共64页 对汇编语言程序进行机器交叉汇编时,必须告诉计算机的汇编程序应该如何完成汇编工作,这一任务就是通过使用伪指令来实现的。 伪指令是程序设计人员发给汇编程序的指令,也称汇编命令或汇编程序控制指令。它具有控制汇编程序的输入输出、定义数据和符号、条件汇编、分配存储空间等功能。 伪指令没有与之相对应的二进制机器代码,因此,在汇编语言指令系统汇总表中,查
50、不到相对应的二进制机器代码。不同汇编语言的伪指令也有所不同,但一些基本指令是相同的。 手工汇编不需要伪指令,但机器交叉汇编必须使用伪指令。在对汇编语言程序进行机器交叉汇编前,伪指令存在于汇编语言程序中,但汇编后得到的机器代码程序中不存在伪指令相对应的二进制机器代码,这一点请特别注意。第47页/共64页(1 1)ORGORG(ORiGinORiGin)汇编起始地址命令 本命令总出现在汇编语言源程序的开头位置,用于规定目标程序的起始地址,即此命令后面的程序或数据块的起始地址。 命令格式: 标号:ORGORG地址 其中 标号: 是选择项,根据需要选用,地址项,通常为1616位绝对地址,但也可以使用标
51、号或表达式表示。 在汇编语言程序的开始,通常都用一条ORGORG伪指令来规定程序的起始地址,如果不用ORGORG规定,则汇编得到的目标程序将从0000H0000H开始。 例: ORG 8000H ORG 8000H 即规定标号STARTSTART代表地址8000H8000H, STARTSTART:MOV AMOV A, #00H#00H; 目标程序的第一条指令从8000H8000H 开始。第48页/共64页(2 2)ENDEND(END of assemblyEND of assembly)汇编终止命令 本命令用于终止汇编语言源程序的汇编工作,ENDEND是汇编语言源程序的结束标志,因此,在
52、整个汇编语言源程序中只能有一个ENDEND指令,且位于程序的最后。如果ENDEND命令出现在程序中间,则在ENDEND之后的指令,汇编程序将不予处理。 命令格式: 标号:ENDEND表达式 (3 3)EQUEQU(EQUateEQUate)赋值命令 本命令用于给字符名称赋予一个特定值,赋值以后,其值在整个程序中有效。 命令格式:字符名称EQUEQU赋值项 其中赋值项可以是常数,地址,标号或表达式,其值为8 8位或1616位二进制数。赋值以后的字符名称既可以作地址使用,也可以作立即数使用。第49页/共64页 例: HOUR EQU 30HHOUR EQU 30H ORG 1000H ORG 10
53、00H START START:MOV HOURMOV HOUR, #40H#40H; 等同于 STARTSTART:MOV 30HMOV 30H, #40H#40H;(4 4)DBDB(Define ByteDefine Byte)定义数据字节命令 本命令用于从指定的地址单元开始,在程序存储器的连续单元中定义字节数据。 命令格式: 标号:DBDB8 8位数表 常使用本命令存放数据表格。 例:存放7 7段数码管(共阳极)显示的十六进制基数(0 0F F)的十六进制数的字形代码,可使用多条DBDB命令定义。 第50页/共64页 DB 0C0H DB 0C0H,0F9H0F9H,0A4H0A4H,
54、0B0H0B0H; 0 0,1 1,2 2,3 3 DB 99H DB 99H, 92H92H, 82H82H, 0F8H0F8H; 4 4,5 5,6 6,7 7 DB 80H DB 80H, 90H90H, 88H88H, 83H83H; 8 8,9 9,A A,B B DB 0C6H DB 0C6H,0A1H0A1H,86H86H, 84H84H; C C,D D,E E,F F 查表时, ,为确定数据区的起始地址, ,可采用两种方法: a a)根据DBDB命令前一条指令的地址确定。把该地址加上它的字节数就是DBDB的定义的数据字节的起始地址。 例:8100: MOV A, #49H81
55、00: MOV A, #49H;一字节指令 TAB: DB 0COHTAB: DB 0COH,0F9H0F9H,0A4H0A4H,0B0H0B0H; 定义的7 7段数码管(共阳极)显示的十六进制基数(0 0F F)的十六进制数的字形代码从8101H8101H地址单元开始存放。第51页/共64页 b b)使用0RG0RG命令专门规定。 例: ORG 8100H ORG 8100H TAB: DB 0COH TAB: DB 0COH,0F9H0F9H,0A4H0A4H,0B0H0B0H; 定义的7 7段数码管(共阳极)显示的十六进制基数(0 0F F)的十六进制数的字形代码从8101H8101H地
56、址单元开始存放。(5 5)DWDW(Define WordDefine Word)定义数据字命令 本命令用于从指定地址开始,在程序存储器单元中定义1616位的数据字。 命令格式: 标号:DWDW1616位数表 存放时,数据字的高8 8位在前(低地址),低8 8位在后(高地址)。 第52页/共64页 例:DW “AA”DW “AA”; 存入41H41H,42H42H。 DBDB和DWDW定义的数表,数的个数不得超过8080个。如数据的数目较多时,可使用多个定义命令。 在MCS-51MCS-51程序设计应用中,常以DBDB来定义数据,以DWDW来定义地址。 (6 6)DSDS(Define Sto
57、nageDefine Stonage)定义存储区命令 本命令用于从指定地址开始,保留指定数目的字节单元作为存储器,供程序运行使用,汇编时,对这些单元不赋值。 命令格式: 标号:DS DS 1616位数表 例: ORG 8100HORG 8100H DS 08H DS 08H 从8100H8100H地址开始,保留8 8个连续的地址单元。 第53页/共64页(7 7)BIT BIT 位定义命令 本命令用于给字符名称赋以位地址 命令格式:字符名称BITBIT位地址 其中位地址可以是绝对地址,也可以是符号地址(即位符号名称) 例: 把的位地址赋给变量AQAQ,在其后的编程中,AQAQ就可以作为位地址使
58、用。 第54页/共64页补充内容:子程序结构 子程序结构是一种非常重要的程序结构。在一个程序中经常遇到反复多次某程序段的情况,如果重复书写这个程序段,会使程序变得冗长而杂乱。对此,可采用子程序结构,即把重复的程序段编写为一个子程序,通过主程序调用而使用它。这样不但减少了编程工作量,而且也缩短了程序的长度。 调用和返回构成了子程序调用的完整过程。为了实现这一过程,必须有子程序调用指令和返回指令。调用指令在主程序中使用,而返回指令则应该是子程序的最后一条指令。执行完这条指令后,程序返回主程序断点处继续执行。第55页/共64页(1 1)子程序的编程原则 在实际的单片机应用系统软件设计中,为了程序结构
59、更加清晰,易于设计,易于修改,增强程序可读性,基本上都要使用子程序结构。子程序作为一个具有独立功能的程序段,编程时需遵循以下原则: a a)子程序的第一条指令必须有标号,明确子程序入口地址; b b)以返回指令RETRET结束子程序; c c)子程序说明部分; 子程序名称:提供给主程序调用的名字,通常用符号或子程 序第一条语句的标号来表示。 子程序功能:简要说明子程序能完成的主要功能。 子程序入口参数:主程序需要向子程序提供的参数。第56页/共64页 子程序出口参数:子程序执行完之后向主程序返回的参数。 子程序占用资源:子程序中使用了哪些存储单元、寄存器等 子程序堆栈深度:子程序占用堆栈区的最大字节数。 子程序嵌套情况:子程序中继续调用子程序的情况。 子程序的字节数:子程序中所有指令字节数的总和。 子程序执行时间:子程序中所有指令的机器周期数总和。 这些说明是写给程序员看的,供以后使用子程序时参考。 d d)较强的通用性和可浮动性,尽可能避免使用具体的内存单元和绝对转移地址等。 e e)注意保护现场和恢复现场。 子程序在编制过程中经常会用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026南京林业大学淮安校区公寓管理服务中心工作人员招聘考试备考试题及答案解析
- 2026年及未来5年市场数据河北省医疗卫生市场运行态势及行业发展前景预测报告
- 酒店合规联系会议制度
- 2026江西中寰投资集团及其下属公司招聘10人考试参考题库及答案解析
- 2026西藏日喀则市审计局招聘网络技术人员4人考试模拟试题及答案解析
- 2026西昌人力资源开发有限公司凉山交城建设有限责任公司建设项目招聘2名考试参考题库及答案解析
- 2026年度中冶宝钢第二分公司安徽巢湖地区招聘55人笔试备考题库及答案解析
- 2026中国邮储银行柳州市分行信用卡销售人员社会招聘考试参考题库及答案解析
- 医护职业规划全攻略
- 机载悬挂产品装调工诚信品质评优考核试卷含答案
- 岩棉板外墙外保温施工技术交底
- 纺织厂生产厂长考核制度
- 2025年中医内科学中级考试历年真题及答案
- 炼钢厂防混钢制度规范
- 医务人员反歧视课件培训
- 碳达峰目标下工业企业减排路径与绿色转型发展研究答辩
- 罗森加盟合同范本
- 2026届高三生物二轮复习教学策略及尖优生精准辅导策略
- 《社会认知:从大脑到文化》阅读记录
- 《高级育婴员》职业资格通关500题(标准答案版)
- 2017-2022年近6年全国卷高考物理真题分类汇编:热力学定律(含答案)
评论
0/150
提交评论