四川工程职业技术学院
单片机应用技术课程电子教案
Copyright ? Http://mcu.scetc.net
第 讲 8
指令功能及汇编语言程序设计(二)
Copyright ? Http:// mcu.scetc.net 2 SiChuan Engineering Technical College-1959
本讲主要内容,
8-1,设计范例 —— 数码管循环显示。
8-2,控制转移类指令( 1)的特点及使用。
8-3,熟练掌握延时程序的设计和延时时间的计算方法。
8-4,子程序的设计方法。
8-5,循环程序设计的基本方法。
Copyright ? Http:// mcu.scetc.net 3 SiChuan Engineering Technical College-1959
8-1,设计范例 —— 数码管循环显示
? 要求在最右侧的数码管上循环显示数字 1~ 5。
P0口
P3.2 P3.3 P3.4
P3.5
P1.3 P1.2 P1.1 P1.0
Copyright ? Http:// mcu.scetc.net 4 SiChuan Engineering Technical College-1959
8-1,设计范例 —— 数码管循环显示
? 范例分析,
? 硬件分析
设计中要求选中最右侧的数码管,根据电路结构,应通过 P3.2
选中该位数码管。
? 软件设计
设计中要求循环显示 1~ 5,很显然应采用循环的方法来实现,
最简单的方法是将 1~ 5的段码依次由 P0口送出。
Copyright ? Http:// mcu.scetc.net 5 SiChuan Engineering Technical College-1959
准备程序,ORG 0000H
MAIN,CLR P3.2
MOV P0,#0F9H
MOV P0,#0A4H
MOV P0,#0B0H
MOV P0,#99H
MOV P0,#92H
SJMP MAIN
延时一段时间
相邻数字之间需要间隔
一段时间吗?如果不间
隔时间,在数码管上会
看到什么现象?
相邻数字之间需要
间隔一段时间吗?
如果不间隔时间,
在数码管上会看到
什么现象?
8-1,设计范例 —— 数码管循环显示
Copyright ? Http:// mcu.scetc.net 6 SiChuan Engineering Technical College-1959
8-2,控制转移类指令( 1)
? 长转移指令
LJMP 目标语句
说明:目标语句可以是程序存储器 64KB空间的任何地方。
? 绝对转移指令
AJMP 目标语句
例,4002H AJMP MM
……
4600H MM,MOV A,#00H
注意:目标语句必须和当前语句同页。在 51单片机中,64KB程序存储器
分成 32页,每页 2KB(7FFH)。
Copyright ? Http:// mcu.scetc.net 7 SiChuan Engineering Technical College-1959
8-2,控制转移类指令( 1)
? 短跳转指令
SJMP 目标语句 (rel)
例,
4060H SJMP LOOP
……
4090H LOOP,MOV A,#0FFH
……
注意:短跳转的目标语句地址必须在当前语句向前 127( 7FH)字节,向
后 128( 80H)字节,否则在进行程序编译时会出错。
Copyright ? Http:// mcu.scetc.net 8 SiChuan Engineering Technical College-1959
8-2,控制转移类指令( 1)
? 变址寻址转移指令
JMP @A+DPTR
该指令主要用于多分支的跳转程序设计。跳转的目标地址是累加器 A
和数据指针 DPTR之和,它可以是 64KB存储空间的任何地方。
程序设计举例,
如果 (A)=00H,执行 SS子程序;如
果 (A)=01H,执行 MM子程序;
如果 (A)=02H,执行 XX子程序。
ORG 4000H
MOV DPTR,#5000H
MOV R2,A
CLR C
RLC A
ADD A,R2
JMP @A+DPTR
……
ORG 5000H
5000H LJMP SS
5003H LJMP MM
5006H LJMP XX
Copyright ? Http:// mcu.scetc.net 9 SiChuan Engineering Technical College-1959
8-2,控制转移类指令( 1)
? 减 1条件转移指令组
DJNZ Rn,目标地址 (rel); 如果 (Rn)-1≠0,则程序跳转到目标语句,
否则顺序执行下一条语句。
DJNZ direct,目标地址 (rel) ; 如果 (direct)-1≠0,则程序跳转到目标语
句,否则顺序执行下一条语句。
例:问执行以下程序段后,( A) =?
MOV R5,#02H
DJNZ R5,L1
SJMP L2
SJMP $
L1,MOV A,#00H
SJMP $
L2,MOV A,#01H
SJMP $ 程序执行后( A) =00H; ( R5) =02H; ( R5) -1=01H,程序转至 L1处执行
Copyright ? Http:// mcu.scetc.net 10 SiChuan Engineering Technical College-1959
8-3,延时程序的编写
? 延时程序是一种应用较为广泛的小程序,一般采用多条语句
循环执行来实现延时。
例 1:当前 fosc=6MHz,试计算下面延时程序的延时时间。
因为 fosc=6MHz,故 T机 =12/fosc=2us
DEL1,MOV R6,#50
DEL2,NOP
NOP
DJNZ R6,DEL2
1T机
1T机
1T机
2T机
循环次数
t1= (1T机 +1T机 +2T机 ) × 50+ 1T机 =402us
循环体
循环次数
Copyright ? Http:// mcu.scetc.net 11 SiChuan Engineering Technical College-1959
8-3,延时程序的编写
? 例 2:来看看下面这个程序能够实现的延时时间,
T机 =12/fosc=12/6MHz=2us
DEL,MOV R7,#30
DEL1,MOV R6,#50
DEL2,NOP
NOP
DJNZ R6,DEL2
DJNZ R7,DEL
1T机
1T机
1T机
1T机
2T机
2T机
t1
t2=(t1+ 2T机 ) × 30+ 1T机 =12182us=12.182ms
t2=((1T机 +1T机 +2T机 ) × 50+ 1T机 + 2T机 ) × 30+ 1T机
第 2循环体
t1= (1T机 +1T机 +2T机 ) × 50+ 1T机 =402us
Copyright ? Http:// mcu.scetc.net 12 SiChuan Engineering Technical College-1959
? 为了便于观察,在这里相邻两个数字之间我们延时 1秒,延时
程序可参考下面这个程序,
8-1,设计范例 —— 数码管循环显示
DEL,MOV R7,#10
DEL1,MOV R6,#123
DEL2,MOV R5,#200
DEL3,NOP
NOP
DJNZ R5,DEL3
DJNZ R6,DEL2
DJNZ R7,DEL1
则数码管显示程序中显示 1的程序段
为,
MOV P1,#0F9H
DEL,MOV R7,#10
DEL1,MOV R6,#123
DEL2,MOV R5,#200
DEL3,NOP
NOP
DJNZ R5,DEL3
DJNZ R6,DEL2
DJNZ R7,DEL1
Copyright ? Http:// mcu.scetc.net 13 SiChuan Engineering Technical College-1959
ORG 0000H
MAIN,MOV P1,#0F9H
MOV P1,#0A4H
MOV P1,#0B0H
8-1,设计范例 —— 数码管循环显示
? 则部分范例程序为,
DEL,MOV R7,#10
DEL1,MOV R6,#123
DEL2,MOV R5,#200
DEL3,NOP
NOP
DJNZ R5,DEL3
DJNZ R6,DEL2
DJNZ R7,DEL1
DEL,MOV R7,#10
DEL1,MOV R6,#123
DEL2,MOV R5,#200
DEL3,NOP
NOP
DJNZ R5,DEL3
DJNZ R6,DEL2
DJNZ R7,DEL1
这样一来,程序显得有些
冗长,对于这种在一个程
序中反复出现的程序段,
我们可以采用 子程序 的结
构来实现。
Copyright ? Http:// mcu.scetc.net 14 SiChuan Engineering Technical College-1959
8-4,子程序的设计方法
? 子程序,在程序中反复多次执行的程序段,可编写为子程序,在使
用时通过主程序调用就可以使用它。这样不但可以减少编程工作量,
也缩短了程序的长度。
例如实例二中用到的延时程序
可设计为 标号 为 DEL,以 返回
指令 RET结束的子程序。
DEL,MOV R7,#10
DEL1,MOV R6,#123
DEL2,MOV R5,#200
DEL3,NOP
NOP
DJNZ R5,DEL3
DJNZ R6,DEL2
DJNZ R7,DEL1
RET
子程序的使用,
1、子程序调用,
指令,ACALL ××× ;绝对调用,2KB范围
LCALL ××× ;长调用,64KB范围
2、子程序返回,
指令,RET ;子程序返回指令
RETI ;中断子程序返回指令
Copyright ? Http:// mcu.scetc.net 15 SiChuan Engineering Technical College-1959
ORG 0000H
MAIN,CLR P3.2
MOV P0,#0F9H
LCALL DEL
MOV P0,#0A4H
LCALL DEL
MOV P0,#0B0H
LCALL DEL
MOV P0,#99H
LCALL DEL
MOV P0,#92H
LCALL DEL
SJMP MAIN
DEL,MOV R7,#10
DEL1,MOV R6,#123
…………
DJNZ R7,DEL1
RET
END
延时子程序
8-1,设计范例 —— 数码管循环显示
Copyright ? Http:// mcu.scetc.net 16 SiChuan Engineering Technical College-1959
8-5,循环程序的设计方法
? 循环程序,在程序中需要反复执行的程序段,为了避免在程序中多
次的编写,可以通过利用条件转移或无条件转移指令来控制程序的
执行。结构流程图一般如下图所示,
循环控制
循环初始化
循环体
下一条指令
N
Y
用于设计循环初值、
循环次数
程序中反复执行的
内容
用于判断循环是否
结束(通常采用次
数递减的方法)
Copyright ? Http:// mcu.scetc.net 17 SiChuan Engineering Technical College-1959
? 彩灯循环设计
8-5,循环程序的设计方法
Copyright ? Http:// mcu.scetc.net 18 SiChuan Engineering Technical College-1959
8-5,循环程序的设计方法
ORG 0000H
MAIN,MOV A,#01H ;初始状态
MOV R0,#08 ;共 8位
L1,MOV P1,A ;D1发光
LCALL DEL ;延时子程序
RL A ;状态下移 1位
DJNZ R0,L1; 循环判断
SJMP MAIN ;循环
循环控制
循环初始

循环体