已阅读5页,还剩67页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程:单片机技术 教材:单片机基础 第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 单片机使用的高级语言 (1)BASIC语言 (2)C语言 (3)PL/M语言 4.1.3 80C51单片机汇编语言的语句格式 课程:单片机技术 教材:单片机基础 汇编语汇编语 言程序设计设计 必须注意如下特点: (1)设计人员必须详细了解单片机的硬件结构,以便在程序设计 中熟练使用; (2)必须熟悉汇编语言指令的功能和用法; (3)在程序设计前,必须分析设计任务,确定所用算法,确定程 序结构,确定数据的类型、数据的结构,必须对数据的存放、寄 存器和工作单元的使用以及所用硬件资源等作出具体安排; (4)根据分析,画出程序设计流程图; (5)根据程序设计流程图编写程序。 课程:单片机技术 教材:单片机基础 4.2 汇编语言程序的基本结构形式 单片机汇编语言程序设计的基本结构形式一般分为以下4种形 式,即顺序结构、分支结构、循环结构和子程序结构。 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字节单元、位地址空间) (7)采用寄存器间接寻址方式(R0、R1) 加数(N1)高字节节(8位)中字节节(8位)低字节节(8位) 加数(N2)高字节节(8位)中字节节(8位)低字节节(8位) 加数(N1)加数(N2)和(N3) 52H单单元低字节节(8位 ) 55H单单元低字节节(8位 ) 52H单单元低字节节(8位 ) 51H单单元中字节节(8位 ) 54H单单元中字节节(8位 ) 51H单单元中字节节(8位 ) 50H单单元高字节节(8位 ) 52H单单元高字节节(8位 ) 50H单单元高字节节(8位 ) 00H位进进位位 课程:单片机技术 教材:单片机基础 (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的地址指针内容 课程:单片机技术 教材:单片机基础 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单元,应如何修改程序? 课程:单片机技术 教材:单片机基础 思考题: 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的地址指针内容 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, 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;加数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高字节和 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 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单单元新字节的低半字节取自40H单元的低半字 节,而高半字节取自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; 合字生成新字节 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和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 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)多分支程序 假设多分支程序中,分支序号的最大值为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或DPTR) (7)程序设计流程框图 (8)程序清单; 思考题(补充作业题): 上例中,如果采用CJNE指令,应如何修改程序? 课程:单片机技术 教材:单片机基础 返回 课程:单片机技术 教材:单片机基础 ARE EQU 1000H; BUF EQU 2000H; ORG 1000H START: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 返回 课程:单片机技术 教材:单片机基础 首先,在程序中建立一个转移指令表,在表格中存放转移指 令,然后,通过查转移指令表的方式实现多分支程序转移。 这种方法主要利用散转指令JMP A+DPTR,此指令采用变址 寻址方式,操作过程:(PC)(A)+(DPTR),CPU根据PC 的内容来实现多分支程序转移。DPTR中送转移指令表的表首地址 (常用转移指令表的名称标号代替),而A中送转移指令表中存放 的转移指令的序号(常常从第0条开始)。 例如,有多个分支程序,如要通过AJMP转移指令进行转移, 则应把这些转移指令按序写入转移指令表中,并设置一个序号指 针(例如R3),序号往往从0开始,然后可使用以下查表程序实现 程序转移。 (b)使用查查转移指令表的方法实现实现 多分支程序转转移 课程:单片机技术 教材:单片机基础 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: ; 分支程序0 ROUT1: ; ROUT127: ; 分支程序127 课程:单片机技术 教材:单片机基础 由于AJMP指令是二字节指令,因此,程序中通过RL A指令将 分支序号乘2。转移指令表中最多只能安排128条分支转移指令, 如需多于128条,则必须另行修改程序。 由于AJMP指令转移范围是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; 分支程序85的转移指令 ROUT0: ; 分支程序0 ROUT1: ; ROUT85:; 分支程序85 课程:单片机技术 教材:单片机基础 例:假设键盘上有4个按键,功能说明如下表:程序流程框图 键键功能键值键值 (分支程序序号)键处键处 理程序(分支程序 ) 删删除00HER 读读数据01HDS 写数据02HXS 插入03HCR 假设转移指令表名称为BRTAB,分支程序序号已在A 中。 MOV DPTR, #BRTAB CLR C RLC A JMP A+DPTR; ORG 3000H 3000H BRTAB:AJMP ER; 转删除分支程序 课程:单片机技术 教材:单片机基础 3000H BRTAB:AJMP ER; 转删除分支程序 3001H 3002H AJMP DS; 转读数据分支程序 3003H 3004H AJMP XS; 转写数据分支程序 3005H 3006H AJMP CR; 转插入分支程序 3007H ORG 3100H 3100H ER:; 删除分支程序 ORG 3200H 3200H DS:; 读数据分支程序 ORG 3300H 3300H XS:; 写数据分支程序 ORG 3400H 3400H CR:; 插入分支程序 END 课程:单片机技术 教材:单片机基础 返回 课程:单片机技术 教材:单片机基础 4.2.3 循环程序结构 MCS-51汇编语言指令系统没有专用的循环指令,但可以使用 条件转移指令通过条件判断来控制循环是继续还是结束。 循环程序一般由四个主要部分组成: (1)初始化部分:为循环程序做准备,如规定循环次数、给各 变量和地址指针预置初值。 (2)处理部分: 为反复执行的程序段,是循环程序的实体, 也是循环程序的主体。 (3)循环控制部分: 其作用是修改循环变量和控制变量,并判 断循环是否结束,直到符合结束条件时,跳出循环为止。 (4)结束部分: 这部分主要是对循环程序的结果进行分析、处 理和存放。 课程:单片机技术 教材:单片机基础 单循环程序一般有以下两种典型结构: 课程:单片机技术 教材:单片机基础 双重循环程序的结构: 课程:单片机技术 教材:单片机基础 在应用系统程序设计时,有时经常需要将数据存储器中各部分 地址单元作为工作单元,以存放程序执行的中间值或执行结果, 因此,在使用这些工作单元之前,必须将工作单元清零。工作单 元清零可用循环程序完成。 例:假设在内部RAM区,开辟96个工作单元,工作单元首地址 为20H,则工作单元清零程序子程序如下: ORG 1000H CLR0:MOV R0, #20H;循环初始化部分 MOV R7, #96; CLR A LOOP:MOV R0, A; 循环体部分 INC R0; 修改变量 DJNZ R7, LOOP;循环控制部分 RET END 思考题(补充作业题):如采用CJNE指令,应如何修改程序? 课程:单片机技术 教材:单片机基础 例:两个三字节二进制无符号数相加,被加数放在内部RAM 20H22H单元(低字节存放在低地址单元,高字节存放在高地址 单元,即低位在前,高位在后),加数放在2AH2CH单元,和放 在20H22H单元,最高位如有进位,则放在23H单元中。 解:数据类型(二、十进制数,有、无符号数);数据结构(升 、降序排列) 被加数(N1)高字节节(8位)中字节节(8位)低字节节(8位) 加数(N2)高字节节(8位)中字节节(8位)低字节节(8位) 被加数(N1)加数(N2)和(N3) 20H单单元低字节节(8位 ) 2AH单单元低字节节(8位 ) 20H单单元低字节节(8位 ) 21H单单元中字节节(8位 ) 2BH单单元中字节节(8位 ) 21H单单元中字节节(8位 ) 22H单单元高字节节(8位 ) 2CH单单元高字节节(8位 ) 22H单单元高字节节(8位 ) 23H单单元进进位位 课程:单片机技术 教材:单片机基础 被加数 N1 高字节(8位) 中字节(8位) 低字节(8位) 加数 N2 高字节(8位) 中字节(8位) 低字节(8位) +)进位位(CY) 进位位(CY) 进位位(CY) 和 N3 进位 高字节(8位) 中字节(8位) 低字节(8位) 程序流程框图 程序清单 思考题:统计正数、负数、零的个数。 课程:单片机技术 教材:单片机基础 ORG 0030H ADDDUO:MOV R0, #20H; 循环初始化部分 MOV R1, #2AH; MOV R7, #03H; 循环次数 CLR C; LOOP:MOV A, R0; 循环体部分 ADDC A, R1; MOV R0, A; INC R0; 修改指针变量 INC R1; DJNZ R7, LOOP; 循环控制部分 CLR A; 循环结束处理部分 ADDC A, #00H; MOV R0, A; RET; END 返回 课程:单片机技术 教材:单片机基础 返回 课程:单片机技术 教材:单片机基础 例:把内部RAM中起始地址为DATA的数据串传送到外部RAM以 BUFFER为首地址的区域,直到发现“$”字符的ASC码为止,同 时规定数据串最大长度为32个字节。 解:(1)分析任务:数据传送;(2)算法:比较、控制转移 (3)程序结构:分支、循环(4)数据类型:多字节字符串 (5)RAM单元安排:内部RAM单元、外部RAM单元 (6)采用寄存器间接寻址方式(R0、R1或DPTR) 课程:单片机技术 教材:单片机基础 (7)程序流程框图; 课程:单片机技术 教材:单片机基础 ORG 0030H DATACS:MOV R0, #DATA; DATA数据区首地址 MOV DPTR, #BUFFER;BUFFER数据区首地址 MOV R1, #20H; 最大数据串长 LOOP:MOV A, R0; 取数据 SUBB A, #24H; 判是否为“$”字符 JZ LOOP1; 是“$”字符,转结束 MOVX DPTR,A; 数据传送 INC R0; INC DPTR; DJNZ R1, LOOP; 循环控制 LOOP1:RET; 结结束 END 课程:单片机技术 教材:单片机基础 4.3 80C51单片机汇编语言程序设计举例 4.3.2 定时程序 在单片机的控制应用中,常有定时的需要,如定时中断、定 时检测和定时扫描等。定时功能除可以使用纯硬件电路、可编程 定时/计数器实现外,还可以使用软件程序(定时程序)完成。 定时程序是典型的循环程序,它是通过执行一个具有固定延 迟时间的循环体来实现定时的。 (1)单循环定时程序 MOV R5, #TIME; LOOP: NOP; NOP; DJNZ R5, LOOP; 课程:单片机技术 教材:单片机基础 假设单单片机晶振频频率fosc=6MHz,则则一个机器周期为为2s, NOP、DJNZ指令分别是单、双机器周期指令。定时程序的总延迟时 间是循环程序段延时时间的整数倍,由于R5是8位寄存器,因此, 这个定时程序的最长定时时间为: 256(28)8=2048(s) (2)较长时间的定时程序 (多重循环定时子程序) TIME:MOV R5, #TTME1; LOOP:MOV R4, #TEME2; LOOP1:NOP; NOP; DJNZ R4, LOOP1; DJNZ R5, LOOP2; RET; 课程:单片机技术 教材:单片机基础 这个定时子程序的最长定时时间为: 256(28)4+2+1256(28)2+4=525828(s) (3)调整定时时间 在定时程序中可通过在循环程序段中增减指令的方法对定时 时间进行微调。 例: MOV R0, #TTME; LOOP:ADD A, R1; INC DPTR; DJNZ R0, LOOP; 由于ADD、INC、DJNZ指令的机器周期分别为1、2、2,所以,该该 程序定时时间为时时间为 =(1+2+2)2sTime(s)。 课程:单片机技术 教材:单片机基础 假定要求定时时间为24us。对于这个定时程序,只须增加一条NOP 指令即可实现。 MOV R0, #TIME; LOOP: ADD A, R1; INC DPTR; NOP; DJNZ R0, LOOP; 只须TIME取2,即可得到精确的24s定时。 (4)以一个基本的延时时程序满满足不同的定时时要求 如果一个系统统有多个定时时需要,我们们就可以设计设计 一个基本延 时时程序,使其延时时间为时时间为 各定时时间时时间 的最大公约约数,然后可以 以此基本程序作为为子程序,通过调过调 用的方法实现实现 所需不同定时时 。 课程:单片机技术 教材:单片机基础 例:在单片机应用系统中,假设需要的定时时间分别为5S、 10S、20S,可设计一个1S延时子程序DELAY,则5S、10S、20S的定 时时间可通过调用DELAY实现。 MOV R0, #05H; 5S定时 LOOP: LCALL DELAY; DJNZ R0, LOOP1; MOV R0, #0AH; 10S定时 LOOP2: LCALL DELAY; DJNZ R0, LOOP2; MOV R0, #14H; 20S定时 LOOP3: LCALL DELAY; DJNZ R0, LOOP3; 课程:单片机技术 教材:单片机基础 4.3.3 查表程序 所谓查表程序,就是指预先把数据以表格形式存放在程序存 储器中,然后使用程序读出,这种能读出表格数据的程序就称之 为查表程序。 查表操作对单片机的控制应用十分重要,查表程序常用于实实 现现非线线性修正,非线线性函数转换转换 以及代码转换码转换 等场合。 MCS-51单片机指令系统统中有两条专专用查查表指令: (1)MOVC A, A+DPTR;A(A)+(DPTR) (2)MOVC A, A+PC; A(A)+(PC) 这两条查查表指令的功能是完全相同的,其共同优点是:能在 不改变PC和DPTR的状态下,只根据A的内容就可以取出表格中的数 据。注意:A的内容均为8位无符号数。 课程:单片机技术 教材:单片机基础 对于第一条指令,适用于64KB ROM范围内查表(即数据表格的大 小和位置可以在64KB程序存储器中任意安排,一个数据表格可以 被多个程序块使用),编写查表程序时,首先把表的首地址送入 DPTR中,再要将查表的数据序号(或下标值)送入A中,然后就可 以使用该指令进行查表操作,并把结果送A中。 对于第二条指令,常用于“本地”范围查表(即数据表格只能 放在该指令后面256个地址单元之内,而且表格只能被本程序使用 ),编写查表程序时,首先把查表数据的序号送入A中,再把从查 表指令的下一条指令的首地址到表的首地址间的偏移量与A值相加 ,然后再使用该指令进行查表操作,并把结果送入A中。 课程:单片机技术 教材:单片机基础 例:设计一个子程序,其功能为根据x的内容(09之间)查平方 表,求出相应的结果y(y=x2)。假设x的内容已存放在内部RAM 30H单元中,求出y的内容存放在内部RAM 40H单元中。 ORG 1000H 1000H SQR: MOV A, 30H; Ax 1002H PUSH DPH; 现场保护 1004H PUSH DPL; 1006H MOV DPTR,#TAB1; DPTR表首地址TAB1 1009H MOVC A, A+DPTR;查表得y 100AH MOV 40H, A; 40Hy 100CH POP DPL; 现场恢复 100EH POP DPH; 1010H RET 1011H TAB1: DB 00H,01H,04H,09H,10H,19H DB 24H,31H,40H,51H 课程:单片机技术 教材:单片机基础 上例中,如果使用MOVC A,A+PC指令,则编编程如下: ORG 1000H 1000H SQR: MOV A, 30H; Ax 1002H PUSH DPH; 现场保护 1004H PUSH DPL; 1006H ADD A, #07H; 加偏移量 1008H MOVC A, A+PC; 查表得y 1009H MOV 40H, A; 40Hy 100BH POP DPL; 现场恢复 100DH POP DPH; 100FH RET 1010H TAB1: DB 00H,01H,04H,09H,10H,19H DB 24H,31H,40H,51H 此题中,偏移量=1010H-1009H=07H 课程:单片机技术 教材:单片机基础 4.4 单片机汇编语言源程序的编辑和汇编 4.5 80C51单片机汇编语言伪指令 汇编语言程序必须转换为二进制的机器代码程序,单片机才能 够执行。汇编语言程序转换为机器代码程序的过程,称之为汇编 。汇编的方法有两种:即机器交叉汇编和手工汇编。 所谓手工汇编,就是指程序设计人员通过查指令编码表,逐个 把助记符指令“翻译”成机器码。手工汇编方法通常用于短、小 程序的汇编。长程序则必须通过机器交叉汇编的方法进行汇编。 所谓机器交叉汇编,就是指程序设计人员使用一种计算机的汇 编程序去汇编另一种计算机的源程序,具体地说就是运行汇编程 序进行汇编的是一种计算机,而运行汇编得到的目标程序的则是 另一种计算机。 单片机只能采用机器交叉汇编的方法对汇编语言程序进行汇编 课程:单片机技术 教材:单片机基础 对汇编语言程序进行机器交叉汇编时,必须告诉计算机的汇 编程序应该如何完成汇编工作,这一任务就是通过使用伪指令来 实现的。 伪伪指令是程序设计人员发给汇编员发给汇编 程序的指令,也称汇编汇编 命 令或汇编汇编 程序控制指令。它具有控制汇编程序的输入输出、定义 数据和符号、条件汇编、分配存储空间等功能。 伪指令没有与之相对应的二进制机器代码,因此,在汇编语 言指令系统汇总表中,查不到相对应的二进制机器代码。不同汇 编语言的伪指令也有所不同,但一些基本指令是相同的。 手工汇编不需要伪指令,但机器交叉汇编必须使用伪指令。 在对汇编语言程序进行机器交叉汇编前,伪指令存在于汇编语言 程序中,但汇编后得到的机器代码程序中不存在伪指令相对应的 二进制机器代码,这一点请特别注意。 课程:单片机技术 教材:单片机基础 (1)ORG(ORiGin)汇编起始地址命令 本命令总出现在汇编语言源程序的开头位置,用于规定目标 程序的起始地址,即此命令后面的程序或数据块的起始地址。 命令格式:标号:ORG地址 其中标号:是选择项,根据需要选用,地址项, 通常为16位绝对地址,但也可以使用标号或表达式表示。 在汇编语言程序的开始,通常都用一条ORG伪指令来规定程序 的起始地址,如果不用ORG规定,则汇编得到的目标程序将从 0000H开始。 例: ORG 8000H 即规定标号START代表地址8000H, START:MOV A, #00H; 目标程序的第一条指令从8000H 开始。 课程:单片机技术 教材:单片机基础 (2)END(END of assembly)汇编终汇编终 止命令 本命令用于终终止汇编语言源程序的汇编汇编 工作,END是汇编语汇编语 言源程序的结结束标标志,因此,在整个汇编语言源程序中只能有一 个END指令,且位于程序的最后。如果END命令出现在程序中间, 则在END之后的指令,汇编汇编 程序将不予处处理。 命令格式:标标号:END表达式 (3)EQU(EQUate)赋值赋值 命令 本命令用于给给字符名称赋赋予一个特定值值,赋值赋值 以后,其值值 在整个程序中有效。 命令格式:字符名称EQU赋值项赋值项 其中赋值项赋值项 可以是常数,地址,标标号或表达式,其值值 为为8位或16位二进进制数。赋值赋值 以后的字符名称既可以作地址使用 ,也可以作立即数使用。 课程:单片机技术 教材:单片机基础 例: HOUR EQU 30H ORG 1000H START:MOV HOUR, #40H; 等同于 START:MOV 30H, #40H; (4)DB(Define Byte)定义数据字节命令 本命令用于从指定的地址单元开始,在程序存储器的连续单 元中定义字节数据。 命令格式:标号:DB8位数表 常使用本命令存放数据表格。 例:存放7段数码管(共阳极)显示的十六进制基数(0F)的 十六进制数的字形代码,可使用多条DB命令定义。 课程:单片机技术 教材:单片机基础 DB 0C0H,0F9H,0A4H,0B0H; 0,1,2,3 DB 99H, 92H, 82H, 0F8H; 4,5,6,7 DB 80H, 90H, 88H, 83H; 8,9,A,B DB 0C6H,0A1H,86H, 84H; C,D,E,F 查查表时时,为为确定数据区的起始地址,可采用两种方法: a)根据DB命令前一条指令的地址确定。把该该地址加上它的 字节节数就是DB的定义义的数据字节节的起始地址。 例:8100: MOV A, #49H;一字节指令 TAB: DB 0COH,0F9H,0A4H,0B0H; 定义义的7段数码管(共阳极)显示的十六进制基数(0F) 的十六进制数的字形代码从8101H地址单元开始存放。 课程:单片机技术 教材:单片机基础 b)使用0RG命令专门规定。 例: ORG 8100H TAB: DB 0COH,0F9H,0A4H,0B0H; 定义的7段数码管(共阳极)显示的十六进制基数(0F)的 十六进制数的字形代码从8101H地址单元开始存放。 (5)DW(Define Word)定义数据字命令 本命令用于从指定地址开始,在程序存储器单元中定义16位 的数据字。 命令格式:标号:DW16位数表 存放时,数据字的高8位在前(低地址),低8位在后(高地 址)。 课程:单片机技术 教材:单片机基础 例:DW “AA”; 存入41H,42H。 DB和DW定义的数表,数的个数不得超过80个。如数据的数目 较多时,可使用多个定义命令。 在MCS-51程序设计应用中,常以DB来定义数据,以DW来定义 地址。 (6)DS(Define Stonage)定义存储区命令 本命令用于从指定地址开始,保留指定数目的字节单元作为 存储器,供程序运行使用,汇编时,对这些单元不赋值。 命令格式:标号:DS 16位数表 例: ORG 8100H DS 08H 从8100H地址开始,保留8个连续的地址单元。 课程:单片机技术 教材:单片机基础 (7)BIT 位定义义命令 本命令用于给字符名称赋以位地址 命令格式:字符名称BIT位地址 其中位地址可以是绝对绝对 地址,也可以是符号地址(即位 符号名称) 例: AQ BIT P1.0 把P1.0的位地址赋给变赋给变 量AQ,在其后的编编程中,AQ就可以作 为为位地址使用。 课程:单片机技术 教材:单片机基础 补充内容:子程序结构 子程序结构是一种非常重要的程序结构。在一个程序中经常遇 到反复多次某程序段的情况,如果重复书写这个程序段,会使程 序变得冗长而杂乱。对此,可采用子程序结构,即把重复的程序 段编写为一个子程序,通过主程序调用而使用它。这样不但减少 了编程工作量,而且也缩短了程序的长度。 调用和返回构成了子程序调用的完整过程。为了实现这一过 程,必须有子程序调用指令和返回指令。调用指令在主程序中使 用,而返回指令则应该是子程序的最后一条指令。执行完这条指 令后,程序返回主程序断点处继续执行。 课程:单片机技术 教材:单片机基础 (1)子程序的编程原则 在实际的单片机应用系统软件设计中,为了程序结构更加清 晰,易于设计,易于修改,增强程序可读性,基本上都要使用子 程序结构。子程序作为一个具有独立功能的程序段,编程时需遵 循以下原则: a)子程序的第一条指令必须有标号,明确子程序入口地址; b)以返回指令RET结束子程序; c)子程序说明部分; 子程序名称:提供给主程序调用的名字,通常用符号或子程 序第一条语句的标号来表示。 子程序功能:简要说明子程序能完成的主要功能。 子程序入口参数:主程序需要向子程序提供的参数。 课程:单片机技术 教材:单片机基础 子程序出口参数:子程序执行完之后向主程序返回的参数。 子程序占用资源:子程序中使用了哪些存储单元、寄存器等 子程序堆栈深度:子程序占用堆栈区的最大字节数。 子程序嵌套情况:子程序中继续调用子程序的情况。 子程序的字节数:子程序中所有指令字节数的总和。 子程序执行时间:子程序中所有指令的机器周期数总和。 这些说明是写给程序员看的,供以后使用子程序时参考。 d)较强的通用性和可浮动性,尽可能避免使用具体的内存单元 和绝对转
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年专利许可使用合同技术支持与专利权限制
- 上海初二下数学期末试卷
- 领先企业广告摄影服务流程优化研究
- 2024年影视作品版权购买与分成合同
- 度假村开发项目投资风险评估方法
- 传动部件热处理工艺
- 2024年甘肃省白银市中考生物试卷(含答案与解析)
- 2024年城市供水管网建设项目融资租赁合同
- 固体饮料行业品牌策划与管理考核试卷
- 2024年度电子商务平台FBA物流风险管理合同
- 安徽省淮北市地方婚礼流程资料
- 附件3-4欧曼金融服务经销商融资业务介绍
- 中医骨伤科学9肩周炎上肢伤筋
- 五年级分数乘法口算练习
- 客户服务管理七大原则
- 斜井常闭式防跑车装置设计说明书
- 购买文件登记表.doc
- [山东]建筑工程施工技术资料管理规程表格
- 《葫芦丝演奏的入门练习》教学设计
- 噪声伤害事故PPT课件
- 四川省农业水价综合改革试点末级渠系工程建设项目实施方案
评论
0/150
提交评论