单片机期末总结 最完整版

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机期末复习总结
1.MCS-51单片机芯片包含哪些主要功能?
8051单片机是个完整的单片微型计算机。

芯片内部包括下列主要功能部件:
1)8位CPU;
2)4KB的片内程序存储器ROM、可寻址64KB程序存储器和64KB外部数据存储
器;
3)128B内部RAM;
4)21个SFR;
5)4个8位并行I/O口(共32位I/O线);
6)一个全双工的异步串行口;
7)两个16位定时器/计数器;0
8)5个中断源,两个中断优先级;
9)内部时钟发生器、
2.MCS-51单片机的4个I/O口在使用上各有什么功能?
1)P0口:8位双向三态端口,外接上拉电阻时可作为通用I/O口线,也可在总线外扩
时用作数据总线及低8位地址总线。

2)P1口:8位准双向I/O端口,作为通用I/O口、
3)P2口:8位准双向I/O端口,可作为通用I/O口,也可在总线外扩时用作高8位地址
总线。

4)P3口:8位准双向I/O端口,可作为通用I/O口,除此之外,每个端口还有第二功能。

实际应用中常使用P3口的第二功能、
I/O口准双向:MCS-51单片机I/O口做输入之前要先输出1、这种输入之前要先
输出1的I/O口线叫做准双向I/O口,以区别真正的输入,输出的双向I/O口。

3、MCS—51单片机的存储器分为哪几个空间?是描述各空间作用?
8051存储器包括程序存储器和数据存储器,从逻辑结构上看,能够分为三个不同的空间: 1)64KB片内片外统一编址的程序存储器地址空间,地址范围:0000H~FFFFH,关于8051单
片机,其中地址0000H~0FFFH范围为4KB的片内ROM地址空间,1000H~FFFFH为片外ROM地址空间;
2)256B的内部数据存储器地址空间,地址范围为00H~FFH,关于8051单片机,内部RAM分为两部分,其中地址范围00H ~ 7FH(共128B单元)为内部静态RAM的地址空间,80H~FFH 为特别功能寄存器的地址空间,21个特别功能寄存器离散地分布在这个区域;关于8052系列单片机还有地址范围为80H~FFH的高128B的静态RAM。

3)64KB的外部数据存储器地址空间:地址范围为0000H~FFFFH,包括扩展I/O端口地址空间。

4、数据存储器
MCS-51基本型单片机内部数据存储器有256B的存储空间,地址为00H~FFH;外部数据存储器的地址空间最大为64KB,编址为
0000H~FFFFH、
256B的内部存储器按功能划分为两部分:地址为00H~7FH的低
128B的基本RAM区和地址为80H~FFH的高128B的特别功能寄存器
(SFR)区
基本RAM区分为工作寄存器区,位寻址区,用户RAM区
工作寄存区(00H~1FH):共分为4组,每组由
8个工作寄存器,编号R0~R7
位寻址区(20H~2FH):16个单元,既能够作
为普通RAM单元使用,有能够对单元中的每
一位进行位操作。

用户RAM区(30H~7FH):用于存放随机数
据及运算的中间结果、
程序状态字寄存器(PSW):RS1,RS0(PSW、
4,PSW、3):工作寄存器组选择控制位。

可用
软件对它们置1或清0,以选择当前工作寄
存器的组号、
堆栈指针寄存器SP:
堆栈只允许在其一端进行数据插入和数据
删除操作的线性表。

PUSH,数据写入堆栈称为插入运算(入栈);POP,从堆栈中读出数据称为删除运算(出栈)。

堆栈的特点:后进先出LIFO(Last-In Firt—Out)。

堆栈有两种类型:向上生长型,向下生长型、
进栈操作:先SP加1,后写入数据
出栈操作:先读出数据,后SP减1
MCS—51单片机复位后,SP的初值自动设为07H;
5、什么是振荡周期,时钟周期,机器周期和指令周期?如何计算机器周期的确切时间?1)振荡周期是指为单片机提供脉冲信号的振荡源的周期,是单片机最基本的时间单位。

通常由外接晶振与内部电路来提供振荡脉冲信号,其频率记为,此频率的倒数即是振荡周期。

2)振荡脉冲经过二分频后就是单片机的时钟信号,时钟信号的周期称为时钟周期,又定义为状态,用S表示。

时钟周期是振荡周期的二倍、
3)机器周期是指令执行过程中完成某一个基本操作所需的时间、一个机器周期等于12个振荡周期、即。

4)指令周期是指执行一条指令所需要的时间,依照指令不同,可包含1、2、4个机器周期。

常用符号说明:
寻址方式:
(1)马上寻址。

操作数直截了当在指令中给出,它能够是二进制、十进制、十六进制数,也能够是带单引号的字符,通常把这种操作数称为马上数,它的寻址范围就是指令本身所在的程序存储单元。

例:MOV A,#25H;MOV DPTR,#1234H;
(2)直截了当寻址。

在指令中直截了当给出存放操作数的内存单元的地址。

寻址范围为:内部RAM低128字节单元,特别功能寄存器。

例:MOV A,25H;
(3)寄存器寻址、指令中给出的是操作数所在的寄存器。

寻址范围为:4组工作寄存器(R0 ~R7),部分特别功能寄存器,如A、B、DPTR。

例:MOV A,R7;
(4)寄存器间接寻址。

存放操作数的内存单元的地址放在寄存器中,指令只给出寄存器(包括Ri 和DPTR),寄存器名称前加“"前缀标志。

寻址范围:地址范围从00 ~FFH的全部内部RAM 单元,包括堆栈区,但不包括特别功能寄存器,以及地址范围从0000 ~FFFFH的全部片外RAM、
例:MOV A,R7;
(5)变址寻址。

将基址寄存器与变址寄存器的内容相加,结果作为操作数的地址、变址寻址主要用于查表操作、寻址范围:64KB的程序存储空间。

例:MOVC A,A+DPTR;
(6)相对寻址。

指令中给出的操作数是程序相对转移的偏移量。

偏移量是一个带符号的单字节数,范围为-128~+127。

例:SJMP 50H;
(7)位寻址、操作数是位地址。

寻址范围:内部RAM位寻址区共128位(位地址:00 ~7FH),11个特别功能寄存器中的可寻址位(关于8051,有83位)、
MCS-51单片机指令系统
I、数据传送类(29条)
1、普通传送指令
MOV:内部ROM;MOVC:外部ROM;MOVX:程序存储器、
1)片内数据存储器传送指令(16条)
(1)以A为目的操作数指令(4条)
MOV A,#data;
MOV A,direct;
MOV A,Rn;
MOV A,Ri;
(2)以Rn为目的操作数的指令(3条)
MOV Rn,#data;
MOV Rn,direct;
MOV Rn,A;
(3)以直截了当地址为目的操作数的指令(5条)
MOVdirect,#data;
MOV direct,direct;
MOV direct,A;
MOV direct,Rn;
MOVdirect,Ri;
(4)以寄存器间接寻址为目的操作数的指令(3条)
MOV Ri,#data;
MOVRi,direct;
MOV Ri,A;
(5)16位书库传送指令(1条)
MOV DPTR,#data16;
2)片外数据存储器传送指令(4条)
(1)使用DPTR进行间接寻址
MOVX A , DPTR;A←((DPTR))
MOVX DPTR , A ;(DPTR)←A
(2)使用Ri进行间接寻址
MOVX A, Ri ;A←((Ri))
MOVX Ri ,A ;(Ri)←A
例3。

6要求把外部RAM60H单元中的数据8BH传送到内部RAM50H中,试编程。

解法1:MOV R0, #60H;(R0)=60H
MOVX A , R0;(A)=8BH
MOV50H , A ;(50H)=8BH
解法2:MOV DPTR , #0060H ;(DPTR)=0060H
MOVX A , DPTR ;(A)=8BH
MOV 50H, A ;(50H)=8BH
3)程序存储器传送指令(2条)
MOVC A , A+DPTR ;A←((A)+(DPTR))
MOVC A , A+PC ;A←((A)+(PC))
例3。

7已知程序存储器中以TAB为起点地址的空间存放着0~9的ASCII码,累加器A 中存放着一个0~9之间的BCD码数据。

要求用查表的方法获得A中数据的ASCII码、
解法1: MOVDPTR, #TAB
MOVC A , A+DPTR
RET
TAB:DB 30H,31H,32H,33H,34H,35H,36H,
37H,38H,39H
解法2: INC A
MOVC A , A+PC
RET
TAB:DB 30H,31H,32H,33H,34H,35H,36H,
37H,38H,39H
2。

数据交换指令(5条)
(1)整字节交换指令
源操作数与累加器A进行8位数据交换,共有3条指令:
XCHA, Rn ;(A)←(Rn)
XCH A , direct ;(A)←(direct)
XCH A , Ri ;(A)←((Ri))
(2)半字节交换指令
源操作数与累加器A进行低4位的半字节数据交换,
只有1条指令:
XCHDA, Ri ;(A)3~0 ((Ri))3~0
(3)累加器高低半字节交换指令
累加器A的高低半个字节进行数据交换,只有1条指令:
SWAP A ;(A)3~0 (A)7~4
3。

堆栈操作指令
PUSH direct; --SP+1,SP←(direct)
POP direct; --direct←(SP),SP←(SP-1)
II。

算术运算类指令
1.加法指令
1)不带进位的加法指令
ADD A, #data;A←(A)+data
ADD A , direct ;A←(A)+(direct)
ADD A , Rn ;A←(A)+(Rn)
ADD A , Ri ;A←(A)+((Ri))
加法运算的结果会影响程序状态字寄存器PSW,其中包括:
①假如运算结果的最高位第7位有进位,进位标志CY置“1”,反之,CY清“0”;
②假如运算结果的第3位有进位,辅助进位标志AC置“1”,反之,AC清“0";
③假如运算结果的第6位有进位而第7位没有进位或者第7位有进位而第6位没
有进位,则溢出标志OV置“1"(即OV=C7⊕C6),反之,OV清“0”;
④奇偶标志P随累加器A中1的个数的奇偶性而变化。

例3、10已知(A)=97H,(R0)=89H,
执行指令:ADD A , R0
解: 10010111
+ 1000 1001
1←0010 0000
运算结果:(A)=20H,CY=1,AC=1,OV=1,P=1。

若97H和89H是两个无符号数,则结果是正确的;
反之,若97H和89H是两个带符号数(即负数),则由于有溢出而表明相加结果是错误的,因为两个负数相加结果不估计是正数。

2)带进位的加法指令
ADDC A , #data ;A←(A)+data+(CY)
ADDC A , direct ;A←(A)+(direct)+(CY)
ADDC A , Rn ;A←(A)+(Rn)+(CY)
ADDC A, Ri ;A←(A)+((Ri))+(CY)
例3、11已知当前(CY)=1,(A)=97H,(R0)=89H,
执行指令:ADDC A, R0
解: 1001 0111
1000 1001
+ 1
1←0010 0001
运算结果:(A)=21H,CY=1,AC=1,OV=1,P=0。

3)加1指令
INC A ; A←(A)+1
INCRn; Rn←(Rn)+1
INCdirect ; direct←(direct)+1
INCRi ;(Ri)←((Ri))+1
INC DPTR ; DPTR←(DPTR)+1
加1指令的操作不影响程序状态字PSW的状态,只有“INC A”指令能够影响奇偶标志位P
例3。

13已知:(A)=0FFH,(R3)=0FH,(30H)=0F0H,(R0)=40H,(40H)=00H,(DPTR)=1234H,
执行如下指令:
INCA
INCR3
INC30H
INC R0
INC DPTR
其结果为:(A)=00H,(R3)=10H,(30H)=0F1H,(R0)=40H,(40H)=01H,(DPTR)=1235H,PSW中仅P改变、
2、减法指令
1)带借位的减法指令
SUBB A , #data;A←(A)﹣data﹣(CY)
SUBB A, direct ;A←(A)﹣(direct)﹣(CY)
SUBB A , Rn ;A←(A)﹣(Rn)﹣(CY)
SUBB A , Ri ;A←(A)﹣((Ri))﹣(CY)
减法运算的结果会影响程序状态字寄存器PSW,其中包括:
①假如运算结果的最高位第7位有借位,则进位标志CY置“1”,反之,CY清“0”;
②假如运算结果的第3位有借位,则辅助进位标志AC置“1”,反之,AC清“0”;
③假如运算结果的第6位有借位而第7位没有借位或者第7位有借位而第6位没有借位,则溢出标志OV置“1”(即OV=C7⊕C6),反之,OV清“0”;
④奇偶标志P随累加器A中1的个数的奇偶性而变化。

例3、14已知(A)=0C9H,(R2)=54H,(CY)=1。

执行指令:SUBB A , R2
解: 1100 1001
﹣0101 0100
1
0111 0100
运算结果:(A)=74H,CY=0,AC=0,OV=1,P=0。

若C9H和54H是两个无符号数,则结果74H是正确的;反之,若为两个带符号数,则由于有溢出而表明结果是错误的,因为负数减正数其差不估计是正数。

2)减1指令组
4条减1指令:
DEC A ; A←(A)﹣1
DECRn ; Rn←(Rn)﹣1
DEC direct; direct←(direct)﹣1
DECRi ;(Ri)←((Ri))﹣1
减1操作不影响PSW的状态,只有DEC A影响奇偶标志位P
只有数据指针DPTR加1指令,而没有DPTR减1指令,假如要在程序设计中进行DP TR-1运算,只有通过编程完成
例3。

3、15假如(A)=0FH,(R7)=19H,(30H)=00H,(R1)=40H,(40H)=0FFH,执行指令:
DEC A
DEC R7
DEC 30H
DEC R1
结果:(A)=0EH,(R7)=18H,(30H)=0FFH,(R1)=40H,(40H)=0FEH。

PSW中仅P改变3、乘法指令
MULAB
16位乘积的低位字节放在A中,高位字节放在B中
乘法运算影响PSW的状态:进位标志CY总是被清“0",溢出标志位状态与乘积有关
例3。

3、16已知(A)=80H(即十进制数128),(B)=40H(即十进制数64),
执行指令:MULAB
执行结果:乘积为2000H(十进制数为8192), (A)=00H,(B)=20H,CY=0,OV=1 4、除法指令
DIVAB
被除数:A除数:B
指令执行后,商存于A中,余数存于B中
除法运算影响PSW的状态:进位标志位CY总是被清“0",溢出标志位OV状态则反映除数情况
例3、17 已知(A)=80H(即十进制数128),(B)=40H(即十进制数64),
执行指令:DIV AB
执行结果:商为02H, 余数为00H,(A)=02H,(B)=00H,CY=0,OV=0。

5。

十进制调整指令:用于对BCD码十进制数加法运算的结果进行修正。

DA A
十进制调整的修正方法:
(1)累加器低4位大于9或辅助进位位(AC)=1,则进行低4位加6修正
A← (A)+06H
(2)累加器高4位大于9或进位标志位(CY)=1,则进行高4位加6修正
A ←(A)+60H
(3)累加器高4位为9、低4位大于9,则进行高4位和低4位分别加6修正
A← (A)+66H
例3、18 试编写程序,实现93+59的加法运算,并分析执行过程。

解:加法运算程序为:
MOV A , #93H
ADD A , #59H
DA A
程序执行的过程分析:
1001 0011
+ 0101 1001
11101100
01100110;加66H调整
101010010
最终结果为1 0101 0010(152)是正确的BCD码。

III、逻辑运算及移位类指令(24条)
1、逻辑与运算指令组
ANL A , #data ; A←(A)∧data
ANL A , direct ; A←(A)∧(direct)
ANL A , Rn ; A←(A)∧(Rn)
ANL A , Ri ; A←(A)∧((Ri))
ANL direct , #data ; direct←(direct)∧data
ANL direct, A ; direct←(direct)∧(A)
例3、19 已知(A)=86H,试分析下面指令执行的结果:
(1)ANL A , #0FFH;
(2)ANL A, #0F0H;
(3)ANL A , #0FH;
(4)ANL A , #1AH;
解:(1)A=86H;
(2)A=80H;
(3)A=06H;
(4)A=02H、
由上例可知,逻辑与指令可用于将指定位清0,方法:将要清零的位与0相与,把要保留的位
与1相与。

2、逻辑或运算指令组
ORL A , #data ; A←(A)∨data
ORL A , direct ; A←(A)∨(direct)
ORL A, Rn ; A←(A)∨(Rn)
ORL A , Ri ; A←(A)∨((Ri))
ORL direct , #data; direct←(direct)∨data
ORL direct , A; direct←(direct)∨(A)
ﻩ例3、20 已知(A)=86H,试分析下面指令执行的结果:
(1)ORLA, #0FFH;
(2)ORL A, #0F0H;
(3)ORL A , #0FH;
(4)ORL A , #1AH;
解:(1)A=0FFH;
(2)A=0F6H;
(3)A=8FH;
(4)A=9EH。

由上例可知,逻辑或指令可用于将指定位置1,方法是将要置1的位与1相或,把要保留的位与0相或
3、逻辑异或运算指令组
XRL A , #data; A←(A) data
XRL A , direct ; A←(A)(direct)
XRL A , Rn ; A←(A)(Rn)
XRL A , Ri ; A←(A)((Ri))
XRLdirect , #data ; direct←(direct) data
XRL direct, A ; direct←(direct)(A)
例3、3、20已知(A)=86H,试分析下面指令执行的结果:
(1)XRL A , #0FFH;
(2)XRL A, #0F0H;
(3)XRL A, #0FH;
(4)XRL A , #1AH;
解:(1)A=79H;
(2)A=76H;
(3)A=89H;
(4)A=9CH。

4。

累加器清“0”和取反指令组
累加器清“0”指令CLR A ; A←0
累加器取反指令:CPL A; A ←(A)
5、移位指令组
(1)累加器循环左移RL A;
(2)累加器循环右移RR A;
(3)带进位循环左移RLC A;
(4)带进位循环右移RRC A;
例3。

3。

23
若累加器A中的内容为1000 1011B,CY=0,则执行RLC A指令后累加器A中的内容为00010110,CY=1
Ⅳ、控制转移类指令
1、无条件转移指令组:不规则条件的程序转移称为无条件转移
(1)长转移指令LJMP addr16; PC←addr16 转移范围:64KB
(2)绝对转移指令AJMPaddr11;PC←(PC)+2,PC10~0←addr11
指令功能:构造程序转移目的地址,实现程序转移
以指令提供的11位地址去替换PC的低11位内容,形成新的PC值,即转移的目的地址。

注意:PC是下一条指令的PC值,是本条指令地址加2以后的PC值例3、25 程序存储器1000H地址单元有绝对转移指令:
1000H AJMP 0750H
分析该指令的执行情况。

解:指令AJMP 0750H执行前,(PC)=1000H,取出该指令后PC当前值为1002H,指令执行的过程是将指令中的11位地址111 0101 0000B送入PC的低11位,得新的PC值为0001 01110101 0000B=1750H,因此指令AJMP0750H执行的结果就是转移到1750H处执行程序。

(3)短转移指令:SJMP rel 目的地址PC=(PC)+2+rel
例3、26 在1000H地址上有指令1000HSJMP 30H
则目的地址为1000H+02H+30H=1032H程序向前转移
假如指令为1000H SJMP 0E7H rel=0E7H,是负数19H的补码,
目的地址=1000H+02H-19H=0FE9H。

程序向后转移。

单片机程序设计时,通常用到一条SJMP指令:SJMP $或HERE: SJMP HE RE
以$代表PC的当前值
(4)变址寻址转移指令JMP A+DPTR ;PC←(A)+(DPTR)
目的地址=(A)+(DPTR)
例3、28 设累加器A中存放着待处理命令的编号(0~n ; n≤85),程序存储器中存放着标号为PGTAB的转移表,则执行以下程序,将依照A内命令编号转向相应的命令处理程序、PG: MOV B , #3
MULAB ; A←(A)*3
MOV DPTR , #PGTB ; DPTR←转移表首址
JMP A+DPTR
PGTB: LJMP PG0 ; 转向命令0处理入口
LJMP PG1 ; 转向命令1处理入口

LJMP PGn ; 转向命令n处理入口2、条件转移指令组:程序的转移时有条件的
(1)、累加器判零转移指令
JZ rel ; 若(A)=0,则PC←(PC)+2+rel、若(A)≠0,则PC←(PC)+2
JNZ rel ; 若(A)≠0,则PC←(PC)+2+rel、若(A)=0,则PC←(PC)+2
例3。

29编写程序将内部RAM以30H为起始地址的数据传送到50H为起始地址的内部RAM区域,遇0终止。

解: MOV R0 , #30H
MOV R1 , #50H
LOOP: MOV A, R0
JZ LOOP1
MOV R1 , A
INC R0
INC R1
SJMPLOOP
LOOP1: SJMP $
(2)数值比较转移指令:将两个操作数进行比较,比较结构作为条件来控制程序转移
CJNE A , #data, rel ; (A)≠data则转移
CJNE A , direct , rel ; (A)≠(direct)则转移
CJNERn , #data ,rel ; (Rn)≠data则转移
CJNE Ri , #data , rel ; ((Ri))≠data则转移
(3)减一非零转移指令
ﻩDJNZ Rn , rel ; Rn←(Rn)—1
; 若(Rn)≠0,则PC←(PC)+2+rel
; 若(Rn)=0,则PC←(PC)+2
DJNZ direct , rel ; Rn←(Rn)-1
; 若(direct)≠0,则PC←(PC)+3+rel
; 若(direct)=0,则PC←(PC)+3
例3。

29 编写程序将内部RAM以30H为起始地址的10个单元的数据传送到50H为起始地址的内部RAM区域,假如遇0终止。

解: MOVR0 , #30H
MOV R1 , #50H
MOV R7, #32
LOOP: MOV A, R0
JZ LOOP1
MOV R1 , A
INC R0
INC R1
DJNZ R7 , LOOP
LOOP1: SJMP $
For循环:MOV R6,#200
LOOP: NOP;
DJNZ R6,LOOP
3、子程序调用与返回指令:调用指令在主程序中使用,返回指令应该是子程序的最后一条指令。

执行完这条指令之后,程序返回主程序断点处接着执行
(1)长调用指令LCALL addr16 ; PC←(PC)+3
; SP←(SP)+1,(SP)←(PC)7~0
; SP←(SP)+1,(SP)←(PC)15~8
; PC←addr16
(2)绝对调用指令ACALLaddr11 ; PC←(PC)+2
; SP←(SP)+1,(SP)←(PC)7~0
; SP←(SP)+1,(SP)←(PC)15~8
; PC10~0←addr11
(3)子程序返回指令RET ;PC15~8←((SP)),SP←(SP)-1
; PC7~0←((SP)),SP←(SP)-1
(4)终端返回指令RETI ;PC15~8←((SP)),SP←(SP)—1
;PC7~0←((SP)),SP←(SP)-1
例3。

33 从片外数据存储器1000H单元开始有10个0~9之间的数,请求出相应数的平方并存入片内RAM 50H开始的存储单元,试编程实现。

解:主程序编程:
MAIN: MOV DPTR , #1000H
MOVR0, #50H
MOV R7 , #10 ;循环10次
LOOP: MOVX A , DPTR
ACALL QPF ;调用求平方的子程序
MOV R0 , A
INC R0
INC DPTR
DJNZ R7 , LOOP
SJMP $
子程序编程:
QPF: MOV B, A
MUL AB
RET
4、空操作指令NOP ;PC←(PC)+1
控制CPU不作任何操作,只消耗一个机器周期的时间
单字节指令,因此执行后PC加1,时间延续一个机器周期
Ⅴ。

位操作类指令(17条)
1。

位传送指令
MOV C , bit ; CY←(bit)
MOV bit , C ; bit←(CY)
例3。

34 例如将30H位的内容传送到40H位,试编程。

MOV 10H, C ;暂存CY内容
MOV C , 30H ;30H位送CY
MOV40H , C ;CY送40H
MOV C , 10H ;恢复CY内容
2。

位置位与清零指令
SETB C ;CY←1
SETBbit ;bit←1
CLRC;CY←0
CLRbit;bit←0
3、位运算指令组
ANLC, bit ;CY←(CY)∧(bit)
ANL C, /bit;CY←(CY)∧( )
ORL C , bit;CY←(CY)∨(bit)
ORLC, /bit;CY←(CY)∨( )
CPL C ;CY←()
CPL bit;bit←()
例3、35 设D、E、F代表位地址,试编程将位D、E的内容相异或,并把结果送到F中。

解:位D、E、F的关系为,
编制程序如下:
MOV C, D
ANL C , /E ; CY←
MOV F , C
MOV C , /D
ANL C , E; CY←
ORL C , F ;
MOV F , C ; 异或结果送F位
4。

位控制转移指令组
(1)以C状态为条件的位转移指令
ﻩJCrel; 若(CY)=1,则PC←(PC)+2+rel
; 若(CY)=0,则PC←(PC)+2
JNCrel ; 若(CY)=0,则PC←(PC)+2+rel
; 若(CY)=1,则PC←(PC)+2
(2)以位地址内容为条件的转移指令
JB bit , rel;若(bit)=1,则PC←(PC)+3+rel
;若(bit)=0,则PC←(PC)+3
JNB bit, rel;若(bit)=0,则PC←(PC)+3+rel
; 若(bit)=1,则PC←(PC)+3
JBC bit, rel ;若(bit)=1,则PC←(PC)+3+rel,; (bit)←0
;若(bit)=0,则PC←(PC)+3
流水灯,汇编
KEYBITP2、3
ORG 00H
LJMP MAIN
ORG 1000H
MAIN:MOV C,KEY
JC CON1 /*若C=1,跳转到CON1*/
ﻩMOVDPTR,#TAB1
ﻩ MOV R2,#8
SJMP CON2
CON1:MOVDPTR,#TAB2
MOV R2,#16
CON2:LCALLDISPLAY
SJMPMAIN
DISPLAY:MOV A,R2
ﻩMOVR6,A
ﻩﻩMOVA,#0
LOOP: MOV20H,A
MOVC A,A+DPTR
MOV P1,A
ﻩﻩLCALLDELAY
ﻩﻩMOV A,20H
ﻩINCA
ﻩﻩDJNZR6,LOOP
ﻩRET
DELAY:MOV R3,#200
D1:MOV R4,#200
D2:NOP
DJNZ R4,D2
DJNZ R3,D1
ﻩRET
ORG 2000H
TAB1:DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH
TAB2:DB7FH,0FFH,0BFH,0FFH,0DFH,0FFH,0EFH,0FFH,0F7H,0FFH,0FBH,0FF H,0FDH,0FFH,0FEH,0FFH
C51的数据类型:
Char: 单字节,能够存放一个字符。

Int: 整数,对大多数单片机开发软件而言是双字节大小
float: 单精度浮点数。

double :双精度浮点数。

单片机特有的数据类型
bitﻩ位变量,值为0或1
sbit 声明可位寻址空间的一个位
sfrﻩ特别功能寄存器,8位
sfr16 特别功能寄存器,16位
C51的存储模式:
Small模式,所有缺省变量参数均装入内部RAM。

优点是速度快,
缺点在于空间有限,仅适用于小规模程序设计、
pact模式,所有缺省变量均位于外部RAM区的一页(256个字节),具体哪一页可由P2口指定(在STARTUP。

A51文件中说明,也可用pdata指定)、
优点是可用空间较Small宽裕,
速度比Small慢但比Large要快、
Large模式,所有缺省变量可放在多达64KB的外部RAM区。

缺点是速度较前两种模式要慢。

第六章
什么是中断?MCS-51有几个中断源?中断请求如何提出?单片机如何进行中断的响应?
①单片机正常工作时,按用户程序逐条执行指令,假如系统中出现某些急需处理的事件,CPU
暂时终止当前的程序,转而去执行服务程序,以对发生的更紧迫的事件进行处理,待服务程序结束后,CPU自动返回原来的程序接着执行,这个过程就称为中断。

②MCS-51单片机有5个中断源:外部中断0、定时/计数器T0的溢出中断、外部中断1、定时/计数器T1的溢出中断、串行口收发中断,对应的中断请求标志为IE0、TF0、IE1、TF1、TI/RI。

③中断源产生中断信号后,中断系统把相应的中断标志置位,在中断允许的前提下,由中断标志触发中断请求。

④中断响应过程:第一步,关于外部中断,需要由CPU采样外部中断请求信号,若采样到后,把相就的中断请求标志置位;第二步,查询各个中断标志位;第三步,进行中断响应,由硬件自动生成一条长调用指令“LCALL#addr16”进行断点保护后转向中断服务程序。

1.中断控制
1)定时器控制寄存器TCON
(1)IE0和IE1:外部中断请求标志位
当CPU采样到INT0(或INT1)出现有效中断时,IE0(IE1)位由片内硬件自动置1;在中断响应完成时,转到中断服务程序时,再由片内硬件自动清零。

(2)IT0和IT1:外部中断请求信号触发方式控制位
IT0(IT1)=0时,INT0(或INT1)信号为低电平有效;IT0(IT1)=1时,INT0(或INT1)信号为脉冲负跳变有效。

IT0(IT1)由软件置1或清零、
(3)TF0和TF1:定时/计数器溢出标志位
T0(T1)发生计数溢出时,TF0(TF1)有片内硬件自动置一,当完成中断响应,并转向中断服务时,有片内硬件自动清零。

2)串行口控制寄存器SCON
(1)TI:串行口发送中断请求标志位
当串行口发送完一帧信号后,由片内硬件自动置1;在转向中断服务后,必须由软件清0。

(2)RI:串行口接收中断请求标志位
当串行口接收完一帧信号后,由片内硬件自动置1;在转向中断服务后,必须由软件清0。

3)中断允许控制寄存器IE
(1)EA:中断允许总控制位
EA=0,中断总禁止,禁止所有中断;EA=1,中断总允许,总允许后各个中断源的允许与禁止,还取决于各个中断源允许位的状态。

(2)EX0和EX1:外部中断允许控制位
EX0(EX1)=0,禁止外部中断INT0(INT1); EX0(EX1)=1,允许外部中断INT0(INT1)、
(3)ET0和ET1:定时器中断允许控制位
ET0(ET1)=0,禁止定时器0(定时器1)中断; ET0(ET1)=1,允许定时器0(定时器
1)中断。

(4)ES:串行中断允许控制位
ES=0,禁止串行(TI或RI)中断;ES=1,允许串行(TI或RI)中断
4)中断优先级控制寄存器IP:MCS-51有高,低两个中断优先级
其中与中断有关的共5位:
①PX0:外部中断0(INT0)优先级设定位;
②PT0:定时器0(T0)优先级设定位;
③PX1:外部中断1(INT1)优先级设定位;
④PT1:定时器1(T1)优先级设定位;
⑤PS:串行中断优先级设定位。

对IP的各个对应位置1或清0决定,设定为0时为低优先级,设定为1时为高优先级。

例6、2在图6。

6中,P1、0~P1、3接有4个开关,P1。

4~P1、7接有4个发光二极管,消抖电路用于产生中断请求信号,当消抖电路的开关来回拨动一次将产生一个下跳变信号,向CPU申请中断,要求:初时发光二极管全黑,每中断一次,P1、0~P1、3所接的开关状态反映到发光二极管上,且要求开关合上时对应发光二极管亮、
解:编程如下:
ORG 0000H
AJMP MAIN
ORG 0003H;外部中断0入口
AJMP SER_INT0 ;转中断服务程序
ORG 0100H ;主程序
MAIN: MOV P1, #0FH ;熄灭发光二极管
且对开关输入端先输出1
SETB IT0 ;脉冲触发方式
SETB EX0 ;允许中断
SETB EA;总中断允许
AJMP $ ;等待中断
SER_INT0: MOV P1, #0FH ;熄灭发光二极
管且对开
关输入端先输出1
MOV A, P1;输入开关状

CPL A ;状态取反
ANL A , #0FH ;屏蔽A的高半字

SWAP A ;A高低半字节交换
MOV P1 , A ;开关状态输出
RETI;中断返回
例6、3 用C语言对例6。

2的任务进行编程
解:编程如下:
#include<reg51、h>
void int0() interrupt 0 /*中断函数*/

P1=0x0f; /*熄灭发光二极管且对开关输入端先输出1*/
P1〈〈=4; /*读入开关状态,并左移四位,使开关反映在发光二极管上*/ ~P1; /*对P1口内容取反*/
}
main() /*主函数
{
EA=1; /*开中断总开关*/
EX0=1; /*允许中断*/
IT0=1; /*负跳沿产生中断*/
while(1) ; /*等待中断*/
}
中断控制数码管显示
#include〈reg51、h>
sbit key=P3^2;
inta[]={0x40,0x79,0x24,0x30,0x1
9,0x12,0x02,0x78,0x00,0x10};
inti=0;
void delay(intn)

ﻩint i,j;
ﻩfor(i=0;i<n;i++)
ﻩﻩfor(j=0;j<125;j++);
}
void int0() interrupt 0

delay(30);
if(key==0)P2=a[i];
ﻩi++;
ﻩif(i==10)i=0;
}
void main()

EA=1;
ﻩEX0=1;
ﻩIT0=1;
ﻩwhile(1);

2.定时/计数器控制
1)定时/计数器控制寄存器TCON
(1)TF0和TF1:定时/计数器溢出标志位
T0(T1)发生计数溢出时,TF0(TF1)有片内硬件自动置一,当完成中断响应,并转向中断服务时,有片内硬件自动清零。

(2)TR0和TR1:定时/计数器运行控制位
TR0(TR1)=0,停止定时/计数器0(定时/计数器1)工作;TR0(TR1)=1,启动定时/计数器0(定时/计数器1)工作、该位依照软件置1或清0;
2)工作方式控制寄存器TMOD
(1)GATE:门控位、
GATE=0,若TCON中的TR0或TR1=1,则起启动定时/计数器;
GATE=1,若TCON中的TR0或TR1=1,则起启动定时/计数器,同时外部中断引脚INT0或INT1也为1,才启动定时/计数器。

(2)C/T:计数方式或定时方式选择位:
C/T=0,选择定时方式;C/T=1,选择计数方式、
定时/计数器工作方式:
1.工作方式0
方式0是13位计数结构的工作方式,其计数器由TH0全部8位和TL0的低5位构成,T L0的高3位弃之不用。

定时时间=(213—计数器初值)×机器周期
或定时时间=(213-计数器初值)×晶振周期×12
若晶振频率为12MHZ,
则最长定时时间为(213-0)×(1/12)×12×10-6 =8192us
最短定时时间为(213-(213-1))×(1/12)×12×10—6 =1us
2.工作方式1
方式1是16位计数结构的工作方式,计数器由TH0全部8位和TL0全部8位构成、
定时时间=(216-计数器初值)×机器周期
或定时时间=(216—计数器初值)×晶振周期×12
若晶振频率为12MHZ,
则最长定时时间为(216-0)×(1/12)×12×10—6 =65536us
最短定时时间为(216-(216—1))×(1/12)×12×10-6=1us。

3、工作方式2
它具有自动重新加载功能,即自动加载计数初值、
初始化时,8位计数器初值同时装入TL0和TH0中
当TL0计数溢出时,置位TF0,同时把保存在TH0中的计数初值自动加载TL0,然后TL0重新计数。

如此重复不止
8位计数结构,计数值有限,最大只能到255
当C/ T=0时,TL0(TL1)对机器周期计数,可作为定时器使用。

定时时间的计算公式为
定时时间=(28-计数器初值)×机器周期
或定时时间=(28-计数器初值)×晶振周期×12
若晶振频率为12MHz,
则最长定时时间为
(28—0)×(1/12)×10-6×12=256µs
最短定时时间为
(28—(28-1))×(1/12)×10-6×12=1µs
当C/ T=1时, TL0(TL1)对外部计数脉冲计数,作为计数器使用, 最大计数值为28=256。

4、工作方式3(省略)。

定时器/计数器的初始化步骤
①确定定时器/计数器的工作方式,确定方式控制字,写入方式控制字寄存器TMOD;
②依照要求计算定时器/计数器的初值,并写入TH0、TL0或TH1、TL1;
③如用中断方式编程,须对中断允许寄存器IE编程,必要时也须对中断优先级寄存器
IP编程;
④设置定时器控制器中的TR1或TR0,启动定时器/计数器;
⑤定时/计数时间到,如用中断方式编程,则执行中断服务程序;如用查询方式编程,则
查询溢出标志,当溢出标志等于1,则转入相应程序、
例6。

4 设单片机的fOSC=12MHz,要求用定时器/计数器T0以1在P1、0脚上输出周期为4ms的方波、
解:P1、0每2ms取反一次即可。

f OSC=12MHz,T0工作于方式1,方式控制字设定为00000001B=01H
最大定时值为216×机器周期=65536µs=65、536ms,满足2ms定时要求,
初值X=216—(12/12)×2000=65536-2000=63536=0F830H、
1)采纳中断方式编程
(1)汇编程序:
ORG0000H
LJMP MAIN
ORG 000BH
AJMP SER_T0
ORG 0100H
MAIN: MOV TMOD , #01H ;写入方式控制字
MOVTH0 , #0F8H ;写入计数初值
MOVTL0 , #30H
SETB EA ;开总中断
SETB ET0;开T0中断
SETBTR0;启动T0
SJMP $ ;等待中断SERT0: MOVTH0, #0F8H ;重新写入计数初值
MOV TL0, #30H
CPL P1。

0 ;输出取反
RETI
END
(2)C语言程序
#include<reg51、h〉
sbit P1_0=P1^0;
voidmain(void)

TMOD=0x01; /*定时器/计数器0工作在定时器方式1 */ P1_0=0; /*P1、0输出0 */
TH0=(65536-2000)/256; /*预置计数初值*/
TL0=(65536-2000)%256;
EA=1; /* CPU开中断*/
ET0=1; /*定时器/计数器0开中断*/
TR0=1; /*启动定时器/计数器0 */
do {}while(1); /*等待中断*/
}
void timer0(void) interrupt1using1/* 定时器/计数器0中断服务程序入口*/

TH0=(65536-2000)/256; /* 计数初值重装载*/ TL0=(65536—2000)%256;
P1_0=!P1_0; /* P1。

0取反*/
}
单片机的串行通信
发送:MOV SBUF, A 接收:MOV A, SBUF
1)串行控制寄存器SCON
位地址9FH9EH9DH9CH 9BH 9AH 99H 98H 位符号SM0 SM1 SM2 REN TB8 RB8 TI RISM0和SM1为工作方式选择位,可选择四种工作方式:
REN:允许接收控制位。

当REN=1,则允许接收,当REN=0,则禁止接收、
TB8:发送数据的第9位。

在方式2或方式3中,是发送数据的第九位
RB8:接收数据的第9位。

在方式2或方式3中,是接收到数据的第九位
TI:发送中断标志位。

TI=1,表示帧发送完毕,其状态可请求中断、TI必须由软件清零。

RI:接收中断标志位。

RI=1,表示帧接收完毕,其状态可请求中断。

RI必须由软件清零、2)
当SMOD=1,串行口波特率加倍,系统复位时,SMOD=0。

②GF1、GF0:通用标志位
③PD:CHMOS器件的低功耗控制位
当PD=0时,正常工作方式;PD=1时,掉电工作方式、
④IDL:芯片IDLE模式设置位
当IDL=0时,正常工作方式;IDL=1时,空闲工作方式、
串行通信的工作方式及波特率设置
1。

串行工作方式0
串行口可作为同步移位寄存器使用,常用于扩展I/O口
RXD/P3。

0端:输入或输出串行数据
TXD/P3、1端:输出移位时钟,作为外接部件的时钟信号
发送和接收均为8位数据,低位在先,高位在后。

波特率固定为fosc/12。

(1)方式0输出
“串入并出"的移位寄存器
(如74LS164、74HC164、CD4094)
MOV SBUF , A
8位数据全部输出完后,中断标志TI自动置1,
串行口停止移位,完成一个字节的输出
(2)方式0输入
“并入串出"的移位寄存器
(如74LS165、74HC165、CD4014)
MO V A,SBUF
经过8次移位,外部寄存器74LS 165的8位并入数据移入内部移位寄存器,并使中断标志RI 自动置1,停止移位,完成一个字节的输入。

2、串行工作方式1
为波特率可变的8位数据的异步通信接口 TXD 为数据发送引脚,RX D为数据接收引脚。

起始
0D 1D 2D 3D 4D 5D 6D 7D 停止
☞波特率可变--用定时器T1作波特率发生器: 公式:波特率 =
(1)方式1输出
执行任何一条写SB UF的指令(如MOV SBUF , A)时,就启动了串行口发送、在串行口由硬件自动加入起始位和停止位,在发送移位时钟(由波特率确定)的作用下,从T XD 引脚发送一帧信息,先送出起始位(0),接着从低位开始依次输出8位数据,最后输出停止位1、一帧10位数据发送完后,将中断标志TI 置1,CP U执行程序判断TI=1后或转中断服务程序后由软件把TI 清0。

(2)方式1输入
软件使R EN =1和RI=0时,就允许接收器接收。

当检测到RXD 引脚输入电平发生负跳变时,则说明起始位有效,将其移入输入移位寄存器,并开始接收这一帧信息的其余位、采样数据从输入移位寄存器右边移入,起始位0移至输入移位寄存器最左边时,控制电路进行最后一次移位,把移位寄存器的内容(9位)分别装入SB UF 和RB8,其中前8位装入接收数据缓冲器SBUF,最后1位停止位装入R B8,并置RI=1,向CPU 请求中断。

此时要求①RI=0;②S M2=0或接收到的停止位=1。

如这两个条件任一不满足,所接收的数据帧就会丢失,且RI 仍为0。

如要再接收数据,就再用软件将RI 清0、 3、串行工作方式2和方式3
方式2或方式3时为11位数据的异步通信口、 TXD 为数据发送引脚,RX D为数据接收引脚 、
起始
0D 1D 2D 3D 4D 5D 6D 7D 停止
8D
第九位由软件置1或清0,发送时在S CON 的TB8中,接收时存入SC ON 的R B8中 方式2和方式3的工作原理类同,唯一的差别是波特率不同 (1)方式2和方式3输出
发送前,先由软件设置TB 8、执行任何一条写SBUF 的指令(如M OV SBUF , A)时,就启动了串行口发送。

串行口能自动把TB8取出,并装到第9位数据的位置,8位数据装入S BUF 。

发送开始时,先把起始位0输出到TXD 引脚,然后是9位数据位,最后是停止位1。

一帧1。

相关文档
最新文档