51单片机定时器用法之1秒定时程序设计
动画演示
在我们的DIY电子时钟里,需要用到单片机定时器来做秒的显示,说是显示,其实就是实现数码管上“:”点的闪烁。这里初步定义为每秒亮1次,亮0.5秒,灭0.5秒。实现显示秒的功能。这里也可以用DS1302的秒数据来做,但是实现起来麻烦,达到一样的效果,我们追求的是程序越简单越好,所以在此我们用单片机定时器来实现。
我们DIY时钟板子上的单片机为STC15W408AS,单片机自带IRC可调时钟和搞可靠复位,为了降低功耗(工作频率越低,功耗越小),本时钟采用12M的工作频率(烧写程序是在软件上选择),那当定时器工作在12T模式下时,一个机械周期就是1us。
接下来我们就该看看单片机的数据手册了。以下是今天我们需要关注的寄存器:
TCON位定义
TMOD寄存器位定义
T0工作方式设置
TCON为定时器T0和T1的控制寄存器,可以位寻址(直接操作位);TMOD是T0、T1工作方式控制寄存器,不可以位寻址(只能操作寄存器),高四位控制T1,低四位控制T0;定时器的工作方式由TOMD寄存器中的M1和M0选择,具体如上图。
本例中我们要用T0实现1秒的定时时间,这里我们用T0工作在方式0,也就是16位的自动重载方式(传统的51单片机只有8位的自动重载,需要做高精度的定时时最好用自动重载方式)。我们不需要外部中断来开启定时器,所以GATE位=0,T0工作在定时模式,CT=0,所以我们TMOD寄存器的值为0x00;在TCON寄存器里和T0相关的位有TF0和TR0;TF0=0:T0中断标志位,当定时器中断产生是,TF0自动置位,CPU相应中断后硬件自动清零;TR0=1:开启定时器,相当于定时器的开关。
除了这些寄存器外,定时器溢出后,也会产生中断,所以还需要去设置中断部分:
EA=1:,开启总中断,相当于中断总开关;ET0=1;开启定时器T0中断,相当于中断的子开关,只有中断的总开关和相应的子开关都开启后,CPU才能相应中断信号,具体请看中断部分数据手册。我们用的STC15W系列单片机属于增强型单片机,为了和传统51单片机兼容,还专门设有一个寄存器AUXR,此寄存器可设置T 0工作在1T还是12T模式,此处我们让T0工作在12T模式下,AUXR=0x00。最后就是定时器的初值寄存器了,我们需要定时的时间是500ms,16位的定时器再12M频率下最大定时时间为65535us,而我们需要的是500ms,明显达不到,那我们就需要做组合定时的方式,这里我们设定定时器的中断频率为10ms,那我们中断1次后在中断函数里将某个变量加1,当变量加到50的时候就是500ms,当变量加到100的时候就是1s了。这就是我们实现1s定时的思路。
具体实现程序如下:(因头条原因,代码图片无法加入,需要请移步关注微信公众号)
如上图中程序所示,定时器初始化时设置T0位16位自动重载模式,工作在12T模式,初值10ms,开启定时器,开启中断。这样定时器就工作了;在定时器中断函数里,每次进入中断后我们就给变量T_a自加1,当变量小于50的时候(小于500ms),让D=1(D即为我们电路中控制秒显示的那两个点,高电平有效),大于50小于100的时候D=0,关闭秒显示。这样一来就实现了秒显示在1秒内亮500ms,灭50ms了。上图中中断函数名后面的interrupt 1这是中断函数的入口地址,C语言中叫中断号(为小白说明,老司机略过),具体的个中断对应的入口地址对照表如下图(部分):
中断号对照表
《51单片机基础》:定时器
咱们今天就聊一聊那些年单片机关于定时器与中断方面的事儿,其实定时器实质上就是一个加1计数器。它随着计数器的输入脉冲进行自加1,也就是说当每来一个脉冲,计数器就会自动加1,如果当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置1,向CPU发出就会发出中断请求。
再讲讲中断吧,有不少单片机初学者对中断有些懵,不知道它的用法,讲个生活例子就是比如你在家里看电视,突然门铃响啦此时你的第一选择就是去开门,打断你做原来事情让你优先去做开门这件事,这就是所谓中断。
当你这件事情结束之后,你又可以继续去看电视。关于单片机中断优先级的问题,小伙伴一定要勤于动手,勤于动脑的查找资料。所以接下来写一个关于定时器与中断的实验,将数码管上电之后8位都显示6,然后定个时间就两秒后全显示2,因为一些原因只能给小伙伴们截两张图片,不过有兴趣的小伙伴可以验证代码的正确性,都这样说啦,代码都是作者亲自验证过的(哈哈哈),行,接下来直接给小伙伴们上图
主函数部分:
定时器主要代码:
实验现象:
哈哈,今天的实验就分享到这里,也希望小伙伴们能够喜欢、点赞。
相关问答
【 51单片机 定时计数器工作方式疑点 单片机定时器 /计数器的工...[最佳回答]因为51单片机处理数据是按八位进行的,所以给定时器赋初值的时候,不能将一个数直接赋到T0中,而是将这个数先转化为一个十六进制数,将它的高两位数(也...
51单片机定时器 初值公式?为:初值=65536-(晶振频率÷分频系数÷所需计时时间)。这个公式的原因是,定时器在工作时会进行计数,而计数最大值为65536,因此初值等于65536减去需要...
51单片机 中设置 定时器 模式时,TMOD|=0x01和TMOD=0x01有什么区别?TMOD是51单片机内的定时器寄存器名称,TimerMode即为定时模式的意思51单片机的定时模式有四种,所以用TMOD=?来选择哪一种,10h表示的是16进制数,也可表示为...
自学 单片机 reg 51 .h定时程序是里头的TH1、TL1、TR1、TMOD是什...自学单片机reg51.h定时程序是里头的TH1、TL1、TR1、TMOD是什么意思?没有在程序上看到定义这样的变量。内存三星讨论回答(6)TH1,TL1、TR1、TMOD是单片机的特...
c 51单片机 定时器 多长时间溢出?51单片机定时器溢出时间取决于两个因素,第一是定时器的时钟源频率,单片机可以配置这个时钟源为主频的1倍或者是1/12;第二个是定时器的初值,定时器是在初值的...
51单片机定时器 ET是什么?51单片机定时器ET是内部定时器/计数器中断允许位。EA是总中断允许位,EX是外部中断允许位(EX0,EX1分别指外部中断INT0,INT1),ET是内部定时器/计数器中断允...
单片机 定时 ET0=1什么意思,,要详解。。 - 暖暖888 的回答 - 懂得楼上说的对,但忘了两个字,应该是“定时器0的中断允许开关”,ET0=1后,定时器0的中断就允许了,当然也要打开EA总开关。定时器0的运行开关是TR0=1单片...
利用 51单片机 的 定时器1 (t1)产生一个500hz的方波?t=1/ft=2ms周期为2ms利用定时器每1ms进入一次中断,中断中将p1,1输出状态改变就可以输出500hz的方波t=1/ft=2ms周期为2ms利用定时器每1ms进入一次中断,中断...
51单片机 T0 定时器 4种方式的定时时长分别是多少 - 150****156...51单片机最大硬件定时时间,就是定时器能定时的时间,最长时间=65536*TcTc=fosc/12,fosc是单片机的晶振频率。以频率=12M为例吧,Tc=1us最大定时时间=6...
51单片机定时器 0的中断编号为多少?51单片机定时器0的中断编号为1。在编写单片机程序时,我们可以使用定时器0来计算时间间隔、延时等操作。当定时器0计数到设定值时,就会触发定时器0中断,此时CPU...