Bootstrap

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个中断请求源,分别是外部中断01INT0和INT1)、定时器中断01(T0和T1)和串口(UART)中断

  下图为中断系统的程序运行流程图

Alt
  下面是各个中断的中断号,中断号类似于函数定义,里面写入进中断需要完成的功能

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被硬件清零,打开ET0EA使能,配置好优先级寄存器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)

  下图为定时器工作原理框图:

Alt
  定时器就相当于一个闹钟,根据时钟的输出信号,每隔一个固定时间,计数单元加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计数器

Alt
  所以时钟信号的产生过程是系统时钟先通过分频,然后通过定时和计数选择门

3.1.2 计数系统

  工作模式116位定时/计数器,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 (具体与非门可见数电相关基础知识点)

Alt

3.1.3 中断系统

  计数达到阈值时,TF0标志位置位后进入中断函数,之后标志位硬件清零

Alt

3.2 定时器寄存器

  下表为定时器的寄存器介绍

在这里插入图片描述

3.2.1 定时器控制寄存器TCON(可位寻址)

在这里插入图片描述TF1T1溢出标志,最高位溢出时,由硬件置1,响应中断时,由硬件置0
TR1T1运行控制位,由软件置1和0。GATE=0,TR1=1时,允许T1计数;TR1=0时,禁止T1计数
TF0T0溢出标志,最高位溢出时,由硬件置1,响应中断时,由硬件置0
TR0T0运行控制位,由软件置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寄存器配置(TCONTMOD)—中断寄存器配置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;		//重新给定初始值,以便下一次按时进入中断服务函数
	/*
	其他功能主体部分
	*/
}
;