//## 定时器控制 LED闪烁 (500MS) ##//
/*** 关于定时器0方式1初值的设置 ***/
预备知识:
首先我们要知道 51单片机普遍是1个机器周期 = 12 个时钟周期(晶振周期),频率与周期互为倒数关系。
示例:
假定晶振频率为12MHZ
时钟周期:1/12(MHZ)==1/12(μs)。
机器周期:12 x 1/12(μs)=1(μs)。
定时1ms,即1000(μs),要经过X个机器周期得到1000(μs),求得X=1000(μs)/1(μs)=1000个机器周期。16位定时器的溢出值是65536(因65535再加1才是溢出)。
所以我们可以先给TH0和TL0一个初始值,每过一个机器周期+1,经过1000个机器周期后刚好达到65536,也就是溢出,溢出后的事件处理通常有2种方式:
①通过软件查询TF0位是否置1,注意要将TF0软件清零。
②进入定时器中断服务函数,中断号注意别写错,本文用的就是进入定时器 中断服务函数的方式。
TH0=(65536-X)/256;
TL0=(65536-X)%256;
#include "reg51.h"
typedef unsigned int u16;
typedef unsigned char u8;
#define LED P1
#define LED_ON() LED = 0xfe
#define LED_OFF() LED = 0xff
static u8 LedState = 0;//LED状态标志,0表示亮,1表示灭
static u16 LedTimeCount = 0;//LED计数器
void LedProcess(void)
{
if(LedState == 0)//
{
LED_ON();
}
else
{
LED_OFF();
}
}
void LedStateChange(void)
{
if(LedTimeCount >= 500)//
{
LedTimeCount = 0;
LedState =!LedState;//LED状态标志取反
}
}
void Timer0Init(void)
{
TMOD = 0X01;//定时器0工作方式1
TH0 = (65536 - 1000)/256;//定时器赋初值
TL0 = (65536 - 1000)%256;
ET0 = 1;
TR0 = 1;
EA = 1;
}
void main()
{
Timer0Init();
while(1)
{
LedProcess();
LedStateChange();
}
}
void timer0Isr(void)interrupt 1
{
TH0 = (65536 - 1000)/256;//定时器重装初值
TL0 = (65536 - 1000)%256;
LedTimeCount++;//LED计数器加1
}