认证考试北方工业大学 单片机选修课课件
3.1 指令和指令程序
指令和助记符:
计算机能直接识别和执行的命令称为指令。一台计算机所能执行的全部指令的集合称为这台计算机的指令系统。
MCS-51单片机的指令系统包含了111条指令。 机器语言: 01110100 ;(740AH)把10送累加器A
00001010
00100100 ;(2414H)A加20,结果仍在A中
00010100
上述指令的汇编形式:(740AH) MOV A, #0AH
(2414H) ADD A, #14H
指令的字节数:
1字节指令—既含操作码也含操作数(49条):
?指令的含义和对象明确eg. 10100011 INC DPTR; ?用一个字节中的几位来表示操作数eg.1101rrr MOV A,Rn 2字节指令—一个字节表示操作码,另一个字节表示操作数(45条):
eg. 01110100 操作数; MOV A, #data 3字节指令—一个字节表示操作码,两个字节表示操作数 3.2 寻址方式
: MCS-51系统中, 操作数的寻址方式有7种
?寄存器寻址 ——直接用寄存器名;寄存器指R0~R7=>用Rn表示;
eg. MOV A,R0 ADD A,R5 ?直接寻址——直接给出操作数地址?内部RAM包括21个SFR的地址=>用direct表示;对于特殊功能寄存器,使用其定义名称和直接地址效果完全相同。
eg. MOV A,3AH MOV A,PCON <=> MOV A,87H
?立即寻址 ——直接给出8位或16位的数值=>用#data或#data16表示;
eg. MOV A,# 3AH; MOV DPTR,# 3A87H?系统仅此一条16位立即数传指令;
?寄存器间接寻址——仅R0; R1及DPTR可用作间址寄存器=>用@Ri及@DPTR表示;用此寻址方式可访问内部RAM和外部RAM,但不能访问SFR; 当被访问的是内部RAM或外部RAM的低256位时, 可用@Ri; 要访问全部64k外部RAM时,用@DPTR;
eg. MOV A,@R0 MOVX A,@R1 MOVX A,@DPTR
3.2 寻址方式
?变址寻址 ——@DPTR+A; @PC+A=>主要用于访问ROM
eg. MOVC A,@A+DPTR
MOVC A,@A+PC
JMP @A+DPTR
?相对寻址 (给出偏移量; 只出现在相对转移指令中 =>用rel 表示偏移量?带符号数:
-128~127)
eg. JZ 3AH (目的地址 = 源地址 + 转移指令字节数 + rel)
?位寻址——给出位地址=>用bit表示;
eg. MOV C,07H
位地址有下列几种表示方法:
直接用位地址: 07H; (00H~F7H中再剔除CxH, D8~DF;合计224bit)
采用第几单元 .第几位: 25H . 5;
SFR名.位数: TCON. 3;
用伪指令定义: eg. A1 BIT P1.0 ; A2 BIT 20H
3.3 数据传送指令
MCS-51指令系统中的指令,可分为五大类:
?数据传送指令28条 ?算术运算指令24条
?逻辑运算及移位指令25条 ?控制转移指令25条
?位操作(布尔操作)指令17条 =>合计111条
一. 内部RAM之间的数据传送指令(15条)
1.立即寻址(4条)
MOV A, # data; MOV Rn, # data; MOV @Ri, # data;
MOV direct, # data
2.直接寻址(5条)
MOV A, direct; MOV direct, A MOV Rn, direct
MOV @Ri, direct MOV direct2, direct1;
3.间接寻址(3条)
MOV A, @Ri MOV @Ri, A; MOV direct, @Ri
4.寄存器寻址(3条)
MOV A, Rn MOV Rn, A MOV direct, Rn
3.3 数据传送指令
MOV指令(15条)图解
基本规律:
两两互访,
两例外:
?立即数只能作为源操作数;
? @Ri与Rn无联系
两特例: ?direct可自访;? @Ri不能访问SFR 3.3 数据传送指令
二. 涉及外部存储器的数据传送指令
(仅此一条16位数传指令) 1. 16位地址传送指令
MOV DPTR,# data16 (data16----16位立即数,通常是外部RAM或ROM的地址)
2. 访问ROM的指令
MOVC A,@A+DPTR ;A? (A+DPTR)
MOVC A,@A+PC ;PC ? PC+1, A? (A+PC)
3. 访问外部RAM的指令
MOVX A,@Ri ;只能寻址外部RAM的0000H~00FFH;比较: MOV
A,@Ri
MOVX @Ri,A
MOVX A,@DPTR
MOVX @DPTR,A
三. 堆栈操作指令
PUSH direct ;SP?SP+1, (SP)?(direct)
(SP), SP?SP-1 POP direct ;(direct)?
四.数据交换指令
XCH A,Rn
XCH A,direct
XCH A,@Ri
XCHD A,@Ri ;ACC.0~ACC.3与(Ri)0~3交换, 高位保持不变;
***数传指令不影响各标志位,仅P标志受A内容的影响;
数据传送类指令课堂练习1
1.如何用MCS-51指令实现以下的数据传送 1)R1内容传送到R0
2)外部RAM 20H单元内容送R0
3)外部RAM 20H单元内容送内部RAM 20H单元 4)外部RAM 1000H单元内容送内部RAM 20H单元 5)ROM 2000H单元内容送R0
6)ROM 2000H单元内容送内部RAM 20H单元 7)ROM 2000H单元内容送外部RAM 20H单元 数据传送类指令课堂练习2
2.设内部RAM的30H单元的内容为40H, 即(30H)=40H, 还知(40H)=10H, (10H)=00H,端口
P1=CAH,问执行以下指令后,
各有关存储单元、寄存器及端口的内容,
MOV R0, #30H ;R0=30H
MOV A, @R0 ;A=40H
MOV R1, A ;R1=40H
MOV B, @R1 ;B=10H
MOV @R1, P1 ;(40H)=CAH
MOV P2, P1 ;P2=CAH
MOV 10H, #20H ;(10H)=20H
MOV 30H, 10H ;(30H)=20H
3.4 算术运算指令
此类指令分为6组, 每组4条; 四条指令的目的操作数是累加器A时,
源操作数采用‘寄存器’; ‘直接’; ‘间接’和‘立即数’四种寻址方式 。
1. 加法指令(ADD):
ADD A,Rn; ADD A,direct; ADD A,@Ri; ADD A,#data
2. 带进位加法指令(ADDC):
ADDC A,Rn; ADDC A,direct; ADDC A,@Ri; ADDC A,#data
3. 加 1指令(INC): (标志位不受影响; 但P标志受A内容的影响)
INC A; INC Rn; INC
direct; INC @Ri
4.带借位减法指令(SUBB):
SUBB A,Rn; SUBB A,direct; SUBB A,@Ri; SUBB A,#data
5.减 1指令(DEC):(标志位不受影响; 但P标志受A内容的影响)
DEC A; DEC Rn; DEC
direct; DEC @Ri
6.乘除指令和其他运算指令
A. 乘除指令: MUL AB; DIV AB
(影响Cy, OV, P标志;执行乘除操作后Cy=0;相乘后若B?0, 则OV=1, 否则OV=0;做除法时若除数B=0, 则OV=1;否则OV=0)
B. 十进制调整指令: DA A
(两个压缩的BCD数相加后应进行此调整;该指令仅影响Cy)
C. 数据指针加1指令: INC DPTR (唯一的一条16位算术运算指令)
3.5 逻辑运算及移位指令
1. 逻辑与运算指令:
ANL A,Rn; ANL A,direct; ANL A,@Ri; ANL A,#data
ANL direct,A; ANL direct,#data;
2. 逻辑或运算指令:
ORL A,Rn; ORL A,direct; ORL A,@Ri; ORL A,#data
ORL direct,A; ORL direct,#data;
3. 逻辑异或运算指令:
XRL A,Rn; XRL A,direct; XRL A,@Ri;
XRL A,#data
XRL direct,A; XRL direct,#data; 4.累加器清零及取反指令
CLR A; CPL A;
*以上逻辑运算都是按位进行的;对Cy,AC和OV都没有影响。
5. 移位及半字节交换指令(只能针对A,移位全部是循环移位)
RL A 循环左移
RLC A 带进位循环左移
RR A 循环右移
RRC A 带进位循环右移
SWAP A 半字节交换(相当于执行4次循环左移) **循环指令执行一次,移一位;若想多移几位,则应编写循环程序
算术运算/逻辑运算类指令课堂练习3
3.已知A=7AH,R0=30H,(30H)=A5H,PSW=80H,问执行以下各指令的结果(每条指令都以题中规定的数据参加操作)。
1) XCH A, R0 ;A=30H R0=7AH 2) XCH A, 30H ;A=0A5H
3) XCH A, @R0 ;A=0A5H
4) XCHD A, @R0 ;A=75H
A=0A7H 5) SWAP A ;
6) ADD A, R0 ;A=0AAH Cy=0 OV=1 7) ADD A, 30H ;A=1FH Cy=1 OV=0 8) ADD A, #30H ;A=0AAH Cy=0 OV=1 9) ADDC A, 30H ;A=20H Cy=1 OV=0 10) SUBB A, 30H ;A=0D4H Cy=1 OV=1 11) SUBB A, #30H ;A=49H Cy=0 OV=0 算术运算/逻辑运算类指令课堂练习4
4.设A=83H, R0=17H, (17H)=34H, 执行以下指令后, A=,
ANL A, #17H ;A=03H
ORL 17H, A ;(17H)=37H
XRL A, @R0 ;A=34H
CPL A ;答A=0CBH
3.6 控制转移指令
1. 无条件转移指令(4条)
?长转移指令:LJMP addr16 ;PC?addr16;在汇编语言中addr16可以
直接用一个16位的地址,也可以用标号由汇编语言算出其16位的地址。
eg. LJMP 35ECH; LJMP lable ?绝对转移指令:AJMP addr11 ; PC? PC+2; PC.10~0?addr11;
在汇编语言中addr11可以直接用一个16位的地址, 也可以用标号由汇编语言算出其16位的地址;但仅取该16位地址的低11位用于替换PC中的低11位;可获得2k的转移范围;
但目标地址必须与该条指令地址+2在同一个2k区域;所以指令“lab:AJMP lab”不一定能实现。
eg. AJMP 27BCH; AJMP lable ?短转移指令: SJMP rel ; PC? PC+2+rel; rel?相对寻址, 8位带符号数表示地址偏移量; 在汇编语言中通常用标号表示:
eg. HERE: SJMP HERE; <=> SJMP $; <=> SJMP
FEH
?变址方式的转移指令:JMP @A+DPTR ; PC? A+DPTR;
这条指令的特点是转移的地址可以在程序运行中加以改变。例如,当DPTR为确定的值时,根据A的不同的值就可以实现多分支的转移,起到一条指令完成多条指令的功能。
3.6 控制转移指令
2. 条件转移类指令
?累加器判零条件转移指令(2条)
JZ rel ;若A=0, 则PC?PC+2+rel; 若A?0, 则PC?PC+2;
eg. Lable: JZ Lable
JNZ rel ;若A?0, 则PC?PC+2+rel; 若A =0, 则PC?PC+2
?比较条件转移指令(4条)
CJNE A, direct, rel ;
CJNE A, #data, rel ;
CJNE Rn, #data, rel ;
CJNE @Ri, #data, rel ;
在汇编语言中通常用标号表达rel;
eg. lable : CJNE A, #data, lable ?减 1条件转移指令(2条)
DJNZ Rn , rel ;Rn?Rn-1;若Rn?0, 则PC?PC+2+rel; 否则PC?PC+2;
DJNZ direct, rel ;(direct)?(direct)-1;若(direct)?0, 则PC?PC+2+rel;
否则PC?PC+2;
*条件转移指令均为相对转移,转移范围-128~127;若要大范围转移需与无条件转移配合使用。
3.6 控制转移指令
3. 子程序调用及返回指令
?调用指令
ACALL addr11 ;PC?PC+2; SP?SP+1, (SP)?PC7~0;
(绝对调用指令) ;SP?SP+1, (SP)?PC15~8; (低位低地址,„)
;PC10~0?addr11; (不在同一2k块,则转不过去) LCALL addr16 ;PC?PC+3; SP?SP+1, (SP)?PC7~0;
(长调用指令) ;SP?SP+1, (SP)?PC15~8; (,„高位高地址) ;PC?addr16;
?返回指令
RET ;(子程序返回) ;PC15~8? (SP), SP?SP-1; PC7~0? (SP), ;SP?SP-1 (高地址?高位,低地址?低位)
RETI ;(中断返回) ;PC15~8? (SP), SP?SP-1; PC7~0? (SP), ;SP?SP-1
4. 空操作指令
NOP ;PC ? PC+1单字节单周期指令;仅消耗了一个机器周期。
3.7 布尔变量操作指令
1. 位传送指令(可位寻址的各位和位累加器C之间可以互相传送内容)
MOV C, bit; MOV bit, C 2. 复位/置位指令(4条)
CLR C; CLR bit; SETB C; SETB bit;
3. 位运算指令(6条)
ANL C, bit; ORL C, bit; CPL C;
ANL C, /bit; ORL C, /bit; CPL bit;
*(ANL C, /bit;表示将bit取反后再与C相与,该指令不会影响原bit的内容)
4. 位控制转移指令(5条)
?以Cy内容为条件的转移指令:
JC rel ;若Cy=1,PC?PC+2+rel;否则,PC?PC+2
JNC rel ;若Cy?1,PC?PC+2+rel;否则,PC?PC+2 ?以位地址内容为条件的转移指令
JB bit,rel ;若(bit)=1,PC?PC+3+rel;否则,PC?PC+3
JNB bit,rel ;若(bit)?1,PC?PC+3+rel;否则,PC?PC+3
JBC bit,rel ;若(bit)=1,PC?PC+3+rel,且使(bit=0); 否则,PC?PC+3
控制转移类指令课堂练习5
5.已知SP=25H, PC=2345H, (24H)=12H, (25H)=34H, (26H)=56H, 问在这种条件下执行RET指令以后, SP=? PC=? 答:SP=23H;PC=3412H
6.若SP=25H, PC=2345H, 标号LABEL所在的地址为3456H, 问执行长调用指令”LCALL LABEL” 之后, 堆栈指针和堆 栈内容发生什么变化,PC=,
答:SP=27H; (26H)=48H; (27H)=23H; PC=3456H 7.在上题中的LCALL指令能否直接换成ACALL指令, 为什么,
答:不能;因为不在同一个2k区域
实例:
例4.1若在外部ROM中2000H单元开始存放0~9的平方值,要求根据累加器A中的值(0~9)来查找所对应的平方值。
解1: ?
MOV A, #8
MOV DPTR, #2000H
MOVC A, @A+DPTR
?
ORG 2000H
TAB: DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81
解2:
?
MOV A, #8
ADD A, #0FH
(1ff0h) MOVC A, @A+PC
?
ORG 2000H
TAB: DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81
实例:
例4.3有2个无符号16位数, 分别存放在从M1和M2开始的数据区中, 低8位先存, 高8位在后, 和存于R3(高8位); R4(低8位), 设和不超过16位。
MOV R0, #M1
MOV R1, #M2
MOV A, @R0
ADD A, @R1
MOV R4, A
INC R0
INC R1
MOV A, @R0
ADDC A, @R1
MOV R3, A
4.1 汇编语言源程序的格式
汇编语言源程序的一般形式:
[标号:] 操作码 [操作数] [;注释]
1. 标号: 标号由8个或8个以下的字母、数字、下划线组成,标号的第一个字符必须是字母;此外,系统中保留使用的字符或字符串不能用作标号。以下标号非法: 2A; S+N; EQU„.
2. 操作数
A. 对于#data: #10010010B; #10; #9BH; #0ABH?注意不能丢掉前面的0; 否则按符号地址ABH处理。eg. MOV A,#0ABH <=> MOV A,#ABH
B. 对于直接地址direct可以用:
?10010011B;98;0F9H;eg. MOV A,98
?标号地址:eg. MOV A,SUM
?带 +、-号的表达式 => 直接地址:eg. MOV A,SUM+3 ?SFR名:eg. MOV A,P2
C. 对于相对寻址的 rel:除可以采用上面提到的? ? ?外,还允许采用一个专门的符号
g. JNB TF0,$ “$”,它表示相对转移指令所在的地址。e
*源程序中除“注释”外,不能出现全角符号;即必须全为西文字符。
4.2 伪指令
每种汇编语言都会定义若干条伪指令,用来对汇编过程进行某种控制,或者对符号、标号赋值。
1. ORG(汇编起始命令)——用于规定下面的目标程序的起始地址,在源程序中可以多次使用,但所规定的地址必须从小到大,且不能造成地址重叠。 格式: OGR 16位地址
eg. ORG 2000H
START: MOV A,#64H
2. END(汇编结束)——在END以后所写的指令,汇编程序都不予处理。源程序中只能有一条END,放在所有指令的最后。
格式:END
3. EQU(等值命令)——将一个数或特定的汇编符号赋予规定的字符名称。用EQU定义的字符名称,必须先定义后使用,且通常不能用于表达式中。 格式:字符名称 EQU 数或汇编符号
4. DATA(数据地址赋值命令)——将数据地址或代码地址赋予规定的字符名称; 用DATA定义的字符名称,允许先使用后定义,且可用在表达式中。 格式:字符名称 DATA 表达式
4.2 伪指令
5. BIT(位地址符号命令)——将位地址赋予所规定的字符名称。 格式:字符名称 BIT 位地址;eg. A1 BIT P1.0 ; A2 BIT 20H
6. DB/DW(定义字节/字命令)——从指定地址单元开始, 定义若干个8/16位内存单元内容
格式: [标号:] DB 8位二进制数表 ;
[标号:] DW 16位二进制数表 ;(*高8位在前,低8位在后) eg. lab: DB 45H, 73, “5”, “A”
DW 45H, 73, “5”, “A”
*注意2者的区别
7. DS(定义空间命令)——从指定地址单元开始,保留由表达式所指定的个数存储单元作为内存备用空间。
格式: [标号:] DS 表达式 ;
ORG 3000H
BUF: DS 50
„ „ ;从地址3000H开始保留50个存储单元作为备用单元; **以上6、7两条伪指令均只能作用于ROM
4.3 MCS-51程序设计举例 1. 分支程序设计
例5.6_设变量X存放在VAR单元, 函数值Y存放在FUNC单元。按下式给Y赋值:
-1 X < 10
Y= 0 10?X?20
1 20 < X
VARDATA 30H
FUNC DATA 31H
MOV A, VAR
CJNE A, #10, NEXT1 NEXT1: JC NEXT2
MOV R0, #1
CJNE A, #21, NEXT3 NEXT3: JNC NEXT4
MOV R0, #0
SJMP NEXT4
NEXT2: MOV R0, #0FFH NEXT4: MOV FUNC, R0 4.3 MCS-51程序设计举例
1. 分支程序设计
例5.8 设有4分支, 对应R3的值为0~3; 每分支用于分别从内部RAM, 外部RAM256B, 外
部64kB, 或外部RAM4kB缓冲区读取数据, 设低8位地址=>R0,高8位地址=>R1。
MOV A, R3
MOV DPTR, #BRTAB
MOVC A, @A+DPTR
JMP @A+DPTR
BRTAB:DB BR0 -BRTAB
DB BR1 -BRTAB
DB BR2 -BRTAB
DB BR3 -BRTAB
4.3 MCS-51程序设计举例 2. 循环程序设计
例5.11 从BLOCK单元开始有一个无符号数据块,其长度存于LEN单元,试求出数据块中
最大的数,并存入MAX单元。 LEN DATA 20H MAX DATA 21H BLOCK DATA 22H
CLR A
MOV R2, LEN
MOV R1, #BLOCK LOOP: CLR C
SUBB A, @R1
JNC NEXT
MOV A, @R1
SJMP NEXT1 NEXT: ADD A, @R1 NEXT1: INC R1
DJNZ R2, LOOP
MOV MAX, A 4.3 MCS-51程序设计举例 例5.13 有10组3字节的被加数和加数, 分别存在两个数据块中, 首地址
分别存于R0和R1中, 求这10组数的10组和, 各组的和仍送回以R0为指针的单元。
MOV TEMP, R0
MOV TEMP+1, R1
MOV R3, #10 LOOP: MOV R2, #3
CLR C
LOOP1:MOV A, @R0
ADDC A, @R1
MOV @R0, A
INC R0
INC R1
DJNZ R2, LOOP1
DJNZ R3, LOOP
MOV R0, TEMP
MOV R1, TEMP+1 TEMP DATA 20H 4.3 MCS-51程序设计举例 3. 查表程序
例5.16若A中存放的是某一位十进制数的7段码, 通过查表程序, 将其转
换为相应的BCD码, 仍存于A中。
MOV R1, #00H
MOV B, A
MOV DPTR, #KTAB LOOP: MOV A, R1
MOVC A, @A+DPTR
CJNE A, B, NEXT
SJMP RESU
NEXT: INC R1
SJMP LOOP
RESU: MOV A, R1
RET
KTAB: DB 40H, 79H, 24H
DB 0H, 19H, 12H
DB 02H, 78H, 00H, 18H 4.3 MCS-51程序设计举例 3. 查表程序
例5.15 将一组16进制数转换为ASCII码。每个字节内存放两个16进制数。16进制数据
块首地址存于R0,存放ASCII码区域的首地址存于R1,数据块长度存于R2。
MOV TEMP, R0
MOV TEMP+1,R1 LOOP: MOV A, @R0
ANL A, #0FH
ADD A, #18
MOVC A, @A+PC
MOV @R1, A
INC R1
MOV A, @R0 4.3 MCS-51程序设计举例 4. 子程序
?通过R0~R7或A来传送数据 例5.17 用程序实现c=a2+b2。设a,b,c存于内部RAM的D1,D2,D3。
MOV A, D1
ACALL SQR
MOV R1, A
MOV A, D2
ACALL SQR
ADD A, R1
MOV D3, A
SJMP $
SQR: INC A
MOVC A, @A+PC
RET
TAB: DB 0, 1, 4, 9, 16
DB 25, 36, 49, 64, 81
END
4.3 MCS-51程序设计举例 TEM DATA 20H
MOV R1, #BLOCK1
ACALL FMAX
MOV TEM, A
MOV R1, #BLOCK2
ACALL FMAX
CJNE A, TEM, NEX
NEX: JNC NEX1
MOV A, TEM NEX1: MOV MAX, A
SJMP $
4.3 MCS-51程序设计举例 4. 子程序
?通过堆栈传递参数 例5.19 在HEX单元有2个16进制数, 试将它们分别转换成ASCII码, 存入ASC和ASC+1
单元。
HEX DATA 30H
ASC DATA 31H
PUSH HEX
ACALL HASC
POP ASC
MOV A, HEX
SWAP A
PUSH ACC
ACALL HASC
POP ASC+1
SJMP $ 4.3 MCS-51程序设计举例
MOV R0, #BLOCK
MOV R1, #SUM SUB: MOV R2, #0
MOV R3, #0
MOV A, @R0
JNB ACC.7, N1
MOV R2, #0FFH N1: INC R0
MOV B, @R0
JNB B.7, N2
MOV R3, #0FFH
4.3 MCS-51程序设计举例 例5.21 2个16位无符号数乘法程序;设R7R6存放乘数, R5R4存乘数,乘积存入以R0开始的
单元(低位积先存)。 MOV A, R6
MOV B, R4
MUL AB
MOV @R0 A
MOV R3, B
MOV A, R7
MOV B, R4
MUL AB
ADD A, R3
MOV R3, A
MOV A, B
ADDC A, #0
MOV R2, A
MOV A, R6
MOV B, R5
MUL AB
ADD A, R3
INC R0
MOV @R0, A
MOV R1, #0
MOV A, R2 4.3 MCS-51程序设计举例 例5.22 两个8位带符号数乘法程序 ;设两个数已存在R0和R1, 16位乘积送R3, R2保存。
SBIT BIT 20.0 SBIT1 BIT 20.1
SBIT2 BIT 20.2
MOV A, R0
RLC A
MOV SBIT1, C
MOV A, R1
RLC A
MOV SBIT2, C
ANL C, /SBIT1
MOV BIT, C
MOV C, SBIT1
ANL C, /SBIT2
ORL C, SBIT
MOV SBIT, C
MOV A, R1 4.3 MCS-51程序设计举例 例5.23 16位被除数已存于R7R6, 16位除数存于R5R4; 除数若为0, 则置单元OVER为
0FFH, 以表示溢出; 若被除数为0, 则置单元OVER为 0(商:R7R6; 余数:R3R2)。
SUB: MOV A, R5
JNZ START
MOV A, R4
JZ OVERF START: MOV A, R7
JNZ START1
MOV A, R6
JNZ START1
MOV OVER, #0
RET
START1: CLR A
MOV R2, A
MOV R3, A
MOV R1, #16
DIV:CLR C
MOV A, R6
RLC A
MOV R6, A
5.1 中断概述
中断——是cpu与外部设备交换信息的一种方式;它解决了CPU和 外设之间的速度配合问题,提高了CPU的效率,使计算机可实时处理 控制现场瞬息变化的信息、参数,提高了计算机处理故障的能力。因此,计算机中断系统的功能也是鉴别计算机性能好坏的重要标志之一。 1.中断源——引起中断的原因或发出中断申请的来源;一般可分为软件中断和硬件中断,MCS-51不支持软件中断,仅有5个硬件中断源。 2.硬件中断的分类: A.屏蔽中断可直接称中断;
B.非屏蔽中断,MCS-51不支持此类中断;
3.中断的开放与关闭
4.中断源的判别和中断优先级
判别: 单线中断,软件查询
多线中断
矢量中断
中断优先级: A.若干个中断源同时发出申请
B.中断嵌套
5.2 中断处理过程
1.中断请求——是中断源向CPU发出的信号,可以是电平信号,也可以是脉冲信号,视CPU而定,MCS-51两种方式都支持。
2.中断响应
A.响应的条件
中断开放(IE EA;ES/ET1/EX1/ET0/EX0);
执行完当前指令(正执行RETI;访问IE/IP的指令时,需再执行一条指令);
无同级或更高优先级中断正在响应(IP PS/PT1/PX1/PT0/PX0) ; B.中断响应基本操作:
中止正在执行的程序;并保护断点(即将断点地址压入堆栈);
确定中断服务程序的入口地址;并将入口地址送入PC; **中断入口地址的获得:固定入口地址;中断向量表; 3.中断处理
A.保护现场; B.处理开/关中断; C.执行中断服务程序;
D.恢复现场; E.结束中断
4.中断返回
RETI: CPU将断点地址弹回PC
5.3 80C51 的中断系统及其控制
MCS-51单片机和外设交换数据通常采用两种方式: 查询方式和中断方式
1.中断系统的一般功能
涉及4个SFR: 中断系统负责对多个中断源进行管理,
TCON;SCON;IE;IP; 主要任务: ?对于中断申请的屏蔽或开放的管理
采用两级管理:
总开关EA和5个中断源自己的开关EX0,ET0,EX1,ET1,ES
?中断的排队
对IP编程将中断分两级,同级时按系统规定的优先顺序执行;在未被屏蔽的前提下高级中断可中断低级中断。
5.3 80C51 的中断系统及其控制
?中断的响应
当中断源产生中断申请时,MCS-51系统先把这些申请登记在各 自的中断标志位中,然后在下一个周期按照内部优先顺序和规定的级别来查询这些中断标志,
并在一个机器周期内完成检测和优先级排队,此时若系统满足下面的3个条件,则在下一个机
器周期的S1状态开始响应其中优先级最高的中断。
A.没有同级或更高级的中断正在响应; B.当前指令执行完毕;
C.若正在执行的指令是RETI或任何访问IE、IP的指令,则必须在另外执行一条指令之后才可以响应中断;
中断响应需要两个机器周期,完成两件事:
将PC推入堆栈(低地址放PC低8位,高地址放PC高8位)—保护断点
将入口地址装入PC;=>相当于内部调用LCALL。 ?中断的撤除
串行口发送/接受中断标志,需通过软件清除;外中断采用电平触发时,中断服务程序应使该I/O设备撤消中断申请;其余的中断标志,一旦被响应将会被自动清除。
5.3 80C51的中断系统及其控制
*电平触发时只要在S5P2时刻为低电平即可将IE0/1置位;而边沿触发时
需两个S5P2才能检测到下降沿。
5.3 80C51的中断系统及其控制
2.中断方式应用举例
(80C51和打印机的接口)
例: 将内部RAM从20H开
始的50个8位数据通过打印
机打印出来。
5.3 80C51的中断系统及其控制
ORG 0000H ;主程序入口
LJMP MAIN
ORG 0003H ;中服程序入口
LJMP ROUT
„„
ORG 100H ;主程序 MAIN: SETB IT0
SETB EA
SETB EX0
SETB PX0
MOV R0, #20H
MOV R1, #0F0H
MOV R2, #49
MOV A, @R0
MOVX @R1, A
LOOP: SJMP $
5.4 80C51外部中断源的扩展 1.借用定时/计数器溢出中断作为外部中断
MOV TMOD, #06H
MOV TL0,#0FFH
MOV TH0, #0FFH
SETB EA
SETB ET0
SETB TR0
2.用查询方式扩展中断源
3.用8259可编程中断控制器扩展中断源(略) 5.5 80C51内部定时/计数器及其应用
51系列内部带有2个16位的定时/计数器; 它们本质上
都是“加法”计数器, 当计数器被加至“全1”后, 再计一个脉冲就会“溢出”—使TF0/1
被置1, 标识它已完成计数工作;可以通过将一个数写入TH0/1和TL0/1, 改变计数器的初值,
即使计数器在此初值的基础上开始计数。 1. MCS-51内部定时/计数器的工作方式 5.5 80C51内部定时/计数器及其应用 方式0:13位计数方式
初值=>TH0/1+TL0/1的低5位; eg. 欲计数1000
213-1000 =7192=>1110000011000B
将初值11100000B(E0H) =>TH0/1; 11000B(18H) =>TL0/1 方式1:16位计数方式
初值=>TH0/1+TL0/1 eg. 欲计数 58344 216-58344=7192=>1110000011000B;
将初值11100B(1CH) =>TH0/1; 00011000B(18H) =>TL0/1
:8位自动重装计数方式 方式2
TL0/1=>8位计数器;TH0/1=>寄存器;当TL0/1计满溢出后能将TH0/1的内容自动装入;
方式3:T0拆为2个独立的8位计数器TL0和TH0;但2者的工作方式略有不同,TL0可用于定时/计数器;TH0只能用于计时器;但将占用T1的TR1,TF1;此时T1将不能使用中断;T1在方式3下相当于TR1=0,停止计数(内容保持不变) 5.5 80C51内部定时/计数器及其应用
2. MCS-51内部定时/计数器的控制
A.定时/计数器工作方式控制寄存器——TMOD(89H) M1M0—确定计数器工作方式;
C/-T—T1/0是用作计数器(1)
还是用作定时器(0);
GATE—起辅助控制作用;
右上图为定时/计数器工作于
方式0/方式1时的逻辑结构图。
方式0时的计数器由TH0和
TL0的低5位构成13位的计数
器; 方式1时的计数器由TH0
和TL0构成16位计数器。
定时/计数器工作于方式2时
的逻辑结构如右下图所示:
TL0溢出, 使TF0置1的同时
将TH0的内容重装入TL0,
并重新开始计数;
5.5 80C51内部定时/计数器及其应用应用
定时/计数器0工作于
方式3及定时/计数器1
与之相应的工作方式:
注意:与定时/计数器1”GATE”
配合使用的是INT1!!
5.5 80C51内部定时/计数器及其应用
B.定时/计数器的启动和中断控制
相关的SFR:
C.定时计数器的初始化
?对TMOD赋值,以确定其工作方式;
?对TH0/1, TL0/1赋初值;
?确定优先级、开放中断;
?对TCON中的TR0或TR1置位,启动计数; 5.5 80C51内部定时/计数器及其应用
3. 应用举例
eg.1 利用定时器输出周期2ms的方波,设单片机时钟频率为12MHz。
答: 用T0; 方式0; 定时1ms; TMOD = 0000 0000B
; 用P1.0输出方波
计算定时器初值X=213-1*10-3(1ms)/1*10-6(1us)
=7192=11100000 11000B=>0E0 18H
ORG 0BH BRT0: MOV TH0, #0E0H
AJMP BRT0 MOV TL0,#20H; ** main: MOV TMOD, #00H CPL P1.0
MOV TH0, #0E0H RETI
MOV TL0,#18H
SETB EA
SETB ET0
SETB TR0
SJMP $
5.5 80C51内部定时/计数器及其应用
**在定时器溢出发出中断申请,到重装完定时器初值并在此基础上继续计数定时,总会有一定的时间间隔,若要求定时/计数比较精确,就需对重装的初值作一些调整。一般考虑两个因素:一是中断响应所需的时间;二是重装指令及中断服务程序中在重装指令前的其它指令所用时间;修正量通常取7~8个机器周期,即少计7~8个数=>重装初值+7~8。
eg. 上题采用查询方式产生2ms的方波。
MOV TMOD, #00H
SETB TR0
LOOP: MOV TH0, #0E0H
MOV TL0,#18H
JNB TF0, $
CPL P1.0
CLR TF0
SJMP LOOP
5.5 80C51内部定时/计数器及其应用
ORG 0BH
AJMP BRT5
„„
START:ORG 2000H
MOV TMOD, #01H
MOV TH0, #0B1H
MOV TL0,#0E0H
MOV IE, #82H
SETB TR0
MOV R0, #50
LOOP: SJMP $
6.1 计算机串行通信基础
计算机与外部的信息交换称为通信; 基本的通信方式: 并行通信;
串行通信。
并行通信——数据各位同时传送=>并行接口;速度快,但使用的通信线多(数据线+控制信号
线),且随着传输距离的增加,传输可靠性下降。串行通信——在单根线上,按一位接一位
从低位到高位的先后顺序进行传送/接收。 串行通信中,按数据传送方向可分为: 单工(Simplex)
半双工(Half Duplex)
全双工(Full Duplex)
串行通信中,按照通信的收发双方是否有统一的时钟,可分为两种基本的传送方式:
异步方式(Asynchronous); 同步方式(Synchronous);
6.1 计算机串行通信基础
异步传送方式:
1.如何同步,
A.必须约定串行数据传送速率——波特率(Baud Rate)=>每秒钟所传送数据的位数,单位为
Bd。
常用国际标准波特率为:
110、300、600、1200、2400、4800、9600和19200Bd B.高于波特率的时钟频率:一般16倍或64倍 C. 加1位起始位—0;
D. 加1/1.5/2位停止位—1)
2.异步传送从哪一位开始传,„„(从低位到高位) 3.可以传送多少位数据,
数据在线路上的传送不是连续的,数据是以一个字(或称字符)为单位来传送的,它可以是5/6/7/8位;
4.如何纠错和区分数据/控制信息,
可加1位奇偶校验位或>=1位的控制位;
例如用来确定这个字符所代表的性质:地址还是数据 6.1 计算机串行通信基础
同步传送方式:
同步传送是一种连续传送数据的方式,即字符与字符间没有间隙(不用起始位和停止位);仅在数据块开始时用同步字符SYNC来指示;
同步字符的插入可以是单同步字符方式或双同步字符方式;同步字符可以有用户约定,也可以采用ASCII码中规定的SYN代码,即16H;因此,一般在硬件设备上需要有插入同步字符或相应的监测手段。
在同步传送时,无论接收或发送,都要求x1时钟,即时钟频率和波特率一致。发送方除了传送数据外,还要把时钟信号同时传送。
串行接口芯片UART和USART
UART——通用异步收发器(Universal Asynchronous Receiver-Transmitter)
USART—通用同步异步收发器(Universal Synchronous-Asynchronous Receiver-Transmitter)
6.2 80c51串行口
51单片机的串口为:可编程/全双工/异步串行口=>”SBUF” 管脚:Rxd=>P3.0;Txd=>P3.1
串口控制:SCON(98H);PCON(87H)—不可位寻址~~
6.2 80c51串行口
串口工作方式:
SM2:多机通信控制位主要用于方式2/3,若允许多机通信,则为1,然后依据接收到的第九位数据的值来决定从机是否接收主机的信号。
串口数据寄存器:SBUF
串口的波特率:
方式2:波特率(方式2)=(2MOD/64)×fosc
方式1和方式3的波特率都由定时器1的溢出率来决定: 波特率(方式1/3)=(2MOD/32)×T1溢出率
T1溢出率=(fosc/12)/(2k-初值)
T1为方式0:k=13;
T1为方式1:k=16;
T1为方式2/3:k=8;
6.2 80c51串行口
方式0——移位寄存器输入/输出方式:
是用同步的方式串行输出或串行输入数据,但是和同步通信不是一回事,因为它不能插入或检出同步字符,此时的串口相当于一个并入串出(发送)或串入并出的移位寄存器。
串行数据通过RXD线输入或输出,也就是接到外部移位寄存器的串行输入或串行输出;而TXD专用于输出时钟脉冲给外部移位寄存器;
方式0可用来同步输出或接收8位数据,波特率固定为fosc/12;此时SM2/RB8/TB8都不起作用;
方式0的发送操作是在TI=0时,由一条写发送缓冲器SBUF的指令开始的,例如:MOV SBUF, A;=>RXD发送8位数据,TXD提供同步时钟;
方式0的接收操作是在RI=0时,使REN=1来启动接收过程: =>RXD接收8位数据,仍由TXD提供同步移位脉冲;
方式0并不能用于同步串行通信,主意用于和外接的移位寄存器结合来进行并行口的扩展。
7.1 80c51内部并行口及其应用
1.单片机内部包含了4个8位的双向并行口:P0/P1/P2/P3
P0:除了用作8位并行口外, 在外扩存储器时, 用作地址
(低8位)/数据分时复用总线, 但此时就不能再用于并行口。用作并行口时, 需加上拉电
阻。
P1:只有并行口功能。
P2:除了用作8位并行口外, 在外扩存储器或I/O设备的地址超过256字节时, 用作地址高8位总线, 此时一般也不能再用于并行口。
P3:它的每个引脚都有不同的第二功能。当它的某些引脚用作第二功能时, P3口也不能作为8位并行口。但没用上的可通过位寻址用于输入或输出。
P3.0 RXD; P3.2 –INT0; P3.4 T0; P3.6 –RD
P3.1 TXD; P3.3 –INT1; P3.5 T1; P3.7 –WR
7.1 80c51内部并行口及其应用
2.80c51的并行口直接用于输入/输出
此时,P0~P3都是准双向口。用作输出口时,端口有锁存器,输出指令可将数据写入锁存器。
eg. MOV P0, A;
MOV P1, R1;
MOV P2, @R1; „.
用作输入口时,端口带有缓冲器,但没有寄存器,因此输入的数据必须一直保持在引脚上,直到把数据读走。此外,在读取数据前先往该端口写“1”。
eg. MOV P0, #0FFH
MOV A, P0
关于“读—改—写”指令
eg. ORL P0, #0FH
ANL P0, #01H
XRL P0, A
7.2 80c51 并行口的扩展
对于80c51系统来说, 如果带有超过256字节的外部存储器, 则只
有P1口可以完全用作8位并行口。=>扩展并行口。(8243; 8255; 8155)
用8155通用接口芯片扩展并行口
1. 8155的引脚和方框图
8155是40引脚, 采用单一+5v电源。它的内部带有地址锁存器, 因此, 可以和P0口直
接连接。
关于ALE:
一般直接与51的ALE
连接;信号的下降沿将
AD0~AD7上的地址信
号; 片选CE信号以及
IO/M信号都锁存进
8155的内部锁存器。
7.2 80c51 并行口的扩展
2. 8155 I/O口的工作方式
A口和B口都可以工作在I或O方式; 但它们是工作在 “一般方式”
还是“选通方式”却是由C口的方式决定;
C口可以设置成4种工作方式 :
输入方式 ; 输出方式 ; A口的控制端口(另3条线为输出方式); 作为A口和B口的控制端口。
7.2 80c51 并行口的扩展
3. 8155的I/O口控制
在8155中, 除了端口A; B; C之外, 需要操作的端口还有命令/状态
寄存器, 定时器低8位以及定时器高8位, 共六个端口, 用AD0~AD2加以区分, 如下表
所示:
若是对8155的存储器进行操作, 则不必作初始化工作, 只需使IO/M=0即可。若对
上述6个端口操作, 需使IO/M=1, 并事先要进行初始化——向命令/状态寄存器端口写入
8155的工作方式控制字。
7.2 80c51 并行口的扩展
工作方式控制字可以设置三方面的内容: ?A、B、C口的工作方式
?是否允许A口和B口中断
?设置定时器的工作方式
7.2 80c51 并行口的扩展
可以用一条对命令/状态寄存器的读指令读出8155的工作状态。
用户可以根据查询的结果来获知各I/O口和定时器的状态, 从而决定程序的控制流向。
7.2 80c51 并行口的扩展
4. 8155和MCS-51单片机的连接
在如下图所示的连接中,将损失00H~07H内存单元。
eg1. 如图, 将8155中41H的内容送端口A:
MOV A, #01H
MOV R0, #0H
MOVX @R0, A
MOV R1, #41H
MOVX A, @R1
INC R0
MOVX @R0, A
7.2 80c51 并行口的扩展
5. 8155内部定时器的使用
8155的定时器实际上是一个14位减法计数器。从TIN输入计数脉
冲, 当计数计满时从TOUT输出方波或脉冲。定时器工作需要送入3个控制字: 8155工
作方式控制字(地址000B); 计数初值低8位(地址100B); 计数初值高6位(地址101B) 该8
位端口最高的2位用来规定计数器4种不同的输出方式.该计数器 计数范围2~3FFFH;
8155复位后,计数器
停止工作。当计数
值为奇数时,如果
是方波输出,则高
电平多计一个数。
7.3 并行口应用——单片机显示/键盘系统 LED数码显示器的控制与编程
显示数据地址: 7AH~7FH(内部RAM)
A口: 基本输出方式 ;
C口: ALT2=> 0DH
如图8155RAM地址? 0000H~00FFH; 8155端口地址? 8000H~8005H;
7.3 并行口应用——单片机显示/键盘系统
eg2.LED数码显示器的控制与编程
已知:
命令/状态寄存器端口地址: 8000H;
A口: 基本输出方式 ;
C口: ALT2 => 0DH
显示数据地址:7AH~7FH(内部RAM) 显示器驱动子程序:
DISP: MOV A, #0DH
MOV DPTR, #8000H
MOVX @DPTR, A
MOV R0, #7AH
MOV R3, #01;位码
MOV A, R3
LD0: MOV DPTR, #8003H
MOVX @DPTR, A
MOV DPTR, #8001H
MOV A, @R0
ADD A, #13
MOVC A, @A+PC
7.3 并行口应用——单片机显示/键盘系统 2. 非编码键盘与单片机的接口
使用非编码键盘
需要用软件来解决
按键的识别,防止
抖动以及键码的产
生等。
?是否有键按下,
?哪个键被按下,
?是否有窜键,
?消除抖动,
7.3 并行口应用——单片机显示/键盘系统 2. 非编码键盘与单片机的接口 ?确定是否有键按下
通过写入C口(3FH),使键盘的行线输出000000B,通过B口读入键盘列线状态 , 如果
不全为1, 则表示有键按下。
?通过“行扫描”确定已按键的位置 依次使每条行线输出0信号, 其余各行都输出1, 并检测每次扫描时所对应的列信号„.
?确定是否有多键同时按下 窜键 通常是由于误操作引起的,解决办法:行扫描扫完最后一行再处理以便发现“窜键”;如“窜
键”此次行扫描结果作废。
?消除按键抖动
发现有键按下后, 延迟10 ~20ms再进行行扫描。 7.3 并行口应用——单片机显示/键盘系统
MOV A, #0EH
MOV DPTR, #8000H
MOVX @DPTR, A
?
SCAN: MOV A, #0FFH
MOV DPTR, #8001H
MOVX @DPTR, A;关显示器
MOV A, #3FH
MOV DPTR, #8003H
MOVX @DPTR, A
MOV DPTR, #8002H
MOVX A, @DPTR
ANL A, #1FH
CJNE A, #1FH, NEXT1
SJMP NEXT4
NEXT1: ACALL D20ms ;有键按下
CLR C
MOV R1, #01H
MOV R2, #00H;窜标 MOV DPTR, #8003H
7.3 并行口应用——单片机显示/键盘系统 eg3. 单片机通过8155控制六个LED显示器, 8155A口输出显示器
段码; C口输出显示器位码; 8155的命令/状态口地址为F0H; 编程使
LED从右到左循环显示“8”; 每个字符显示时间为20ms; 用定时器控制。
(8的显示码为80H; 单片机晶振12MHz)。 解:T0初值=65536-20000=45536=0B1E0H;
工作于方式1:TMOD=01H
7.3 并行口应用——单片机显示/键盘系统
ORG 0BH
AJMP BT8
START: MOV A, #0DH
MOV R0, #0F0H
MOVX @R0, A
MOV TMOD, #01H
MOV TH0, #0B1H
MOV TL0,#0E0H
MOV IE, #82H
MOV A, #80H
INC R0
MOVX @R0, A 7.3 并行口应用——单片机显示/键盘系统
eg3. 单片机通过8155控制六个LED显示器,8155A口输出显示器段码;C口输出显示器
位码;8155的命令/状态口地址为F0H;编程使LED从右到左循环显示“8”;每个字符显示时
间为20ms;用定时器控制。(8的显示码为80H)。
T0初值=65536-20000=45536=0B1E0H 工作于方式1:TMOD=01H
ORG 0BH
AJMP BT8
START: ORG 2000H
MOV A, #0DH
MOV R0, #0F0H
MOVX @R0, A
MOV TMOD, #01H
MOV TH0, #0B1H
MOV TL0,#0E0H
MOV IE, #82H
1. A/D和D/A基本概念 1).关于D/A
问题的提出:
什么是D/A,
输出电压,
参考电压,
位数,
分辨率(8位=>1/256)
精度
1. A/D和D/A基本概念 问题的解决:
1. A/D和D/A基本概念
2)D/A典型芯片——DAC0832
其中:Vref: +10v ~ -10v ; Vcc: +5v ~ +15v , 最佳值为 +15v 三种工作方式:直通方式 ;单缓冲方式 ;双缓冲方式(此时用XREF作为另一片选端)
1. A/D和D/A基本概念
3)DAC0832典型应用
定时1ms=>64536=>0FC18H SETB TR0 MOV TMOD, #01H SJMP $ MOV TH0, #0FCH ORG 0BH MOV TL0,#18H MOV TH0, #0FCH MOV IE, #82H MOV TL0,#18H MOV R0, #0FFH INC A CLR A MOVX @R0, A MOVX @R0, A RETI 1. A/D和D/A基本概念
4)关于 A/D
问题的提出; 问题的解决
什么是A/D , 测量电压,参考电压, 位数, 分辨率(8位=>256位) 精度 计数式A/D转换法;逐次逼近式A/D转换法;双积分式A/D转换法;
1. A/D和D/A基本概念
5)典型芯片——ADC0809
时钟:10~1280kHz
转换时间:750k=>100us
REF(-):当输入模拟电压等于 REF(-)时, 输出数字为0;
:当输入模拟电压等于 REF(+)
REF(+)时, 输出数字为0FFH; ALE:地址锁存信号,高电平 有效时将3个通道地址送入地址 锁存器/译码=>选择相应的模拟 输入通道;
1. A/D和D/A基本概念
6) ADC0809典型应用
要求10ms对8路模拟信号巡回采集一遍;完成8路采集后设标志位F0=1。
1. A/D和D/A基本概念
org 00H timer0: mov th0, #
ajmpmain mov tl0, # org 0bH mov a, r3
ajmptimer0 movx @r0, a org 13h reti
ajmpint1 int1: movx a, @r0 z3 data 30H ;数据保存首地址 mov @r1, a main: mov tmod, #01H inc r1
mov th0, # inc r3
mov tl0, # cjne r3, #08, L4
mov ie, #86H mov r1, #z3
mov r0, #0ffH ;地址 mov r3, #00H
mov r1, #z3 setb f0
mov r3, #00H ;通道号 reti
mov a, r3 L4: mov a, r3
movx @r0, a movx @r0, a
setb tr0 reti
clr f0
sjmp $
2.数据采集处理系统介绍
MCS-51系列单片机和ADC0809采用下图所示的连接方法。写出
对8路模拟信号连续采集并存入存储器的程序。
2.数据采集处理系统介绍
8路模拟信号端口地址:0000H~0700H; 存储器首地址:MEM<=30H
ORG 0013H
AJMP INT_1
MEM DATA 30H
MOV DPTR, #0000H
MOVX @DPTR, A ;启动0809
MOV R0, #MEM
MOV IE, #84H ;开中断
SJMP $
INT_1: MOVX A, @DPTR
MOV @R0, A
INC DPH
INC R0
MOV A, DPH
CJNE A, #08H, J_0
CLR EX1
RETI
J_0: MOVX @DPTR, A ;启动0809下一通道
RETI
2.数据采集处理系统介绍
?模拟信号变化范围
=>是否需要放大,
?关于采样频率
=>选用不同类型的A/D
=>结合模拟信号的情况决定是否采用“采保” ?系统典型连接框图