顺序结构
程序默认以顺序结构执行
;
分支结构
- 用
CJNE
进行分支;
CJNE的使用规则
CJNE A, #data rel
- 若(A) = (data),则
顺序执行
; - 若(A) > (data),则
0 -> (CY)并跳转
(重要); - 若(A) < (data),则
1 -> (CY)并跳转
(重要);
循环结构
包含部分
循环初始化
;循环体
;循环控制
;循环结束
;
分类
-
计数式循环控制
(以循环次数作为循环是否执行的控制条件)- 适合先执行后判断的结构;
- 适用已知循环次数的场合;
- 多采用
DJNZ
指令;
-
条件循环控制
(用某个条件是否满足条件作为循环是否执行的控制条件)- 适用于先判断后执行的语句;
- 适用于未知循环次数的场合;
- 多采用
CJNE
、JZ
(判断A)与JC
、JNC
(判断CY
)指令;
常考题型
- 本章常考题型为
汇编语言程序设计
;
例题1
题目描述
- 设变量
X
的值存放在内部RAM中的50单元
中,函数值Y
存放在内部RAM中的60H
单元,请编写程序实现下列分段函数。
题解
ORG 0000H ;设置起始地址
AJMP MAIN ;跳转到MAIN开始执行
ORG 0030H ;跳过一些终端地址
MAIN:
MOV A, 50H ;取出X的值
CJNE A, #12, Jdg2;判断(A)是否等于12,不等于就跳转
BR1:
MOV 60H, #6 ;令Y = 6
SJMP OUTG ;跳转到出口
Jdg2:
JNC BR3 ;若(CY)=0,则说明X>12,则跳转到分支3
BR2:
ADD A, #6 ;X = X + 6
MOV 60H, A ;将结果给Y
SJMP OUTG ;分支结束,跳转到出口
BR3:
ADD A, #2 ;X = X + 2
MOV 60H, A ;将结果给Y
OUTG:
SJMP $ ;在此处死循环
- 一定要仔细阅读注释的内容!!!
其中,BR1
代表 X = 12
的情况;BR2
代表 X > 12
的情况;BR3
代表 X < 12
的情况;
例题2
题目描述
- ①将片内RAM的
50H~5FH
地址的区间的内容初始化为(0 ~ 15)
,即(50H) = 0,(51H) = 1…,②然后将该区间(50H ~ 5FH)
的内容复制到片内RAM的(30H ~ 3FH)
单元。
题解
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV R7, #16 ;设置循环次数
MOV R0, #30h;存储地址的起始位置
MOV A, #0 ;存储数的最小值
LOOP1:
MOV @R0, A ;A中存的值放入R0处
INC A ;A = A + 1
INC R0 ;R0 = R0 + 1
DJNZ R7, LOOP1;(R7) = (R7)-1,若R7!=0,则跳转到LOOP1
MOV R0, #50H;复制的起始地址
MOV R1, #30H;粘贴的起始地址
MOV R7, #16 ;设置循环次数
LOOP2:
MOV A, @R0 ;R0中存的值放入A
MOV @R1, A ;A中存的值放入R1处
INC R0 ;R0 = R0 + 1
INC R1 ;R1 = R1 + 1
DJNZ R7, LOOP2;(R7) = (R7)-1,若R7!=0,则跳转到LOOP2
OUTG:
SJMP $
例题3
题目描述
- 电路如图所示,已知单片机的晶振频率是
12MHZ
,请编程实现发光二极管LED亮0.1秒,灭0.1秒
的闪烁现象,要求采用模块化技术设计
。
题解
重要公式
T(机器周期) = 12 / ∫(晶振频率)
题目解析
-
根据发光二极管的特性,P1.0若为
高电平
则二极管灭
,P1.0若为低电平
则二极管亮
; -
根据公式可得若晶振频率为
12MHZ
,则机器周期为1微秒
; -
题目要求使用模块化编程,也就是说要求使用
子程序
;
代码
ORG 0000H
SJMP MAIN
ORG 0030H
MAIN:
SETB P1.0 ;LED灭
LOOP:
CLR P1.0 ;LED亮
ACALL DL100ms ;延时0.1s
SETB P1.0 ;LED灭
ACALL DL100ms ;延时0.1s
SJMP LOOP ;循环控制LED的亮灭
DL100ms:
MOV R6, #100 ;外循环产生100ms的延时
DL1ms:
MOV R7, #200 ;产生1μs的延时需要1个机器周期
DL5μs:
NOP ;NOP指令为1个机器周期
NOP
NOP
DJNZ R7, DL5ms ;DJNZ为2个机器周期
DJNZ R6, DL1ms
RET ;子程序返回
代码解析
- 程序采用一个内嵌循环设计。内循环(DL1ms)200次,每次循环消耗
5个机器周期
,也就是5微秒
,所以总共消耗200x5 = 1000微妙 = 1ms
; - 外循环100次,达到延时
100x1ms = 100ms = 0.1s
的效果;
更多例题有待更新…