用户工具

站点工具


侧边栏

抱歉,您没有权限增加页面
4.单片机入门教程:7.计数器定时器

单片机入门教程之计数器定时器

Part1:定时器实验

一:实验现象:定时器T0工作于定时器模式,精确延时一秒钟,每一秒LED闪烁一次。

二:实验原理
一般51单片机内部都设有两个通用16位定时器/计数器T0和T1,都具有定时方式和计数方式两种工作方式,定时器计数器的核心部件是一个加法计数器,其本质是对脉冲进行计数,如果计数脉冲来自系统时钟(晶振),则为定时器方式,此时定时器每12个时钟得到一个计数脉冲,计数值加1。当晶振为11.0592Mhz时,一个时钟就是1/11.0592us,计数加1的时间就是:1/11.0592*12≈1.085us 。如果计数脉冲来自单片机外部管脚(T0为P3.4,T1为P3.5),则为计数方式,每来一个脉冲计数加1。

这两个16位的定时器/计数器范围由两个8位寄存器组成高8位TH和低8位TL,最大计数值范围是0—65535,如果每个脉冲是1.085us,计满65536个脉冲的时间就是65536*1.085≈71107us=71.107ms,如果只需要50ms,怎么办呢?这时我们需要在计数器里预先放进65536-50000/1.085=19453,此时定时器会在预先放进的数值基础上加计数,加46083次,即46083*1.085≈50000us=50ms。

当定时器计数到设定的值时就会溢出,如:上面的产生50ms定时时间,计数到46083次就会溢出,单片机将由此产生定时器溢出中断。我们查询定时器溢出标志位或者在定时器中断服务函数中即可知道这个50MS定时时间。

上节说过,要控制单片机中的某个功能模块,就是对相关寄存器进行初始化配置和读写,定时器计数器相关寄存器如下:

首先得初始化,我们要先配置TMOD模式寄存器,这个用来把定时器/计数器选择成定时器功能还是计数器功能和配置定时器/计数器的计数方式是16位还是8位。然后根据我们所需的定时时间往定时器/计数器的低8位TL和高8位TH写初始计数填充值。最后再配置TCON控制寄存器,这个控制着定时器/计数器的运行控制位和计数溢出标志位。
以下代码演示的是让定时器(T0)工作于16位模式,定时计数累计到1秒钟,LED亮灭一次。

三:代码演示

注:本代码完整工程在stc51 discovery开发板【实验例程】【入门实验】【实验十八】

四:关键解说
其他的就不说了,先看定时器中断初始化部分,第31行,TMOD定时器工作模式配置寄存器,此寄存器不可位寻址,低四位控制着定时器0,高四位控制定时器1,我们只对定时器0操作所以高四位先不管全部选择0。TMOD=0x01; 即GATE=0;CT=0;M1=0;M0=1; 具体含义下面寄存器各位功能描述已经写的很清楚了:

第32,33行,TL0=0x00,TH0=0x4C,这个是根据我们需要的定时时间往定时器计数器里填的初始值,对于这个值是怎么来的,前面已经说了,这里是50ms,需要填充的初始值是19456,用计算器得转化为16进制为:4C00,低8位值00赋给TL0,高8位值4C赋给TH0。
第35行,TR0=1;定时器T0运行打开,这个是定时器控制寄存器TCON中的一位,因为此寄存器可位寻址,所以在代码中可以单独选择其中的一位来控制,TCON寄存器如下:

第36,38行,ET0=1;EA=1;打开T0中断和总中断。在外部中断那节提过,有一个寄存器专门控制着各种中断的总开关,此寄存器为IE,可位寻址。寄存器详细如下:

定时器初始化就这样了,下面看定时器中断入口函数,第42行,这个中断入口函数在外部中断优先级那部分说过,定时器0中断号为1。 第44,45行,在初始化那里写过,这里又写了一遍,因为我们选择的计数方式是16位,不会自动填充重装载,所以每次进入中断都要填充一遍初值。
第46行,TimeNum++;因为使用定时器一次计数的时间是50ms,而我们需要一秒LED闪烁,所以用一个变量来累加时间,定时器计数每溢出一次进一次中断的时间是50ms,加20次,就是1S了。
第49行,这里变量要清零。第50行,LED每过1S取反一次。

OK了,以上是使用定时器中断方式来实现定时,当然你也可以使用查询方式,就是在While主循环里面一直查询定时器溢出标志位TF是否为1,为1则定时器计数溢出定时时间到,TF0在寄存器TCON中:

关于查询方式代码就不贴了,工程文件在【实验例程】【入门实验】【实验十九】

上面定时器是16位的,我们也可以把定时器/计数器设置成8位自动重装方式,这个在TMOD寄存器修改一下M0 M1两位即可,所谓自动重装就是只需在初始化代码中设置一次初装值,以后就不需要管了,无论是中断函数里还是查询语句里都不需要在写一次了。

8位重装方式代码请参考:
中断方式:stc51 discovery开发板【实验例程】【入门实验】【实验二十】
查询方式:stc51 discovery开发板【实验例程】【入门实验】【实验二十一】

总结:关于定时器就说完了,上面只介绍了定时器T0的使用,同理,定时器T1也是设置那几个寄存器,定时器T1有关代码请参考:
8位查询方式:stc51 discovery开发板【实验例程】【入门实验】【实验二十二】
8位中断方式:stc51 discovery开发板【实验例程】【入门实验】【实验二十三】
16位查询方式:stc51 discovery开发板【实验例程】【入门实验】【实验二十四】
16位中断方式:stc51 discovery开发板【实验例程】【入门实验】【实验二十五】

Part2:计数器实验(外部计数)
先说一下何为计数器试验,就是把定时器/计数器配置成外部计数模式,通过单片机引脚输入(T0:P3.4 T1:P3.5),引脚每输入一个脉冲,计数加1。

实验原理:
定时器/计数器T0的外部触发管脚接在了五向按键的右键上,按下按键接通低电平形成一个脉冲,计数器计数加1,LED显示计数值0-255次。和定时器初始化配置流程一样,只需把TMOD寄存器中C/T这一位配置为1即可。

看代码吧,计数器T0,8位自动重装,中断方式 。

注:本代码完整工程在stc51 discovery开发板【实验例程】【入门实验】【实验二十六】 计数器T1完整工程在stc51 discovery开发板【实验例程】【入门实验】【实验二十七】

4.单片机入门教程/7.计数器定时器.txt · 最后更改: 2017/03/06 15:20 由 wawooo