单片机期末总结材料 最完整版

合集下载
  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口的第二功能。

P3的第二功能:
【注】:P0口必须接上拉电阻;
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) 振荡周期是指为单片机提供脉冲信号的振荡源的周期,是单片机最基本的时间单位。

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

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

时钟周期是振荡周期的二倍。

3)机器周期是指令执行过程中完成某一个基本操作所需的时间。

一个机器周期等于12个振荡周期。

即OSC M f T 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条)
MOV direct,#data;
MOV direct,direct;
MOV direct,A;
MOV direct,Rn;
MOV direct,Ri;
(4)以寄存器间接寻址为目的操作数的指令(3条)
MOV Ri,#data;
MOV Ri,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 要求把外部RAM 60H单元中的数据8BH传送到部RAM 50H中,试编程。

解法1:MOV R0 , #60H ;(R0)=60H
MOVX A , R0 ;(A)=8BH
MOV 50H , 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: MOV DPTR , #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条指令:
XCH A , Rn ;(A)←(Rn)
XCH A , direct ;(A)←(direct)
XCH A , Ri ;(A)←((Ri))
(2)半字节交换指令
源操作数与累加器A进行低4位的半字节数据交换,
只有1条指令:
XCHD A , 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
解:1001 0111
+ 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
INC Rn ; Rn←(Rn)+1
INC direct ; direct←(direct)+1
INC Ri ;(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,
执行如下指令:
INC A
INC R3
INC 30H
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
DEC Rn ; Rn←(Rn)﹣1
DEC direct ; direct←(direct)﹣1
DEC Ri ;(Ri)←((Ri))﹣1
减1操作不影响PSW的状态,只有DEC A影响奇偶标志位P
只有数据指针DPTR加1指令,而没有DPTR减1指令,如果要在程序设计中进行DPTR-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.乘法指令
MUL AB
16位乘积的低位字节放在A中,高位字节放在B中
乘法运算影响PSW的状态:进位标志CY总是被清“0”,溢出标志位状态与乘积有关
例3.3.16已知(A)=80H(即十进制数128),(B)=40H(即十进制数64),
执行指令:MUL AB
执行结果:乘积为2000H(十进制数为8192), (A)=00H,(B)=20H,CY=0,OV=1
4.除法指令
DIV AB
被除数: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
1110 1100
0110 0110 ;加66H调整
1 0101 0010
最终结果为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)ORL A , #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))
XRL direct , #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中的容为0001 0110,CY=1
Ⅳ.控制转移类指令
1.无条件转移指令组:不规则条件的程序转移称为无条件转移
(1)长转移指令L JMP addr16; PC←addr16 转移围:64KB
(2)绝对转移指令AJMP addr11;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 0111 0101 0000B=1750H,所以指令AJMP 0750H执行的结果就是转移到1750H 处执行程序。

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

程序向后转移。

单片机程序设计时,通常用到一条SJMP指令:SJMP $或HERE:SJMP HERE
以$代表PC的当前值
(4)变址寻址转移指令JMP A+DPTR ;PC←(A)+(DPTR)
目的地址=(A)+(DPTR)
例3.28 设累加器A中存放着待处理命令的编号(0~n ; n≤85),程序存储器中存放着标号为PGTAB的转移表,则执行以下程序,将根据A命令编号转向相应的命令处理程序。

PG: MOV B , #3
MUL AB ; 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
SJMP LOOP
LOOP1: SJMP $
(2)数值比较转移指令:将两个操作数进行比较,比较结构作为条件来控制程序转移
CJNE A , #data , rel ; (A)≠data则转移
CJNE A , direct , rel ; (A)≠(direct)则转移
CJNE Rn , #data ,rel ; (Rn)≠data则转移
CJNE Ri , #data , rel ; ((Ri))≠data则转移
(3)减一非零转移指令
DJNZ Rn , rel ; R n←(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终止。

解:MOV R0 , #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)绝对调用指令ACALL addr11 ; 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
MOV R0 , #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
MOV 40H , C ;CY送40H
MOV C , 10H ;恢复CY容
2.位置位与清零指令
SETB C ;CY←1
SETB bit ;bit←1
CLR C ;CY←0
CLR bit ;bit←0
3.位运算指令组
ANL C , bit ;CY←(CY)∧(bit)
ANL C , /bit ;CY←(CY)∧()
ORL C , bit ;CY←(CY)∨(bit)
ORL C , /bit ;CY←(CY)∨()
CPL C ;CY←()
CPL bit ;bit←()
例3.35 设D、E、F代表位地址,试编程将位D、E的容相异或,并把结果送到F中。

解:位D 、E 、F 的关系为,E D E D E D 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 状态为条件的位转移指令
JC rel ; 若(CY )=1,则PC←(PC )+2+rel
; 若(CY )=0,则PC←(PC )+2
JNC rel ; 若(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
流水灯,汇编 KEY BIT P2.3
ORG 00H
LJMP MAIN
ORG 1000H
MAIN:MOV C,KEY
JC CON1 /*若C=1,跳转到CON1*/
MOV DPTR,#TAB1
MOV R2,#8
SJMP CON2
CON1:MOV DPTR,#TAB2
MOV R2,#16
CON2:LCALL DISPLAY
SJMP MAIN
DISPLAY:MOV A,R2
MOV R6,A
MOV A,#0
LOOP: MOV 20H,A
MOVC A,A+DPTR
MOV P1,A
LCALL DELAY
MOV A,20H
INC A
DJNZ R6,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:DB
7FH,0FFH,0BFH,0FFH,0DFH,0FFH,0EFH,0FFH,0F7H,0FFH,0FBH,0FFH,0FDH,0FFH,0FEH,0FFH C51的数据类型:
Char:单字节,可以存放一个字符。

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

double :双精度浮点数。

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

优点是速度快,
缺点在于空间有限,仅适用于小规模程序设计。

Compact模式,所有缺省变量均位于外部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”进行断点保护后转向中断服务程序。

串行通信完成一帧数据发送或接收
串行口中断TI/RI
0023H
3.0RI 3.1TI
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;
int
a[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; int i=0;
void delay(int n)
{
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,选择计数方式。

(3)M1,M2:工作方式选择位
M1 M0 工作方式功能说明
0 0 方式0 13位定时器/计数器
0 1 方式1 16位定时器/计数器
1 0 方式
2 8位自动重装初值定时器/计数器
1 1 方式3 T0分成两个独立的8位定时器/计数器;T1此方式停止计数
定时/计数器工作方式:
1.工作方式0
方式0是13位计数结构的工作方式,其计数器由TH0全部8位和TL0的低5位构成,TL0的高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 设单片机的f OSC=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)汇编程序:
ORG 0000H
LJMP MAIN
ORG 000BH
AJMP SER_T0
ORG 0100H
MAIN: MOV TMOD , #01H ;写入方式控制字MOV TH0 , #0F8H ;写入计数初值
MOV TL0 , #30H
SETB EA ;开总中断
SETB ET0 ;开T0中断
SETB TR0 ;启动T0
SJMP $ ;等待中断
SERT0: MOV TH0 , #0F8H ;重新写入计数初值MOV TL0 , #30H
CPL P1.0 ;输出取反
RETI
END
(2)C语言程序
#include <reg51.h>
sbit P1_0=P1^0;
void main(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) interrupt 1 using 1/* 定时器/计数器0中断服务程序入口*/
{
TH0=(65536-2000)/256; /* 计数初值重装载*/
TL0=(65536-2000)%256;
P1_0=!P1_0; /* P1.0取反*/
}
单片机的串行通信
发送:
MOV SBUF, A 接收:MOV A, SBUF 1) 串行控制寄存器SCON
位地址
9FH 9EH 9DH 9CH 9BH 9AH 99H 98H 位符号
SM0 SM1
SM2
REN
TB8
RB8
TI
RI
SM0和SM1为工作方式选择位,可选择四种工作方式:
SM2:多机通信控制位。

SM2=1,允许多机通信。

REN :允许接收控制位。

当REN=1,则允许接收,当REN=0,则禁止接收。

TB8:发送数据的第9位。

在方式2或方式3中,是发送数据的第九位
SM0 SM1 工作方式 功能
波特率
0 0 方式0 8位同步移位寄存器 Fosc/12 0 1 方式1 10位异步收发 可变
1 0 方式
2 11位异步收发 Fosc/32或Fosc/64 1 1
方式3
11位异步收发
可变。

相关文档
最新文档