初识51单片机-定时器&中断
一、前置知识
1.可位寻址和不可位寻址寄存器:通俗来讲,就是可位寻址可以单独给定寄存器中的某一位高或者低电平,而不可位寻址只能同时给八位赋值
2.逻辑与或赋值法:逻辑与赋值:可以将固定位置0而不影响其他位;逻辑或赋值:可以将固定位置1而不影响其他位
3.特殊声明通俗讲就是将某个寄存器或者寄存器的某一位换一个名称,便于阅读和功能编写
4.sfr:特殊功能寄存器声明,声明寄存器,例sfr P0 = 0X81或sfr LED = P0
5.sbit:特殊位寄存器,针对可位寻址的寄存器,声明寄存器的某一位,例sbit SER = P3^4
二、中断系统
2.1 中断基本知识
1.中断系统是为使得CPU具有对外界紧急事件的实时处理能力而设置的
2.中断存在优先级,传统51单片机只有2个优先级,在程序运行时,高优先级打断低优先级,再回到低优先级去处理
3.传统51单片机有5个中断请求源,分别是外部中断0和1(INT0和INT1)、定时器中断0和1和串口(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中断为例子,当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:定时/计数器1中断允许位,ET1=1,允许中断
EX1:外部中断1中断允许位,EX1=1,允许中断
ET0:定时/计数器0中断允许位,ET0=1,允许中断
EX0:外部中断0中断允许位,EX0=1,允许中断
所以本次在配置中断寄存器时,只需要给定使能EA=1,ET0=1
2.2.2 中断优先级控制寄存器低IP(可位寻址)
目前只使用了定时器0中断,所以优先级不需要配置,只需要给定PT0=0
三、定时器
1.51单片机的定时器属于单片机的内部资源,其电路的连接和运转都在单片机的内部完成,不同于LED、按键、LCD1602等都是属于外设
2.定时器作用:
用于计时系统,实现软件计时,或者使程序每隔一固定时间完成一项操作;
代替长时间的Delay(尽量避免在main中出现Delay),提高CPU的运行效率和处理速度
3.51系列单片机定时器个数:2个(T0和T1)
如下图所示为定时器工作原理框图:
定时器就相当于一个闹钟,根据时钟的输出信号,每隔一个固定时间,计数单元加1,当计数单元加到阈值时,计数单元就会向中断系统申请中断,从而去执行中断函数中的内容。
3.1 定时器工作模式
51系列单片机的T0和T1均有四种工作模式:
模式0:13位定时器/计数器
模式1:16位定时器/计数器(常用)
模式2:8位自动重装模式
模式3:两个8位计数器
由于模式1在平时最常用,只讨论模式1的工作原理,如下图所示为51单片机T0工作在模式1下的工作原理图:
从上图中可以看出,T0模式1的工作主要分为三块,分别是时钟信号,计数系统和中断系统
3.1.1 时钟信号
SYSclk作为系统时钟(定时器),即晶振周期,不同开发板晶振不一致,频率主要是12MHZ和11.0592MHZ;T0 Pin作为外部引脚时钟(计数器);两者都可以提供时钟脉冲
计数速率为12T和6T模式(以频率12MHZ为例,选中12T模式,则12MHZ被分频成1MHZ,即1s内重复振动了一百万次,周期=1/频率,得到周期为1us,则1us出现一个脉冲)
C/T非给0是定时器,给1为计数器
所以时钟信号的产生过程是系统时钟先通过分频,然后通过定时和计数选择门
3.1.2 计数系统
工作模式1为16位定时/计数器,TH0作为高8位,TL0作为低8位,共同组成16位二进制数,阈值为65535。时钟每来一个脉冲,计数系统加1,TL0的8位溢出向TH0进位,TH0计数溢出(达到阈值)指向标志位(TF0),最终转向中断服务函数
当GATE=0时,如TR0=1,则定时器计数,TR0=0时,定时器不计数,由TR0控制定时器是否计数;当GATE=1时,允许外部输入INT0控制T0 (具体与非门可见数电相关基础知识点)
3.1.3 中断系统
计数达到阈值时,来到TF0标志位后进入中断函数,中断系统内容见上一小节
3.2 定时器寄存器
下图给出T0/1的寄存器表格
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初始化
1.51系列单片机依靠配置寄存器从而实现硬件的相关操作,所以首先要配置定时0和中断系统的寄存器
2.由第二三节可得,本文配置寄存器的步骤主要是:定时器0寄存器配置(TCON和TMOD)—中断寄存器配置(IE和IP)
下面给出定时器0初始化函数
#include <REGX52.H>
/*
函数功能:定时器0初始化
*/
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 中断服务函数
1.写好定时器初始化函数时,在上电运行后,程序会自动根据设定的时间间隔进入中断服务函数,从而达到“固定时间内完成某一项工作”,如果存在高低优先级,则会先完成高优先级的任务,再完成低优先级的任务,最终再返回程序中断点
下面给出中断服务函数基本格式,这里以定时器0中断为标准
void Timer0_Routine() interrupt 1
{
TL0 = 0X66;
TH0 = 0XFC; //重新给定初始值,以便下一次按时进入中断服务函数
/*
其他功能主体部分
*/
}
五、总结
本次学习的内容是定时器和中断两大块内容,这是51单片机的重难点,了解了定时器和中断二者之间的关系,学会了如何对定时器和中断的寄存器相关配置,并且可以利用定时器和中断去完成一些需要重复的任务,不再依赖于循环延时函数。