1.为什么要用计时器?
延时过程中,CPU时间被占用,无法进行其他任务,导致系统效率降低。延时时间越长,该
缺点便越明显,因此软件延时只适用于短暂延时,或简单项目。
工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。
2.定时器操作步骤:
1.选择工作方式(设置M1,M0)
2.选择控制方式(设置GATE)
3.选择定时器还是计数器模式(设置C/T)
4.给定时/计数器赋初值(设置THx和TLx)
5.开启定时器中断(设置ET0或ET1)
6.开启总中断(设置EA)
7.打开计数器(设置TR1或TR0)
定时/计数器的作用
1、进行延时。
2、对外部信号的时间间隔进行精确测量。
3、对外部脉冲信号进行计数。
/*********************************************************************************
*实验名 :定时器实验
*实验效果 :第一个LED以定时器0设定的时间周期闪烁
*
*********************************************************************************/
#include<reg52.h>
#include "bstv51.h"
void Init_timer0(void)
{
TMOD |= 0X01; //工作方式1 内部寄存器控制的定时功能
TH0=0X00; //高八位的初值
TL0=0X00; //低八位初值
EA=1; //开启整体中断允许
ET0=1; //开启定时器0中断允许
TR0=1; //开始计数
}
void main()
{
bstv51_init();
Init_timer0();
while(1)
{
;
}
}
void Timer0_isr(void)interrupt 1
{
TH0=0x00;
TL0=0x00;
L0=~L0;
}
/*********************************************************************************
*实验名 :定时器实验
*实验效果 :第一个LED灯以一秒一次的准确频率开始闪烁
*
*********************************************************************************/
#include<reg52.h>
#include "bstv51.h"
uint i=0;
void Init_timer0(void)
{
TMOD |= 0X01; //工作方式1 内部寄存器控制的定时功能
TH0=0X4C; //高八位的初值
TL0=0X00; //低八位初值
EA=1; //整体中断允许
ET0=1; //定时器0中断允许
TR0=1; //开启定时器0
}
void main()
{
bstv51_init(); //初始化
Init_timer0(); //定时器配置函数
while(1)
{
if(i==10) //查询是否计够10次,相当于0.5秒闪烁一次
{
L0=~L0;
i=0; //注意清0全局变量
}
}
}
void Timer0_isr(void)interrupt 1
{
TH0=0x4C; //50ms=(12/11059200)(65535-初值) 初值=19456——————0x4C00
TL0=0x00;
i++;
}