当前位置:首页 > 单片机 > 单片机
[导读]8051定时器/计数器介绍:8051有两个定时器/计数器,而8052则有三个定时器/计数器。定时器、计数器本质都是一样的,定时器通过对内部脉冲进行计数来达到计时的目的,而计数器是对外部输入脉冲进行计数,所以它们的本质

8051定时器/计数器介绍:
8051有两个定时器/计数器,而8052则有三个定时器/计数器。定时器、计数器本质都是一样的,定时器通过对内部脉冲进行计数来达到计时的目的,而计数器是对外部输入脉冲进行计数,所以它们的本质都是一样的。

定时器/计数器的工作模式:
定时器/计数器0有四种工作模式,而定时器/计数器1只有三种工作模式,工作模式由TMOD寄存器的M1和M0位控制。

M1M0工作模式00013位定时器/计数器。01116位定时器/计数器。1028位自动重装定时器/计数器。113模式3只能用于定时器/计数器0,T0被分为两个8位定时器/计数器,TL0可以作为定时器/计数器来使用,由T0的控制位来控制,而TH0只能用于计数器,有T1的控制位来控制。GATEGATE为0时,由TRx(软件控制)来控制定时器/计数器的启动和停止,当GATE为1时,定时器/计数器的启动由TRx和引脚INTx共同来控制(硬件来控制,仅当TRx=1并且引脚INTx输入高电平时才工作)。C/T定时器/计数器选择位,0工作在定时器模式,1工作在计数器模式。TCON寄存器:TFx定时器/计数器溢出标志位,当定时器/计数器计数溢出时,由硬件自动置1,在编写程序时可以通过检测该位来判断是否达到定时时间,需要通过软件来清零。工作在中断方式下不需要清零,因为在执行中断服务程序时会自动给我们清零。TRx定时器/计数器运行控制位。IE寄存器:ETx定时器/计数器中断使能位。EA全局中断使能位。


THx、TLx初值计算:
假设8051外接12MHz的晶振,由于8051的机器周期是时钟周期的12分频,所以8051的机器周期为1MHz,那么计数一次的时间刚好为1us,如果定时器工作在模式0下,那么可以最长计时为8192us,工作模式1可以最长计时为65536us。那么假设8051工作在模式1下,定时1ms,那么THx、TLx的初值应该为多少呢?如果定时1ms,也就意味着需要计数1000次,那么初值就应该为65536-1000=64536,也就是THx=0xFC,TLx=0x18。
根据上面可以总结出如下公式:
定时时间=(最大计数值-计数器初值)*机器周期=(最大计数值-计数器初值)*(12000000/晶振频率(Hz))(us);
计数器初值=(最大计数值-定时时间*(晶振频率(Hz)/12000000));
套用这个公式,初值=(65536-1000*(12000000/12000000))=64536=0xFC18,那么TH就应该为0xFC,TL为0x18。

整个程序如下:

/*timer.c*/

#include

#defineOSC_FREQ12000000UL

#defineTIMER_MODE00x00

#defineTIMER_MODE10x01

#defineTIMER_MODE20x02

#defineTIMER_MODE30x03

voidtimer0_init(void)

{

TMOD&=0xF0;

TMOD|=TIMER_MODE1;/*Timer0workon16-bittimermode*/

TH0=(65536-1000*(OSC_FREQ/12000000))>>8;

TL0=(65536-1000*(OSC_FREQ/12000000))&0x00FF;

TR0=1;/*Turnontimer0*/

}

voiddelayms(unsignedintn)

{

while(n--){

while(!TF0);

TF0=0;

TH0=(65536-1000*(OSC_FREQ/12000000))>>8;

TL0=(65536-1000*(OSC_FREQ/12000000))&0x00FF;

}

}


/*timer.h*/

#ifndef__TIMER_H

#define__TIMER_H

externvoidtimer0_init(void);

externvoiddelayms(unsignedintn);

#endif/*__TIMER_H*/


/*main.c*/

#include

#include"timer.h"

#defineled1P2_0

voidmain(void)

{

timer0_init();

while(1){

led1=0;

delayms(1000);

led1=1;

delayms(1000);

}

}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

单片机定时器通过晶振频率来产生精准的计数脉冲,从而实现微秒级别的时间控制。 单片机定时器依托于一个稳定的计数器,该计数器与单片机上的晶振部件相连。晶振经过12分频后,为单片机提供稳定且精准的1MHZ脉冲。由于晶振的频率极...

关键字: 单片机 定时器

编码器‌是一种传感器,主要用于测量旋转运动的角度、角速度和位移等参数。常见的编码器类型包括增量式编码器和绝对值编码器,前者通过检测脉冲的增加或减少来测量旋转方向和距离,后者则直接输出当前的绝对位置信息‌。

关键字: 编码器‌ 定时器

一款语音控制的番茄时间定时器,内置Seeed Studio XIAO ESP32S3感测和圆形显示。用免提时间管理保持高效!

关键字: 定时器 ESP32S3 语音控制

【2025年3月20日, 德国慕尼黑讯】全球功率系统和物联网领域的半导体领导者英飞凌科技股份公司(FSE代码:IFX / OTCQX代码: IFNNY)近日宣布,其旗下ModusToolboxTM开发平台中的AIROC™...

关键字: MCU 物联网 定时器

众所周知,说到延时,很多人都会想到用软件件来实现,比如定时器之类的。今天就来说说用硬件来实现定时的方式,虽说没有那么准,但是有些场合还是用得到的。

关键字: CD4060 定时器

如果定时器的重装值和分频设置不正确,会导致PWM输出的频率和占空比不准确,从而产生误差‌1。

关键字: 定时器 分频

SysTick定时器的工作原理主要基于一个递减计数器的机制。以下是对SysTick定时器工作原理的详细解释:

关键字: SysTick 定时器

单片机定时器是一种用于计时和定时操作的功能模块。它通常用于生成延时、计数事件以及产生精确的时间间隔信号。

关键字: 定时器 时钟源

在现代嵌入式系统设计中,51单片机作为一种经典的微控制器,凭借其丰富的功能和广泛的应用领域,仍然受到工程师们的青睐。定时器中断是51单片机中一个非常实用的功能,它可以在特定的时间间隔内自动触发中断,执行预设的操作,从而提...

关键字: 51单片机 定时器

Holtek新推出BS67F2432具备触控按键、高精准度HIRC与LCD驱动器Flash MCU。主要特色为内建高精准度4MHz HIRC振荡电路、8路触控按键及最大支持4COM×15SEG LCD驱动器。适用于触控接...

关键字: MCU LCD驱动器 定时器
关闭