单片机
将组成微型计算的各个功能部件:中央处理器(CPU) 、存储器 (RAM、ROM、EPROM)、定时/计数器 、串行口 、I/O接口电路 等集成 在一块集成电路芯片中,从而构成完整的微型计算机。故称为单晶片微型计算机,简称单片机 ,也称为微控制器(Micro Controller Unit, MCU )。
51单片机的体系结构
51单片机与微机系统的区别与联系
内部结构
MCS-51单片机的内部结构组成 : CPU (进行运算、控制)、RAM (数据存储器)、ROM (程序存储器)、I/O口 (串口、并口)、内部总线 和中断系统 等。组成框图、内部结构如下:
CPU的组成
组成:运算器 、控制器
(1)运算器:完成算数运算和逻辑运算
(8位算数逻辑运算单元ALU、8位累加器A、8位寄存器B、程序状态字寄存器PSW、8位暂存寄存器TMP1和TMP2)
(2)控制器:取指令、译码、执行信号
(程序计数器PC、指令寄存器IR、指令译码器ID、堆栈指针SP、数据指针DPTR、定时控制逻辑、振荡器OSC)
存储器的组成
片内数据存储器、片内程序存储器、片外数据存储器、片外程序存储器。
存储器的访问
片内数据存储器RAM:MOV
片内/片外程序存储器TOM:MOVC
片外程序存储器RAM:MOVX
存储空间的分布
三个逻辑空间:
(1)片内外同一寻址的64KB程序存储器空间,地址范围为0000H~FFFFH。
(2)64KB的片外数据存储器空间,地址范围也为0000H~FFFFH。
(3)256B的片内数据存储器空间,地址范围为00H~FFH。
特殊功能寄存器(SFR)
理解程序计数器PC、累加器、工作寄存器、程序状态字PSW、数据指针DPTR、堆栈指针SP、I/O专用寄存器P0~P3。
程序计数器PC
程序计数器PC在物理上是独立的,它不属于SFR存储器块。PC是一个16位的计数器,专门用于存放CPU将要执行的指令地址(即下一条指令的地址),寻址范围为64KB,PC有自动加1功能,不可寻址,用户无法对它进行读写,但是可以通过转移、调用、返回等指令改变其内容,以控制程序执行的顺序。
累加器A
累加器A是8位寄存器,又记做ACC,是一个最常用的专用寄存器。在算术/逻辑运算中用于存放操作数或结果。
工作寄存器R0~R7
内部RAM的工作寄存器区00H~1FH共32个字节被均匀地分成四个组(区),每个组(区)有8个寄存器,分别用R0~R7表示,称为工作寄存器或通用寄存器,其中,R0、R1还经常用于间接寻址的地址指针。在程序中通过程序状态字寄存器(PSW)第3、4位设置工作寄存器区。
程序状态字PSW
程序状态字PSW是8位寄存器,用于存放程序运行的状态信息,PSW中各位状态通常是在指令执行的过程中自动形成的,但也可以由用户根据需要采用传送指令加以改变。
数据指针DPTR
数据指针DPTR是16位的专用寄存器,即可作为16位寄存器使用,也可作为两个独立的8位寄存器DPH(高8位)、DPL (低8位)使用。DPTR主要用作16位间址寄存器,访问程序存储器和片外数据寄存器。
堆栈指针SP
堆栈指针SP是一个8位寄存器,用于指示堆栈的栈顶,它决定了堆栈在内部RAM中的物理位置。
I/O专用寄存器P0~P3
片内有4个8位并行I/O接口P0, P1, P2和P3,在SFR中相应有4个I/O口寄存器P0, P1, P2和P3。
端口线P0~P3的特点
P0口
8位双向三态I/O口,可作为外部扩展时的数据总线/低8位地址总线的分时复用口。又可作为通用I/O口,每个引脚可驱动8个TTL负载。
P1口
8位准双向I/O口,内部具有上拉电阻,可作为通用I/O口。每个引脚可驱动4个TTL负载。
P2口
8位准双向I/O口,内部具有上拉电阻,可作为外部扩展时的高8位地址总线。又可作为通用I/O口,每个引脚可驱动4个TTL负载。
P3口
8位准双向I/O口,内部具有上拉电阻。它是双功能复用口,作为通用I/O口时,功能与P1口相同,常用第二功能。每个引脚可驱动4个TTL负载。作为第二功能使用时,各位的作用如下表所示。
控制线ALE、EA
ALE
地址锁存允许/编程引脚。当访问外部程序存储器时,ALE的输出用于锁存地址的低位字节,以便P0口实现地址/数据复用。当不访问外部程序存储器时,ALE端将输出一个1/6时钟频率的正脉冲信号。
知识延伸解释
复用:"复用" 是指 同一个物理引脚(P0口的引脚)在不同的时间段被用来传输不同类型的信息------地址信息和数据信息。
复用技术的精髓------时间分割
同一组引脚,不同时间干不同的事:在总线周期的前半部分(通常是地址建立阶段): P0口被用作低8位地址总线(A0-A7)。在总线周期的后半部分(数据读写阶段): P0口被用作8位双向数据总线(D0-D7)。
ALE使能:当单片机输出地址时,它会同时产生一个ALE(地址锁存使能) 信号(通常是一个高电平脉冲)。
ALE有效时: 地址锁存器是透明的,P0口上的地址信息直接通过锁存器送到地址总线的低8位(A0-A7)。
当ALE信号由高变低(下降沿)时: 地址锁存器将此刻出现在其输入端的地址信息(即P0口上的值)锁存并保持在它的输出端(A0-A7),即使P0口上的电平之后发生了变化。
ALE无效后: P0口就可以释放出来,用于传输数据(D0-D7)。此时地址锁存器的输出保持不变,继续为外部存储器提供稳定的低8位地址。
总结:
P0口的"地址/数据复用"就是指P0口的引脚在CPU访问外部存储器的过程中,先当地址线用,锁存住地址后,再当数据线用。 利用时间分割和外部地址锁存器(由ALE信号控制)来分离地址信息和数据信息。
EA
允许访问片外程序存储器/编程电源引脚。对于片内无程序存储器的MCS-51单片机(如8031),EA 必须接地。片内有程序存储器的MCS-51单片机(如8051),EA必须接高电平。
51单片机的时序
时序 :CPU在执行指令时所需控制信号的时间顺序称为时序。
时序是用定时单位来描述的,MCS-51的时序单位有四个,分别是时钟周期(节拍)、状态、机器周期和指令周期。
MCS-51的时序单位
(1)时钟周期
又称为振荡周期、节拍(用P表示),定义为单片机提供时钟信号的振荡源(OSC)的周期。它是时序中的最小单位。
(2)状态S
单片机振荡脉冲经过二分频后即得到整个单片机工作系统的状态。一个状态有两个节拍,前半周期对应的节拍定义为P1,后半周期对应的节拍定义为P2。
(3)机器周期
通常将完成一个基本操作所需的时间称为机器周期。
MCS-51中规定一个机器周期包含12个时钟周期 ,即有6个状态,分别表示为S1~S6。
若晶振为6MHz,则机器周期为2μs,若晶振为12MHz,则机器周期为1μs。
知识延伸与解释:晶振
机器周期(Machine Cycle) 是单片机执行一个基本操作(如取指令、读存储器等)所需的时间单位。在8051中,1个机器周期 = 12个时钟周期(Clock Cycle)。
时钟周期(Clock Cycle) 是单片机最小的时间单位,由 晶振频率(Crystal Frequency) 直接决定:时钟周期 = 1/fosc,其中fosc是晶振频率(单位:Hz)。
(4)指令周期
执行一条指令所需要的时间称为指令周期。它是时序中的最大单位。一个指令周期通常含有1~4个机器周期。
指令所包含的机器周期数决定了指令的运算速度,机器周期数越少的指令,其执行速度越快。
以机器周期为单位,指令可分为单周期、双周期和四周期指令。
指令的取指/执行时序
ALE信号 是用于锁存低8位地址的选通信号,每出现一次该信号,单片机即进行一次读指令操作。当指令为多字节或多周期指令时,只有第一个ALE信号进行读指令操作,其余的ALE信号为无效操作(或读操作数操作)。
单周期和双周期指令的取指时序图如下:
访问片外ROM/RAM指令的时序
(1)片外ROM读时序
从外部程序存储器读取指令,必须有两个信号进行控制:ALE信号 和PESN信号 (外部ROM读选通脉冲)。
(2)片外RAM读时序
第一个机器周期是取指周期,是从ROM中读取指令数据,第二个机器周期才开始读取外部数据存储器RAM中的内容。有三个信号进行控制:ALE信号 、PSEN 信号 (外部ROM读选通脉冲)和RD信号 (外部RAM读选通脉冲)。
MCS-51单片机的片上接口及其应用
定时/计数器
工作原理
定时器
计数输入信号来自内部振荡信号 ,在每个机器周期内定时器的计数器做一次"+1"运算。因此定时器亦可视为计算机机器周期的计数器。
计数器
计数输入信号来自外部引脚T0(P3.4)、T1(P3.5)上的计数脉冲 ,外部每输入一个脉冲,计数器做一次"+1"运算。
当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。
控制方式
方式控制寄存器TMOD
TMOD用于设置定时/计数器的工作方式,是一可编程的特殊功能寄存器,字节地址为89H,不可位寻址。其中低4位控制T0,高4位控制T1。
GATE :门控位。GATE=0时,软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚为高电平,才能启动定时/计数器工作。
C/T :定时/计数模式选择位。0为定时模式;1为计数模式。
M1和M0:工作方式选择位。
定时器/计数器控制寄存器TCON
8位特殊功能寄存器,字节地址为88H,可以位寻址,位寻址为88H~8FH,用来存放控制字。
初始化编程
- 确定工作方式------对方式寄存器TMOD赋值。
- 预置定时或计数初值,直接将初值写入TL0、TH0或TL1、TH1中。
- 根据需要对中断允许寄存器有关位赋值,以开放或禁止定时器/计数器中断。
- 启动定时器/计数器,使TCON中的TR1或TR0置"1",计数器即按确定的工作方式和初值开始计数或定时。
举例说明:
设置定时器0工作方式1,晶振频率为12MHz,定时器50ms中断一次。
则程序开始处对定时器及中断寄存器的初始化设置如下:
TMOD=0x01; //设置定时器工作方式 TH0=(65535-50000)/256; //装初值 TL0=(65535-50000)%256; EA=1; //打开总中断 ET0=1; //打开定时器0中断 TR0=1; //启动定时器0
初值计算
设计数器最大计数值为M,选择不同的工作方式,最大计数值M不同。
方式0:M=213=8192
方式1:M=216=65536
方式2、3:M=28=256
置入计数初值X可计算如下:
① 计数方式时:
X=M-计数值(X即为计数值的补码)
例如:要计100个数,则计数初值X=M-100
② 定时方式时:
(M-X)×T=定时值
故,X=M-定时值/T
其中T为计数周期,是单片机时钟的12分频,即单片机机器周期。当晶振为6MHz时,T=2μs,当晶振为12MHz时,T=1μs。
51单片机的中断系统
中断
当CPU正在处理某事件的时候,外部发生的某一事件请求CPU迅速去处理,于是CPU暂时中止当前的工作,转去处理所发生的事件。中断服务处理完该事件后,再返回到原来被中止的地方继续原来的工作,这样的过程称为中断。
中断过程
中断响应(入口地址)、中断处理(保存现场、寄存器工作区切换、中断撤销)、中断返回
中断源
(MCS-51:外2,内2,串1,外2可拓展)
INT0:来自P3.2引脚上的外部中断请求
INT1:来自P3.3引脚上的外部中断请求
T0:片内定时器/计数器0溢出中断请求
T1:片内定时器/计数器1溢出中断请求
串行口:完成一帧发送(TI)或接收(RI)中断请求
中断涉及控制寄存器
中断允许控制器

EA:总中断允许控制位。0:屏蔽所有中断;1:打开所有中断。
中断优先级寄存器IP

PX0:外部中断0的中断优先级控制位。
PT0:定时/计数器T0中断优先级控制位。
PX1:外部中断1的中断优先级控制位。
PT1:定时/计数器T1中断优先级控制位。
PS:串行口中断优先级控制位。
中断标志优先顺序
中断源 | 中断标志优先顺序 |
---|---|
外部中断0 | 高 |
定时/计数器0 | ↓ |
外部中断1 | ↓ |
定时/计数器1 | ↓ |
串行口 | 低 |
中断编程应用
汇编语言中断编程
- 中断入口地址设定
- 中断允许、优先级设定
- 中断服务程序
- 保护现场
- 切换工作寄存器区
- 执行中断工作
- RETI
bash
ORG 0000H ;主程序
LJMP START
ORG 0003H
LJMP INT0IN
ORG 0040H
START:
SETB EA
SETB EX0 ;下降沿触发,EX0允许INT0中断
...
ORG 0100H
INT0IN: ;四个区 R0~R7区1:00H~07H
PUSH PSW ; 区2或区3都可以 R0~R7区2:08H~0FH
SETB RS0; --设置工作寄存器区3 R0~R7区3:10H~17H
SETB RS1; --11第3区 R0~R7区4:18H~1FH
...
POP PSW
RETI ;保存中断返回地址
C51中断编程
- 主程序(允许中断、中断优先级)
- 中断函数(interrupt、保护现场)
中断函数
中断函数使用interrupt m进行修饰。当函数定义时用了interrupt m修饰符,系统编译时把对应函数转化为中断函数,自动加上程序头段和尾段,并按MCS-51系统中断的处理方式自动把它安排在程序存储器中的相应位置。
在该修饰符中,m的取值为0~31,对应的中断情况如下:
0------外部中断0
1------定时/计数器T0
2------外部中断1
3------定时/计数器T1
4------串行口中断
5------定时/计数器T2
其它值预留。
编写MCS-51中断函数的注意事项:
-
中断函数不能进行参数传递
-
中断函数没有返回值
-
不能直接调用中断函数
-
中断函数中调用的其他函数所使用的寄存器必须与中断函数相同
-
中断函数最好写在文件的尾部
实例:
编写一个用于统计外中断0的中断次数的中断服务程序。
cextern int x; void int0() interrupt 0 using 1 { x++; }