定时器
定时器介绍:
51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成
定时器作用:
(1)用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作
(2)替代长时间的Delay,提高CPU的运行效率和处理速度
(…)
定时器0初始化
定时器1初始化
中断源
#include "reg52.h"
typedef unsigned int u_int;
sbit LED1 = P2^1;
sbit LED0 = P2^0;
void Timer0Init() //12MHz
{
TMOD |= 0x01; //0000 0001,低四位用于T0,GATE=0;C/T=0;M1M0=01:16位定时/计数器,与运算为了不让其它位受影响
TH0 = 0xFC; //给定时器赋初值,分为两个寄存器,一个配置高位,一个配置低位,单位是1us
//这里定时1ms,1ms=1000us,初值=65535-1000+1=64536,转为十六进制是0xFC18;
TL0 = 0x18;
ET0 = 1; //打开定时器0中断允许
EA = 1; //打开中断总开关
TR0 = 1; //控制寄存器TCON的TR0,置1时定时器开启工作,置0时停止工作
}
//当定时器满时,会跳到中断处理函数
void Timer0interrupt() interrupt 1
{
u_int mount;
static u_int i; //设定一个全局变量
TH0 = 0xFC; //当计时满溢出后,这两个标志位会清零,这时要给其重新上初始值
TL0 = 0x18;
i++;
if(i == 1000) //如果计时满1秒
{
i = 0;
LED1 = ~LED1; //LED灯亮灭
//D2亮10次后点亮D1
if(LED1 == 0)
{
mount++;
if(mount == 10)
{
mount = 0;
LED0 =~ LED0;
}
}
}
}
int main()
{
Timer0Init();
while(1)
{
}
}
注意:定时器的的中断处理函数不一定要放到main.c文件中,也可以放到其他的文件,处理函数要用到变量可以在对应文件中声明,如果该变量要在main函数中改变的,如PWM控制的compare比较值,可以在main.c文件的开头声明该变量,用extern关键字
extern unsigned char compare