第四章80C51单片机的汇编语言的程序设计

Download Report

Transcript 第四章80C51单片机的汇编语言的程序设计

第4章
80C51汇编语言程序设计
本章的主要内容
程序设计语言和伪指令;
 MCS-51单片机汇编语言程序设计的步骤
 延时程序的使用方法
 查表程序设计
 数制转换的原理

4.1.1 程序设计语言
机器语言
 汇编语言
 C8051语言

4.1.2 伪指令
ORG 操作数;
 符号名称 EQU 操作数;
 字符名称 DATA 操作数;
 【标号:】 DB 数据表;
 【标号:】 DW 数据表;
 字符名称 bit 位地址;
P10 bit P1.0

4.1.3 简单汇编语言程序设计(67)
虽然单片机的每—条指令能使计算机完
成一种特定的操作。但要完成某一特定的任
务还需要将这些指令按工作要求有序组合为
一段完整的程序。程序实际上是一系列计算
机指令的有序集合。我们把利用计算机的指
令系统来合理地编写出解决某个问题的程序
的过程,称之为程序设计。
编制程序的步骤
1.任务分析(硬件、软件系统分析)
2.确定算法和工作步骤;
3.程序总体设计和流程图绘制
关于流程图符号:
开始、结束----圆角矩形
工作任务----矩形
判断分支----菱形
程序流向---程序连接----
开始
结束
4. 分配内存,确定程序与数据区存放地址;
5. 编写源程序;
6. 调试、修改,最终确定程序。
方法技巧
1. 模块化设计(显示、打 印、输入、发送)
2. 尽量采用循环及子程序结构(节省内存)
汇编语言的规范
1. 汇编语言源程序由以下两种指令构成
 汇编语句(指令语句)
 伪指令(指示性语句)
2. 汇编语句的格式:
标号: 操作码
操作数
;注释
3. 数据表示形式:
二进制(B)、十六进制(H)、十进制(D或省
略)、ASCII码(以单引号标识)
4.2.1 三种程序的结构
(1)分支结构或者选择结构
(2)循环结构
(3)查表程序
4.2.2 三个应用举例
(1)延时程序
(2)十六进制—ASCII的转换
(3)两字节的乘法
(1)延时程序

题目:单片机采用12M晶振,试编写0.1s延时程序

ORG
0100H

MOV
R2,#200

LOOP:MOV
R3,#250

DJNZ
R3,$

DJNZ
R2,LOOP

RET

请思考:
机器周期是
多少?
(2周期)
请思考:
如何计算总
的延时时间?
例2: 50ms延时子程序。设晶振频率为12MHz,
则机器周期为1us。
DEL: MOV R7,#200
DEL1:MOV R6,#123
NOP
DJNZ R6,$
DJNZ R7,DEL1
RET
;1MC
;1MC
;1MC
;2MC
;2MC
;2MC
延时时间:t=1+200[(1+1+2*123)+2]+2
≈50000us=50ms
(2)代码转换类程序设计

十六进制数与ASCII的转换

十六进制整数转换成单字节BCD码整数
* 单字节十六进制数转换成双字节ASCII码
表4-1
十 六
进制数
十六进制数与ASCII码之间的关系
十 六
进制数
十 六
进制数
十 六
进制数
0
30H
4
34H
8
38H
C
43H
1
31H
5
35H
9
39H
D
44H
2
32H
6
36H
A
41H
E
45H
3
33H
7
37H
B
42H
F
46H
例1:待转换的单字节十六进制数在寄存器R2中。高四位的
ASCII码存在A中,低四位的ASCII码存在B中。
ORG 0100H
MOV
A,R2
MOV
B,A
;暂存待转换的单字节十六进制数
LCALL MS1
XCH
A,B
;存放低四位的ASCII码
SWAP A
;准备转换高四位
LCALL MS1
SJMP
$
MS1: ANL A,#0FH
CJNE A, #0AH, N1
SJMP DAYU
N1:
JNC DAYU
ADD A ,#30H
SJMP DIWEI
DAYU: ADD A ,#37H ;将累加器低四位转换成 ASCII DIWEI
DIWEI: RET
例2:查找无符号数据块中最大值(P104)











ORG 1000H
请思考:
MOV R2,#0AH ;共计十个数
用另外一种
方法?
CLR A
LP:
SUBB A,@R1
JNC NEXT
MOV A,@R1
;第二个数大
SJMP NEXT1
NEXT: ADD A,@R1
;原数最大,恢复
NEXT1: INC R1
DJNZ R2,LP
END
(3) 查表程序设计

MOVC A,@A+DPTR

MOVC A,@A+PC
举例:查表求ASCII码
已知:R0低四位有一个十六进制数(0~F)。
将查表找出的相应ASCII码并送回R0中。
ORG 0100H
请思考:
为什么?
MOV A,R0
ANL A,#0FH
;屏蔽高4位
ADD A,#03H
MOVC
A,@A+PC
;查表
MOV R0,A
;存结果
SJMP
$
ASCTAB:
DB '0','1','2','3','4','5','6','7'
DB '8','9','A','B','C','D','E','F'
4.2 子程序设计时注意事项
1. 给子程序赋一个名字。实际为入口地址代号。
2. 要能正确传递参数:
入口条件:子程序中要处理的数据如何给予。
出口条件:子程序处理结果如何存放。
(寄存器、存储器、堆栈方式)
3. 保护与恢复现场:
保护现场:压栈指令PUSH
恢复现场:弹出指令POP
4. 子程序可以嵌套