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的要求。
以上就是设置定时器时基主要参数的内容,大家可以去试着设置下,以上传设置视频,大家可观看此链接视频:定时器时基设定
相关问答
基于 单片机 控制的专用 定时器 定时 时间1、 1s ~99s可调,2、1mi...[最佳回答]属于基本问题定器初始化设定count变量选择定器工作于式1装初值装65ms左右设置50ms引起断断20概1s写显示程序断计满1s秒变量加1秒计满60.钟变量++类...
拜托了,提问里面没人理我。比如说这个:1、AT89C51 单片机 P...[最佳回答]51系列单片的机器周期算法是(12/晶振)us,你使用12MHz晶振,那么机器周期就是12/12Hz=1us,那么定时器是16位2^16=65536,65536-x,其中x代表你需要定时...
8051 单片机 用汇编程序让八个LED灯每隔一秒亮一个,轮流亮(加说明啊,谢谢了)?设个定时器。然后一个端口,赋值1(高电平亮),如果低电平就赋值11111110b然后每隔一秒给它做个移位。不就完了。设个定时器。然后一个端口,赋值1(高电平亮),...
单片机 数码管动态显示0-100?给你简单的修改了一下,如果你的数码管编码没错,应该可以显示0~99的没添加百位显示,所以只有0~99//数码管动态显示+1,显示范围0-100,定时时间1s#include...
单片机 51软件延时 1s 晶振6M的编程?通过调用这个子程序就可以实现DEL1S:MOVR1,#10DEL1:MOVR2,#100DEL2:MOVR3,#250DEL3:DJNZR3,DEL3;2*2*250*100*10=1000000us...
单片机定时器 有65535计数值,66535是什么单位,微秒还是毫秒?怎么计算定时1秒led闪烁一次?65535是16进制的FFFF,是51单片机定时器最大值,就是最大65535us,=65.535ms,计数器初值设置50ms,65536-50000=15536=3CB0H,,使用一个计数器计数20...
使用中断技术设计一个发光二极管led闪烁电路,闪烁周期为 1s 要求亮0.5s在暗0.5s?可以利用单片机定时器中断来实现这个闪烁电路周期为2s的设计。在单片机设计中经常需要设计一个1s闪烁的LED来判断单片机是否在工作。我们只要设置好定时器计...
led灯闪烁即亮 1s 灭 1s 的程序?1.LED灯闪烁即亮1s灭1s的程序是可以实现的。2.因为LED灯是一种电子元件,可以通过控制电流来实现亮灭。在程序中,可以通过控制GPIO口的电平来控制LED灯的亮灭...
设 单片机 晶振频率为12MHZ,试编写一延时 1s 的子程序?MAIN:MOVTMOD,#01HMOVTH0,#3CHMOVTL0,#0B0HMOVR0,#20SETBEASETBTR0SETBET0SJMP$DJNZR0,ZDFHMOVR0,...
急求无源蜂鸣器的驱动程序, 单片机 是51的?无源蜂鸣器驱动,只需定时将管脚2端电平取反即可如让其响1S,频率约500HZ,可用软延时uinti;for(i=0;i{P1^0=~P1^0;delay_ms(1);}如果想长时间响...