C51单片机
SFR(Special Function Register)
地址与RAM高位相同但寻址方式不同,SFR直接寻址,RAM通过R0/R1间接寻址。
.7 | .6 | .5 | .4 | .3 | .2 | .1 | .0 | |
---|---|---|---|---|---|---|---|---|
IE(A8H) | EA | ES | ET1 | EX1 | ET0 | EX0 | ||
IP(B8H) | PS | PT1 | PX1 | PT0 | PX0 | |||
TCON(88H) | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
TMOD(89H) | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
SCON(98H) | TI | RI | ||||||
IE(A8H)Interrupt Enable
中断允许寄存器
EA(IE.7)Enable All interrupt
中断总允许位
-
相当于总开关
-
默认为0,禁止一切中断响应
-
EA=1,CPU对所有中断开放
-
外部中断INT0/INT1中断请求标志位,外部中断源有请求时,TCON中对应的标志位IE0/IE1由硬件置“1”,当CPU响应该中断后,又由硬件自动置“0”,为电平触发。
ES(IE.4)Enable Serial
串口中断允许控制位
- 相当于串口单独开关
- ES=1,允许串口接受,发送中断
- 外部中断INT0/INT1的触发方式选择位,IT0/IT1=0,对应外部中断设置为低电平触发方式,TCOM中,IT0/IT1=1,对应外部中断设置为边沿触发方式。
ET1/0(IE.3/1)Enable Timer
定时/计数器1/0中断允许控制位
- 选择时赋值为1即可
- ET0=1,允许定时/计数器0的溢出中断
EX1/0(IE.2/0)Enable eXterior
0/1外部中断0/1允许控制位
- EX0是外部中断0的使能控制位,如果EX0设置为0,则外部中断0失效,无论外部中断引脚如何变化,都不会发生外部中断。
IP(B8H)Interrupt Priority
中断优先级寄存器
【1】51有默认的中断优先级,在有中断标志时,MCU查询的顺序是:
【2】设置IP = 0x10,即设置串口中断为最高优先级,则串口中断可以打断任何其他的中断服务函数实现嵌套,且只有串口中断能打断其他中断的服务函数。若串口中断没有触发,则其他几个中断之间还是保持逻辑优先级,相互之间无法嵌套。
【3】T1中断会一直等待cpu执行完T0中断函数再执行T1中断函数。一直要等到T0中断函数执行完毕后才会处理T1中断。如果在执行T0中断的过程中T1第二次相应中断,也要等T0全部执行完之后再相应T1中断,这时候T1中断只会被执行一次。
PS(IP.4)Priority Serial
串口优先级标志位
PT1/0(IP.3/1)Priority Timer
1/0定时器1/0优先级标志位
PX1/0(IP.2/0)Priority eXterior
1/0外部中断1/0优先级标志
PCON(87H)Power CONtrol
电源控制和波率选择
Timer 初始化
由于定时器/计数器的功能是由软件编程确定的,所以一般在使用定时/计数器前都要对其进行初始化,使其按设定的功能工作。初始化的步骤一般如下:
1、确定工作方式(即对TMOD赋值);
2、预置定时或计数的初值(可直接将初值写入TH0、TL0或TH1、TL1);
3、根据需要开放定时器/计数器的中断(直接对IE位赋值);
4、启动定时器/计数器(若已规定用软件启动,则可把TR0或TR1置“1”;若已规定由外中断引脚电平启动,则需给外引脚加启动电平。当实现了启动要求后,定时器即按规定的工作方式和初值开始计数或定时)。
下面介绍一下确定定时器/计数器初值的具体方法。
因为在不同工作方式下计数器位数不同,因而最大计数值也不同。
现假设最大计数值为M,那么各方式下的
最大值M值如下:
方式0:M=2 ^13=8 192
方式1:M=2^16=65 536
方式2:M=2^8=256
方式3:定时器0分成两个8位计数器,所以两个M均为256。
因为定时器/计数器是作“加1”计数,并在计数满溢出时产生中断,因此初值X可以这样计算:
在计数方式下:X=M-计数值
在定时方式下:X=M-定时值/机器周期
TCON(88H)Time CONtrol
定时器控制寄存器
可位寻址
设定好了定时器/计数器的工作方式后,它还不能进入工作状态,必须通过设置控制寄存器TCON中的某些位来启动它工。要使定时器/计数器停止运行,也必须通过设置TCON中的某些位来实现。当定时器/计数器计满溢出,或有外部中断请求时,TCON能标明溢出和中断情况。
定时器 启动/暂停/中断/溢出 控制
TF1/0(TCON.7/5)Timer Flag
T1/0溢出标志位
当定时/计数器溢出,会触发TF1/0位,然后CPU检测TF1/0位,执行对应的中断,响应中断后,硬件清零。(也可软件清零)
TR1/0(TCON.6/4)Timer Run
T1/0运行控制位
可由软件置1(或清零)来启动(或关闭)定时器,使定时器开始计数。例如用指令SETB TR1(或CLR TR1)使TR1置1(或清零)。
IE1/0(TCON.3/1)Intrrupt Enable
外部中断1/0溢出标志位
外部中断请求标志,外部中断执行,请求中断,对应IE1/0=1,CPU响应中断,硬件对IE1清零。
IT1/0(TCON.2/0)Interrupt Touch
外部触发1/0触发方式选择位
但是对于外部中断,却有两种中断触发方式,一种是低电平触发,一种是下降沿触发。我们对于不同情况要进行不同的控制.我们看TCON的第二位和第零位,第二位IT1对应外部中断1,第零位IT0对应外部中断0,给他们高电平就为下降沿触发,给他们低电平就为低电平触发。
TMOD(89H)Timer MODe
定时器方式控制寄存器
字节寻址
高四位定义“1”模式,低四位定义“0”模式
GATE(TMOD.7/3)
门控制
●GATE=1,内外一起控制定时/计数器
-
“与门”的输出信号K由INTx输入电平和TRx位的状态一起决定(即此时K=TRx·INTx),当且仅当TRx=1,INTx=1(高电平)时,计数启动;否则,计数停止。(启动外部中断)
-
当INT0引脚为高电平时且TR0置位,TR0=1;启动定时器T0;
-
当INT1引脚为高电平时且TR1置位,TR1=1;启动定时器T1。
●GATE=0,只有内部控制
-
“或门”输出恒为1,“与门”的输出信号K由TRx决定(即此时K=TRx),定时器不受INTx输入电平的影响,由TRx直接控制定时器的启动和停止。(启动内部中断)
-
当TR0=1,启动定时器T0。
-
当TR1=1,启动定时器T1。
C/T(TMOD.6/2)Count/Timer
功能选择位
C/T=0时为定时功能: 加1计数器对脉冲f进行计数,每来一个脉冲,计数器加1,直到计时器TFx满溢出;
C/T=1时为计数功能: 加1计数器对来自输入引脚T0(P3.4)和T1(P3.5)的外信号脉冲进行计数,每来一个脉冲,计数器加1,直到计时器TFx满溢出;
M1,M0(TMOD.5,4/1,0)Mode
方式选择功能
MCS-51的定时器T0有4种工作方式:方式0,方式1,方式2,方式3。
MCS-51的定时器T1有3种工作方式:方式0,方式1,方式2。
M1 | M0 | 工作方式 | 功能说明 |
---|---|---|---|
0 | 0 | 方式0 | 13位定时器/计数器 |
0 | 1 | 方式1 | 16位定时器/计数器 |
1 | 0 | 方式2 | 自动重载8位定时器/计数器 |
1 | 1 | 方式3 | T0分为2个8位独立计数器,T1无方式3 |
SCON(98H)
TI(SCON.1)
串行口发送中断标志位
RI(SCON.0)
串行口接收中断标志位