一、定时/计时器T0的工作原理
在定时方式1下,定时/计数器T0的核心是一个16位宽的,由计数脉冲触发的,按递增规律(及累加方式)工作的循环累加计时器(TH0+TL0)。从预先设定的初始值开始,每来1个计数脉冲就加1,当加到计数器全为1时,再输入1个脉冲,就会发生溢出现象,计数器回零。同时产生溢出中断请求信号(TF0置1)。如果定时/计数器工作于定时模式,则表示定时时间已到。
二、定时器T0初值计算(我这里用到的是12MHZ的晶振)
初值=65536-计数
计数=定时时间/(振荡周期 X 12)
定时时间=振荡时间 X 12 X (65536-初值)
最大定时时间+振荡周期 X 12 X65536=65.536ms
比如我们这里要用到的定时器初值是50ms则定义如下所示:
TH0 = (65536 - 50000) / 256; // 50ms
TL0 = (65536 - 50000) % 256;
三、实验(项目新建和烧录请看上一篇文章)
这里我们要实现一个基于 51 单片机的秒表程序。每5秒响一次蜂鸣器,每秒闪烁一次 LED 灯。
所以我们的代码如下所示:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep