C51 定时器/计数器 个人笔记

时间:2022-06-07 23:36:10

C51的周期

C51 定时器/计数器 个人笔记

结构图

C51 定时器/计数器 个人笔记

两个功能寄存器

51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。
C51 定时器/计数器 个人笔记

工作方式寄存器TMOD

C51 定时器/计数器 个人笔记

C51 定时器/计数器 个人笔记
其中方式一和方式二常用

控制寄存器TCON

第四位用于控制外部中断,详见C51中断个人笔记
C51 定时器/计数器 个人笔记

初始化函数中要完成的工作:

  1. 给TMOD赋值,确定工作方式
  2. 计算初值,写入TH0,TL0或TH1,TL1
  3. 中断允许控制,EA和ET0 或ET1的置位为1
  4. TR0或TR1置位,启动定时计数器

计数初值的计算

首先知道振荡周期是多少,从而机器周期是其12倍,即每计一个数,用时为机器周期
若需求是计一个数就溢出,则初值应设为65535,即65536-1 (如果是16位计数器)
若需求是计n个数就溢出,则初值应设为65536-n (如果是16位计数器)

例如,定时一毫秒。一个机器周期是1微秒,故1000个机器周期是1ms。
初值为 65536-1000 = 64536 ,十六进制为FC18
所以

TH0 = 0xFC;
TL0 = 0x18;

完整代码

#include <reg51.h>
typedef unsigned int u16;        
typedef unsigned char u8;
#define delaytime 500000
sbit led = P0^0;
              
/*
void delay(u16 i)
{
    while(i--);
}
*/
void T0Init()
{
    //1.选择工作方式,给TMOD 赋值
    //TMOD: GATE    C~T  M1 M0   (低四位是T0)
    //           0      0    0  1  (方式一)
    // xxxx 0001
    TMOD |= 0x01;
    //2. 计算初值,写入计数器
    TH0=0XFC;               //给定时器赋初值,定时1ms   0xFC18 = 65536 - 1000  微秒
    TL0=0X18;   
    //3. 中断允许:总允许和T0允许
    ET0 = 1 ;
    EA = 1;
    //4. 开始定时
    TR0=1;
}
void main(void)
{
    T0Init();
    while(1);
}
//外部中断0的调用程序
void Timer0() interrupt 1             //    T0溢出时引用
{
    static u16 i;
    TH0=0XFC;               //给定时器赋初值,定时1ms   0xFC18 = 65536 - 1000  微秒
    TL0=0X18;
    i++;
    if(i==1000)            //1s
    {
        i=0;
        led = ~led;
    }
}