80C51单片机汇编语言程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第4章 80C51单片机汇编语言程序设计
4.1 单片机程序设计语言概述 4.2 汇编语言程序的基本结构形式 4.3 80C51 单片机汇编语言程序设计举例 4.4 单片机汇编语言源程序的编辑和汇编 4.5 80C51 单片机汇编语言伪指令
4.1 单片机程序设计语言概述
4.1.1 机器语言和汇编语言 1、机器语言
用二进制代码“0”和“1”表示指令和数据的程序设计语 言,是计算机能直接识别并执行的指令。 优点:执行速度快、占用内存少。 缺点:识别难、记忆难。 2、汇编语言 用助记符和专门的语言规则表示指令的功能和特征。 优点:助记符与机器指令一一对应。比机器语言直观、
易懂、易记。非常适合于实时控制的需要。 缺点:难以记忆和使用,程序设计的技巧性较高,编程
难度较大。要求使用者必须精通单片机的硬件系 统和指令系统。缺乏通用性,程序不易移植。
4.1.2 单片机使用的高级语言
对于8051单片机,现有4种语言支持,即汇编、 PL/M、C和BASIC。
C语言最终得到广泛应用。 可以大大提高单片机应用系统研制的开发效率。移 植性好。 高级语言的不足:生成的目标代码较长,导致应用程 序运行速度较慢。
4.1.3 80C51 单片机汇编语言的语句格式
80C51汇编语言的语句格式如下:
[<标号>] : <操作码> [<操作数>]; [<注释>]
1. 标号
是语句地址的标志符号,标号的几点规定:
1~8个ASCII字符组成,第一个字符必须是字母。
不能使用本汇编语言已经定义的符号作为标号。
标号后面必须跟以冒号“:”。
同一标号在一个程序中只能定义一次。
标号可有可无。 错误的标号
正确的标号
1BT :
BT1
BEGIN
BEGIN :
TA+TB:
TATB:
ADD:
ADD1:
2. 操作码 用于规定语句执行的操作内容,用指令助记符表示。 不能空缺。
3. 操作数 操作数用于为指令操作提供数据。可以是空白,也可 能有1~3个操作数,各操作数之间以逗号分隔。
4. 注释 不属于语句的功能部分,只是对语句的解释说明,以 “;”开头。
5. 分界符(分隔符) 用于把语句中的各部分隔开,以便于区分。分界符包 括空格、冒号、分号或逗号等符号。
4.2 汇编语言程序的基本结构形式
三种基本结构形式:顺序程序结构,分支程序结构, 循环程序结构。
4.2.1 顺序程序结构 顺序结构程序是最简单的程序结构。程序既无分支、 循环,也不调用子程序,程序执行时一条接一条地 按顺序执行指令。
2、程序设计的一般步骤
(1)分析任务 (2)确定算法 (3)画流程图 (4)编写程序 (5)上机调试
查错、改错, 用指令的形式
对程序进行 将程序流程图
优化。
实现出来。
当接到程序设计的任务后, 首先对任务进行详尽的分析, 搞清楚已知的数据和想要得 到的结果,程序应该完成何 种的功能。明确在程序设计 时应该 “做什么” 。
根据实际问题的要求和指令系 统的特点,确定解决问题的具 体步骤。根据任务要求,对不 同的计算方法进行比较,选择 最适宜的算法。解决“怎样做” 的问题。
将解决问题的具体步骤用一种 约定的几何图形、指向线和必 要的文字说明描述出来,用图 形的方法描绘解决问题的思路。
例:3字节无符号数相加:其中被加数在内部RAM的50H、
51H和52H单元中;加数在内部RAM的53H、54H和55H单元 中;要求把相加之和存放在50H、51H和52H单元中,进位存 放在位寻址区的20H位中。
(1)分析任务 (2)确定算法 (3)画流程图 (4)编写程序 (5)上机调试
50H N1高字节 51H N1中字节 52H N1低字节 53H N2高字节 54H N2中字节 55H N2低字节
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 ;存高字节相加结果
CLR A ADDC A, #00H;进位送00H位保存 MOV R0, #20H;存放进位的单元地址
MOV @R0, A
4.2.2 分支程序结构
分支结构也称为选择结构。为分支需要,程序设计时 应给程序段的起始地址赋予一个地址标号,以供选择分支 使用。分支结构又可分为单分支结构和多分支结构。
1. 单分支程序结构 单分支程序结构即二中选一,是通过条件判断实现
的。一般都使用条件转移指令对程序的执行结果进行判 断。
可实现单分支转移的指令有:JZ、JNZ、CJNE和 DJNZ。位状态转移指令:JC、JNC、JB、JNB和JBC 等。
(1)单分支结构举例 假定在外部RAM中有ST1、ST2和ST3共3个连续
单元,其中ST1和ST2单元中存放着两个无符号二进制 数,要求找出其中的大数并存入ST3单元中。
解:(1)分析任务:比较两个数的大小
(2)算法:算术运算、控制转移
(3)程序结构:单分支
(4)数据类型:单字节、二进制、无符号数
(5)数据结构:单元地址升序排列
(6)RAM单元安排:外部RAM单元
(7)采用寄存器间接寻址方式(R0、R1或DPTR)
(8)程序设计流程框图;
(9)程序清单;
开始
设置数据指针
取数据N1并暂存
Y N2保存于A中
取数据N2
N2≥N1 N
N1保存于A中
修改数据指针
保存大数
结束
START: CLR C
;进位位清0
MOV DPTR,#ST1 ;设置数据指针
MOVX A,@DPTR ;取第1个数
MOV R2, A
;第1个数存于R2
INC DPTR
;数据指针加1
MOVX A, @DPTR ;取第2个数
SUBB A, R2
;两数比较
JNC BIG1
;若第2个数大,则转向BIG1
XCH A, R2
;若第1个数大,则整字节交换
BIG0:
INC DPTR
MOVX @DPTR, A ;存大数
RET
BIG1:
MOVX A, @DPTR
上例中,如果采SJ用MPCJBINGE0 A, direct,rel指令,应如何修改程序?
(2)多重单分支结构举例 多重单分支结构中,通过一系列条件判断,进
行逐级分支。为此可使用比较转移指令CJNE实现。
例:假定采集的温度值Ta放在累加器A中。此外,在内部 RAM 54H单元存放温度下限值T54,在55H单元存放温度 上限值T55。若Ta>T55,程序转向JW(降温处理程序);若 Ta<T54,则程序转向SW(升温处理程序);若 T55≥Ta≥T54,则程序转向FH(返回主程序)。
CJNE A, 55H, LOOP1 ;若Ta≠T55,则转向LOOP1
AJMP FH
;若Ta=T55,则返回
LOOP1: JNC JW
;若(CY)=0,表明Ta>T55,转降温处理程序
CJNE A, 54H, LOOP2 ;若Ta≠T54,则转向LOOP2
AJMP FH
;若Ta=T54,则返回
LOOP2: JC SW
;若(CY)=1,表明Ta<T54,转升温处理程序
FH: RET
;若T55≥Ta≥T54,则返回主程序
例:已知:127≥X≥-128,求Y。设X,Y分别存放在外部 RAM 1000H和2000H单元中。
解:(1)分析任务:解方程 (2)算法:控制转移 (3)程序结构:多分支
1 y 1
0
x0 x0 x0
(4)数据类型:单字节、二进制、有符号数
(5)RAM单元安排:外部RAM单元
(6)采用寄存器间接寻址方式(R0、R1或DPTR)
(7)程序设计流程框图
(8)程序清单;
Y Y=0
开始
取数据X
X=0 N
X<0 N
Y=1
Y Y=-1
保存数据Y 结束
返回
XAD BUF ORG START:MOV MOVX JZ JB MOV SJMP NEG: MOV SAV: MOV MOVX END
EQU EQU 1000H DPTR, A, SAV; ACC.7, A, SAV; A, DPTR, @DPTR,
1000H; 2000H;
#XAD ;数据X的地址送数据指针DPTR @DPTR; A←取数据X
X=0转SAV NEG; X<0转NEG,否则,X>0 #01H;
#0FFH; (0FFH为-1补码) #BUF; 数据Y的地址送数据指针DPTR A; 保存Y值
上例中,如果采用CJNE指令,应如何修改程序?
XAD EQU
1000H;
BUF EQU
2000H;
ORG 1000H
START:MOV DPTR, #XAD ;数据X的地址送数据指针DPTR
MOVX A,
@DPTR; A←取数据X
CJNE A, #0, ANZ ; X≠0转ANZ
SJMP SAV;
ANZ: JC NEG ;X<0转NEG,否则,X>0
MOV A,
#01H;
SJMP SAV;
NEG: MOV A,
#0FFH; (0FFH为-1补码)
SAV: MOV DPTR, #BUF; 数据Y的地址送数据指针DPTR
MOVX @DPTR, A; 保存Y值
END
2. 多分支程序结构 多分支程序结构流程中具有两个以上条件可供选择。可 供使用的是变址寻址转移指令“JMP @A+DPTR”,但使 用该指令实现多分支转移时,需要有数据表格配合。
多分支程序结构
(1)通过数据表实现程序多分支
MOV A, n
;分支序号送A
MOV DPTR, #BRTAB ;地址表首址
MOVC A, @A+DPTR ;查表
JMP @A+DPTR ;转移
BRTAB:DB BR0-BRTAB ;地址表
DB BR1-BRTAB
DB BRn-BRTAB
BR0: …
分支程序
BR1: …
BRn: …
(2)通过转移指令表实现程序多分支
MOV A, n
RL A
;分支序号值乘以2
MOV DPTR, #BRTAB;转移指令表首址
JMP @A+DPTR
BRTAB: AJMP BR0
;转分支程序0
AJMP BR1
;转分支程序1
BR0: … BR1: …
AJMP BR127
;转分支程序127 ;分支程序
BRn: …
(3)其他实现程序多分支的方法
MOV DPTR, #BRTAB ;分支入口地址表首址
MOV A, R0
RL A
;分支转移值乘以2
MOV R1, A
;暂存A值
INC A
MOVC A, @A+DPTR ;取低位地址
PUSH ACC
;低位地址入栈
MOV A, R1
;恢复A值
MOVC A, @A+DPTR ;取高位地址
PUSH ACC
;高位地址入栈
RET
;分支入口地址装入PC
BRTAB:DW BR0
;分支程序入口地址表
DW BR1
DW BR127
例:假设键盘上有4个按键,功能说明如下表:
键功能
删除 读数据 写数据
插入
键值(分支程序序号)
00H 01H 02H 03H
键处理程序(分支程序)
ER DS XS CR
分析任务 确定算法 程序流程框图
DPTR←表首地址
A←分支序号×2
JMP @A+DPTR
序号=00H 序号=01H
序号=02H 序号=03H
ER分支程序 DS分支程序 XS分支程序 CR分支程序
假设转移指令表名称为BRTAB,分支程序序号已在A 中。
MOV DPTR, #BRTAB
CLR C
RLC A
JMP @A+DPTR;
ORG
3000H BRTAB3:10A0JHMP 3001H
3002H 3003H
320A0JHMP
3004H 3005H
330A0JHMP
3006H
340A0JHMP
3000H ERE:R;…OR…G ……转…3删1…0除0;H分支删程除序分支程序
ORG 3200H DSD:S;…………转…读…数;据分读支数程据序分支程序
ORG 3300H XSX:S;…………转…写…数;据分写支数程据序分支程序
ORG 3400H CRC:R;…………转…插…入;分支插程入序分支程序
END
(4)使用比较转移指令CJNE实现。
(A)=0? N
(A)=1? N
(A)=2?
N
Y 转向0分支
Y 转向1分支
Y 转向2分支
4.2.3 循环程序结构
循环结构是重复执行某个程序段。使用条件转移指令通 过条件判断来实现和控制循环。 循环程序一般由四个主要部分组成:
4.1 单片机程序设计语言概述 4.2 汇编语言程序的基本结构形式 4.3 80C51 单片机汇编语言程序设计举例 4.4 单片机汇编语言源程序的编辑和汇编 4.5 80C51 单片机汇编语言伪指令
4.1 单片机程序设计语言概述
4.1.1 机器语言和汇编语言 1、机器语言
用二进制代码“0”和“1”表示指令和数据的程序设计语 言,是计算机能直接识别并执行的指令。 优点:执行速度快、占用内存少。 缺点:识别难、记忆难。 2、汇编语言 用助记符和专门的语言规则表示指令的功能和特征。 优点:助记符与机器指令一一对应。比机器语言直观、
易懂、易记。非常适合于实时控制的需要。 缺点:难以记忆和使用,程序设计的技巧性较高,编程
难度较大。要求使用者必须精通单片机的硬件系 统和指令系统。缺乏通用性,程序不易移植。
4.1.2 单片机使用的高级语言
对于8051单片机,现有4种语言支持,即汇编、 PL/M、C和BASIC。
C语言最终得到广泛应用。 可以大大提高单片机应用系统研制的开发效率。移 植性好。 高级语言的不足:生成的目标代码较长,导致应用程 序运行速度较慢。
4.1.3 80C51 单片机汇编语言的语句格式
80C51汇编语言的语句格式如下:
[<标号>] : <操作码> [<操作数>]; [<注释>]
1. 标号
是语句地址的标志符号,标号的几点规定:
1~8个ASCII字符组成,第一个字符必须是字母。
不能使用本汇编语言已经定义的符号作为标号。
标号后面必须跟以冒号“:”。
同一标号在一个程序中只能定义一次。
标号可有可无。 错误的标号
正确的标号
1BT :
BT1
BEGIN
BEGIN :
TA+TB:
TATB:
ADD:
ADD1:
2. 操作码 用于规定语句执行的操作内容,用指令助记符表示。 不能空缺。
3. 操作数 操作数用于为指令操作提供数据。可以是空白,也可 能有1~3个操作数,各操作数之间以逗号分隔。
4. 注释 不属于语句的功能部分,只是对语句的解释说明,以 “;”开头。
5. 分界符(分隔符) 用于把语句中的各部分隔开,以便于区分。分界符包 括空格、冒号、分号或逗号等符号。
4.2 汇编语言程序的基本结构形式
三种基本结构形式:顺序程序结构,分支程序结构, 循环程序结构。
4.2.1 顺序程序结构 顺序结构程序是最简单的程序结构。程序既无分支、 循环,也不调用子程序,程序执行时一条接一条地 按顺序执行指令。
2、程序设计的一般步骤
(1)分析任务 (2)确定算法 (3)画流程图 (4)编写程序 (5)上机调试
查错、改错, 用指令的形式
对程序进行 将程序流程图
优化。
实现出来。
当接到程序设计的任务后, 首先对任务进行详尽的分析, 搞清楚已知的数据和想要得 到的结果,程序应该完成何 种的功能。明确在程序设计 时应该 “做什么” 。
根据实际问题的要求和指令系 统的特点,确定解决问题的具 体步骤。根据任务要求,对不 同的计算方法进行比较,选择 最适宜的算法。解决“怎样做” 的问题。
将解决问题的具体步骤用一种 约定的几何图形、指向线和必 要的文字说明描述出来,用图 形的方法描绘解决问题的思路。
例:3字节无符号数相加:其中被加数在内部RAM的50H、
51H和52H单元中;加数在内部RAM的53H、54H和55H单元 中;要求把相加之和存放在50H、51H和52H单元中,进位存 放在位寻址区的20H位中。
(1)分析任务 (2)确定算法 (3)画流程图 (4)编写程序 (5)上机调试
50H N1高字节 51H N1中字节 52H N1低字节 53H N2高字节 54H N2中字节 55H N2低字节
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 ;存高字节相加结果
CLR A ADDC A, #00H;进位送00H位保存 MOV R0, #20H;存放进位的单元地址
MOV @R0, A
4.2.2 分支程序结构
分支结构也称为选择结构。为分支需要,程序设计时 应给程序段的起始地址赋予一个地址标号,以供选择分支 使用。分支结构又可分为单分支结构和多分支结构。
1. 单分支程序结构 单分支程序结构即二中选一,是通过条件判断实现
的。一般都使用条件转移指令对程序的执行结果进行判 断。
可实现单分支转移的指令有:JZ、JNZ、CJNE和 DJNZ。位状态转移指令:JC、JNC、JB、JNB和JBC 等。
(1)单分支结构举例 假定在外部RAM中有ST1、ST2和ST3共3个连续
单元,其中ST1和ST2单元中存放着两个无符号二进制 数,要求找出其中的大数并存入ST3单元中。
解:(1)分析任务:比较两个数的大小
(2)算法:算术运算、控制转移
(3)程序结构:单分支
(4)数据类型:单字节、二进制、无符号数
(5)数据结构:单元地址升序排列
(6)RAM单元安排:外部RAM单元
(7)采用寄存器间接寻址方式(R0、R1或DPTR)
(8)程序设计流程框图;
(9)程序清单;
开始
设置数据指针
取数据N1并暂存
Y N2保存于A中
取数据N2
N2≥N1 N
N1保存于A中
修改数据指针
保存大数
结束
START: CLR C
;进位位清0
MOV DPTR,#ST1 ;设置数据指针
MOVX A,@DPTR ;取第1个数
MOV R2, A
;第1个数存于R2
INC DPTR
;数据指针加1
MOVX A, @DPTR ;取第2个数
SUBB A, R2
;两数比较
JNC BIG1
;若第2个数大,则转向BIG1
XCH A, R2
;若第1个数大,则整字节交换
BIG0:
INC DPTR
MOVX @DPTR, A ;存大数
RET
BIG1:
MOVX A, @DPTR
上例中,如果采SJ用MPCJBINGE0 A, direct,rel指令,应如何修改程序?
(2)多重单分支结构举例 多重单分支结构中,通过一系列条件判断,进
行逐级分支。为此可使用比较转移指令CJNE实现。
例:假定采集的温度值Ta放在累加器A中。此外,在内部 RAM 54H单元存放温度下限值T54,在55H单元存放温度 上限值T55。若Ta>T55,程序转向JW(降温处理程序);若 Ta<T54,则程序转向SW(升温处理程序);若 T55≥Ta≥T54,则程序转向FH(返回主程序)。
CJNE A, 55H, LOOP1 ;若Ta≠T55,则转向LOOP1
AJMP FH
;若Ta=T55,则返回
LOOP1: JNC JW
;若(CY)=0,表明Ta>T55,转降温处理程序
CJNE A, 54H, LOOP2 ;若Ta≠T54,则转向LOOP2
AJMP FH
;若Ta=T54,则返回
LOOP2: JC SW
;若(CY)=1,表明Ta<T54,转升温处理程序
FH: RET
;若T55≥Ta≥T54,则返回主程序
例:已知:127≥X≥-128,求Y。设X,Y分别存放在外部 RAM 1000H和2000H单元中。
解:(1)分析任务:解方程 (2)算法:控制转移 (3)程序结构:多分支
1 y 1
0
x0 x0 x0
(4)数据类型:单字节、二进制、有符号数
(5)RAM单元安排:外部RAM单元
(6)采用寄存器间接寻址方式(R0、R1或DPTR)
(7)程序设计流程框图
(8)程序清单;
Y Y=0
开始
取数据X
X=0 N
X<0 N
Y=1
Y Y=-1
保存数据Y 结束
返回
XAD BUF ORG START:MOV MOVX JZ JB MOV SJMP NEG: MOV SAV: MOV MOVX END
EQU EQU 1000H DPTR, A, SAV; ACC.7, A, SAV; A, DPTR, @DPTR,
1000H; 2000H;
#XAD ;数据X的地址送数据指针DPTR @DPTR; A←取数据X
X=0转SAV NEG; X<0转NEG,否则,X>0 #01H;
#0FFH; (0FFH为-1补码) #BUF; 数据Y的地址送数据指针DPTR A; 保存Y值
上例中,如果采用CJNE指令,应如何修改程序?
XAD EQU
1000H;
BUF EQU
2000H;
ORG 1000H
START:MOV DPTR, #XAD ;数据X的地址送数据指针DPTR
MOVX A,
@DPTR; A←取数据X
CJNE A, #0, ANZ ; X≠0转ANZ
SJMP SAV;
ANZ: JC NEG ;X<0转NEG,否则,X>0
MOV A,
#01H;
SJMP SAV;
NEG: MOV A,
#0FFH; (0FFH为-1补码)
SAV: MOV DPTR, #BUF; 数据Y的地址送数据指针DPTR
MOVX @DPTR, A; 保存Y值
END
2. 多分支程序结构 多分支程序结构流程中具有两个以上条件可供选择。可 供使用的是变址寻址转移指令“JMP @A+DPTR”,但使 用该指令实现多分支转移时,需要有数据表格配合。
多分支程序结构
(1)通过数据表实现程序多分支
MOV A, n
;分支序号送A
MOV DPTR, #BRTAB ;地址表首址
MOVC A, @A+DPTR ;查表
JMP @A+DPTR ;转移
BRTAB:DB BR0-BRTAB ;地址表
DB BR1-BRTAB
DB BRn-BRTAB
BR0: …
分支程序
BR1: …
BRn: …
(2)通过转移指令表实现程序多分支
MOV A, n
RL A
;分支序号值乘以2
MOV DPTR, #BRTAB;转移指令表首址
JMP @A+DPTR
BRTAB: AJMP BR0
;转分支程序0
AJMP BR1
;转分支程序1
BR0: … BR1: …
AJMP BR127
;转分支程序127 ;分支程序
BRn: …
(3)其他实现程序多分支的方法
MOV DPTR, #BRTAB ;分支入口地址表首址
MOV A, R0
RL A
;分支转移值乘以2
MOV R1, A
;暂存A值
INC A
MOVC A, @A+DPTR ;取低位地址
PUSH ACC
;低位地址入栈
MOV A, R1
;恢复A值
MOVC A, @A+DPTR ;取高位地址
PUSH ACC
;高位地址入栈
RET
;分支入口地址装入PC
BRTAB:DW BR0
;分支程序入口地址表
DW BR1
DW BR127
例:假设键盘上有4个按键,功能说明如下表:
键功能
删除 读数据 写数据
插入
键值(分支程序序号)
00H 01H 02H 03H
键处理程序(分支程序)
ER DS XS CR
分析任务 确定算法 程序流程框图
DPTR←表首地址
A←分支序号×2
JMP @A+DPTR
序号=00H 序号=01H
序号=02H 序号=03H
ER分支程序 DS分支程序 XS分支程序 CR分支程序
假设转移指令表名称为BRTAB,分支程序序号已在A 中。
MOV DPTR, #BRTAB
CLR C
RLC A
JMP @A+DPTR;
ORG
3000H BRTAB3:10A0JHMP 3001H
3002H 3003H
320A0JHMP
3004H 3005H
330A0JHMP
3006H
340A0JHMP
3000H ERE:R;…OR…G ……转…3删1…0除0;H分支删程除序分支程序
ORG 3200H DSD:S;…………转…读…数;据分读支数程据序分支程序
ORG 3300H XSX:S;…………转…写…数;据分写支数程据序分支程序
ORG 3400H CRC:R;…………转…插…入;分支插程入序分支程序
END
(4)使用比较转移指令CJNE实现。
(A)=0? N
(A)=1? N
(A)=2?
N
Y 转向0分支
Y 转向1分支
Y 转向2分支
4.2.3 循环程序结构
循环结构是重复执行某个程序段。使用条件转移指令通 过条件判断来实现和控制循环。 循环程序一般由四个主要部分组成: