|
发表于 2024-1-22 15:15:56
|
显示全部楼层
第十一集:定时器的使用
1.定时器的作用和意义
什么是定时器:定时器-与非网
上节课的一段代码:
while(1)
{
TimeCount++;
delay_ms(1);
}
TimeCount++然后一个延时1毫秒,每运行1ms,变量就会加一。
系统已经运行了多少个毫秒。
实际使用时的代码如下,
while(1)
{
TimeCount++;
delay_ms(1);
if (KEY1 == 0)
{
delay_ms(10);
if (KEY1 == 0)
{
while(KEY1 == 0);
}
}
}
判断按键有沿有按下的时候,我们等待按键松开,还有一个while循环。
如果没有松开,会一直死在这一行。所以,按下的时间段内,TimeCount++没有在执行,变量不会动。
那么像这样while函数在不断循环执行的时候,能不能有办法让这个变量每隔1ms能自动加一,并且不受while循环的影响呢?
引入:中断的概念
如果中断不发生,就会一直执行主程序(主函数)。但是,如果中断发生了,先会进行这个中断的处理函数
处理完后,从中断返回,再继续执行主程序(之前没有完成的一个人任务)。
定时一定时间之后产生的中断,也就是定时器中断。
主程序:你在背书
中断:妈妈让你五分钟以后看一下锅里的汤有没有烧干,一个定时器中断的一个例子。
定时器是定时器和计数器的统称。
1)设置为定时器时,可实现硬件计时,或者使程序每隔一固定时间完成一项操作;
2)设置为计数器时候能够对脉冲进行计数;
3)替代长时间的delay,提高CPU的运行效率和处理速度,能及时的响应某个事件。
1、软件定时的缺点:占用CPU时间,影响CPU的运行效率和处理速断,有时会造成很大的定时误差。
2、中断的概念:中断请求、中断响应(中断处理程序)、中断返回,本节主要是讲定时器中断。
3、定时器的使用(以T0为例)
1)设置为定时器/计数器
寄存器TMOD的T0_CT位:0为定时模式,1为计数模式
2)设置不分频或12分频
通过设置辅助寄存器AUXR的T0x12:0为12分频(默认为0),1为不分频。
3)定时器工作模式T0_M1/T0_M0
16位自动重载模式比较常用。
4)定时器设置 (定时器 0/1 控制寄存器TCON)
TF0:T0 溢出中断标志。该位软件清0,也可以不清0。
TR0:定时器 T0 的运行控制位。该位软件置1,开启定时器。
5)中断
IE:中断使能寄存器,EA:总中断允许控制位。EA=1允许中断。
ET0:定时 / 计数器 T0 的溢出中断允许位。ET0=1允许定时器中断。
4、实现T0定时器中断的主要程序
T0初始化程序
TMOD =0x00; // 设置定时器 0 位 16 位自动重载模式
TL0=0x30; // 计算出的 24M 时钟下的 1ms 的定时时间初始值
TH0=0xF8:
TR0=1; //启动定时器
ET0 =1; // 使能定时器中断
EA = 1; //CPU 开放中断,打开总中
T0中断响应程序
void Tim0_Isr() interrupt 1 //1-定时器0中断号
{
}
|
|