单片机定时器模式的使用(单片机定时器代码_单片机定时器程序)

定时器和计数器是单片机中的同一个模块。在这篇文章中,我们主要解释定时器。顾名思义,定时器是用来计时的。计时器里有一个寄存器。在我们让它开始计数后,该寄存器的值将在每个机器周期自动增加1。所以我们可以把机器周期理解为定时器的计数周期。

就像我们的时钟一样,数字每秒自动加1,这个定时器每机器周期自动加1,也就是12/11059200秒。还有一点要特别注意,就是时钟加到60后,秒会自动变成0。这种情况在单片机或计算机中称为溢出。

单片机定时器模式的使用定时器模式的使用0 TMOD=0xf0/TMOD=0x0f

TL0的高3位不用,低5位溢出时直接进位到TH0。

通过设置TH0和TL0的初始值(0~8191),计数器从初始值开始递增1,溢出后请求中断,溢出后复位初始值,否则从0开始递增1。

T=(模数-初始值)*机器周期,初始值为8191位技术最小值1,初始值为0,为计数最大值8191。

定时器模式1(TMOD=0xf1/TMOD=0x1f)

模式1和模式0的功能相同,但模式1有16位。

定时器模式2(TMOD=0x2f/0xf2)

模式2构成8位定时器,自动重载,计数器的范围为0~256。

TH是初始值寄存器,TL是计数寄存器。当TL溢出时,中断标志被置位,TH中的值自动载入TL。

定时器模式3,模式3仅适用于定时器0。

在模式3下,定时器由两个独立的8位计数器组成。

在这种模式下,TL0可以像模式0和1一样计数和计时。TH0只能用于计时,不能计数,占用T1的资源TF1和TR1。

MCU定时器代码_ MCU定时器程序首先使用定时器0。使用定时器时,需要以下步骤:

第一步:设置特殊功能寄存器TMOD,配置工作模式;

步骤2,设置计数寄存器TH0和TL0的初始值;

步骤3:设置TCON,并通过打开TR0位让计时器开始计数。

步骤4:判断TCON寄存器的TF0位,监控定时器溢出。

在写程序之前,我们应该学习如何用计时器计算时间。我们以晶振为例说明一下,时钟周期是1/11059200,机器周期是12/11059200。如果我们要计时20ms,就是0.02秒,需要X个机器周期才能得到0.02秒。让我们计算x*12/11059200=0.02,得到X=

所以现在我们的16位定时器溢出值是65536。我们能做到的。首先,我们给TH0和TL0一个初始值,使它们在18432个机器周期后溢出。溢出后,通过检测TF0位可以知道,正好是0.02秒。这个初始值y=65536-18432=47104,换算成十六进制就是0xB800,所以就是TH0=0xB8,TL0=0x00。

我们已经超时了0.02秒。细心的同学会发现,如果我们直接给一个0x0000的初始值,直到65536溢出,最大定时器值大概是71ms,那么如果我们想给它计时更长的时间,应该怎么做呢?这个问题可以用你小学学过的逻辑和多重关系来解决。

好了,下面我们用程序来实现以下功能。

#include //包含寄存器的库文件

sbit led=p0^0;

sbit add r0=p1^0;

sbit addr 1=p1^1;

sbit addr 2=p1^2;

sbit addr 3=p1^3;

sbit enled=p1^4;

void main()

{

无符号字符计数器=0;

ENLED=0;add r0=0;ADDR1=1

addr 2=1;addr 3=1;LED=1;//74HC138和LED灯初始化部分

TMOD=0x 01;//将定时器0设置为模式1。

TH0=0xB8

TL0=0x00//计时值的初始值

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

while(1)

{

If(1==TF0) //判断定时器0是否溢出。

{

TF0=0;

TH0=0xB8//一旦溢出,重新赋值。

TL0=0x00

柜台;

If(50==counter) //判断定时器0是否溢出50次。

{

计数器=0;//计数器清零,重新计数。

LED=!LED//LED反转操作,0-"1,1-"0

}

}

}

}

程序都有注释,不难理解这里有一个地方需要说明,就是两个if判断。细心的同学会发现,if(1==TF0)是一个句子,我在前面写了1。我推荐新手这样写,因为如果我们写if(TF0==1),作为新手,会不小心少了一个'='写成if(。我们用的Keil4也会给出一个警告,Keil之前的版本和其他一些软件可能根本没有任何错误和警告提示,但是这样生成的Hex文件下载到单片机里就会出错。你可以试试。

这个程序的结果是小灯亮一秒,灭一秒,也就是以0.5HZ的频率闪烁。