设计与开发

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

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

中断号对照表

单片机入门-C51语言采用定时器查询方法获取1秒精准定时解说

视频教程如下:

视频教程

51系列单片机含有专用的 定时器/计数器,定时器/计数器是一个二进制的加1寄存器,当启动

后就开始从所设定的计数初始值开始加1计数,寄存器计满回零时能自动产生溢出中断请求。

但定时与计数两种模式下的计数方式却不相同,定时器模式时,每个机器周期寄存器增1,即

寄存器对机器周期计数。

先总结一下定时器的用法:

定时器/计数器的运用总结:

1。计算计数初值:

计数值=定时的时间/机器周期

初值X=最大计数值M-计数值;

2.TMOD寄存器的设置:参考教材P69

GATE C/T M1 M0 GATE C/T M1 M0

3.TCON寄存器的设置:参考教材P69

主要关注TR1/TR0

4.打开中断(含定时器中断和总中断)或者查询TF0/TF1

5。编程

举例:请大家设计1个1秒定时的定时器,用定时器0工作在方式1

假设单片机的时钟是12MHZ=>机器周期=(1/1MHZ)=1us

分析:1s=20*50ms ,先用定时器定时50ms,然后再数20次

1。计数计数初值:计数值=50ms/1us=50000

初值X=65536-50000=15536=0X3CB0

2. TMOD设置:(定时器T0,T1没用到)

GATE C/T M1 M0 GATE C/T M1 M0

0 0 0 0 0 0 0 1 =》0x01

TMOD=0X01

3.TCON寄存器的设置:

TR0=1

4.打开中断(含定时器中断和总中断)或者查询TF0/TF1

5.编程

获取1秒精准定时代码如下:

#include<reg51.h>

sbit P1_0=P1^0;

unsigned char count=0;

void main()

{

TMOD=0X01;//设置定时器0工作方式1

TH0=0X3C;

TL0=0XB0;//设置定时器的计数初值15536

TR0=1;//启动定时器0

while(1)

{

while(TF0)//判断溢出 ,是否计数到65536,才产生50ms的定时

{

TF0=0;

TH0=0X3C;

TL0=0XB0;//设置定时器的计数初值

count++;

if(count==20) //20*50ms=1000ms=1s

{

count=0;

P1_0=!P1_0; //对P1.0取反,输出高低电平,从而使LED闪烁

}

}

}

}

相关问答

拜托了,提问里面没人理我。比如说这个:1、AT89C 51单片机 P...

[最佳回答]51系列单片的机器周期算法是(12/晶振)us,你使用12MHz晶振,那么机器周期就是12/12Hz=1us,那么定时器是16位2^16=65536,65536-x,其中x代表你需要定时...

单片机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...

关于MCS- 51单片机 、你们懂得!以下是是MCS- 51单片机 的数字时...

[最佳回答]#include"reg51.h"unsignedcharcodedisptab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0...

单片机 数字钟毕业中期检查表中的一个问题 - 沈禾欣子 的回答...

你问什么问题??淮安信息职5261业技术学院综合毕业实践说明4102书(论文1653)2009-2010学年系专业摘要:数字电子时钟电路设计系统,以AT89C51单片机为...

使用中断技术设计一个发光二极管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,...

一个机械周期多少秒?

一个机械周期可以表示为时钟晶振频率(1秒钟的时钟脉冲数)的倒数(也就是1s/时钟脉冲数,比如1/12MHz),对CPU来说,在一个时钟周期内,CPU仅完成一个最基本的...一...

猜你喜欢