51单片机-定时器&中断
一、前置知识
1.可位寻址和不可位寻址寄存器:可位寻址可以单独给定寄存器中的某一位高或者低电平,而不可位寻址只能同时给八位赋值
2.逻辑与或赋值法:逻辑与赋值:可以将固定位置0而不影响其他位;逻辑或赋值:可以将固定位置1而不影响其他位
3.特殊声明就是将某个寄存器或者寄存器的某一位换一个名称,便于阅读和功能编写
4.sfr:特殊功能寄存器声明,声明寄存器,例sfr P0 = 0X81或sfr LED = P0
5.sbit:特殊位寄存器,针对可位寻址的寄存器,声明寄存器的某一位,例sbit SER = P3^4(不是P3_4)
二、中断
2.1 中断介绍
- 中断系统是为使得CPU具有对外界紧急事件的实时处理能力而设置的
- 中断存在优先级,传统51单片机只有2个优先级,在程序运行时,高优先级打断低优先级,再回到低优先级去处理
- 传统51单片机有5个中断请求源,分别是外部中断0和1(INT0和INT1)、定时器中断0和1(T0和T1)和串口(UART)中断
下图为中断系统的程序运行流程图
下面是各个中断的中断号,中断号类似于函数定义,里面写入进中断需要完成的功能
void Int0_Routine(void) interrupt 0; //外部中断0
void Int1_Routine(void) interrupt 2; //外部中断1
void Timer0_Routine(void) interrupt 1; //定时器中断0
void Timer1_Routine(void) interrupt 3; //定时器中断1
void UART_Routine(void) interrupt 4; //串口中断
不同型号的单片机中断个数,优先级,中断号都是不一样的,需要自行查找用户手册
下图为中断具体的电路图(以传统51单片机为例)
以T0中断为例子,当定时器TH0和TL0溢出时,TF0中断请求标志位被置位(1),中断发生,进入中断以后,TF0被硬件清零,打开ET0、EA使能,配置好优先级寄存器PT0,就可以进入中断函数
2.2 中断寄存器
下表是中断寄存器
从中断电路原理图可以看出来,对于中断寄存器,目前只需要考虑IE,IP寄存器即可
2.2.1 中断允许寄存器IE(可位寻址)
EA:CPU的总中断允许控制位,EA=1时,CPU开放中断,EA=0时,CPU屏蔽中断
ET2:定时器/计数器T2的中断允许位。ET2=1,允许T2中断,ET2=0,禁止T2中断
ES:串口中断允许位,ES=1,允许中断
ET1:定时/计数器T1中断允许位,ET1=1,允许中断
EX1:外部中断1中断允许位,EX1=1,允许中断
ET0:定时/计数器T0中断允许位,ET0=1,允许中断
EX0:外部中断0中断允许位,EX0=1,允许中断
所以本次在配置定时器0中断寄存器时,只需要给定使能EA=1,ET0=1
2.2.2 中断优先级控制寄存器低IP(可位寻址)
目前只使用了定时器0中断,所以优先级不需要配置,只需要给定PT0=0
三、定时器
- 51单片机的定时器属于单片机的内部资源,其电路的连接和运转都在单片机的内部完成,不同于LED、按键、LCD1602等都是属于外设
- 定时器功能:用于计时系统,实现软件计时,或者使程序每隔一固定时间完成一项操作;代替长时间的Delay(尽量避免在main中出现Delay),提高CPU的运行效率和处理速度
- 51系列单片机定时器:定时器0(T0)、定时器1(T1)
下图为定时器工作原理框图:
定时器就相当于一个闹钟,根据时钟的输出信号,每隔一个固定时间,计数单元加1,当计数单元加到阈值时,计数单元就会向中断系统申请中断,从而去执行中断函数中的内容。
3.1 定时器工作模式
- 51系列单片机的T0和T1均有四种工作模式:
- 模式0:13位定时器/计数器
- 模式1:16位定时器/计数器(常用)
- 模式2:8位自动重装模式
- 模式3:两个8位计数器
下图为T0工作在模式1下的原理图
T0模式1的工作分为三块,分别是时钟信号、计数系统和中断系统
3.1.1 时钟信号
下图为时钟信号部分
SYSclk是系统时钟输入,不同开发板晶振频率不一致,这里的51单片机频率是11.0592MHZ,T0 Pin是外部引脚时钟,两者都可以提供时钟脉冲
计数速率为12T(12分频)和6T(6分频)模式(以频率12MHZ为例,选中12T模式,则12MHZ被分频成1MHZ,即1s内重复振动了一百万次,周期=1/频率,得到周期为1us,则1us出现一个脉冲)
C/T非给0是定时器,给1为计数器
所以时钟信号的产生过程是系统时钟先通过分频,然后通过定时和计数选择门
3.1.2 计数系统
工作模式1为16位定时/计数器,TH0是高8位,TL0是低8位,共同组成16位二进制数,阈值为65535(2^16)。时钟每来一个脉冲,计数系统加1,TL0的8位溢出向TH0进位,TH0计数溢出(达到阈值)指向中断标志位(TF0),最终转向中断服务函数
当GATE=0时,若TR0=1,则定时器计数,TR0=0时,定时器不计数,由TR0控制定时器是否计数。当GATE=1时,允许外部输入INT0控制T0 (具体与非门可见数电相关基础知识点)
3.1.3 中断系统
计数达到阈值时,TF0标志位置位后进入中断函数,之后标志位硬件清零
3.2 定时器寄存器
下表为定时器的寄存器介绍
3.2.1 定时器控制寄存器TCON(可位寻址)
TF1:T1溢出标志,最高位溢出时,由硬件置1,响应中断时,由硬件置0
TR1:T1的运行控制位,由软件置1和0。GATE=0,TR1=1时,允许T1计数;TR1=0时,禁止T1计数
TF0:T0溢出标志,最高位溢出时,由硬件置1,响应中断时,由硬件置0
TR0:T0的运行控制位,由软件置1和0。GATE=0,TR0=1时,允许T0计数;TR0=0时,禁止T0计数
IE1:外部中断1请求源,IE1=1,外部中断向CPU请求中断,响应时,硬件置0
IT1:外部中断1触发方式控制位,IT1=0时,低电平触发
IE0:外部中断0请求源,IE0=1,外部中断向CPU请求中断,响应时,硬件置0
IT0:外部中断0触发方式控制位,IT0=0时,低电平触发
所以在TCON寄存器里,如果要使用定时器0,则需要配置使能TR0=1,溢出位默认给TF0=0
3.2.2 定时器模式寄存器TMOD(不可位寻址)
GATE:GATE=0,TR0/1=1时,允许T0/1开始计数(TR0/1单独控制)
C/T非:置1计数,置0定时
M1/M0:00(13位定时/计数器)01(16位定时/计数器)10(8位自动重载)11(定时器0/1无效)
TMOD作为不可位寻址,需要给定时器1的相关位置0,GATE给0,TR0单独控制定时器0,模式选择16位定时/计数器,则M1/M0给01,最终TMOD配置为0000 0001
四、程序编写
4.1 定时器0初始化
51系列单片机依靠配置寄存器从而实现硬件的相关操作,所以首先要配置定时0和中断系统的寄存器
本文配置寄存器的步骤主要是:定时器0寄存器配置(TCON和TMOD)—中断寄存器配置(IE和IP)
下面给出定时器0初始化函数
#include <REGX52.H>
/*
函数功能:定时器0初始化,1ms进一次
*/
void Timer0_Init() //11.0592MHZ
{
//配置定时器0寄存器
TMOD &= 0xF0;
TMOD |= 0x01; //配置定时器模式0000 0001
TL0 = 0x66; //低八位
TH0 = 0xFC; //高八位 总64535,即1000us进一次中断
TF0 = 0; //溢出标志位默认给0
TR0 = 1; //运行控制位给1运行
//配置中断寄存器
ET0 = 1; //定时器0允许中断
EA = 1; //总中断允许
PT0 = 0; //优先级配置
}
从代码中可以看出,配置了T0的相关寄存器TMOD(不可位寻址)和TCON(可位寻址)的TF0和TR0,设定初始值,确定间隔多久进一次中断,配置中断寄存器,打开中断使能和配置优先级
4.2 中断服务函数
定时器初始化后,上电,程序会自动根据设定的时间间隔进入中断服务函数,从而达到“固定时间内完成某一项工作”。
如果存在高低优先级,则会先完成高优先级的任务,再完成低优先级的任务,最终再返回程序中断点
下面是T0中断服务函数基本格式
void Timer0_Routine() interrupt 1
{
TL0 = 0X66;
TH0 = 0XFC; //重新给定初始值,以便下一次按时进入中断服务函数
/*
其他功能主体部分
*/
}