资源描述
第第4 4章章 80C5180C51单片机汇编语言程序设计单片机汇编语言程序设计4.1 单片机程序设计语言概述单片机程序设计语言概述4.2 汇编语言程序的基本结构形式汇编语言程序的基本结构形式4.3 80C51 单片机汇编语言程序设计举例单片机汇编语言程序设计举例4.4 单片机汇编语言源程序的编辑和汇编单片机汇编语言源程序的编辑和汇编4.5 80C51 单片机汇编语言伪指令单片机汇编语言伪指令1特制分析4.1 单片机程序设计语言概述单片机程序设计语言概述4.1.1 机器语言和汇编语言机器语言和汇编语言1、机器语言、机器语言 用二进制代码用二进制代码“0”和和“1”表示指令和数据的程序设计语表示指令和数据的程序设计语言言, ,是计算机能直接识别并执行的指令是计算机能直接识别并执行的指令。 优点:执行速度快、占用内存少。优点:执行速度快、占用内存少。 缺点:识别难、记忆难。缺点:识别难、记忆难。2、汇编语言、汇编语言 用助记符和专门的语言规则表示指令的功能和特征。用助记符和专门的语言规则表示指令的功能和特征。优点:助记符与机器指令一一对应。比机器语言直观、优点:助记符与机器指令一一对应。比机器语言直观、 易懂、易记。非常适合于实时控制的需要。易懂、易记。非常适合于实时控制的需要。 缺点:难以记忆和使用,程序设计的技巧性较高,编程缺点:难以记忆和使用,程序设计的技巧性较高,编程 难度较大。要求使用者必须精通单片机的硬件系难度较大。要求使用者必须精通单片机的硬件系 统和指令系统。缺乏通用性,程序不易移植。统和指令系统。缺乏通用性,程序不易移植。2特制分析4.1.2 单片机使用的高级语言单片机使用的高级语言n对于对于8051单片机,现有单片机,现有4种语言支持,即汇编、种语言支持,即汇编、PL/M、C和和BASIC。nC C语言最终得到广泛应用。语言最终得到广泛应用。可以大大提高单片机应用系统研制的开发效率。移可以大大提高单片机应用系统研制的开发效率。移植性好。植性好。 高级语言的不足:生成的目标代码较长,导致应用程高级语言的不足:生成的目标代码较长,导致应用程序运行速度较慢。序运行速度较慢。3特制分析4.1.3 80C51 单片机汇编语言的语句格式单片机汇编语言的语句格式80C5180C51汇编语言的语句格式如下:汇编语言的语句格式如下: : : ; ; 1. 标号标号是语句地址的标志符号,标号的几点规定:是语句地址的标志符号,标号的几点规定:18个个ASCII字符组成,第一个字符必须是字母。字符组成,第一个字符必须是字母。不能使用本汇编语言已经定义的符号作为标号。不能使用本汇编语言已经定义的符号作为标号。标号后面必须跟以冒号标号后面必须跟以冒号“:”。同一标号在一个程序中只能定义一次。同一标号在一个程序中只能定义一次。标号可有可无。标号可有可无。错误的标号错误的标号 正确的标号正确的标号1BT : BT11BT : BT1BEGIN BEGIN : BEGIN BEGIN : TA+TB: TATB:TA+TB: TATB:ADD: ADD1:ADD: ADD1:4特制分析2. 2. 操作码操作码用于规定语句执行的操作内容,用指令助记符表示。用于规定语句执行的操作内容,用指令助记符表示。不能空缺。不能空缺。3. 3. 操作数操作数操作数用于为指令操作提供数据。可以是空白,也可操作数用于为指令操作提供数据。可以是空白,也可能有能有1313个操作数,各操作数之间以逗号分隔。个操作数,各操作数之间以逗号分隔。4. 4. 注释注释不属于语句的功能部分,只是对语句的解释说明,以不属于语句的功能部分,只是对语句的解释说明,以“;”开头。开头。5. 5. 分界符(分隔符)分界符(分隔符)用于把语句中的各部分隔开,以便于区分。分界符包用于把语句中的各部分隔开,以便于区分。分界符包括空格、冒号、分号或逗号等符号。括空格、冒号、分号或逗号等符号。5特制分析4.2 汇编语言程序的基本结构形式汇编语言程序的基本结构形式 三种基本结构形式:顺序程序结构,分支程序结构,三种基本结构形式:顺序程序结构,分支程序结构,循环程序结构。循环程序结构。4.2.1 顺序程序结构顺序程序结构顺序结构程序是最简单的程序结构。程序既无分支、顺序结构程序是最简单的程序结构。程序既无分支、循环,也不调用子程序,程序执行时一条接一条地循环,也不调用子程序,程序执行时一条接一条地按顺序执行指令。按顺序执行指令。6特制分析(1)分析任务)分析任务(2)确定算法)确定算法(3)画流程图)画流程图(4)编写程序)编写程序(5)上机调试)上机调试 2、程序设计的一般步骤、程序设计的一般步骤 当接到程序设计的任务后,当接到程序设计的任务后,首先对任务进行详尽的分析,首先对任务进行详尽的分析,搞清楚已知的数据和想要得搞清楚已知的数据和想要得到的结果,程序应该完成何到的结果,程序应该完成何种的功能。明确在程序设计种的功能。明确在程序设计时应该时应该 “做什么做什么” 。根据实际问题的要求和指令系根据实际问题的要求和指令系统的特点,确定解决问题的具统的特点,确定解决问题的具体步骤。根据任务要求,对不体步骤。根据任务要求,对不同的计算方法进行比较,选择同的计算方法进行比较,选择最适宜的算法。解决最适宜的算法。解决“怎样做怎样做”的问题。的问题。将解决问题的具体步骤用一种将解决问题的具体步骤用一种约定的几何图形、指向线和必约定的几何图形、指向线和必要的文字说明描述出来,要的文字说明描述出来,用图用图形的方法描绘解决问题的思路。形的方法描绘解决问题的思路。用用指令指令的形式的形式将程序流程图将程序流程图实现出来。实现出来。查错、改错,查错、改错,对程序进行对程序进行优化。优化。7特制分析 50H 51H 52H53H54H55HN1高字节高字节N1中字节中字节N1低字节低字节N2高字节高字节N2中字节中字节N2低字节低字节(1)分析任务)分析任务(2)确定算法)确定算法(3)画流程图)画流程图(4)编写程序)编写程序(5)上机调试)上机调试例:例:3字节无符号数相加:其中被加数在内部字节无符号数相加:其中被加数在内部RAM的的50H、51H和和52H单元中;加数在内部单元中;加数在内部RAM的的53H、54H和和55H单元单元中;要求把相加之和存放在中;要求把相加之和存放在50H、51H和和52H单元中,进位存单元中,进位存放在位寻址区的放在位寻址区的20H位中。位中。8特制分析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, R0ADDC A, R1;高字节带进位相加高字节带进位相加MOV R0, A ;存高字节相加结果存高字节相加结果CLR AADDC A, #00H;进位送进位送00H位保存位保存MOV R0, #20H;存放进位的单元地址存放进位的单元地址MOV R0, A9特制分析 分支结构也称为选择结构。为分支需要,程序设计时分支结构也称为选择结构。为分支需要,程序设计时应给程序段的起始地址赋予一个地址标号,以供选择分支应给程序段的起始地址赋予一个地址标号,以供选择分支使用。分支结构又可分为单分支结构和多分支结构。使用。分支结构又可分为单分支结构和多分支结构。 1. 单分支程序结构单分支程序结构 单分支程序结构即二中选一,是通过条件判断实现单分支程序结构即二中选一,是通过条件判断实现的。一般都的。一般都使用条件转移指令使用条件转移指令对程序的执行结果进行判对程序的执行结果进行判断。断。 可实现单分支转移的指令有:可实现单分支转移的指令有:JZ、JNZ、CJNE和和DJNZ。位状态转移指令:。位状态转移指令:JC、JNC、JB、JNB和和JBC等。等。4.2.2 分支程序结构分支程序结构10特制分析(1)单分支结构举例)单分支结构举例 假定在外部假定在外部RAM中有中有ST1、ST2和和ST3共共3个连续个连续单元,其中单元,其中ST1和和ST2单元中存放着两个无符号二进制单元中存放着两个无符号二进制数,要求找出其中的大数并存入数,要求找出其中的大数并存入ST3单元中。单元中。解解:(:(1 1)分析任务:比较两个数的大小)分析任务:比较两个数的大小 (2 2)算法:算术运算、控制转移)算法:算术运算、控制转移 (3 3)程序结构:单分支)程序结构:单分支 (4 4)数据类型:单字节、二进制、无符号数)数据类型:单字节、二进制、无符号数 (5 5)数据结构:单元地址升序排列)数据结构:单元地址升序排列 (6 6)RAMRAM单元安排单元安排:外部:外部RAMRAM单元单元 (7 7)采用寄存器间接寻址方式()采用寄存器间接寻址方式(R0R0、R1R1或或DPTRDPTR) (8 8)程序设计流程框图程序设计流程框图; (9 9)程序清单程序清单;11特制分析开开 始始设设 置置 数数 据据 指指 针针取取 数数 据据 N N2 2取取 数数 据据 N N1 1并并 暂暂 存存结结 束束N N1 1保保 存存 于于 A A中中N N2 2 N N1 1修修 改改 数数 据据 指指 针针保保 存存 大大 数数N N2 2保保 存存 于于 A A中中Y YN N12特制分析STARTSTART: CLR CCLR C; ;进位位清进位位清0 0 MOV DPTR MOV DPTR,#ST1#ST1 ; ;设置数据指针设置数据指针 MOVX AMOVX A,DPTRDPTR; ;取第取第1 1个数个数 MOV R2, AMOV R2, A; ;第第1 1个数存于个数存于R2R2 INC DPTR INC DPTR; ;数据指针加数据指针加1 1 MOVX A, DPTR MOVX A, DPTR; ;取第取第2 2个数个数 SUBB A, R2SUBB A, R2; ;两数比较两数比较 JNC BIG1JNC BIG1; ;若第若第2 2个数大,则转向个数大,则转向BIG1BIG1 XCH A, R2 XCH A, R2; ;若第若第1 1个数大,则整字节交换个数大,则整字节交换BIG0:BIG0: INC DPTR INC DPTR MOVX DPTR, A MOVX DPTR, A; ;存大数存大数 RETRETBIG1:BIG1: MOVX A, DPTR MOVX A, DPTR SJMP BIG0 SJMP BIG0上例中,如果采用上例中,如果采用CJNE A, direct,rel指令,应如何修改程序?指令,应如何修改程序?13特制分析(2)多重单分支结构举例)多重单分支结构举例 多重单分支结构中,通过一系列条件判断,进多重单分支结构中,通过一系列条件判断,进行逐级分支。为此可使用比较转移指令行逐级分支。为此可使用比较转移指令CJNE实现。实现。14特制分析CJNE A, 55H, LOOP1CJNE A, 55H, LOOP1; ;若若TaT55,TaT55,则转向则转向LOOP1LOOP1AJMP FHAJMP FH ; ;若若TaTaT55,T55,则返回则返回LOOP1:LOOP1: JNC JW ;JNC JW ;若若(CY)(CY)0,0,表明表明TaTaT55,T55,转降温处理程序转降温处理程序CJNE A, 54H, LOOP2 ;CJNE A, 54H, LOOP2 ;若若TaT54,TaT54,则转向则转向LOOP2LOOP2AJMP FHAJMP FH ; ;若若TaTaT54,T54,则返回则返回LOOP2:LOOP2: JC SWJC SW; ;若若(CY)(CY)1,1,表明表明TaTaT54,T54,转升温处理程序转升温处理程序 FH:FH:RETRET; ;若若T55TaT54,T55TaT54,则返回主程序则返回主程序例:假定采集的温度值例:假定采集的温度值Ta放在累加器放在累加器A中。此外,在内部中。此外,在内部RAM 54H单元存放温度下限值单元存放温度下限值T54,在,在55H单元存放温度单元存放温度上限值上限值T55。若。若TaT55,程序转向程序转向JW(降温处理程序降温处理程序);若;若TaT54,则程序转向,则程序转向SW(升温处理程序升温处理程序);若;若T55TaT54,则程序转向,则程序转向FH(返回主程序返回主程序)。15特制分析解解:(:(1 1)分析任务:解方程)分析任务:解方程 (2 2)算法:控制转移)算法:控制转移 (3 3)程序结构:多分支)程序结构:多分支 (4 4)数据类型:单字节、二进制、有符号数)数据类型:单字节、二进制、有符号数 (5 5)RAMRAM单元安排单元安排:外部:外部RAMRAM单元单元 (6 6)采用寄存器间接寻址方式()采用寄存器间接寻址方式(R0R0、R1R1或或DPTRDPTR) (7 7)程序设计流程框图程序设计流程框图 (8 8)程序清单程序清单; 011y000 xxx例:已知:例:已知:127X-128,求,求Y。设。设X,Y分别存放在外部分别存放在外部RAM 1000H和和2000H单元中。单元中。16特制分析开开 始始取取 数数 据据 X X结结 束束X X= =0 0Y Y= =0 0Y YN NX X 0 0Y Y= =- -1 1Y Y= =1 1N NY Y保保 存存 数数 据据 Y Y返回17特制分析 XAD EQU 1000H XAD EQU 1000H; BUF EQU 2000HBUF EQU 2000H; ORG 1000HORG 1000HSTARTSTART:MOV DPTRMOV DPTR, #XAD #XAD ;数据;数据X X的地址送数据指针的地址送数据指针DPTRDPTR MOVX A MOVX A, DPTRDPTR; AA取数据取数据X X JZ SAVJZ SAV; X X0 0转转SAVSAV JB ACC.7 JB ACC.7, NEGNEG; X X0 0转转NEGNEG,否则,否则,X X0 0 MOV A MOV A, #01H#01H; SJMP SAVSJMP SAV; NEG: MOV ANEG: MOV A, #0FFH#0FFH; (0FFH(0FFH为为-1-1补码补码) ) SAV: MOV DPTR SAV: MOV DPTR, #BUF#BUF; 数据数据Y Y的地址送数据指针的地址送数据指针DPTRDPTR MOVX DPTR MOVX DPTR, A A; 保存保存Y Y值值 ENDEND上例中,如果采用上例中,如果采用CJNE指令,应如何修改程序?指令,应如何修改程序?18特制分析 XAD EQU 1000H XAD EQU 1000H; BUF EQU 2000HBUF EQU 2000H; ORG 1000HORG 1000HSTARTSTART:MOV DPTRMOV DPTR, #XAD #XAD ;数据;数据X X的地址送数据指针的地址送数据指针DPTR DPTR MOVX A MOVX A, DPTRDPTR; AA取数据取数据X X CJNE A, #0, ANZ CJNE A, #0, ANZ ; X X0 0转转ANZANZ SJMP SAV SJMP SAV; ANZANZ: JCJC NEGNEG ;X0X0X0 MOV A MOV A, #01H#01H; SJMP SAVSJMP SAV; NEG: MOV ANEG: MOV A, #0FFH#0FFH; (0FFH(0FFH为为-1-1补码补码) ) SAV: MOV DPTR SAV: MOV DPTR, #BUF#BUF; 数据数据Y Y的地址送数据指针的地址送数据指针DPTRDPTR MOVX DPTR MOVX DPTR, A A; 保存保存Y Y值值 ENDEND19特制分析2. 多分支程序结构多分支程序结构多分支程序结构流程中具有两个以上条件可供选择。可多分支程序结构流程中具有两个以上条件可供选择。可供使用的是变址寻址转移指令供使用的是变址寻址转移指令“JMP A+DPTR”,但使,但使用该指令实现多分支转移时,需要有数据表格配合。用该指令实现多分支转移时,需要有数据表格配合。多分支程序结构多分支程序结构20特制分析(1)通过数据表实现程序多分支)通过数据表实现程序多分支 MOV A, n;分支序号送分支序号送A MOV DPTR, #BRTAB;地址表首址地址表首址 MOVC A, A+DPTR;查表查表 JMP A+DPTR;转移转移BRTAB:DB BR0-BRTAB ;地址表地址表 DB BR1-BRTAB DB BRn-BRTABBR0: 分支程序分支程序BR1: BRn: 21特制分析(2)通过转移指令表实现程序多分支)通过转移指令表实现程序多分支MOV A, nRL A ;分支序号值乘以分支序号值乘以2MOV DPTR, #BRTAB;转移指令表首址转移指令表首址JMP A+DPTRBRTAB:AJMP BR0 ;转分支程序转分支程序0AJMP BR1 ;转分支程序转分支程序1 AJMP BR127 ;转分支程序转分支程序127BR0: ;分支程序分支程序BR1: BRn: 22特制分析(3)其他实现程序多分支的方法)其他实现程序多分支的方法MOV DPTR, #BRTAB;分支入口地址表首址分支入口地址表首址MOV A, R0RL A;分支转移值乘以分支转移值乘以2MOV R1, A;暂存暂存A值值INC AMOVC A, A+DPTR;取低位地址取低位地址PUSH ACC;低位地址入栈低位地址入栈MOV A, R1;恢复恢复A值值MOVC A, A+DPTR;取高位地址取高位地址PUSH ACC;高位地址入栈高位地址入栈RET;分支入口地址装入分支入口地址装入PCBRTAB:DW BR0;分支程序入口地址表分支程序入口地址表 DW BR1 DW BR12723特制分析例:假设键盘上有例:假设键盘上有4 4个按键,功能说明如下表:个按键,功能说明如下表: 分析任务分析任务 确定算法确定算法 程序流程框图程序流程框图键功能键功能键值(分支程序序号)键值(分支程序序号)键处理程序(分支程序)键处理程序(分支程序)删除删除00H00HERER读数据读数据01H01HDSDS写数据写数据02H02HXSXS插入插入03H03HCRCR24特制分析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 H25特制分析 假设转移指令表名称为假设转移指令表名称为BRTABBRTAB,分支程序序号已在,分支程序序号已在A A 中。中。 MOV DPTRMOV DPTR, #BRTAB#BRTAB CLR C CLR C RLC A RLC A JMP A+DPTR JMP A+DPTR; ORG 3000HORG 3000H3000H BRTAB3000H BRTAB:AJMP ERAJMP ER; 转删除分支程序转删除分支程序3001H 3001H 3002H AJMP DS3002H AJMP DS; 转读数据分支程序转读数据分支程序3003H3003H3004H AJMP XS3004H AJMP XS; 转写数据分支程序转写数据分支程序3005H3005H3006H AJMP CR3006H AJMP CR; 转插入分支程序转插入分支程序 ORG 3100H ORG 3100H3100H ER3100H ER:; 删除分支程序删除分支程序 ORG 3200HORG 3200H3200H DS3200H DS:; 读数据分支程序读数据分支程序 ORG 3300HORG 3300H3300H XS3300H XS:; 写数据分支程序写数据分支程序 ORG 3400HORG 3400H3400H CR3400H CR:; 插入分支程序插入分支程序 ENDEND26特制分析(4)使用比较转移指令)使用比较转移指令CJNE实现。实现。( (A A) )= =0 0? ?转转向向0 0分分支支( (A A) )= =1 1? ?( (A A) )= =2 2? ?转转向向2 2分分支支转转向向1 1分分支支Y YY YY YN NN NN N27特制分析4.2.3 循环程序结构循环程序结构循环结构是重复执行某个程序段。使用循环结构是重复执行某个程序段。使用条件转移指令条件转移指令通通过条件判断来实现和控制循环。过条件判断来实现和控制循环。循环程序一般由循环程序一般由四四个主要部分组成个主要部分组成: : (1 1)初始化部分:初始化部分:为循环程序做准备,如规定循环次数、为循环程序做准备,如规定循环次数、给各变量和地址指针预置初值。给各变量和地址指针预置初值。 (2 2)处理部分处理部分: : 为反复执行的程序段,是循环程序的实体,为反复执行的程序段,是循环程序的实体, 也是循环程序的主体。也是循环程序的主体。 (3 3)循环控制部分循环控制部分: : 其作用是修改循环变量和控制变量,其作用是修改循环变量和控制变量,并判断循环是否结束,直到符合结束条件时,跳出循环为止。并判断循环是否结束,直到符合结束条件时,跳出循环为止。 (4 4)结束部分结束部分: : 这部分主要是对循环程序的结果进行分析、这部分主要是对循环程序的结果进行分析、处理和存放。处理和存放。28特制分析MOV R2, #0FFH;MOV R2, #0FFH;设置长度计数器初值设置长度计数器初值 MOV R0, #3FH;MOV R0, #3FH;设置字符串指针初值设置字符串指针初值LOOP:LOOP: INC R2INC R2INC R0INC R0CJNE R0, #0DH, LOOPCJNE R0, #0DH, LOOPRETRET举例:通过查找结束标志举例:通过查找结束标志(回车符回车符)以统计字符串长度的循环以统计字符串长度的循环 程序。程序。 假定字符串存放在内部假定字符串存放在内部RAM从从40H单元开始的连续存单元开始的连续存储单元中。为找到结束标志,应采用逐个字符依次与回车储单元中。为找到结束标志,应采用逐个字符依次与回车符符(ASCII码码0DH)比较的方法。同时在程序中还应设置一)比较的方法。同时在程序中还应设置一个字符串指针以顺序定位字符,设置一个字符长度计数器以个字符串指针以顺序定位字符,设置一个字符长度计数器以累计字符个数。累计字符个数。29特制分析 单循环程序一般有以下两种典型结构:单循环程序一般有以下两种典型结构:30特制分析 双重循环程序的结构:双重循环程序的结构:开开始始外外循循环环初初始始化化结结束束外外循循环环结结束束否否N NY Y内内循循环环初初始始化化内内循循环环处处理理内内循循环环变变量量修修改改外外循循环环处处理理外外循循环环变变量量修修改改结结束束处处理理内内循循环环结结束束否否N NY Y31特制分析解解:(:(1 1)分析任务:数据传送;()分析任务:数据传送;(2 2)算法:比较、控制转移)算法:比较、控制转移 (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) )= =$ $结结束束例:把内部例:把内部RAM中起始地址为中起始地址为DATA的数据串传送到外部的数据串传送到外部 RAM以以BUFFER为首地址的区域,直到发现为首地址的区域,直到发现“$”字符字符 的的ASC码为止,同时规定数据串最大长度为码为止,同时规定数据串最大长度为32个字节。个字节。32特制分析 (7 7)程序流程框图;)程序流程框图;开开始始初初始始化化数数据据指指针针结结束束数数传传送送完完否否N NY Y初初始始化化控控制制变变量量取取数数数数据据传传送送修修改改指指针针变变量量是是$ $吗吗? ?Y YN N33特制分析 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; 是是“$”$”字符,转结束字符,转结束 MOVX A MOVX A , R0 R0 ; MOVX DPTRMOVX DPTR,A A; 数据传送数据传送 INC R0INC R0; INC DPTRINC DPTR; DJNZ R1DJNZ R1, LOOPLOOP; 循环控制循环控制 LOOP1LOOP1:RETRET; 结束结束 ENDEND34特制分析【补充程序补充程序】存储器清零程序。假设在内部存储器清零程序。假设在内部RAM区,开辟区,开辟96个工作单元,工作单元首地址为个工作单元,工作单元首地址为20H,则工作单元清零,则工作单元清零程序子程序如下程序子程序如下:思考题:如采用思考题:如采用CJNE指令,应如何修改程序?指令,应如何修改程序?解:解: ORG 1000HORG 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 ENDDEC R7DEC R7CJNE R7,#00H,LOOP;CJNE R7,#00H,LOOP;35特制分析 例:两个三字节二进制无符号数相加,被加数放在内部例:两个三字节二进制无符号数相加,被加数放在内部RAM 50H52H单元(低字节存放在高地址单元,高字节存放在低地单元(低字节存放在高地址单元,高字节存放在低地址单元,即低位在前,高位在后),加数放在址单元,即低位在前,高位在后),加数放在53H55H单元,单元,和放在和放在50H52H单元,最高位如有进位,则放在单元,最高位如有进位,则放在23H单元中。单元中。被加数(被加数(N1N1)加数(加数(N2N2)和(和(N3N3)50H50H单元单元高字节高字节53H53H单元单元高字节高字节50H50H单元单元高字节高字节51H51H单元单元中字节中字节54H54H单元单元中字节中字节51H51H单元单元中字节中字节52H52H单元单元低字节低字节55H55H单元单元低字节低字节52H52H单元单元低字节低字节23H23H单元单元进位位进位位 被加数被加数 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位)位)36特制分析开开始始初初始始化化数数据据指指针针结结束束两两数数加加完完否否N NY Y初初始始化化控控制制变变量量取取加加数数N N1 1取取加加数数N N2 2两两数数相相加加并并保保存存修修改改指指针针变变量量数数据据处处理理返回返回程序流程框图程序流程框图37特制分析 ORG 0030H ORG 0030H ADDUDO ADDUDO:MOV R0MOV R0, #52H#52H; 循环初始化部分循环初始化部分 MOV R1MOV R1, #55H#55H; MOV R7MOV R7, #03H#03H; 循环次数循环次数 CLR CCLR C; LOOPLOOP:MOV AMOV A, R0R0; 循环体部分循环体部分 ADDC AADDC A, R1R1; MOV R0MOV R0, A A; DEC R0DEC R0; 修改指针变量修改指针变量 DEC R1DEC R1; DJNZ R7DJNZ R7, LOOPLOOP; 循环控制部分循环控制部分 CLR ACLR A; 循环结束处理部分循环结束处理部分 ADDC AADDC A, #00H#00H; MOV R0MOV R0, #23H#23H; MOV R0MOV R0, A A; RETRET; END END 程序清单程序清单38特制分析4.3 80C514.3 80C51单片机汇编语言程序设计举例单片机汇编语言程序设计举例4.3.2 4.3.2 定时程序定时程序 在单片机的控制应用中,常有定时的需要,如定时中断、定在单片机的控制应用中,常有定时的需要,如定时中断、定时检测和定时扫描等。定时功能除可以使用纯硬件电路、可编程时检测和定时扫描等。定时功能除可以使用纯硬件电路、可编程定时定时/ /计数器实现外,还可以使用软件程序(计数器实现外,还可以使用软件程序(定时程序定时程序)完成。)完成。 定时程序是典型的循环程序,它是通过定时程序是典型的循环程序,它是通过执行一个具有固定延执行一个具有固定延迟时间的循环体迟时间的循环体来实现定时的。来实现定时的。开开始始初初始始化化部部分分结结束束循循环环控控制制部部分分N NY Y循循环环体体39特制分析(1 1)单循环定时程序)单循环定时程序 MOV R5MOV R5, #TIME#TIME;LOOP: NOPLOOP: NOP; NOPNOP; DJNZ R5DJNZ R5, LOOPLOOP; 假设假设单片机晶振频单片机晶振频率率f foscosc=6MHz=6MHz,则一个机器周期为则一个机器周期为2s2s,NOPNOP、DJNZDJNZ指令分别是单、双机器周期指令。指令分别是单、双机器周期指令。定时程序的总延迟定时程序的总延迟时间是循环程序段延时时间的整数倍时间是循环程序段延时时间的整数倍,由于,由于R5R5是是8 8位寄存器,因位寄存器,因此,这个定时程序的最长定时时间为:此,这个定时程序的最长定时时间为: 256256(2 28 8)8=20488=2048(ss)40特制分析(2 2)较长时间的定时程序)较长时间的定时程序 (多重循环定时子程序)(多重循环定时子程序) TIMETIME:MOV R5MOV R5, #TTME1#TTME1; LOOP2LOOP2:MOV R4MOV R4, #TEME2#TEME2; LOOP1LOOP1:NOPNOP; NOPNOP; DJNZ R4DJNZ R4, LOOP1LOOP1; DJNZ R5DJNZ R5, LOOP2LOOP2; RETRET; 这个定时子程序的最长定时时间为:这个定时子程序的最长定时时间为: 256256(2828)4+2+14+2+1256256(2828)2+4=5258282+4=525828(ss)开开始始外外循循环环初初始始化化结结束束内内循循环环控控制制N NY Y内内循循环环初初始始化化外外循循环环控控制制内内循循环环体体N NY Y41特制分析(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)。42特制分析假定要求定时时间为假定要求定时时间为24us24us。对于这个定时程序,只须增加一条。对于这个定时程序,只须增加一条NOPNOP指令即可实现。指令即可实现。 MOV R0MOV R0, #TIME#TIME; LOOPLOOP: ADD AADD A, R1R1; INC DPTRINC DPTR; NOPNOP; DJNZ R0DJNZ R0, LOOPLOOP; 只须只须TIMETIME取取2 2,即可得到精确的,即可得到精确的24s24s定时。定时。43特制分析(4 4)以一个基本的延时程序满足不同的定时要求以一个基本的延时程序满足不同的定时要求 如果一个系统有多个定时需要,我们就可以设计一个基如果一个系统有多个定时需要,我们就可以设计一个基本延时程序,使其延时时间为各定时时间的最大公约数,然本延时程序,使其延时时间为各定时时间的最大公约数,然后可以以此基本程序作为子程序,通过调用的方法实现所需后可以以此基本程序作为子程序,通过调用的方法实现所需不同定时。不同定时。 44特制分析 MOV R0 MOV R0, #05H#05H; 5S5S定时定时LOOP: LCALL DELAYLOOP: LCALL DELAY; DJNZ R0DJNZ R0, LOOP1LOOP1; MOV R0MOV R0, #0AH#0AH; 10S10S定时定时LOOP2: LCALL DELAYLOOP2: LCALL DELAY; DJNZ R0DJNZ R0, LOOP2LOOP2; MOV R0MOV R0, #14H#14H; 20S20S定时定时LOOP3: LCALL DELAYLOOP3: LCALL DELAY; DJNZ R0DJNZ R0, LOOP3LOOP3; 例:在单片机应用系统中,假设需要的定时时间分别为例:在单片机应用系统中,假设需要的定时时间分别为5S、10S、20S,可设计一个,可设计一个1S延时子程序延时子程序DELAY,则,则5S、10S、20S的定时时间可通过调用的定时时间可通过调用DELAY实现。实现。45特制分析 4.3.3 4.3.3 查表程序查表程序 所谓所谓查表程序,就是指预先把数据以表格形式存放在程查表程序,就是指预先把数据以表格形式存放在程序存储器中,然后使用程序读出,这种能读出表格数据的程序存储器中,然后使用程序读出,这种能读出表格数据的程序序就称之为查表程序。就称之为查表程序。 查表操作对单片机的控制应用十分重要,查表程序查表操作对单片机的控制应用十分重要,查表程序常用常用于实现于实现非线性修正,非线性函数转换以及代码转换非线性修正,非线性函数转换以及代码转换等等场合。场合。 46特制分析MCS-51MCS-51单片机单片机指令系统中指令系统中有有两条两条专用查表指令专用查表指令:(1 1)MOVC AMOVC A, A+A+DPTRDPTR;AA(A A)+ +(DPTRDPTR) (2 2)MOVC AMOVC A, A+A+PCPC; AA(A A)+ +(PCPC) 这两条这两条查表指令查表指令的功能是完全相同的,其的功能是完全相同的,其共同优点共同优点是:能在是:能在不改变不改变PCPC和和DPTRDPTR的状态下,只根据的状态下,只根据A A的内容就可以取出表格中的的内容就可以取出表格中的数据。注意:数据。注意:A A的内容均为的内容均为8 8位无符号数。位无符号数。适用于适用于64KB ROM64KB ROM范围内范围内查表,一个数据表格可以查表,一个数据表格可以被被多个多个程序块使用。程序块使用。编写查表程序时,首先把表的首地址送入编写查表程序时,首先把表的首地址送入DPTRDPTR中,再将中,再将要查表的数据序号(或下标值)送入要查表的数据序号(或下标值)送入A A中,然后就可以使中,然后就可以使用该指令进行查表操作,并把结果送用该指令进行查表操作,并把结果送A A中。中。常用于常用于“本地本地”范围范围查表(数据表格只能放在该指令后查表(数据表格只能放在该指令后面面256256个地址单元之内,而且表格只能被本程序使用)。个地址单元之内,而且表格只能被本程序使用)。编写查表程序时,首先把查表数据的序号送入编写查表程序时,首先把查表数据的序号送入A A中,再中,再把从查表指令的下一条指令的首地址到表的首地址间的把从查表指令的下一条指令的首地址到表的首地址间的偏移量与偏移量与A A值相加,然后再使用该指令进行查表操作,值相加,然后再使用该指令进行查表操作,并把结果送入并把结果送入A A中。中。47特制分析 ORG 1000H1000H SQR:MOV A, 30H; Ax1002H PUSH DPH; 现场保护现场保护1004H PUSH DPL; 1006H MOV DPTR,#TAB1; DPTR表首地址表首地址TAB1 1009H MOVC A, A+DPTR;查表得查表得y100AH MOV 40H, A; 40Hy100CH POP DPL; 现场恢复现场恢复100EH POP DPH; 1010H RET1011H TAB1: DB 00H,01H,04H,09H,10H,19H DB 24H,31H,40H,51H例:设计一个子程序,其功能为根据例:设计一个子程序,其功能为根据x的内容(的内容(09之间)之间)查平方表,求出相应的结果查平方表,求出相应的结果y(y=x2)。假设)。假设x的内容已存的内容已存放在内部放在内部RAM 30H单元中,求出单元中,求出y的内容存放在内部的内容存放在内部RAM 40H单元中。单元中。48特制分析上例中,上例中,如果使用如果使用MOVC A,A+PC指令指令,则则编程如下:编程如下: ORG 1000H1000H SQR: MOV A, 30H; Ax1002H PUSH DPH; 现场保护现场保护1004H PUSH DPL;1006H ADD A, #07H; 加偏移量加偏移量1008H MOVC A, A+PC; 查表得查表得y1009H MOV 40H, A; 40Hy100BH POP DPL; 现场恢复现场恢复100DH POP DPH; 100FH RET1010H TAB1: DB 00H,01H,04H,09H,10H,19H DB 24H,31H,40H,51H此题中,偏移量此题中,偏移量=1010H-1009H=07H49特制分析编辑:编辑:编写程序的过程。编写程序的过程。汇编语言源程序:汇编语言源程序:用汇编语言编写的程序称为汇编用汇编语言编写的程序称为汇编语言源程序。语言源程序。汇编:汇编:汇编语言源程序不能在单片机中直接执行,汇编语言源程序不能在单片机中直接执行,必须将其必须将其“翻译翻译”为用二进制代码为用二进制代码(机器语言机器语言)表表示的目标程序才能执行。这个示的目标程序才能执行。这个“翻译翻译”过程称为过程称为汇编汇编。 4.4 单片机汇编语言源程序的编辑和汇编单片机汇编语言源程序的编辑和汇编50特制分析4.4.1 手工编程与汇编手工编程与汇编手工汇编手工汇编:先把程序用助记符指令写出,然后通过先把程序用助记符指令写出,然后通过查指令代码表,逐个把助记符指令查指令代码表,逐个把助记符指令“翻译翻译”成机成机器码,最后再把机器码的程序输入单片机,进行器码,最后再把机器码的程序输入单片机,进行调试和运行。通常把这种调试和运行。通常把这种查表翻译指令查表翻译指令的方法称的方法称为手工汇编。为手工汇编。 由于手工编程是按绝对地址进行定位的,所由于手工编程是按绝对地址进行定位的,所以手工汇编时要根据转移的目标地址计算转移指以手工汇编时要根据转移的目标地址计算转移指令的偏移量,不但令的偏移量,不但麻烦而且容易出错麻烦而且容易出错。51特制分析4.4.2 机器编辑与交叉汇编机器编辑与交叉汇编机器编辑:机器编辑:是指借助于微型机或开发系统进行单片机的程序设是指借助于微型机或开发系统进行单片机的程序设计,通常都是使用编辑软件进行源程序的编辑。编辑完成计,通常都是使用编辑软件进行源程序的编辑。编辑完成后,生成一个由汇编指令和伪指令构成的扩展名为后,生成一个由汇编指令和伪指令构成的扩展名为“.ASM.ASM”的的ASCIIASCII码文件。码文件。机器汇编:机器汇编:由计算机完成从汇编语言源程序到机器语言目标程由计算机完成从汇编语言源程序到机器语言目标程序的序的“翻译翻译”工作。工作。交叉汇编:交叉汇编:是指使用一种计算机的汇编程序为另一种计算机的是指使用一种计算机的汇编程序为另一种计算机的源程序进行汇编,即运行汇编程序进行汇编的是一种计算源程序进行汇编,即运行汇编程序进行汇编的是一种计算机,而汇编得到的目标程序是另一种计算机的。机,而汇编得到的目标程序是另一种计算机的。 单片机只能采用机器交叉汇编的方法对汇编语言程序进行汇编单片机只能采用机器交叉汇编的方法对汇编语言程序进行汇编52特制分析 在微型机或开发系统上采用交叉汇编方法对源程序进行在微型机或开发系统上采用交叉汇编方法对源程序进行汇编。交叉汇编后,再使用串行通信,把汇编得到的目标程汇编。交叉汇编后,再使用串行通信,把汇编得到的目标程序传送到单片机,进行程序调试和运行。可见,序传送到单片机,进行程序调试和运行。可见,“机器编辑机器编辑交叉汇编交叉汇编串行传送串行传送”的过程构成了单片机软件设计的的过程构成了单片机软件设计的“三步曲三步曲”,全过程如图所示。,全过程如图所示。单片机汇编语言程序生成过程单片机汇编语言程序生成过程 对汇编语言程序进行机器交叉汇编时,必须告诉计算机的汇对汇编语言程序进行机器交叉汇编时,必须告诉计算机的汇编程序应该编程序应该如何完成汇编工作如何完成汇编工作,这一任务就是通过使用,这一任务就是通过使用伪指令伪指令来来实现的。实现的。53特制分析伪指令伪指令是程序是程序设计人设计人员员发给汇编程序发给汇编程序的指令,也称汇编命令的指令,也称汇编命令或汇编程序控制指令。或汇编程序控制指令。它具有控制汇编程序的输入输出、定义数它具有控制汇编程序的输入输出、定义数据和符号、条件汇编、分配存储空间等功能。据和符号、条件汇编、分配存储空间等功能。伪指令没有与之相对应的二进制机器代码,伪指令没有与之相对应的二进制机器代码,不同汇编语言的伪指令也有所不同。不同汇编语言的伪指令也有所不同。手工汇编不需要伪指令,但机器交叉汇编必须使用伪指令。手工汇编不需要伪指令,但机器交叉汇编必须使用伪指令。在对汇编语言程序进行机器交叉汇编前,伪指令存在于汇编在对汇编语言程序进行机器交叉汇编前,伪指令存在于汇编语言程序中,但语言程序中,但汇编后得到的机器代码程序中不存在伪指令相对汇编后得到的机器代码程序中不存在伪指令相对应的二进制机器代码应的二进制机器代码,这一点请特别注意。,这一点请特别注意。4.5 80C51单片机汇编语言伪指令单片机汇编语言伪指令54特制分析1.1.汇编起始地址命令汇编起始地址命令ORGORG(ORiGinORiGin) 本命令总出现在汇编语言源程序的开头位置,用于本命令总出现在汇编语言源程序的开头位置,用于规定目标规定目标程序的起始地址程序的起始地址,即此命令后面的程序或数据块的起始地址。,即此命令后面的程序或数据块的起始地址。 命令格式命令格式: 标号:标号: ORG ORG 地址地址 在汇编语言程序的开始,通常都用一条在汇编语言程序的开始,通常都用一条ORGORG伪指令来规定程伪指令来规定程序的起始地址,如果不用序的起始地址,如果不用ORGORG规定,则汇编得到的目标程序将从规定,则汇编得到的目标程序将从0000H0000H开始。开始。 选择项选择项通常为通常为16位绝对地址,但也位绝对地址,但也可以使用标号或表达式表示可以使用标号或表达式表示例:例: ORG 8000H START:MOV A, #00H; 即规定标号即规定标号START代表地址代表地址8000H,目标程序的第一条指令从目标程序的第一条指令从8000H开始。开始。55特制分析2. 2. 汇编终止命令汇编终止命令ENDEND(END of assemblyEND of assembly)n 该命令用于终止源程序的汇编工作。该命令用于终止源程序的汇编工作。 ENDEND是汇编是汇编语言源程序的结束标志,因此,在整个汇编语言源程语言源程序的结束标志,因此,在整个汇编语言源程序中只能有一个序中只能有一个ENDEND指令,且位于程序的最后。如果指令,且位于程序的最后。如果ENDEND命令出现在程序中间,则在命令出现在程序中间,则在ENDEND之后的指令,汇编之后的指令,汇编程序将不予处理。程序将不予处理。n 命令格式为:命令格式为: END END 是选择项,只有主程序模块才有;是选择项,只有主程序模块才有; : 也是选择项,当源程序为主程序时才具有,其也是选择项,当源程序为主程序时才具有,其值为主程序第一条指令的符号地址值为主程序第一条指令的符号地址56特制分析3. 赋值命令赋值命令EQU(EQUate) 该命令用于给字符名称赋值。赋值后,其值在整个该命令用于给字符名称赋值。赋值后,其值在整个程序中有效。程序中有效。命令格式为:命令格式为:EQU 其中其中可以是常数、地址、标号或表达式。可以是常数、地址、标号或表达式。其值为其值为8位或位或16位二进制数。赋值以后的字符名称既可位二进制数。赋值以后的字符名称既可以作地址使用,也可以作立即数使用。以作地址使用,也可以作立即数使用。例:例: HOUR EQU 30HHOUR EQU 30H ORG 1000H ORG 1000H START START:MOV HOURMOV HOUR, #40H#40H; 等同于等同于 STARTSTART:MOV 30HMOV 30H, #40H#40H;57特制分析4.DB4.DB(Define ByteDefine Byte)定义数据字节命令)定义数据字节命令 本命令用于从指定的地址单元开始,在程序存储器的连续单本命令用于从指定的地址单元开始,在程序存储器的连续单元中定义字节数据。常使用本命令存放数据表格。元中定义字节数据。常使用本命令存放数据表格。 命令格式:命令格式: 标号:标号:DBDB8 8位数表位数表 例如:例如: DBDB“how are you?”“how are you?” DB DB-2,-4,-6,10,11,17-2,-4,-6,10,11,17 例:存放例:存放7 7段数码管(共阳极)显示的十六进制基数(段数码管(共阳极)显示的十六进制基数(0 0F F)的十六进制数的字形代码,可使用多条的十六进制数的字形代码,可使
展开阅读全文