第 4章 MCS- 51程序设计
4.1 汇编语言的格式与伪指令
4.2 汇编语言程序设计步骤
4.3 查表程序设计
4.4 循环程序设计
4.5 分支程序设计
4.6 散转程序设计
4.7 数制转换程序设计
4.1 汇编语言的格式与伪指令
一, 指令的格式
LOOP,MOV A,R0 ;将 R0的内容送 A
[标号 ] 操作码 第一操作数 第二操作数 [注释 ]
(目的操作数) (源操作数)
注:白色的内容不是必须的
二、汇编语言格式:
地址 机器码 源程序 注释
ORG 0000H ; 整个程序起始地址
0000 20 00 30 LJMP MAIN ; 跳向主程序
ORG 0030H ; 主程序起始地址
0030 C3 MAIN,CLR C ; MAIN为程序标号
0031 E6 LOOP,MOV A,@R0
0032 37 ADDC A,@R1
0033 08 INC R0
0034 DA FB DJNZ R1,LOOP ;相对转移
0036 80 03 SJMP NEXT
0038 78 03 MOV R0,#03H
003A 18 NEXT,DEC R0
003B 80FE SJMP $ ; HERE,SJMP HERE
END ; 结束标记
三, 伪操作指令
1,ORG( Origin) 定义程序的起始地址
2,END 程序结束标志
3,DB ( Define Byte) 定义字节
4,DW ( Define Word)定义字
5,EQU( Equate) 表达式赋值
四、伪操作指令例子
MATH EQU 03H
ORG 0000H
MAIN,CLR C
LOOP,MOV A,@R0
MOV R1,#MATH ;相当于 MOV R1,#03H
NEXT,SJMP $
ORG 1100H
DB 01H,04H,09H,05H ;
END
ROM中
地址 数据
1100 01
1101 04
1102 09
1103 05
4.2 汇编语言程序设计步骤
1.确定方案和计算方法
2.了解应用系统的硬件配置、性能指
标。
3.建立系统数学模型,确定控制算法
和操作步骤。
4.画程序流程图,确定程序的流向
5,编制源程序
( 1)合理分配存储器单元和了解 I/O接
口地址。
( 2)按功能设计程序,明确各程序之
间的相互关系。
( 3)用注释行说明程序,便于阅读和
修改调试和修改。
开始
1
Y
N
举例
ORG 0000H ; 整个程序起始地址
AJMP MAIN ; 跳向主程序
ORG 0030H ; 主程序起始地址
MAIN,CLR C ; MAIN为程序标号
LOOP,MOV A,@R0
ADDC A,@R1
INC R0
DJNZ R1,LOOP ;相对转移
SJMP NEXT
MOV R1,#03H
NEXT,DEC R0
SJMP $ ;相当于 LOOP1,SJMP LOOP1
END ; 结束标记
4.3 查表程序设计
一, 用 DPTR查表(查 0~ 9平方表)
1000 C083 TA,PUSH DPH
1002 C082 PUSH DPL
1004 902000 MOV DPTR,#TAB
1007 93 MOVC A,@A+DPTR
1008 D082 POP DPL
100A D083 POP DPH
100C 22 RET
ORG 2000H
TAB,DB 00H,01H,04H,09H
2000 00
2001 01
2002 04
2003 09
二, 用 PC查表(查 0~ 9平方表)
ORG 1000H
1000 C083 TA,ADD A,#01H ; # 01H 为偏移量
1002 83 MOVC A,@A+PC
1003 22 RET
1004 00 DB 00H,01H,04H,09H
1005 01 END
1006 04
1007 09
偏移量=表首地址-(查表指令下一条指令地址)
= 1004H - 1003H
= 01H
4.4 循环程序设计
一, 延时 50ms程序
DEL,MOV R7,#200
DEL1,MOV R6,#125
DEL2,DJNZ R6,DEL2 ;125*2=250us
DJNZ R7,DEL1 ; 0.25ms*200= 50ms
RET
使用 12MHz晶振时,一个机器周期为 1us,执行
DJNZ指令为 2us,加其他指令的时间( 250+ 1+ 2)
*200+ 1= 50.301ms
精确计算见 P327
?
?
?
n
i
ixy
1
二, 计算几个数据的和
例题:对内部 RAM 50h开始的 10个无符号数求和。
源程序:
ADD1,MOV R7,#10 ;循环次数 n= 10
MOV R3,#0 ;存放结果的高 8位
MOV R4,#0 ;存放结果的低 8位
MOV R0,#50H ; 求和的数据存放在从内部 RAM 50h开始的; 单元中,。注意:( 50h)=?不知道
LOOP,MOV A,R4 ;
ADD A,@R0 ;( R4)+(5?H)→A
MOV R4,A ; 结果送回 R4
CLR A ;
ADDC A,R3 ; 把进位位 C加到高 8位去
MOV R3,A
INC R0 ; 为下一轮循环作准备
DJNZ R7,LOOP
END
解释:
高 8位 低 8位
(R3) (R4)
+ (50h)
C (A)
MOV A,R4
ADD A,@R0
MOV R4,A
CLR A
ADDC A,R3
MOV R3,A
( 50h)中是什么,不知道,
不能用 ADD A,# 50H
4.5 分支程序设计
一、基本分支程序:
1、若( A) < 14H,转 NEXT,否则继续执行
2、若( A) ≤ 14H,转 NEXT,否则继续执行
3、若( A) ≥ 14H,转 NEXT,否则继续执行
4、若( A) > 14H,转 NEXT,否则继续执行
( A) ≤ 14H
相当于( A) < 15H
CJNE A,#15H,LOOP
LOOP,JC NEXT
… …
( A) > 14H
相当于( A) ≥ 15H
CJNE A,#15H,LOOP
LOOP,JNC NEXT
… …
CJNE A,#14H,LOOP
LOOP,JNC NEXT
… …
CJNE A,#14H,LOOP
LOOP,JC NEXT
… …
CJNE A,#data,rel;
(A)=#data,继续 Cy←0
(A)> #data,转 Cy←0
(A)< #data,转 Cy←1
特点:只有<时,Cy←1
例 1:按下面公式编写程序,
x为无符号数,存在 20h单元
y存放在 21h单元。
ORG 0030H
MOV A,20H
CJNE A,#21H,LOOP1
LOOP1,JC NEXT1
CJNE A,#40H,LOOP2
LOOP2,JNC NEXT2
MOV B,#2
MUL AB
AJMP NEXT2
NEXT1,CPL A
NEXT2,MOV 21H,A
END
最终结果存在 21h中
?
?
?
?
?
?
??
?
?
20
40202
40
xx
xx
xx
y
二、分支程序例 1
三、分支程序例 2:
从内部 RAM 22h单元开始存有一个无符号数数据块,
长度 n存于 21h中。求出数据块中的最小数,存于 20h中。
ORG 0030H
MOV R0,#22H ;数据块起始地址
MOV R1,21H ;数据个数 n
MOV 20H,#0FFH ; 最大数
LOOP,MOV A,@R0 ; 取新数
INC R0 ; 为取下一个新数作准备
CJNE A,20H,LOOP1 ; 与原最大数比较
LOOP1:JNC NEXT ; 大,原最小数保留
MOV 20H,A ; 小,改变最小数
NEXT,DJNZ R1,LOOP ;循环
END
初始化
y <x
y → x
取新数 y
n- 1= 0?
y
yN
N
END
FRT,MOV A,40H ; 取行李重量 G放在 40H
MOV R3,A
MOV B,#03H ; M=G× 3
MUL AB
MOV R2,A ; 暂存 3 × G在 R2
MOV A,R3 ;取回 G
CJNE A,#06H,L1 ; G≤5?
L1,JC WETC ;是,转至 WETC
SUBB A,#05H ;否则 M=3G+2(G-5)
RLC A
ADD A,R2
WETC,MOV 41H,A ; 最后结果 M存 41H
end
例:行李计价,当 G≤5,M=G× 3;当 G> 5,M=G× 3+(G-5)× (5-3)
指出本程序的条件限制
4.6 散转程序设计
根据 R7中的内容,转向各个子程序。
R7= 0,转入 Prog0
R7= 1,转入 Prog1
R7= 2,转入 Prog2
……
R7= n,转入 Progn
ORG 0030H
JUMP1,MOV DPTR,#TAB
CLR A
MOV A,R7
ADD A,R7
AJMP @A+DPTR
ORG 0100H
TAB,AJMP Prog0
AJMP Prog1
AJMP Prog2
……*AJMP … 即把 PC指向子程序的起始地址;
*R7 x 2 是 AJMP @A+DPTR的机器码匹配;此处 n<127;
*如用 LJMP @A+DPTR,则 R7 x 3,程序还要作相应修改。

理0

理1

理n
R7=?
0 1 n
4.7 数制转换程序设计
例,8位二进制转换成 BCD码。 (用十进制表达的二进制码);程序名,BINBCD1;功能,0~ FFH内的二进制数转换为 BCD数;入口,A存要转换的二进制数;出口, R0 存放 BCD数 百、十、个位数的地址
BINBCD1,MOV B,#100
DIV AB
MOV @R0,A
INC R0
MOV A,#10
XCH A,B ; (A)=原( B),(B)=10
DIV AB
MOV @R0,A
INC R0
XCH AB
MOV @R0,A
RET