第4章 MCS-51单片机的程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4.3 MCS-51汇编语言程序设计
汇编语言程序设计的一般过程 分析任务,确定算法或解题思路 按功能划分模块,确定各模块之间的相互关系及参数
传递 若问题较复杂,应根据算法和解题思路画出程序流程
图 合理分配寄存器和存储器,编写汇编语言源程序,并
附以必要的注释 进行汇编和连接 软件或硬件仿真调试、修改,直到满足任务要求 将调试好的目标文件(二进制或HEX格式)写入程序存
分支结构的例子
ADD MOV MOV JMP BR_TAB:LJMP LJMP ………… LJMP
A, DPH
;乘积高8位加到DPH
DPH, A
A, B
;乘积的低8位
@A+DPTR
;间接转移
CASE_0
CASE_1
CASE_N
4.3.3 循环结构
循环条件有两种形式:事先可以确定循环次数 的,称为计数式循环;若只能根据某种条件是 否满足来决定,则称为条件式循环
所有表达式求值都按16位运算进行
表达式
数制
在常数结尾处加符号八进制,H表 示十六进制,D或者不加标注表示十进制
字符和字符串
以一个或两个用单引号引起来的字符构成 汇编器将其ASCII码转换为等价的二进制形式
算术运算
包括加、减、乘、除、求模,分别用符号+、-、 *、/、MOD表示
与DB相同
伪指令语句
PUBLIC和EXTRN伪指令
PUBLIC symbol[, symbol][...]
说明的符号或符号列表,可以在当前模块之外 引用
EXTRN
seg_type(symbol[, symbol]
[...] )
其中段类型为DATA、IDATA、XDATA、BIT、 CODE等
若该接口电路的状态寄存器地址为DEV_STA, 数据输入寄存器地址为DEV_DATA,可以使用 以下的代码段实现上述功能
循环结构的例子
即使在高级语言开发的软件中,对响应速度要 求严格的程序段也常用汇编语言编写
单片机程序开发过程
以汇编语言为例 编写汇编语言源程序 如果没有语法错误,经过汇编后,每个源程序
文件产生一个相应的浮动(可重定位的)地址目 标文件 由连接定位程序(连接定位器)将这些目标文件 连接,将浮动地址确定下来,生成一个绝对地 址目标文件
第4章 MCS-51单片机 的程序设计
汇编语言、C语言
4.1 MCS-51程序设计语言概述
计算机程序设计语言是指计算机能够理解和执 行的语言
理解和执行也可能经过某种中间环节的翻译, 但是都与人类所使用的自然语言有较大差别
机器语言 汇编语言 高级语言
机器语言
二进制编码的指令 74H 34H 24H 45H F5H 09H 74H 12H 34H
DPTR, #BR_TAB A, R3 A R1, A A
;表起始位置 ;序号
;乘以2 ;暂存
分支结构的例子
MOVC PUSH MOV MOVC PUSH RET BR_TAB: DW BR0: ………… BR1: ………… …………
A, @A+DPTR
;查表得低8位
ACC
;入栈
A, R1
A, @A+DPTR; 查表得高8位
储器内,上电运行
4.3.1 顺序结构
编写程序,将存放于内部RAM中30H、31H处 和40H、41H处的各4位BCD数相加,结果仍 存入30H、31H。低地址中存放BCD数低2位, 高地址存放高2位
BCD1 BCD2
MAIN:
DATA DATA ORG LJMP ORG MOV
30H ;第一个BCD数低位 40H ;第二个BCD数低位 0000H MAIN 0030H A, BCD1
计数式循环可以使用DJNZ类指令,条件式循 环可以使用条件转移指令实现
循环结构的例子
将外部RAM地址2000H~201FH单元32个字 节数据复制到内部RAM 30H~4FH中。这是典 型的计数式循环,循环次数为32。
X_BUF
XDATA
2000H;外部缓冲区起始地址
I_BUF
DATA 30H
表达式
逻辑运算
包括逻辑或、与、异或和非,分别用符号OR、 AND、XOR和NOT表示,实现的是按位运算
特殊运算
包括SHR、SHL、HIGH、LOW、(),分别表示 右移、左移、取高字节、取低字节和优先求值
关系运算
关系运算符有EQ、NE、LT、LE、GT和GE, 也可以写作=、<>、<、<=、>、>=,分别表示 相等、不等、小于、小于或等于、大于、大于 或等于
伪指令语句
DS伪指令 以字节单位保留存储空间
[label:]
DS
expression
汇编时,地址计数器的值将会更新为当前值与 expression结果的和
伪指令语句
DBIT伪指令 以位为单位保留存储空间
[label:]
DBIT
expression
伪指令语句
DB伪指令 以字节为单位初始化程序存储器空间 [label:] DB expression[, expression][...] 在程序存储器中存储常数数据或表格 DW伪指令 以双字节为单位初始化程序存储器空间,格式
$
;无需处理
A, NUM16
;取低位
A
;取反
A, #1
;加一
NUM16, A
;保存
A, NUM16+1
;高位
A
A, #0
ACC.7
NUM16+1, A
$
分支结构的例子
使用查表指令和堆栈实现的多分支转移程序。 假设分支转移序号在R3中,分支程序表入口地 址为BR_TAB
MOV MOV RL MOV INC
伪指令语句
绝对地址段选择伪指令
CSEG
[AT
address]
DSEG
[AT
address]
ISEG
[AT
address]
BSEG
[AT
address]
XSEG
[AT
address]
分别为程序存储器、内部数据存储器、间接寻 址的内部数据存储器、位寻址区和外部数据存 储器的使用指定绝对地址
顺序结构的例子
ADD DA MOV MOV ADDC DA MOV SJMP END
A, BCD2 A BCD1, A A, BCD1+1 A, BCD2+1 A BCD1+1, A $
;低位相加 ;调整 ;保存低位
;高位相加 ;调整 ;保存高位
4.3.2 分支结构
根据标志实现分支的,通常使用位条件转移指 令
23H F5H 08H
如果不对照指令系统的机器码,很难看出这段 程序要实现什么功能
汇编语言
使用助记符、符号地址、标号等符号来编写程 序的系统
RES_LOW
DATA
09H
RES_HIGH
DATA
08H
MOV
A, #34H
ADD
A, #45H
MOV
RES_LOW, A
MOV
A, #12H
ADDC
A, #23H
4.2.5 通用的转移和调用语句
MCS-51汇编器允许程序员使用通用的转移和 调用助记符JMP与CALL
用来代替SJMP、AJMP、LJMP和ACALL、 LCALL
汇编产生的未必是最优化的结果
4.2.6 条件汇编
将一个软件的多个版本保存在同一组源程序文 件中
使用IF、ELSEIF、ELSE、ENDIF IF或ELSEIF后的表达式通常为关系表达式 当IF或ELSEIF后的数值表达式的值非零时,
NUM16 MAIN:
DATA ORG LJMP ORG MOV JB
30H ;有符号数存储位置 0000H MAIN 0030H A, NUM16+1 ACC.7, MINUS
分支结构的例子
MINUS:
SJMP MOV CPL ADD MOV MOV CPL ADDC SETB MOV SJMP END
4.2 MCS-51单片机的汇编语言
INTS SET
IF ELSE ENDIF
INTS = 1 MAIN_START
MAIN_START
NUM1 DATA NUM2 DATA
DSEG AT
STACK: DS
20H
CSEG MAIN:
AT LJMP ORG MOV
1
EQU EQU
0030H 0010H
NUM2, A
$
;原地踏步
; BCD2BIN子程序的功能是将累加器A中的两位BCD数转换成8位二进制数,仍存放 于A中
BCD2BIN:
PUSH
ACC
SWAP
A
ANL
A, #0FH
MOV
B, #10
MUL
AB
POP
B
XCH
A, B
ANL
A, #0FH
ADD
A, B
RET
END
4.2.2 程序语句格式
根据数值比较结果的,通常使用比较不等转移、 位累加器条件转移指令
根据数值内容的,通常使用累加器判零转移、 间接转移指令
单分支、双分支结构,通常使用条件转移指令 多分支结构,通常使用间接转移指令
分支结构的例子
将内部RAM的30H、31H单元中用原码表示的 一个16位有符号数的补码求出,结果仍存入原 处。31H中为高8位,30H中为高8位
指令语句、汇编语言伪指令语句、汇编 控制语句和注释语句
语句的一般格式为
[标号:] 助记符 [操作数列表] [;注释] [标号或符号:] 伪指令 [操作数] [;注释]
4.2.3 表达式
位于操作数字段的数据有三种表示方法 显式记法,如0FFH 使用预定义的符号,如ACC 也可使用表达式,如(2+3) 汇编器在汇编时求值表达式并存入合适位置,
4.2.4 伪指令语句
ORG伪指令
ORG
expression
设置汇编计数器的值,指定其后语句的起始地 址
伪指令语句
END伪指令
应当是源程序的最后一条语句 通知汇编程序汇编过程应在此结束 汇编器不理会END后面的文件内容
每个程序文件都应以END结束
伪指令语句
EQU和SET伪指令
;主程序开始地址 ;主程序开始地址
30H 31H
60H
;堆栈起始地址
;堆栈长度
0000H MAIN MAIN_START SP, #STACK – 1
;RESET ;初始化SP,设定堆栈大小
4.2.1 汇编语言程序示例
MOV MOV CALL MOV SJMP
NUM1, #56H
A, NUM1
BCD2BIN;将BCD数转换成二进制
symbol
EQU
expression
EQU伪指令为常数符号symbol指定一个数值, 即表达式expression的结果
使用SET定义的符号可以重新定义
伪指令语句
DATA、IDATA、XDATA、BIT、CODE伪指令 给相应的段(存储区域)内地址赋予一个符号 分别对应于直接寻址的内部RAM 间接寻址的内部RAM 外部RAM 位寻址区 程序存储器区域
A, @DPTR ;读外部缓冲区
@R0, A
;写入内部缓冲区
DPTR
;地址增1
R0
R7, LOOP ;循环
$
循环结构的例子
某外部接口准备好数据之后,将其内部状态寄 存器最高有效位置为1。若单片机无其他任务, 而且必须得到这个数据后才能进行下一步的处 理,则应一直检查该接口,直到其准备好方可 读取数据
汇编其后的语句组;若表达式的值为0,汇编 ELSE后面的语句组
4.2.7 程序结构
版本符号定义部分用来标示软件版本 常数符号定义部分用来给程序中用到的一些数
值或非数值的常数指定有意义的符号名字 存储区符号定义部分给分配的存储单元指定符
号名称 指令代码是具体执行部分,其中的操作数可以
使用前面已经定义的一些符号 条件汇编可以出现在任意部分内
MOV
RES_HIGH, A
高级语言
面向过程和问题并能独立于机器的通用程序设 计语言,是一种接近人类自然语言和常用数学 表达式的计算机语言
int
a, b, c;
a = 0x1234;
b = 0x2345;
c = a + b;
三种语言的比较
在科学计算、信息处理等方面采用高级语言比 较合适;而在实时控制中,通常使用汇编语言
;内部缓冲区起始地址
BUF_SIZE EQU
20H ;缓冲区长度
ORG
0000H
LJMP
MAIN
ORG
0030H
循环结构的例子
MAIN:MOV MOV MOV
LOOP:MOVX MOV INC INC DJNZ SJMP END
DPTR, #X_BUF
R0, #I_BUF
R7, #BUF_SIZE ;循环次数
ACC
;入栈
;弹出到PC,实现转移
BR0, BR1, BR2, ……
分支结构的例子
使用间接转移指令实现的散转分支程序。 假设分支转移序号在R3中,分支程序表 入口地址为BR_TAB
MOV MOV MOV MUL XCH
DPTR, #BR_TAB
A, R3
;序号
B, #3
AB
;乘以3
A, B
;乘积可能超过255
相关文档
最新文档