文章目录

  • 前言
  • 一、时钟计时原理
  • 二.单片机定时器原理

前言

单片机定时计数器(详解)


一、时钟计时原理

时钟,钟摆这些计时方式已经和单片机中的定时计数器原理很像了。
时钟的工作原理是利用了一个晶体振荡器,如下:


它的控制频率为32.768KHZ,即32768HZ,即一秒振荡2^15次,再通过内部15分频,即可得到1HZ的方波了(周期T=1s),然后利用这个方波来驱动秒针运动,即方波每秒前进一格,秒针驱动6度;接着秒针向分针进位,分针像时针进位。这样3个针的角度值就代表时间的多少了,即记录时间的目的。

二.单片机定时器原理

而单片机定时器是最常见的内部资源了,C51内部设有两个功能相同的定时计数器,定时器0/定时器1他们的原理也很简单:即在RAM区里面指定一段空间,用于计数(counter)


每驱动一个周期的方波,counter++;如果方波周期T是固定的,那么计数器的值就代表流逝的时间,这里的振荡方波当然就是C51单片机自带的晶体振荡电路产生的。(缩写为OSC)而在C51单片机内部也是有分频器的,只不过默认为12分频(除以12),然后再送给计数器触发计数,而计数器RAM中的counter实际长度为两个字节(如下经过了镜像处理):

当然为了读写更加便捷,它不能位于普通的RAM区了,位于特殊功能寄存器(Counter reigster)C51 RAM空间地址表格中:


其中TH0/TL0:是定时器0的两个计数器 TH1/TL1是定时器1的两个计数器
而在上图框图上,由于经过了镜像处理,所以显示了低位在左(TLi),高位在右(THi)

OSC为系统时钟,如果我们采用的频率为12MHZ,那么经过12分频,计数器输入的时钟即为1MHZ(10^6HZ)
即一秒振荡10 的6次方次)这里的周期T=1/10^6秒=0.000001秒

1s=1000ms=1000000us;所以这里的周期0.000001s=1us;相当于每次计数器中数字加1,那么就过了1us

那么如果我们要定时 1s :只要检测定时器里面的数值:1us*10^6=1sec 扩大10的6次方即过了一秒钟

但是会存在bug,因为是16位计数器( THi / TLi) 它的最大值为1111 1111 1111 1111 相当于65535【0-2^16-1】

所以撑死此计数器只能计数65535*1us=65.535ms
那么为了计时更长的时间,会在后面增加溢出标志位(TimeOverFlowFlag)即TFi:那么每当计数溢出,就会触发溢出标志位 置1,说明从开始已经计数了65.535ms / 那么我们可以在用户RAM区再申请一个变量别名即为C
用于累加溢出次数

那么我们想要计时1s=1us*10^6;


1s的话对应振荡次数为10的6次方 ,所以这里是通过算总振荡次数是不是10^6来对应1s的时间

当然可以直接算时间溢出15次,则1565.536ms+662561us+641us=983040us+16896us+64us=10^6us=1s

所以当计数器THi TLi ==0000 0000 0000 0000开始以频率1Mhz(分频后)计数到溢出变量为C=15和到计数器为THi TLi == 0100 0010 0100 0000末态的时候,就过了准准确确过了1s

当然这里的溢出标志位除了有此功能,还有个更重要的功能,即是进入中断程序

当然上述讨论的是以SOC系统时钟基准,为了更灵活的改变时间基准,而有不破坏原来的晶振电路(不影响系统主频),增加了选择开关,可以选择外部晶振,用以不同的时间基准如下:

其中C是Counter缩写,T是Timer缩写,横线代表低电平有效,也就是该控制位C/T=1的时候,时间基准就由外部晶振提供(单片机的外部引脚提供) i也是通位符(如果是T0,则TH0/TL0,TF0),此时外部时间基准由单片机P3^4管脚链接




即在流水线上,会设置传感器来检测物体是否通过,当有物体通过,传感器即会输出一个方波,如果我们把传感器的输出方波链接在Ti,在通过单片机对应的外部定时计数器输入管脚,那么CNT中(THi/TLi)便会对流水线上的通过物品计数,这便实现了外部计数功能了。


当然为了更好的控制CNT 特殊功能寄存器计数,增加了使能开关(启动控制) ,当GATE=0的时候,那么在与门面前,TRi的状态就决定了启动开关的状态,TRi为Timer Run Flag的缩写,定时器的启动位,所以我们想要定时计数器运行,那么这个启动位就必须打开,比如定时器1使用,就打开TR1,即TR1=1;(C语言编程)

那么看下面的部分,或门由两个变量输入,其中一个是外部中断变量(INT,是interrupt的缩写)【如果是外部中断0,即复用了单片机P3 ^ 2管脚;如果是外部中断1,即复用了单片机P3^3管脚】


如果我们使用外部中断0,外部晶振(定时计数器0为例),TR0定时器0启动位打开为1,C/T选择位为1,那么单片机P3^4上的方波信号是否送入到CNT中进行计数,就取决于或门的两个变量,如果GATE=0,那么CNT就会开始计数,即单片机管脚P3.2上的电平不起作用(链接外部中断0的管脚);

那么如果GATE=1打开,那么单片机引脚P3.2就可以控制启停定时计数器,如果是高电平,则工作;如果是低电平则不工作(即启动控制开关)如下:


这便是C51实际的控制电路部分;接下来则是聊寄存器部分:CNT

其实CNT中还有两个控制位MO/M1:这两个控制位是CNT工作方式选择位


前面我们一直说的情况就是方式1的情况M1M0=01的时候,Thi/TLi一共16位(高8位/低8位)而方式0,即M1M0=00的时候,即13位使用,高8位THi全部使用;低8位中实际只使用了低5位(TLi)


方式2:即M1M0=10的时候:即自动装载如下:




上述所说的变量全部在特殊功能寄存器中(TMOD/TCON) ,TCON寄存器的低四位是外部中断相关的位。(这两个寄存器地址可以参考RAM表,在上面)

补充一点:



相信硬件了解过后,软件编程信手拈来