C51单片机定时器介绍

发布者:Wanderlust123最新更新时间:2020-09-09 来源: 51hei关键字:C51  单片机  定时器 手机看文章 扫描二维码
随时随地手机看文章

简介


C51中的定时器和计数器是同一个硬件电路支持的,通过寄存器配置不同,就可以将他当做定时器或者计数器使用。

确切的说,定时器和计数器区别是致使他们背后的计数存储器加1的信号不同。当配置为定时器使用时,每经过1个机器周期,计数存储器的值就加1。而当配置为计数器时,每来一个负跳变信号(信号从P3.4 或者P3.5引脚输入),就加1,以此达到计数的目的。


标准C51有2个定时器/计数器:T0和T1。他们的使用方法一致。C52相比C51多了一个T2。




时钟周期与机器周期


定时器的本质原理就是:每经过1个机器周期,计数存储器的值就加1。因此当使用定时器时,就必须掌握时钟周期和机器周期的关系。

时钟周期 :晶振频率的倒数。如果使用的是11.0592M的晶振,那么就是 1 / (11.0592x10^6) 秒   

注:1MHz = 10^6Hz

机器周期 :标准51下,机器周期 =12倍的时钟周期。即:12 / (11.0592x10^6) 秒 。有的增强51单片机,1个机器周期等于4倍的时钟周期,还有的更短。

计数存储寄存器THx&TLx

定时器和计数器工作,都依赖于 计数。计数则是由计数存储器THx和TLx这2个8位寄存器完成的。

对于计数器,每来一个负跳变信号(信号从P3.4 或者P3.5引脚输入),就加1,以此达到计数的目的。

对于定时器,每隔1个机器周期 加 1,假如(只是假如)一个机器周期为 1ms , 当加到1000次时,我们就认为经过了1s,这就是定时器定时依据。


T0和T1都拥有一对8bit计数存储寄存器。他们的复位值都是0。

T0 对应:TH0 ,TL0

T1 对应 : TH1 , TL1


sfr TL0 = 0x8A; // TL中的L是LOW的意思,代表低位,同理H代表HIGH高位。2个8位组合起来就形成了一个16位的计数器。当然也可以配置为仅仅当做8bit计数存储器用。

sfr TL1 = 0x8B;

sfr TH0 = 0x8C;

sfr TH1 = 0x8D;


当计数器加满后,再加1,就溢出了,溢出后自动归0。且溢出时,溢出标识位TFx 就会自动变为1(T0的溢出标志位TF0,T1的溢出标志位TF1)。如果启用了对应的中断,单片机会调用中断处理函数。


若TH0 和 TL0 以 16位 模式工作,那它的计数范围为   [0 , 65535 ]  ,  也就是累加 65536次发生溢出。 每累加一次是  12 / (11.0592x10^6) 秒。

那么从 0 累加到溢出 历时  ≈ 0.071s = 71ms 。

可以延时 10的整数倍ms,这样就避免了误差,以便用倍数控制更长的延时时间。所以,我么要给 TH0 和  TL0赋一个初始值,使他们的溢出周期(TH0,TL0从初始值到溢出所用的时间)减少到 10ms。

就像一个瓶子,开始装了2/3,再来就只能装1/3就溢出了。通过比例式计算:

12 / (11.0592x10^6) s       -----     1   次

10x 10-3   s                        ------          x  次         (求出 x = 9216次 ,计数9216次后溢出)

65536 - 9216 = 56320  =  二进制( 11011100   00000000)

也就是  TH0 = 11011100 , TL0 = 00000000

工作模式寄存器TMOD

通过TMOD来配置T0和T1的工作模式。

注意,TMOD寄存器不可位寻址(例如sbit led = P0^0 就是P0寄存器位寻址的例子),因此对它的配置需要对这个8bit寄存器整体赋值。

注:51中有些特殊功能寄存器不支持位寻址。只有寄存器的地址值能够被8整除的(即以数字0或者8结尾的地址,如0xA8, 0xD0),才能支持位寻址。不支持位寻址的,只能整体赋值。


小技巧:在对寄存器整体赋值时,要注意只修改我们想修改的位而不影响其它无关位的值,避免影响了之前对这个寄存器的配置。

TMOD |= 0x01;   //仅仅修改TMOD的最低位,其他位保持不变。


C/T:计数器,定时器功能选择位。 1为计数器模式, 0 为定时器模式。

M0和M1:



M1


M0

模式

0


1

THx和TLx  组成一个16位计数存储器

1


0

8位重装模式。THx的值不变,负责在每次溢出后初始化TLx,仅仅由TLx计数

1


1

禁用定时器 1,定时器 0 变成 2 个 8 位定时器。很少使用。

0


0

兼容 8048 单片机的 13 位定时器,THn的 8 位和 TLn 的 5 位组

成一个 13 位定时器。很少使用。


GATE:门控位。


解释说明:

②处 C/T = 0 表示为定时器模式,触发信号为①处的单片机内部时钟信号。(若②处CT = 1,则触发信号为Tn脚)

③处表明,信号能触发使加法计数器加1,还得受④处控制。不然时钟信号是不能让加法计数器累加的。 ④处这个是与门,所以TRx(TR0和TR1)必须为1,表明我们要开启定时器。同时当,GATE为0,通过非门后为1,再通过或门,也是1,那么就让③处控制起来了。若GATE为1,那么,定时器的启动停止受 TRx和 INTx 共同控制。 INTx脚为1且TRx为1才能启动定时器/计数器。

于是在一般情况下使用定时器,我们需要如下配置:

TRx    为  1

GATE  为 0

INTx   任意

控制寄存器TCON

控制寄存器就是用来控制定时器/计数器 启动和停止的,以及溢出标志位的查询和修改。TFx是计数存储器溢出标志位,只要一溢出,就马上置为1。


TF1:定时器/计数器1的溢出标志位。1表示计数存储器溢出,0表示计数存储器正常计数。

        清0方式:①通过代码修改TF1为0

                       ②当通过中断机制来使用定时器/计数器1时,进入中断处理函数后自动归0

TR1:定时器/计数器1的启动和停止位。1表示启动,0表示停止。


TF0:定时器/计数器0的溢出标志位。1表示计数存储器溢出,0表示计数存储器正常计数。

        清0方式:①通过代码修改TF0为0

                       ②当通过中断机制来使用定时器/计数器0时,进入中断处理函数后自动归0

TR0:定时器/计数器0的启动和停止位。1表示启动,0表示停止。


低4位与外部中断INT0和INT1有关,与定时器/计数器无关。这里不做介绍。

查询法使用T0作为定时器

程序1:P0_0连接驱动的LED小灯,用T0作为16位定时器,完成间隔为1s 的 blink程序。

#include

#include"binary.h"

#include"int51.h"

/******************************/

void timer0_init(void);

void timer0_delay(uint16_t dly);

// P0_0驱动LED小灯

#define LEDpin P0_0

void main(void)

{

    LEDpin = 0;

    timer0_init();

    TR0 = 1;

    for(;;)

    {

       LEDpin = 1;

       timer0_delay(1000);         //延时1000ms

       LEDpin = 0;

       timer0_delay(1000);        //延时1000ms

    }

}

/*************************

T0作为定时器的初始化

**************************/

void timer0_init(void)

{

    TMOD |= B0000_0001;        //定时器0,16位存储计数器模式


    TH0 = B1101_1100;       //TH0 TL0 形成数是 56320  。这样,一次溢出代表经过10ms     

    TL0 = B0000_0000;

}

/**********************

参数:

    dly,延时的毫秒数,只能是10的整数倍

***********************/

void timer0_delay(uint16_t dly)

{

     while(dly)

    {   

        if(TF0){

             TF0 = 0;

             TH0 = B1101_1100;  

             TL0 = B0000_0000;

             dly -= 10;             //溢出一次代表10ms

        }

    }

}


程序2:通过T0定时器的8位重装模式,使得P0_0输出PWM信号,LED为呼吸灯效果。

#include

#include"binary.h"

#include"int51.h"

/******************************/

void timer0_init(void);

void timer0_delay(uint16_t dly);

void pwm_duty(uint16_t d);

// P0_0驱动LED小灯

#define LEDpin P0_0

void main(void)

{   

    uint16_t i;

    LEDpin = 0;

    timer0_init();

    TR0 = 1;

    for(;;)

    {

       for(i=0;i<=500;++i)

           pwm_duty(i);

       for(i=500;i>0;--i)

           pwm_duty(i);

    }

}

/*************************

T0作为定时器的初始化

**************************/

void timer0_init(void)

{

    TMOD |= B0000_0010;      //定时器0,8位重装模式

    TH0 = 250;           //一次溢出代表经过6.51us     

    TL0 = 250;

}

/**********************

一次溢出代表经过6.51us

参数 c乘以6.51us 就是这个函数延时的时间   

***********************/

void timer0_delay(uint16_t c)

{

    while(c)

    {   

        if(TF0){

             TF0 = 0;   //因为是自动重装,因此不用给计数存储器赋值。

             --c;            

        }

    }

}

/*************

参数d 的范围是[0,500]。d / 500 即为 pwm输出的占空比,控制LED灯的暗亮程度

**************/

void pwm_duty(uint16_t d)

{

    LEDpin = 1;

    timer0_delay(d);

    LEDpin = 0;

    timer0_delay(500-d);

}


注:如果需要精确的延时,使用8位自动重装模式最好,因为硬件装值(赋值给TH0)比软件装值快。但8位自动重装模式不宜做单次长时间延迟。毕竟溢出周期短。长时间延迟需要多个溢出周期,也挺消耗资源的。


尽量让溢出周期 越长越好。溢出周期为10ms 的优于 1ms 的。因为,在同样的延时时间下,如100ms,溢出周期为10ms 的 只需要溢出10次,为TH0 和 TL0重新赋值10次,而溢出周期为1ms的要溢出100次,为TH0 和 TL0重新赋值100次。减少溢出次数和赋值次数,可以减轻单片机的负担,提高定时的准确性。


关键字:C51  单片机  定时器 引用地址:C51单片机定时器介绍

上一篇:非常稳定可靠的单片机按键消抖程序
下一篇:谈51单片机实物与仿真差异

推荐阅读最新更新时间:2024-11-12 16:15

定时器0,中断,控制LED闪烁
#include reg52.h #include stdio.h #define uchar unsigned char #define uint unsigned int sbit LED = P2^2; void timer_init() { TMOD |= 0x01; TH0 = 0x4C; TL0 = 0x00; EA = 1; ET0 = 1; TR0 = 1; } void trigger_timer0() interrupt 1 { static uint i = 0; TH0 = 0x4C; TL0 = 0x00;
[单片机]
基于C8051F320单片机的低成本心电监护系统设计
  1 引言   虚拟医学仪器充分利用计算机丰富的软硬件资源,仅增设少量专用软、硬件模块,便可实现传统仪器的全部功能及一些传统仪器无法实现的功能,同时缩短了研发周期。本系统由两部分组成:以C8051F320单片机为核心的数据采集装置和以PC机为平台的分析处理系统。设计中充分考虑数据采集装置体积小、功耗低、操作快捷的要求,因此全部采用SMT封装的元器件。PC监护终端通过USB接口接收数据,传输速率高;采用图形编程语言LabVIEW编写显示、存储、分析处理等功能程序。该系统可实时监护并提供心动周期,心率等参数,也可进行数据的存储回放,为心血管疾病的诊断提供依据。系统的软件开发和硬件与上位机软件的集成测试表明,系统运行稳定可靠,取得
[测试测量]
基于C8051F320<font color='red'>单片机</font>的低成本心电监护系统设计
51单片机扩展数据存储器RAM proteus仿真
8051单片机芯片扩展数据存储器完整案例下面是proteus仿真原理图: 单片机源程序: #include reg51.h #include absacc.h sbit K1=P3^4; sbit K2 =P3^5; void Ex_Int0(void); unsigned int n; void main() { unsigned int i; n = 0; P1 = 0xff; EA = 1; IT0 = 1; EX0 = 1; for(i=0;i 200
[单片机]
51<font color='red'>单片机</font>扩展数据存储器RAM proteus仿真
51单片机-播放天空之城
#include //包含51单片机寄存器定义的头文件 sbit sound=P3^7; //将sound位定义为P3.7 unsigned int C; //储存定时器的定时常数 //以下是C调低音的音频宏定义 #define L1 262 //将 L1 宏定义为低音 1 的频率262Hz 时间是1/262=3826/2 us 取半周期 #define L2 286 //将 L2 宏定义为低音 2 的频率286Hz #define L3 311 //将 L3 宏定义为低音 3 的频率311Hz #define L4 349 //将 L4 宏定义为低音 4 的频率349Hz #de
[单片机]
STM32 定时器定时时间的计算
假设系统时钟是72Mhz,TIM1 是由PCLK2 (72MHz)得到,TIM2-7是由 PCLK1得到关键是设定 时钟预分频数,自动重装载寄存器周期的值/*每1秒发生一次更新事件(进入中断服务程序)。RCC_Configuration()的SystemInit()的RCC- CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK为72MHz。因此,每次进入中断服务程序间隔时间为: ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+9999)=1秒。定时器的基本设置如下: 1、TIM_TimeBaseStructure.TIM_
[单片机]
Msp430单片机内部Flash存储器的特点及功能解析
1 Msp430Flash型单片机内部Flash存储器介绍 MSP430的Flash存储器是可位、字节、字寻址和编程的存储器。该模块由一个集成控制器来控制编程和擦除的操作。控制器包括三个寄存器,一个时序发生器及一个提供编程、擦除电压的电压发生器。 Msp430的Flash存储器的特点有: 1)产生内部编程电压 2)可位、字节、字编程,可以单个操作,也可以连续多个操作 3)超低功耗操作 4)支持段擦除和多段模块擦除 2 Flash存储器的分割 Msp430 Flash存储器分成多个段。可对其进行单个字节、字的写入,也可以进行连续多个字、字节的写入操作,但是最小的擦除单位是段。 Flash存储器被分割成两部分:主存储器
[单片机]
Msp430<font color='red'>单片机</font>内部Flash存储器的特点及功能解析
AT89S51单片机的复位操作及复位电路设计
复位是单片机的初始化操作,只需给AT89S51的复位引脚RST加上大于2个机器周期(即24个时钟振荡周期)的高电平就可使AT89S51复位。 复位操作 当AT89S51进行复位时,PC初始化为OOOOH,使AT89S51单片机从程序存储器的OOOOH单元开始执行程序。除了进入系统的正常初始化之外,当程序运行出错(如程序“跑飞”)或操作错误使系统处于“死锁”状态时,也需按复位键即RST脚为高电平,使AT89S51摆脱“跑飞”或“死锁”状态而重新启动程序。 除PC之外,复位操作还对其他一些寄存器有影响,这些寄存器复位时的状态见表2-7。由表2-7可以看出,复位时,SP-07H,而4个I/O端口PO~P3的引脚均为高电平。在某些
[单片机]
AT89S51<font color='red'>单片机</font>的复位操作及复位电路设计
简仪计数器/定时器模块满足严格的工业标准和安全要求
应用 在电气开关柜的控制模组中,精确的时延控制对于确保高电压设备的安全运行至关重要。控制模组需要输出固定时延的脉冲信号,以控制外部的高电压设备。这种应用场景要求脉冲信号的时延精度达到10 ns级别,以满足严格的工业标准和安全要求。 挑战 传统的脉冲边沿检测方法通常采用示波器或时间间隔计时器等仪表进行测量,但这些方法存在精度不够高、测量速度慢、操作繁琐等弊端,难以满足高压控制模组测试的苛刻要求。 解决方案 针对这一挑战,简仪提供的PCIe-5211计数器/定时器模块成为了理想的解决方案。该模块具备8通道定时器,每个通道都能独立进行双边沿测量,完美契合了客户的测试需求。内部搭载的100 MHz高精度时钟,确保了每次测量都能达到
[嵌入式]
简仪计数器/<font color='red'>定时器</font>模块满足严格的工业标准和安全要求
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved