产品概述

单片机定时器1s 51单片机定时器用法之1秒定时程序设计

小编 2025-09-02 产品概述 23 0

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语言中叫中断号(为小白说明,老司机略过),具体的个中断对应的入口地址对照表如下图(部分):

中断号对照表

STM32单片机通用定时器时基设置

定时器为单片机中很重要的一个外设,这里我们结合STM32CUBEIDE中的参数设定,分享下STM32CUBEIDE中定时器的时基设定。下图为STM32CUBEIDE中定时器时基设置界面:

STM32CUBE中定时器时基设置界面

定时器时基即设定定时器的计数周期。这里我们主要需要设置两个参数,一个是定时器的预分频系数(图示中:Prescaler,PSC预分频器寄存器),另外一个为定时器的自动装载值(图示中:Counter Period,ARR自动装载寄存器)。

一、定时器预分频系数

定时器预分频系数为对针对系统的内部时钟周期进行分频。如分频系数设定为1,则定时器计数与系统内部时钟周期一致,若分频系数设置为2,则经过两个内部时钟周期定时器计数增加一次。具体可见下图,当预分频系数由1更改为2时计数器寄存器的反应。

预分频系数由1更改为2时的定时器时序图

以此类推定时器计数周期=预分频系数*内部时钟周期。定时器预分频系数对应寄存器PSC,此寄存器为16位寄存器,其取值范围为0-65535。定时器预分频系数=寄存器值+1,故定时器预分频系数取值为1-65536。

二、定时器预装载值

定时器预装载值可以理解成定时器的极值,等计数器计数值到此值时,计数器反转,恢复到初始的计数数值。定时器预装载值对应寄存器ARR,此寄存器也为16位寄存器,其取值范围为0-65535。

ARR寄存器设置为0X36时,计数器寄存器的跳变

三、定时器的频率公式

根据以上分析我们可以得出定时器的频率公式:

f=内部时钟频率/((ARR+1)*(PSC+1));

T=1/f ;

我们若希望此单片机的定时器周期为1s,我们选用的STM32f103C8系列单片机时钟频率为72MHz,则可以根据公式设定ARR,PSC的参数。例如设:ARR=7199,PSC=9999或ARR=9999,PSC=7199均可实现定时器周期为1S的要求。

以上就是设置定时器时基主要参数的内容,大家可以去试着设置下,以上传设置视频,大家可观看此链接视频:定时器时基设定

相关问答

51 单片机 用C语言或者汇编程序如何实现定时1秒?如何设定初始值?如何计算?如何输出方波?如何对外部?

使用定时器实现1秒定时;初始值要看单片机配置的晶振频率了,若12M晶振,初始值为TH0=0x3c;TL0=0xb0;这才是50ms,还要一个单元做计数器,计数20次才是1秒方波...

12mhz的51 单片机 如何用方式0一次定时1ms?

对于一个12MHz的51单片机,要使用定时器0的方式0(16位定时器模式)来定时1ms,我们需要进行一些计算和设置。首先,我们计算定时器0需要定时的初始值:方式0是...

单片机 在使用 定时器 时是用到了哪些引脚?一定是这些吗? - 懂得

单片机使用定时器时,不用到任何引脚,因为定时器就好比一个时钟,它被安装在单片机内部,在接收到信号之后,就开始运行,一般使用定时器,通过编程的方案...

单片机 ,当 定时器 /计数器工作方式于1下,晶振频率为6M,请计算最短定时时间和最长定时时间。各是多少?

定时器是通过计数溢出来计时的,工作方式1是16位计数方式。晶振频率为6M,那么计数器加1需要一个机器周期2us。机器周期=12/fosc,fosc为晶振频率。计数初值为1...

51 单片机 T0 定时器 4种方式的定时时长分别是多少 - 181****489...

这个取决于系统时钟和定时器位数。例如传统89c51单片机(在不考虑新型单片机有分频设置的情况下),12MHz系统时钟,采用8位定时器,最大定时时间为256us...

单片机定时器 1的中断函数】作业帮

[最佳回答]voidT0_init(void){TMOD=0X10;//定时器1ET1=0;//打开定时器1中断EA=1;//打开总中断TR1=0;//启动定时器1TH1=0xxx;//算吧TL1=...

单片机定时器 定时的时间肿么算?-ZOL问答

51单片机,根据晶振频率,计算指令周期,设置定时器的分频,然后设置定时器的工作方式TMOD,最后设置初值TH0TL0比如用的XHZ的晶振,stc的单片机有3种模式(X/12)x/...

单片机定时器 在12M晶振下,方式二最长可定时多久?怎么算?

12M晶振,每个指令周期是1us,采用方式1定时,那么定时公式为:定时时间=(2^16-定时初值)×1us,当初值=0时,最大可以是2^16us=65536us即一次循环最多可以定时...1...

单片机 51软件延时 1s 晶振6M的编程?

通过调用这个子程序就可以实现DEL1S:MOVR1,#10DEL1:MOVR2,#100DEL2:MOVR3,#250DEL3:DJNZR3,DEL3;2*2*250*100*10=1000000us...

单片机 中定时计数器的TH0和TL0的值如何计算?

单片机在不同的工作方式下,计数器的位数不同,因而最大计数值也不同。现在设最大计数值为M,那么在各方式下的M值如下;方式0:M=2^13=8192方式1:M=2^16=6553...

猜你喜欢