嵌入式学习笔记6——定时器计数器

it2023-08-07  71

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++; }
最新回复(0)