资源描述
MCS-51单片机
8051单片机是8位单片机,有40个管脚,8根数据线,16根地址线。
单片机的八大组成部分:CPU 、ROM、RAM、I/O 、定时/计数器、串口、SFR、中断服务系统
一、MCS-51机的内存结构 (如图1所示)
60KB
外部ROM
64KB
外部
RAM
4KB
内部
EA = 1
4KB
外部
EA = 0
特殊功能寄存器
内部RAM
FFFFH
FFFFH
1000H
0FFFH 0FFFH FFH
80H
7FH
0000H 0000H 00H 0000H
7F
程序存储器 内部数据存储器 外部数据存储器
图1 MCS-51机的内存结构
物理上分为:4个空间, 片内ROM、片外ROM
片内RAM、片外RAM
逻辑上分为;3个空间, 程序内存(片内、外)统一编址 MOVC
数据存储器(片内) MOV
数据存储器(片外) MOVX
1、程序内存
寻址范围:0000H ~ FFFFH 容量64KB
EA = 1,寻址从内部ROM;EA = 0,寻址从外部ROM
地址长度:16位 存储器地址空间为64KB
作用: 存放程序及程序运行时所需的常数。
8051 单片机6个具有特殊含义的单元是:0000H —— 系统复位,PC指向此处;
0003H —— 外部中断0入口
000BH —— T0溢出中断入口
0013H —— 外中断1入口
001BH ——T1溢出中断入口
0023H —— 串口中断入口
2、内部数据存储器
物理上分为两大区:00H ~ 7FH即128B内RAM 和 SFR区。如图2所示。
7FH
资料缓冲区
堆栈区 80字节 数据缓冲器用
工作单元
30H
2FH
位地址: 16字节
00H~7FH 128 可位寻址位
20H
1FH 3区
2区
1区 32字节 4组R0~R7工作寄存器
0区
00H
图2 内部数据存储器
二、 殊功能寄存器SFR
寻址空间离散分配在:80H ~ FFH ,
注意PC不在此范围内。地址末尾为0或8的SFR具有位寻址功能
1、 CPU是运算器加控制器
2、 算术运算寄存器
(1)累加器A(E0H)
(2)B寄存器:乘、除法运算用
(3)程序状态字PSW寄存器:包含程序运行状态信息。
PSW CY AC FO RS1 RS0 OV — P
CY(PSW.7) —— 进位/借位标志;位累加器。
AC (PSW.6)—— 辅助进/借位标志;用于十进制调整。
F0 (PSW.5) —— 用户定义标志位;软件置位/清零。
OV (PSW.2)—— 溢出标志; 硬件置位/清零。
P (PSW.0) —— 奇偶标志;A中1的个数为奇数 P = 1;否则 P = 0。
RS1、RS0 ——寄存器区选择控制位。
0 0 : 0区 R0 ~ R7
0 1 : 1区 R0 ~ R7
1 0 : 2区 R0 ~ R7
1 1 : 3区 R0 ~ R7
2、指针寄存器
(1)程序计数器PC
PC的内容是指明即将执行的下一条指令的地址,16位,寻址64KB范围,
复位时PC = 0000H 具有自动加1功能 不可寻址即不能通过指令访问。
(2)堆栈指针SP
指明栈顶元素的地址,8位,可软件设置初值,复位时SP = 07H
(3)数据指针DPTR
@R0、@R1、@DPTR;指明访问的数据存储器的单元地址,16位,寻址范围64KB。 DPTR = DPH + DPL,也可单独使用。没有自动加1功能 通过软件 INC DPTR 内容加1
时序
单片机内的各种操作都是在一系列脉冲控制下进行的,而各脉冲在时间上是有 先后顺序的,这种顺序就称为时序。
执令周期:即从取指到执行完,所需时间。
不同机器指令周期不一样;即使相同机器,不同的指令其指令周期也不一样。
机器周期:机器的基本操作周期。
一个指令周期含若干机器周期(单、双、四周期)
状态周期:一个机器周期分6个状态周期Si
每个状态周期含两个振荡周期,即相位P1、P2。
振荡周期:由振荡时钟产生。
振荡周期Tosc = 1/fosc
一个机器周期 = 12个振荡周期 = 12×1/fosc 。
例如,若fosc = 12MHz,则一个机器周期 = 1μs。
时钟的产生:
通过XTAL1(19)、XTAL(18)。这两个管脚外部加石英晶体和电容组成振荡器
系统复位
通过给RST管脚加高电平理论上大于两个机器周期,实际大于10ms,系统复后
除了SP=07H ,P0、P1、P2、P3为FFH外,所有的寄存器均为00H,PC=0000H,PSW=00H 工作寄存器组R0~R7工作在0组。
并行I/O端口
并行I / O端口
四个8位I/O口P0、P1、P2、P3
作为通用I / O使用, 是一个准双向口:
“读管脚在输入数据时应先把口置1,使两个FET都截止,引脚处于悬浮状态,可作高阻抗输入” MOV P1.#0FFH
MOV A,P1
读端口数据方式是一种对端口锁存器中数据进行读入的操作方式,CPU读入的这个数据并非端口引脚的数据。(对端口进行读-修改-写类指令 列如 CPL P1.0是读端口锁存器而不是管脚)
一、P0口地址80H系统复位后P0=FFH
(1) P0口可作通用I / O口使用,又可作地址/数据总线口;
(2)P0既可按字节寻址,又可按位寻址;
(3)P0作为输入口使用时:是准双向口;
(4)作通用I / O 口输出时:是开漏输出;(外部管脚必须接上拉电阻)
(5)作地址/数据总线口时,P0是一真正双向口,分时使用,提供地址线 A0~A7由ALE控制信号锁存,数据线D0~D7
二、P1口地址90H地址90H系统复位后P1=FFH
2、特点
(1)无地址/数据口功能
(2)可按字节寻址,也可按位寻址
(3)作I / O输入口时:是一准双向口,不是开漏输出(无需外接上拉电阻)。
三、P2口地址A0H系统复位后P2=FFH
2、特点
(1)当P2口作为通用I / O时,是一准双向口。
(2)从P2口输入数据时,先向锁存器写“1”。
(3)可位寻址,也可按字节寻址
(4)可输出地址高8位A8~A15。
四、P3口地址B0H系统复位后P3=FFH
2、特点
(1)作通用I / O时,是一准双向口,不是开漏输出(无需外接上拉电阻)。
(2)P3口具有第二功能
1、P0口:地址低8位与数据线分时使用端口,
2、P1口:按位可编址的输入输出端口,
3、P2口:地址高8位输出口
4、P3口:双功能口。若不用第二功能,也可作通用I / O 口。
5、按三总线划分:
地址线:P0低八位地址,P2高八地址;
数据线:P0输入输出8位数据;
控制线:P3口的8位(RXD、TXD、INT0、INT1、T0、T1、WR*、RD*加上PSEN*、ALE、EA组成制总线。)
中断系统
五个中断源,两个优先级
一、 中断请求源(“五源中断”)
五个中断源: 入口地址
外部中断0(/INT0) 0003H
T0溢出中断 000BH
外部中断1(/INT1) 0013H
T1溢出中断 001BH
串口中断 0023H
有了中断请求,如何通知CPU?
通过中断请求标志位来通知CPU。
外部中断源、定时/计数器的中断请求标志位分布在 TCON中;
串口中断标志位分布在 SCON中。
TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
SCON TI RI
中断请求标志位
IE0(INT0) IE1(INT1) TF0(T0) TF1(T1) TI/RI(串口)
TF1—— T1的溢出中断标志。
硬件置1,硬件清0(也可软件清0)。
TF0—— T0的溢出中断标志。(同TF1,只是针对T0的)
IE1 —— 外部中断1(/INT1)请求标志。
外部有中断请求时,硬件使IE1置1,硬件清0。
IE0 —— 外部中断0(/INT0)请求标志。
IT1 —— 外部中断1(/INT1)触发类型控制位。
IT1 = 0 ,低电平触发。
IT1 = 1 , 下降沿触发。
IT0 —— 外中断0(/INT0)触发类型控制位,用法同IT1。
外部中断INT0、INT1 触发方式有电平触发和跳变触发
TI —— 串口发送中断标志位。
发送完数据,硬件使TI置1,软件清0(CLR TI)
RI —— 串行口接收中断标志位。
硬件置1,软件清0。
二、 中断控制(两级管理)
1、中断屏蔽
在中断源与CPU之间有一级控制,类似开关,其中第一级为一个总开关,
第二级为五个分开关,由IE控制。
IE EA ES ET1 EX1 ET0 EX0
EA —— 总控制位
ES —— 串口控制位 若为“1”,允许(开关接通)
ET1—— T1中断控制位 若为“0”,不允许(开关断开)
EX1—— /INT1控制位 例如,SETB EA
ET0—— T0中断控制位 CLR IE.7
EX0—— /INT0控制位
2、中断优先级
为什么要有中断优先级?
CPU按中断申请时间先后顺序响应中断,同一时间只能响应一个中断请求。
若同时来了两个或两个以上中断请求CPU响应高级别中断。为此将5个中断源分成高级、低级两个级别,高级优先,由IP控制。同时同级的中断源申请中断CPU按优先顺序响应中断。
IP PS PT1 PX1 PT0 PX0
以上各位与IE的低五位相对应,为“1”时为高级。初始化编程时,由软件确定。
例如,SETB PT0 或SETB IP.1
CLR PX0等。
同一级中的5个中断源的优先顺序是:(注意是同级)
/INT0中断 高
T0中断 厂家出厂时已固化好顺序
/INT1中断 ——事先约定
T1中断
串口中断 低
中断嵌套 同级或低级中断不能打断正在响应的中断的服务程序,高级中断能够打断低级中断服务程序而形成中断嵌套
定时/计数器
定时 / 计数器 两个定时器/计数器T0 、T1 四种工作方式
中断方式定时器程序初始化主要部分如下
MOV TMOD,#DATA ;设置定时器工作方式
MOV TH0(TH1),# DATA;给定时器计数器装入初值
MOV TL0(TL1),# DATA
SETB EA ;开中断
SETB ET0(ET1) ;开中断
SETB TR0(TR1) ;启动定时器计数器
一、定时 / 计数器的结构
T0、T1均为16位加1计数器。
计数值高八位
计数值低八位
计数值高八位
计数值低八位
TH0 TH1
TL0 TL1
工作方式
控制字
TMOD
工作方式 TCON
1、工作方式控制寄存器 TMOD
T1 T0
TMOD GATE C//T M1 M0 GATE C//T M1 M0
GATE —— 门控位。
GATE = 0 软件启动,仅由软件置TR0(TR1)为1启动定时器/计数器;置0停止定时/计数
GATE = 1 硬件启动,软件置TR0(TR1)为1后 .INT0 管脚或 /INT1管脚高电平启动定时器/计数器。
C//T —— 外部计数器 / 定时器方式选择位
C//T = 0 定时方式;
C //T = 1 计数方式。
M1M2 —— 工作模式选择位。
M1 M0 模式 说明
0 0 0 13位定时/计数器 八位TH(7 ~ 0)+ 低五位TL(4 ~ 0)
0 1 1 16位定时/计数器 TH(7 ~ 0)+ TL(7 ~ 0)
1 0 2 8位计数初值自动重装 TL(7 ~ 0) TH(7 ~ 0)
1 1 3 T0工作在两个8位定时/计数。运行,而T1只能工作方式2,
TCON TR1 TR0
TR0 —— 定时 / 计数器0运行控制位。
软件置位,软件复位。
与GATE有关,分两种情况:
GATE = 0 时,若TR0 = 1,开启T0计数工作;
若TR0 = 0,停止T0计数。
GATE = 1 时,若TR0 = 1 且/INT0 = 1时,开启T0计数;
若TR0 = 1 但 /INT0 = 0,则不能开启T0计数。
若TR0 = 0, 停止T0计数。
TR1 —— 定时 / 计数器1运行控制位。
用法与TR0类似。
C//T = 0 ——定时
C//T = 1 —— 对外计数。
定时:fosc / 12 = 1 /(12/fosc) = 1 / Tcy
等间隔,次数已定,时间确定
Tcy 即对机器周期进行计数。
左图定时时间为n×Tcy。
n
计数:脉冲不等间隔。
外部管脚输入(T0 P3.4、T1 P3.5 )每个下降沿计数一次
确认一次负跳变需两个机器周期,(要求计数脉冲的高、低
电平要大于一个机器周期)所以,计数频率最高为fosc / 24。
定时器初值计算
计数脉冲的个数 N=t(定时时间)/Tcy(机器周期
计数初值X=M(定时计数器的模)-N
方式0 X=213-N =8192-N
方式1 X=216-N=65536-N
方式2 X=28-N=256-N
推荐工作方式1 和方式2
例1、设计一个P1.0能产生t=1ms的周期信号发生器,主频试编程。
解:选T0; C//T=0,GATE= 0定时时间0.5ms
N = t / Tcy= t /(12×(1/fosc))= 500
所以, X = M - 500 ,问:M取多少?
模式0、模式1均可,取模式1,M=216
X = 65536-500=65036 = FE0CH
TH0 0FEH
TL0 0CH
程序:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP INSE1
ORG 1000H
MAIN: MOV SP,#60H
MOV TL0,#0CH
MOV TH0,#0FEH
MOV TMOD,#01H
SETB TR0;
SETB ET0;
SETB EA
SJMP $
INSE1: MOV TL0,#0CH
MOV TH0,#0F0H
CPL P10
RETI
单片机串行接口
8051单片机有一个异步全双工串行通讯口 通过RXD(P3.0)接收 ,通过TXD(P3.1)发送,(串行通信有单工、半双工、全双工) ,8051单片机串行口有4种工作方式。
异步通信一帧数据的格式如下
空闲位 起始位 5 ~ 8位数据 奇偶校验位 停止位 空闲位
3、串行通信方向
A B
发 单工 收
A B
发 半双工 发
收 收
A 全双工 B
发 收
收 发
4、波特率
即串行通信速率。 b/s 、 bps
举例、设有一帧信息,1个起始位、8个数据位、1个停止位,传输速率为
240个字符。求波特率。
解:
(1+8+1)×240 = 2400 b/s = 2400波特。
5、串行通信接口
发送: CPU 通过指令MOV SBUF,A 来启动发送 发送一帧数据完毕后TI置1,通过查询方式查询到TI=1或中断方式可以继续发送下一帧数据,并软件复位TI=0 (CLR TI)
D7 D6 D5 D4 D3 D2 D1 D0 发送数据寄存器
SBUF(99H)
1 D7 D6 D5 D4 D3 D2 D1 D0 0 发送数据
发送时钟
接收: 必须置位寄存器 SCON, REN位为1才能启动串口接收数据,当接收一帧数据后,RI置1 ,CPU通过查询RI=1或中断方式,通过指令 MOV A.SBUF 来取走接收的数据,并软件复位RI=0(CLR RI)
接收时钟
0 D0 D1 D2 D3 D4 D5 D6 D7 1 接收数据
D0 D1 D2 D3 D4 D5 D6 D7 接收数据寄存器
SBUF(99H)
CPU
二、MCS-51机串行接口
单片机内有:通用异步接收/发送器 UART
全双工,4种工作方式,波特率可编程设置,可中断。
1、串口的组成
从编程角度讲来看主要由以下寄存器组成。
PCON SMOD
SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
SBUF D7 D6 D5 D4 D3 D2 D1 D0 SBUF发
SBUF收
SM0、SM1:工作方式选择位
SM2:多机通信控制位,常与RB8配合,决定是否激活RI
REN:允许接收
TB8:发送的第九位数
RB8:接收的第九位数
TI :中断标志
RI
SMOD:波特系数选择位,0 —— 20 = 1
1 —— 21 = 2
2、串行口的工作方式
(1)SM0、SM1=00;方式0:是8位同步移位寄存器方式,波特率固定为fosc / 12
RXD —— 接收/发送数据
TXD —— 产生同步移位脉冲
接收/发送完,置位RI / TI ,(要求SM2 = 0)
方式0 D7 D6 D5 D4 D3 D2 D1 D0 发送
D0 D1 D2 D3 D4 D5 D6 D7 接收
无起始位,无停止位
(2)SM0、SM1=01方式1:8位UART,波特率为(2SMOD×T1的溢出率)/ 32
停止位 D7 D6 D5 D4 D3 D2 D1 D0 起始位 发送位 TXD
起始位 D0 D1 D2 D3 D4 D5 D6 D7 停止位 接收位 RXD
1帧信息,10位。 送RB8位
波特率可变: 2SMOD / 32 ×(T1的溢出率)
发送完置位TI。
接收完数据置位RI。
置位RI是有条件的。即:
REN = 1,RI = 0 且SM2 = 0或SM2 = 1但是接收到的停止位为1。
此时,数据装载SBUF,停止位进入RB8,RI置1。
(3)方式2( SM0、SM1=10)、方式3 (SM0、SM1=11) :9位UART,多机通信。多机通信只能工作在方式2、方式3
停止位 TB8 D7 D6 D5 D4 D3 D2 D1 D0 起始位 发送数据
起始位 D0 D1 D2 D3 D4 D5 D6 D7 TB8 停止位 接收数据
送SCON寄存器RB8位
方式2波特率:(固定)2SMOD / 64 × fosc
方式3波特率: 2SMOD / 32 ×(T1溢出率)
数据发送
串口方式2、3发送第九位数据必须通过软件置事先写入寄存器SCON的TB8位,把要发送的数据发送到SBUF(MOV SUBF,A) 启动数据发送,发送完数据置位TI。CPU通过查询方式查询到TI=1或中断方式可以继续发送下一帧数据,并软件复位TI=0 (CLR TI)
数据接收
接收: 必须置位寄存器 SCON REN位为1才能启动串口接收数据,当接收一帧数据后此时,数据装载SBUF,接收到的第9位数据(TB8)送SCON寄存器RB8位 ,RI置1。
,CPU通过查询RI=1或中断方式,通过指令 MOV A.SBUF 来取走接收的数据,并软件复位RI=0(CLR RI)
3、波特率的设置
方式0、方式2固定。
方式1,方式3可变。波特率 = 2SMOD / 32 ×(T1的溢出率)
T1溢出率 = 单位时间内溢出次数 = 1 /(T1的定时时间)
而T1的定时时间t就是T1溢出一次所用的时间。此情况下,一般设T1工作在模式2(8位自动重装初值)。
N = 28- t / T, t = (28-N)T =(28-N)×12 / fosc
所以,T1溢出率 = 1/t = fosc / 12(28-N),
故, 波特率 = 2SMOD / 32 × fosc / 12(256-N)。
若已知波特率,则可求出T1的计数初值:
y = 256-2SMOD×fosc / (波特率×32×12)
例、若fosc = 6MHz,波特率为2400波特,设SMOD = 1,则定时/计数器T1的计数初值为多少?并进行初始化编程。
解:y = 256-2SMOD×fosc / (2400×32×12)= 242.98≈243 = F3H
同理,fosc = 11.0592MHz,波特率为2400,设SMOD = 0,则
y = F4H
初始化编程:
MOV TMOD,#20H
MOV PCON,#80H
MOV TH1,#0F3H
MOV TL1,#0F3H
SETB TR1
MOV SCON,#50H
指令系统
指令按寻址方式分有 7种寻址方式,直接寻址(direct)、立即寻址(#20H) 、寄存器寻址(Rn)、寄存器间接寻址(@Ri)、相对寻址(rel)、寄存器变址寻址(@A+PC)、位寻址 ( ACC.1)
指令按功能上分有5种 ,传送类指令 、算术运算类指令、逻辑运算及移位类指令、控制转移类指令、位操作类指令
指令三大属性。功能属性、空间属性(指令站用的字节数)、时间属性(指令执行的机器周期数)
传送类指令 有四种寻址方式 对A的数据传送只影响状态标志位P
访问片内RAM和SFR 指令格式 MOV
唯一的一条16位传送指令 MOV DPTR,#DATA16
访问 片外 RAM 4条指令
MOVX A,@Ri MOVX A,@DPTR( 这两条指令是读片外RAM的数据伴随着控制信号RD*有效)
MOVX @Ri,A MOVX @DPTR,A ( 这两条指令是写片外RAM的数据伴随着控制信号WR*有效)
访问 程序存储器ROM 2条指令
MOVC A,@A+PC MOVC A,@A+DPTR ( 这两条指令是读程序ROM的数据伴随着控制信号PSEN*有效)
2、栈操作指令
PUSH direct
POP direct
不影响任何标志位。Direct 可以是内存RAM 128个单元任意一个单元 也可以特殊功能寄存器 这里注意 PUSH ACC ( ACC是直接地址,不能写A)
PUSH direct 指令执行中,机器自动进行两步操作:
(1)(SP) (SP)+ 1
(2)((SP)) (direct)
例1、设分析:
执行 PUSH DPL
PUSH DPH
后,各单元中的内容。(0AH)=23H (0BH)=01H (SP)=0BH
POP direct 指令执行中,机器也自动进行两步操作:
(1)(direct) ((SP))
(2)(SP) (SP)- 1
例2、设(SP)= 40H,(40H)= 12H,(3FH)= 34H
执行 POP DPH
POP DPL
后,各单元中的内容。(SP) = 3EH,(DPTR)= 1234H,
结论:1)PUSH 与 POP 操作过程刚好相反;
2)进、出栈规则:
先进后出,后进先出。应注意指令书写先后顺序;
3)可用于“保护现场,恢复现场”
3、字节交换指令
XCH A,Rn
XCH A,direct 整字节交换
XCH A,@Ri
XCHD A,@Ri
SWAP A 半字节交换
不影响任何标志位。
算术运算类指令
包括:加、 减、乘、除;加一、减一。
一、加法指令
ADD A,Rn ;(A) (A)+ (Rn)以下类同。
ADD A,direct
ADD A,@Ri
ADD A,#data
无符号数相加时:若C = 1,说明有溢出(其值 > 255)。
带符号数相加时:若OV = D7c⊕D6c = 1,说明有溢出。
影响 C OV AC这三个标志位 奇偶标志P由累加器A的值决定
INC A ;(A) (A)+1 ,以下类同。
INC Rn
INC direct
INC @Ri
INC DPTR
不影响 C OV AC这三个标志位 奇偶标志P由累加器A的值决定
逻辑操作类指令
共分两大类:单字节逻辑操作,双字节逻辑操作,共24条。
一、单字节逻辑操作指令
CLR A ;(A) 0
CPL A A中8位按位求反。
循环左移、右移指令:
RL A
RLC A
RR A
RRC A
二、双字节逻辑操作指令
“与操作”:
ANL A,Rn ; (A) (A)∧(Rn),以下类同。
ANL A,direct
ANL A,@Ri
ANL A,#data
ANL direct,A
ANL direct,#data
例1、(P1)= 35H,使其高4位输出0,低4位不变。
解; ANL P1,#0FH
此做法称为“屏蔽”位。
“或操作”:
ORL A,Rn ; (A) (A)∨(Rn),以下类同。
ORL A,direct
ORL A,@Ri
ORL A,#data
ORL direct,A
ORL direct,#data
例2、将A中的低3位送入P1中,并且保持P1中高5位不变。
ANL A,#07H
ANL P1,#0F8H
ORL P1,A ;(P1)= P17P16P15P14P13A2A1A0
这称为“数位组合”。
“异或操作”:
XRL A,Rn ; (A) (A)⊕(Rn),以下类同。
XRL A,direct
XRL A,@Ri
XRL A,#data
XRL direct,A
XRL direct,#data
例3、设(P1)= 0B4H = 10110100B,执行:
XRL P1,#00110001B
结果按# 0 0 1 1 0 0 0 1 取反,即:
(P1)= 1 0 0 0 0 1 0 1 B = 85H
这称为“指定位取反”。
在上述ANL、ORL、XRL操作中,用于端口操作时,无论P0 ~ P3是第一,还是第二操作数,都遵循“读—修改—写”端口锁存器的操作。
§3-5 控制转移类指令
作用:改变程序计数器PC的值,从而改变程序执行方向。
分为四大类:无条件转移指令;条件转移指令;调用指令;返回指令。
一、无条件转移指令
LJMP addr16
AJMP addr11
SJMP rel
JMP @A + DPTR
LJMP addr16 ;长跳转
转移目的地址 addr16 (PC);
展开阅读全文