单片机第7章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JZ rel ;(PC) ←(PC) +2
当 (A) = 0, (PC) = (PC) + rel,即转移
当 (A) ≠ 0, 则程序顺序执行 JNZ rel ;(PC) ←(PC) +2 当 (A) ≠ 0, (PC) = (PC) + rel,即转移 当 (A) = 0, 则程序顺序执行
执行这两条指令时,首先对累加器A内容进行判断,满足条件则转移, 否则程序顺序执行。 相对位移量rel=(目的地址-PC当前值),由CPU自动算出。
参考程序: MOV MOV CLR ADDSUM: ADD INC DJNZ MOV SJMP R2,#10 R0,#DAT A A,@R0 R0 R2,ADDSUM SUM,A $
例3:将片内RAM的20H~2AH区域清0。
参考程序段: MOV R0,#20H MOV R1,#11 ZERO:MOV @R0,#0 ;清0 INC R0 DJNZ R1,ZERO SJMP $ 若是要将多个区域清0,如何设置程序结构更合理?例如,将 20H~2AH,30H~3EH,40H~4FH这三个不同大小的区域清零?
(3) 条件转移指令-循环控制转移指令或减1转移指令 DJNZ
;(PC) ←(PC)+2, (Rn)←(Rn)-1 当(Rn)≠0时, (PC) ←(PC) +rel,即转移; 当(Rn)=0时, 程序顺序执行。 DJNZ direct,rel ;(PC)←(PC)+3,(direct)←(direct)-1 当(direct)≠0时,(PC) ←(PC) +rel,即转移; 当(direct)=0时, 程序顺序执行。 DJNZ Rn, rel
例7(P88 ,例42 ):从P1.7引脚输出4个正脉冲,其脉宽为4 个机器周期。 MOV R2,#8 LOP: CPL P1.7 ;4个正脉冲,8个状态 ;P1.7状态取反
NOP
DJNZ R2 ,LOP
布尔(位)处理类指令
共有17条指令,处理1位数据。 位处理指令可分为:
位数据传送(2条,MOV)
位操作(6条,CLR/SETB/CPL) 位逻辑运算(4条,ANL/ORL) 位条件转移(5条,JC/JNC、JB/JNB、JBC)
1、位数据传送指令-MOV
指令格式
MOV MOV
C,bit
bit,C
; (C) ←(bit)
; (bit) ←(C)
两个操作数,一个是位单元(片内RAM可位寻址区128位,11个
CJNE指令执行过程中的比较操作实际上是减法操作,但不 保持两数之差,只形成了Cy标志,具体而言: 若DST=SRC, 则 (PC)←(PC)+3 ,顺序执行程序; 若DST>SRC, 则 (PC) ← (PC)+3+rel, 转移且C=0; 若DST<SRC, 则 (PC) ← (PC)+3+rel,转移且C=1;
LCALL ZERO ;区域20H~2AH清0 MOV R0,#30H MOV R1,#15 LCALL ZERO;区域30H~3EH清0 MOV R0,#40H MOV R1,#16 LCALL ZERO;区域40H~4FH清0
SJMP
$
例4,流水灯的控制。有8盏灯依次接在P1口的8位引脚,当 P1口输出低电平,对应的灯点亮。编写程序段,分别实现 下述功能: (1) 8盏灯轮流点亮; (2)8盏灯依次点亮。 (2) MOV A,#0FEH 参考程序: NEXT:MOV P1,A (1) MOV A,#0FEH ACALL DELAY_1S NEXT: MOV P1,A CLR C ACALL DELAY_1S RLC A RL A SJMP NEXT SJMP NEXT
分析:8051内部有4组R0~R7,由RS1(PSW.4)和RS2 (PSW.3)选择工作寄存器组。例中要求第2组工作寄存器,因 此,需将RS1、RS0分别设置为0、1。 参考程序: CLR PSW.4 SETB PSW.3 MOV R7,A 或者 CLR RS1 SETB RS0 MOV R7,A
SFR和I/O端口),另一个必须是位累加器C(进位位标志Cy)。
例,位传送指令的应用。将片内数据存储器中的00H和07H位 的内容相交换。
分析:根据位传送指令的特点,00H位与07H位之间不可直接进行交换,选 用某一位作暂存,例如选用01H位做中间量。 参考程序: MOV C,00H MOV 01H,C MOV C,07H MOV 00H,C MOV C,01H MOV 07H,C
例:设(C)=0,P3口的内容为1 1 1 1 1 0 1 0 B。 执行指令: SETB P3.0 SETB C 则(C)=?,(P3)=? 执行结果为(C)=1,(P3)=1 1 1 1 1 0 1 1 B。 若将SETB改为CLR或CPL指令,则结果分别是?
例:把累加器A中的数据送入第2组工作寄存器的R7中。
条件转移指令JZ/JNZ/CJNE/DJNZ都是相对短转移,其
转移范围为-128~127,若超过此范围,该如何实现转移?
可以借助一条长转移LJMP指令的过渡来实现。 下面举例分析各类转移指令的应用。
控制转移指令的应用举例 例1,以DATA1起始的片外RAM连续存放一系列数据,以“0”
为结束标志。编写程序段实现:将DATA1起始的数据传送到以 DATA2为起始的内部RAM中。
2、位操作指令:清0、置1、取反 (1)位清0指令 (CLR) CLR C ;(C)←0 CLR bit ;(bit)←0 功能:将C或指定位(bit)清0。 (2) 位置1指令 (SETB) SETB C ;(C)←l SETB bit ;(bit)←1 功能:将C或指定位(bit)置1。 (3) 位取反指令 (CPL) CPL C ;(C)←(/C) CPL bit ;(bit)←(/bit) 功能:将 C或指定位(bit)取反。
例5(P89 ,例43 ):利用DJNZ、NOP指令实现延时:
MOV 40H,#N AGIN:NOP NOP DJNZ 40H,AGIN;改变N的值就可以改变延时时间 问:此程序段最多能实现多长时间的延时?此时的N为多少?
分析:1T+(1T+1T+2T)*N≈4T*N N 为一个 8位数,当 N=255时,实现 255次循环;当 N=0 时,实现 256次循环。 故N=0时,实现最长延时4T*256=1024T
将20H~2AH,30H~3EH,40H~4FH三个不同大小的区域都清零?
参考程序:
MOV MOV MOV SP, #70H ;清0子程序 R0,#20H R1,#11
;参数R0表示初始存储单元地址
;参数R1表示存储单元个数 ZERO: MOV INC DJNZ RET END @R0,#0 R0 R1,ZERO
例41(P85):设(A)=01H,分析下列程序后(A)=? JZ LABEL1 DEC A JZ LABEL2 ;(A)≠ 0,程序继续执行 ;(A)-l=00H ;(A)=00H,程序转向标号LABEL2
……
LABEL1:MOV A,#2 …… LABEL2:MOV A,#3
例42(P85),编写一段程序实现:由P2口输入
编写程序,实现如下图所示的逻辑运算功能。(P94,例51) 其中,输入变量U、V是P1.1、P2.2的状态,W是T0的溢出
3、 位逻辑运算指令-ANL/ORL
(1)位逻辑“与”(ANL) ANL C,bit ;(C)←(C)· (bit) ANL C,/bit ;(C)←(C)· (bit) 功能:将指定位( bit )的内容或指定位内容取反后(原内 容不变)与C的内容进行逻辑与运算,结果仍存于C中。 (2)位逻辑“或”(ORL) ORL C,bit ;(C)←(C)+(bit) ORL C,/bit ;(C)←(C)+(bit) 功能:将指定位( bit)的内容或指定位内容取反后(原内 容不变)与C的内容进行逻辑或运算。结果仍存于C中。
若 T=1 μs ,则上述程序段实现 1.024ms的延时。思考:如要实 现10ms、100ms、1s的延时又该如何修改程序段?
例 6,若单片机的主频为12MHz,分析下列程序能实现的延时
时间为多少? MOV R1, #0AH DELAY: DJNZ R1, DELAY
分析:单片机主频为 12 MHz,则机器周期为1 μs : MOV R1,#0AH为单周期指令,执行时间为1 μs; DJNZ R1, DELAY为双周期指令, 执行1次所需时间为2 μs。 R1 中存放着循环的次数 10 , DJNZ指令需执行10次,共需20 μs 。 执行上述程序共需要时间:(1T+2T*10)=21T=21*1μs=20 μs ,即 可产生21 μs的延时时间。
例49(P93),编程实现下列逻辑运算要求:
若(P1.0)=1,(ACC.7)=1,且OV=0时,位累加器C置1。 分析:相当于逻辑函数式C=P1.0∧ACC.7 ∧(/OV) 参考程序: MOV C,P1.0 ;若P1.0=1,则C=1 ANL C,ACC.7;若ACC.7=1,则C继续保持为1 ANL C,/OV ;若/OV=1(或OV=0),则C=1
比较转移指令的格式: CJNE A , direct, rel CJNE A , #data, rel
CJNE CJNE
Biblioteka Baidu
Rn , #data, rel @Ri , #data, rel
例:设(A)=34H , (R7)=56H 分析下列程序执行过程: CJNE R7, #60H, N1 ;(R7)<60H,转向N1, 且Cy=1 …… N1:CJNZ A,#30H, N2 ; (A)>30H,转向N2,且Cy=0 …… N2: ……
每执行一次本指令,先将指定的 Rn 或 direct 的内容减 1 ,再 判别其内容是否为0: 若不为0,转向目标地址,继续执行循环程序; 若为0,则结束循环程序段,往下执行其他程序。
例:DJNZ的应用。
设内部 RAM 的 40H , 50H, 60H单元中内容分别为 01H, 70H,15H。执行下列指令: DJNZ 40H,LABLE1 DJNZ 50H,LABLE2 DJNZ 60H,LABLE3 …… LABLE1:MOV A,#1 LABLE2:MOV A,#2 LABLE3:MOV A,#3
的内容转向由P1口输出,若输入为00H,则停止
转发。
参考程序:
NEXT:MOV JZ MOV SJMP DONE:…… A,P2 DONE P1,A NEXT
(2)条件转移指令- 比较转移指令CJNE
基本格式: CJNE (目的操作数DST), (源操作数SRC), rel
比较两个操作数的大小, 如果不相等则转移;如果相等,则 顺序执行。
参考程序:MOV MOV LOOP: MOVX JZ MOV INC INC SJMP DONE: SJMP R0,#DATA1 R1,#DATA2 A,@R0 ;外部RAM DONE @R1,A ;内部RAM R0 R1 LOOP $
例2,以DAT为起始的片内RAM中连续存放了10个无符号数,编 写程序段实现:10个无符号数相加,并将和送入SUM单元。 假设相加的结果不超过8位二进制数所能表示的范围。
例50(P93),编程实现下列逻辑运算要求:
若(P1.0)=1或(ACC.7)=1或OV=0时,位累加器C置1。 分析:相当于逻辑函数式C=P1.0∨ACC.7 ∨(/OV) 参考程序: MOV C,P1.0 ;若P1.0=1,则C=1 ORL C,ACC.7 ;若ACC.7=1,不管原有的C为何值,C为1 ORL C,/OV ;若/OV=1,不管原有的C为何值,C为1
回顾上节课内容
逻辑运算类指令
CLR/CPL RL/RLC/RR/RRC ANL/ORL/XRL
控制转移类指令
无条件转移类ACALL/LCALL、RET/RETI、 AJMP/LJMP/SJMP/JMP、NOP
控制转移类-条件转移指令:JZ/JNZ、CJNE、DJNZ 分为三类: 1、判零转移指令 JZ/JNZ
当 (A) = 0, (PC) = (PC) + rel,即转移
当 (A) ≠ 0, 则程序顺序执行 JNZ rel ;(PC) ←(PC) +2 当 (A) ≠ 0, (PC) = (PC) + rel,即转移 当 (A) = 0, 则程序顺序执行
执行这两条指令时,首先对累加器A内容进行判断,满足条件则转移, 否则程序顺序执行。 相对位移量rel=(目的地址-PC当前值),由CPU自动算出。
参考程序: MOV MOV CLR ADDSUM: ADD INC DJNZ MOV SJMP R2,#10 R0,#DAT A A,@R0 R0 R2,ADDSUM SUM,A $
例3:将片内RAM的20H~2AH区域清0。
参考程序段: MOV R0,#20H MOV R1,#11 ZERO:MOV @R0,#0 ;清0 INC R0 DJNZ R1,ZERO SJMP $ 若是要将多个区域清0,如何设置程序结构更合理?例如,将 20H~2AH,30H~3EH,40H~4FH这三个不同大小的区域清零?
(3) 条件转移指令-循环控制转移指令或减1转移指令 DJNZ
;(PC) ←(PC)+2, (Rn)←(Rn)-1 当(Rn)≠0时, (PC) ←(PC) +rel,即转移; 当(Rn)=0时, 程序顺序执行。 DJNZ direct,rel ;(PC)←(PC)+3,(direct)←(direct)-1 当(direct)≠0时,(PC) ←(PC) +rel,即转移; 当(direct)=0时, 程序顺序执行。 DJNZ Rn, rel
例7(P88 ,例42 ):从P1.7引脚输出4个正脉冲,其脉宽为4 个机器周期。 MOV R2,#8 LOP: CPL P1.7 ;4个正脉冲,8个状态 ;P1.7状态取反
NOP
DJNZ R2 ,LOP
布尔(位)处理类指令
共有17条指令,处理1位数据。 位处理指令可分为:
位数据传送(2条,MOV)
位操作(6条,CLR/SETB/CPL) 位逻辑运算(4条,ANL/ORL) 位条件转移(5条,JC/JNC、JB/JNB、JBC)
1、位数据传送指令-MOV
指令格式
MOV MOV
C,bit
bit,C
; (C) ←(bit)
; (bit) ←(C)
两个操作数,一个是位单元(片内RAM可位寻址区128位,11个
CJNE指令执行过程中的比较操作实际上是减法操作,但不 保持两数之差,只形成了Cy标志,具体而言: 若DST=SRC, 则 (PC)←(PC)+3 ,顺序执行程序; 若DST>SRC, 则 (PC) ← (PC)+3+rel, 转移且C=0; 若DST<SRC, 则 (PC) ← (PC)+3+rel,转移且C=1;
LCALL ZERO ;区域20H~2AH清0 MOV R0,#30H MOV R1,#15 LCALL ZERO;区域30H~3EH清0 MOV R0,#40H MOV R1,#16 LCALL ZERO;区域40H~4FH清0
SJMP
$
例4,流水灯的控制。有8盏灯依次接在P1口的8位引脚,当 P1口输出低电平,对应的灯点亮。编写程序段,分别实现 下述功能: (1) 8盏灯轮流点亮; (2)8盏灯依次点亮。 (2) MOV A,#0FEH 参考程序: NEXT:MOV P1,A (1) MOV A,#0FEH ACALL DELAY_1S NEXT: MOV P1,A CLR C ACALL DELAY_1S RLC A RL A SJMP NEXT SJMP NEXT
分析:8051内部有4组R0~R7,由RS1(PSW.4)和RS2 (PSW.3)选择工作寄存器组。例中要求第2组工作寄存器,因 此,需将RS1、RS0分别设置为0、1。 参考程序: CLR PSW.4 SETB PSW.3 MOV R7,A 或者 CLR RS1 SETB RS0 MOV R7,A
SFR和I/O端口),另一个必须是位累加器C(进位位标志Cy)。
例,位传送指令的应用。将片内数据存储器中的00H和07H位 的内容相交换。
分析:根据位传送指令的特点,00H位与07H位之间不可直接进行交换,选 用某一位作暂存,例如选用01H位做中间量。 参考程序: MOV C,00H MOV 01H,C MOV C,07H MOV 00H,C MOV C,01H MOV 07H,C
例:设(C)=0,P3口的内容为1 1 1 1 1 0 1 0 B。 执行指令: SETB P3.0 SETB C 则(C)=?,(P3)=? 执行结果为(C)=1,(P3)=1 1 1 1 1 0 1 1 B。 若将SETB改为CLR或CPL指令,则结果分别是?
例:把累加器A中的数据送入第2组工作寄存器的R7中。
条件转移指令JZ/JNZ/CJNE/DJNZ都是相对短转移,其
转移范围为-128~127,若超过此范围,该如何实现转移?
可以借助一条长转移LJMP指令的过渡来实现。 下面举例分析各类转移指令的应用。
控制转移指令的应用举例 例1,以DATA1起始的片外RAM连续存放一系列数据,以“0”
为结束标志。编写程序段实现:将DATA1起始的数据传送到以 DATA2为起始的内部RAM中。
2、位操作指令:清0、置1、取反 (1)位清0指令 (CLR) CLR C ;(C)←0 CLR bit ;(bit)←0 功能:将C或指定位(bit)清0。 (2) 位置1指令 (SETB) SETB C ;(C)←l SETB bit ;(bit)←1 功能:将C或指定位(bit)置1。 (3) 位取反指令 (CPL) CPL C ;(C)←(/C) CPL bit ;(bit)←(/bit) 功能:将 C或指定位(bit)取反。
例5(P89 ,例43 ):利用DJNZ、NOP指令实现延时:
MOV 40H,#N AGIN:NOP NOP DJNZ 40H,AGIN;改变N的值就可以改变延时时间 问:此程序段最多能实现多长时间的延时?此时的N为多少?
分析:1T+(1T+1T+2T)*N≈4T*N N 为一个 8位数,当 N=255时,实现 255次循环;当 N=0 时,实现 256次循环。 故N=0时,实现最长延时4T*256=1024T
将20H~2AH,30H~3EH,40H~4FH三个不同大小的区域都清零?
参考程序:
MOV MOV MOV SP, #70H ;清0子程序 R0,#20H R1,#11
;参数R0表示初始存储单元地址
;参数R1表示存储单元个数 ZERO: MOV INC DJNZ RET END @R0,#0 R0 R1,ZERO
例41(P85):设(A)=01H,分析下列程序后(A)=? JZ LABEL1 DEC A JZ LABEL2 ;(A)≠ 0,程序继续执行 ;(A)-l=00H ;(A)=00H,程序转向标号LABEL2
……
LABEL1:MOV A,#2 …… LABEL2:MOV A,#3
例42(P85),编写一段程序实现:由P2口输入
编写程序,实现如下图所示的逻辑运算功能。(P94,例51) 其中,输入变量U、V是P1.1、P2.2的状态,W是T0的溢出
3、 位逻辑运算指令-ANL/ORL
(1)位逻辑“与”(ANL) ANL C,bit ;(C)←(C)· (bit) ANL C,/bit ;(C)←(C)· (bit) 功能:将指定位( bit )的内容或指定位内容取反后(原内 容不变)与C的内容进行逻辑与运算,结果仍存于C中。 (2)位逻辑“或”(ORL) ORL C,bit ;(C)←(C)+(bit) ORL C,/bit ;(C)←(C)+(bit) 功能:将指定位( bit)的内容或指定位内容取反后(原内 容不变)与C的内容进行逻辑或运算。结果仍存于C中。
若 T=1 μs ,则上述程序段实现 1.024ms的延时。思考:如要实 现10ms、100ms、1s的延时又该如何修改程序段?
例 6,若单片机的主频为12MHz,分析下列程序能实现的延时
时间为多少? MOV R1, #0AH DELAY: DJNZ R1, DELAY
分析:单片机主频为 12 MHz,则机器周期为1 μs : MOV R1,#0AH为单周期指令,执行时间为1 μs; DJNZ R1, DELAY为双周期指令, 执行1次所需时间为2 μs。 R1 中存放着循环的次数 10 , DJNZ指令需执行10次,共需20 μs 。 执行上述程序共需要时间:(1T+2T*10)=21T=21*1μs=20 μs ,即 可产生21 μs的延时时间。
例49(P93),编程实现下列逻辑运算要求:
若(P1.0)=1,(ACC.7)=1,且OV=0时,位累加器C置1。 分析:相当于逻辑函数式C=P1.0∧ACC.7 ∧(/OV) 参考程序: MOV C,P1.0 ;若P1.0=1,则C=1 ANL C,ACC.7;若ACC.7=1,则C继续保持为1 ANL C,/OV ;若/OV=1(或OV=0),则C=1
比较转移指令的格式: CJNE A , direct, rel CJNE A , #data, rel
CJNE CJNE
Biblioteka Baidu
Rn , #data, rel @Ri , #data, rel
例:设(A)=34H , (R7)=56H 分析下列程序执行过程: CJNE R7, #60H, N1 ;(R7)<60H,转向N1, 且Cy=1 …… N1:CJNZ A,#30H, N2 ; (A)>30H,转向N2,且Cy=0 …… N2: ……
每执行一次本指令,先将指定的 Rn 或 direct 的内容减 1 ,再 判别其内容是否为0: 若不为0,转向目标地址,继续执行循环程序; 若为0,则结束循环程序段,往下执行其他程序。
例:DJNZ的应用。
设内部 RAM 的 40H , 50H, 60H单元中内容分别为 01H, 70H,15H。执行下列指令: DJNZ 40H,LABLE1 DJNZ 50H,LABLE2 DJNZ 60H,LABLE3 …… LABLE1:MOV A,#1 LABLE2:MOV A,#2 LABLE3:MOV A,#3
的内容转向由P1口输出,若输入为00H,则停止
转发。
参考程序:
NEXT:MOV JZ MOV SJMP DONE:…… A,P2 DONE P1,A NEXT
(2)条件转移指令- 比较转移指令CJNE
基本格式: CJNE (目的操作数DST), (源操作数SRC), rel
比较两个操作数的大小, 如果不相等则转移;如果相等,则 顺序执行。
参考程序:MOV MOV LOOP: MOVX JZ MOV INC INC SJMP DONE: SJMP R0,#DATA1 R1,#DATA2 A,@R0 ;外部RAM DONE @R1,A ;内部RAM R0 R1 LOOP $
例2,以DAT为起始的片内RAM中连续存放了10个无符号数,编 写程序段实现:10个无符号数相加,并将和送入SUM单元。 假设相加的结果不超过8位二进制数所能表示的范围。
例50(P93),编程实现下列逻辑运算要求:
若(P1.0)=1或(ACC.7)=1或OV=0时,位累加器C置1。 分析:相当于逻辑函数式C=P1.0∨ACC.7 ∨(/OV) 参考程序: MOV C,P1.0 ;若P1.0=1,则C=1 ORL C,ACC.7 ;若ACC.7=1,不管原有的C为何值,C为1 ORL C,/OV ;若/OV=1,不管原有的C为何值,C为1
回顾上节课内容
逻辑运算类指令
CLR/CPL RL/RLC/RR/RRC ANL/ORL/XRL
控制转移类指令
无条件转移类ACALL/LCALL、RET/RETI、 AJMP/LJMP/SJMP/JMP、NOP
控制转移类-条件转移指令:JZ/JNZ、CJNE、DJNZ 分为三类: 1、判零转移指令 JZ/JNZ