历史上的今天
今天是:2024年08月24日(星期六)
2021年08月24日 | 51单片机-定时器中断函数的使用
2021-08-24 来源:eefocus
1.定时器与延时的区别
大家可能会觉得我们用延时函数照样可以实现上一讲代码的实验现象,但是定时器与延时的概念不同,延时函数需要占用CPU的使用权,正在延时的时候其他任务没有CPU的使用权就会拖慢执行效率。
而定时器是不需要占用CPU的使用权的,它是独立自己运行的,就像我们在第一讲的时候提到调好5分钟的闹钟,在这5分钟里我们可以随意执行任务,也可以什么事都不做,但是5分钟过后闹钟响了就要执行相关的任务了。
所以上一讲的代码的实现原理就是每隔51微秒,有个变量会自加1,过了1000个51微秒的时候LED的状态才会改变,可以说CPU在51ms的时间里基本没什么事做,只是在51微秒到了的时候做了“cnt++;”这样简单的任务,然后又空闲地等下一个51微秒的到来再执行“cnt++;”。
2.定时器中断函数
与外部中断一样,定时器中断也有中断函数,同理,程序去执行中断函数就会把TF0的中断标志位自动清0,所以只要我们用了定时器中断函数,那么TF0就可以不用再出现在程序书写中了。
还记得外部中断这个图吗

同样定时器0的中断函数使能如下

至于“interrupt”后面的数字为什么是1,请再看我们以前给过大家的这个图的中断函数编号就明白了

这些编号是为了区分哪些硬件资源的相关中断函数,如果我们同时使用两个定时器,那么只能用“interrupt 1”和“interrupt 3”来区分谁是谁的中断函数了。
使用“TIM0_IRQHandler”作为函数名也是模仿STM32定时器中断函数名的写法。
如果我们使用的是工作模式1,每次触发中断函数的执行内容首先就是再次给TH0和TL0赋初值保证下次的定时时间还是一样。
这里我们使用中断函数的执行方式来实现30ms的间隔流水灯,算出TH0和TL0合成的“16位的变量”要填充的值为37888=0x9400。
在中断函数里也是可以定义局部变量的,当然如果这个变量是用来辅助流水灯的,那么肯定是要定义成静态变量的。
3.代码
#include #include void main() { LED_Init(); //初始化LED硬件模块 EA = 1; //闭合总中断开关 TMOD = 0x01; //设置定时器0为工作模式1 TH0 = 0x94; //设置定时时间为30ms TL0 = 0x00; ET0 = 1; //闭合定时器0中断的开关 TR0 = 1; //启动定时器0 while(1); } void TIM0_IRQHandler() interrupt 1 { static u8 i; TH0 = 0x94; //重新设置定时时间为30ms TL0 = 0x00; P0=~(0x80>>i);//这一次让流水灯向右移 i++; if(i>=8)i=0; } 觉得30ms的流速太快,想改为300ms的话,修改一下中断函数即可,如下 void TIM0_IRQHandler() interrupt 1 { static u8 i,cnt; TH0 = 0x94; //重新设置定时时间为30ms TL0 = 0x00; cnt++; if(cnt>=10) { cnt=0; P0=~(0x80>>i);//这一次让流水灯向右移 i++; if(i>=8)i=0; } }
上一篇:51单片机-定时器工作模式2
下一篇:51单片机-定时器初始化新写法
史海拾趣
|
基于EL7558BC的DC/DC变换器的设计与实现 摘要:对HSOP封装的EL7558BC降压型开关整流器芯片的使用特点进行了分析,给出了利用该整流器芯片设计DC/DC变换器的外围电路和设计方法。并通过实验验证了该设计方法。 关键词:DC/DC变换器;EL7 ...… 查看全部问答> |
|
SV做验证不必说了,但据说将来SV也可以做设计,而且是趋势。现在有用SV做设计的吗,如果有,其流程是什么?用什么工具综合和布局布线?目前据我所知,两大主流FPGA供应商xilinx和altera的开发工具还不支持SV做设计。… 查看全部问答> |
|
hr |= m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pMediaControl); hr |= m_pGraph->QueryInterface(IID_IMediaEvent, (void **)&m_pIMediaEvent); hr |= m_pGraph->QueryInterface(IID_ ...… 查看全部问答> |
|
、、开发环境iar;st_link;stm8sdiscovery系统版;无法进入中断;大家帮忙看看啊。以下是全部代码,stm8_conf.h里面的_EXTI已经配置了。 #include "stm8s.h" #include "stm8s_type.h" #include "stm8s_conf.h" #include "s ...… 查看全部问答> |
|
#pragma interrupt_handler TimeCountr0_Interrupt:20 void TimeCountr0_Interrupt(void){//中断程序 ...… 查看全部问答> |
|
刚接触si4432,用该芯片传输语音,在我设置Fd=45K,Rb=5.6Kbps的时候,频谱仪上看到的带宽是95K左右,通信正常。但当我把设置改成Fd=5.6K的时候,频谱仪上看到的带宽还是那么多,接收端也收不到信号了,是怎么回事呢,这个带宽怎么设置就变窄了,有 ...… 查看全部问答> |
|
MSP430 链接时出现附图所示错误,说CSTACK尺寸太大,改小后问题解决。只是我担心改小后有其它问题,故请教是否有其它更好的办法?导致该问题的原因是什么?有会的网友请帮忙指教一下,谢谢! StackSet… 查看全部问答> |




