定时器
定时器是单片机的内部资源,它就存在于单片机中中,而在开发板上,类似于矩阵键盘、数目显示屏这些都属于外接的硬件设备,是通过I\O口(Input \ Output)外接的,图中红圈部分的叫晶振,晶振有固定的频率,在达到一定时间后会发送一段脉冲信号,这段脉冲由计数器接收,并记录接受脉冲的次数,能够达到计时的效果,定时器的计数和计时功能都依赖晶振。
作用:
- 可实现软件计时或使程序每隔一固定时间完成一项操作
- 替代长时间的延时函数Delay,因为延时函数其实就是通过让CPU卡在循环中,这样虽然能够起到延时的作用,但是这时候假如你按下按键,但是CPU并不能检测你按键的状态,因为他正在运行延时函数的内容,属于一种浪费,而定时器在运行时不会浪费CPU的资源,CPU仍然能够从寄存器中读取其中信息或是写入或者做其他的事情
不同的单片机拥有的定时器个数不同,但STC89c51类型的单片机都会有两个或两个以上的定时器,基础的定时器为T0和T1(Timer0/1),接下来的讲解也只涉及两个定时器。
定时器T0和T1均有四种工作模式:
- 模式0:13位定时器/计数器
- 模式1:16位~
- 模式2:8位自动重装模式
- 模式3:两个8位计数器
不同的工作模式有不同的电路,我们常用的为模式1
定时器运行时,根据时钟的输出信号,每隔一个特定的时间,计数单元的数值就加一,当计数单元数值增加到最大时就会产生“溢出”,“溢出”后计数单元就会向中断系统发出中断申请,然后单片机就会跳转去执行中断程序,执行完后再回到中断处的下一步程序继续执行。
我们能够知道,在单片机所控制的硬设中,如判断是否溢出或是按键是否按下,就是CPU在读取相应的寄存器的信息,例如没溢出时定时器0的计数单元对应的寄存器TCON中的TF0的值为0,溢出后就会变为1,然后向CPU发送中断申请,当CPU响应其中断请求时TF0又会被硬件清0,按键的状态同理。通过对相应的寄存器进行检测,就能够知道特定的信息,然后做对应的事情,如,没溢出就不中断,溢出就中断,或是按键按下就亮灯之类的是事情。
时钟对应下图的红圈部分,计数单元为绿圈、中断系统为黄圈,中断系统还有自己的中断电路图片中没有展示,两个图片均来自哔哩哔哩up主江协科技的51单片机教程视频,我认为它讲的挺好的,网课可以看他的,笔记可以收藏我的博客
时钟:
时钟可由系统时钟(SYSclk)提供,也可以由外部引脚T0 Pin(黑圈)提供,当有外部引脚(T0 Pin)来提供时钟时,定时器作计数器使用。
SYSclk(红圈):系统时钟,即晶振周期,我的51单片机上的晶振频率为12MHz,51单片机应该都是一样的,一般写在晶振表面
分频(黄圈):把较高频率变为其整数分之一低频率的方法,例如选择12分频(➗12),就是把12MHz的系统时钟发出的脉冲信号转换为1MHz的脉冲信号输出,也就是大约1us
C / T(蓝圈):选择定时器的功能,T上面有一横线表示低电平,即如果C/T位置0,那么开关就上拨,接上面的线路作定时器,如果置1,那么开关下拨,就接下面的线路作计数器。
计数单元的计数系统:
计数器(TL0\TH0)在计数单元中,也就是绿圈内的一部分,TL(Timer Low)为低位,TH为高位,它们是两个8位寄存器,0表示它是T0定时器的计数系统,而这个计数系统高位和低位的存储大小都是8bit的,计数系统左边的时钟每一定时间就会发出一个脉冲信号,而计数系统每接收一个脉冲信号,它的值就会加1,也就是说它们能从0一直增到65535(11111111 11111111),当达到65535时再来一个脉冲信号时,计数器就会变为0,然后产生溢出,然后计数器(TL0\TH0)右边的TF0(Timer Flag)就会被置1,TF0就是定时器0的溢出标志位,也叫中断请求标志位,信号发送至中断系统,中断系统产生中断
中断系统:
中断系统是为使CPU具有对外接紧急事件的实时处理能力而设置的。
当中央处理器CPU正在处理某件事的时候,外界发生了紧急事件请求(中断源),要求CPU暂停当前工作,转而去处理这个紧急事件,处理完以后再回到原来被中断的地方,继续原来的工作,这样的过程被称为中断,实现这一功能的部件称为中断系统。
微型机MCU的中断系统一般允许多个中断源,每一个中断源都有优先级别,CPU会优先响应中断优先级最高的中断请求。因此当CPU响应某一中断请求然后正在处理某一个紧急事件时(执行相应的中断服务程序),如果有一个更高优先级的中断源发出中断请求,那么CPU就会暂停当前的工作去响应优先级更高的中断请求,处理完以后,再回到原先低优先级的中断服务程序继续运行,这一过程称为中断嵌套,能够实现中断嵌套功能的中断系统称为多级中断系统,不能的称为单级中断系统。
中断程序流程:
Interrupt为中断入口,和C语言函数的格式差不多,只不过多了一个中断入口
单片机通过配置寄存器来控制内部线路的连接,通过内部线路的不同连接方式来实现不同的功能。
下面是定时器/计数器还有中断系统的相关寄存器:
在图2中有一条黄线,这条黄线就是一条定时器实现某个功能时的线路,而其中的一些开关的位置,是上拨还是下拨,是闭合还是断开,就通过配置寄存器来实现控制。
定时器/计数器控制寄存器TCON(Timer Control):
TCON为定时器T0、T1的控制寄存器,同时也锁存(能够存储数据并且外部没有输入的时候可以保持稳定状态)T0、T1溢出的中断源和外部请求中断源等。
TCON的格式如下:
可位寻址理解为,可以通过寻找寄存器中的某一位的地址,对该地址进行写入或读取,如单独对B0位的IT0进行写入,IT0 = 1;
TF 0/1(Timer Flag):
定时器/计数器0或1的溢出标志位,如当定时器1(T1)被允许计数后,从初值开始加1计数,当加至最高位产生溢出时由硬件将TF1置1,向CPU请求中断,一直保持到CPU响应中断时(锁存),才由硬件清0,即TF1变为0。
TR 1/0(Timer Run):
定时器1或0的运行控制位,该位由软件置位和清零,定时器1或0是否允许或禁止计数,要通过看TR 1/0与GATE(门控端)的值,如GATE = 0,TR1 = 1时就允许定时器1开始计数。这可以通过看前面计数单元的电路图部分,其中设计或与非门,可通过网上查询了解运算规则。
IE 1/0(Interrupt Enable):
外部中断1或0请求原标志。如IE1= 1,外部中断向CPU请求中断,当CPU响应中断时由硬件将IE1清零。
IT 0/1(Iterrupt Touch):
外部中断0或1出发方式控制位。如IT1 = 0时,外部中断1为低电平触发方式。
定时器/计数器工作模式寄存器TMOD(Timer Mode):
定时和计数功能由特殊功能寄存器TMOD的控制位C/T进行选择,两个定时器/计数器有4种操作模式,通过TMOD的M1和M0进行选择。
TMOD寄存器的各位信息:
不可位寻址就是配置该寄存器不能够对其中单独一位的地址(如只对M0进行写入,M0 = 1)然后对该地址进行写入等操作,也就是说,在配置寄存器TMOD时,只能对其整个地址进行操作,即只能对从89H这个地址开始往后数八位的这一整块区域(该寄存器是八位寄存器)进行写入等操作
M 1/0:
定时器1或0的模式选择:
M1 M0
0 0 13位定时器/计数器,兼容8048定时模式(一种老的定时模式),TL0只用低五位参与分频,TH0全用
0 1 16位定时器/计数器,TL0、TH0全用
1 0 8位自动重装载定时器,即当溢出时将TH0存放的值自动重装入TL0
1 1 双8位定时器/计数器
C / T:
选择定时器的功能,T上面有一横线表示低电平,即如果这C/T位置0,那么开关就上拨,接上面的线路作定时器,如果置1,那么开关下拨,就接下面的线路作计数器。
GATE(门控端):
与外部引脚INT共同控制定时器,哪些情况下打开和关闭定时器就需要看电路图了,这里涉及或与非门的内容,http://t.csdn.cn/zLQUH这是我在CSDN上找到的一个关于或与非门的博客,如果忘记了可以进去看一看,我觉得挺好的。
当GATE = 0时,由TR1/0单独控制定时器的开闭,如当TR0 = 0时那么蓝圈的结果为0,定时器0关闭,TR0 = 1时则为1,定时器0打开。 (当GATE = 1时则必须考虑外部引脚INT的情况)它们控制着蓝圈部分的开关,结果为0则开关断开,线路断开,结果为1则开关闭合,线路接通。
中断寄存器:
IE(Interrupt Enable)中断允许寄存器:
EA(Enable All):
CPU的总中断允许控制位,从上面的中断电路图可以看出,当EA = 1时,开关闭合,线路接通,CPU开放中断,反之EA = 0,CPU屏蔽所有中断申请,各中断源首先受EA控制,其次还受各中断源自己的中断允许控制位控制
ET 1/ 0(Enable Timer)和EX1/0:
定时器 T1/T0的溢出中断允许位。即,若ET1 = 1,开关关闭,线路接通,允许定时器T1中断,反之则禁止定时器T1中断,EX 1/0是外部中断1 / 0中断允许位
IP(Iterrupt Priority)中断优先级控制寄存器:
(上面的中断系统电路图中只有两个优先级,由PT 1/0单独控制)
PT 1/0H PT1/0 优先级
0 0 1
0 1 2
1 0 3
1 1 4
注:H是high的意思,1 / 0表示是定时器1或0,上面两位二进制(PT 1/0H 与 PT 1/0所组成的,高H位在左)的值越大,优先级就越高,某一个中断源优先级越高,CPU就会优先响应其中断请求
总结:
以上就是相关的寄存器的简单介绍,而我们想要实现定时器的功能的时候,就是需要根据电路图来配置相关的寄存器,然后接通电路,需要注意的就是,要区分可位寻址与不可位寻址的寄存器,对于不可位寻址的寄存器,在配置时需要检查配置的结果是否和你想要的相同。
下一篇博客将会利用定时器实现按键控制LED流水灯模式 和 定时器时钟