历史上的今天
返回首页

历史上的今天

今天是: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就可以不用再出现在程序书写中了。


还记得外部中断这个图吗

8.3.png?imageView2/2/w/550

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

QQ截图20200518195134.png?imageView2/2/w/550


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

6.11.png?imageView2/2/w/550

这些编号是为了区分哪些硬件资源的相关中断函数,如果我们同时使用两个定时器,那么只能用“interrupt 1”和“interrupt 3”来区分谁是谁的中断函数了。


使用“TIM0_IRQHandler”作为函数名也是模仿STM32定时器中断函数名的写法。

如果我们使用的是工作模式1,每次触发中断函数的执行内容首先就是再次给TH0和TL0赋初值保证下次的定时时间还是一样。


这里我们使用中断函数的执行方式来实现30ms的间隔流水灯,算出TH0和TL0合成的“16位的变量”要填充的值为37888=0x9400。


在中断函数里也是可以定义局部变量的,当然如果这个变量是用来辅助流水灯的,那么肯定是要定义成静态变量的。


3.代码

#include  

#include //详见第六章第8讲

 

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;

    }

}


推荐阅读

史海拾趣

ELDECO公司的发展小趣事

随着环保意识的不断提高,ELDECO公司积极响应国家号召,将绿色环保理念融入产品设计和生产过程中。公司采用环保材料和节能技术制造ELD产品,减少了对环境的污染和能源消耗。同时,公司还推广绿色出行理念,鼓励运输企业采用更环保的运输方式。通过这些措施,ELDECO公司不仅提高了企业的社会责任感,还为推动绿色交通发展做出了积极贡献。

DOMINANT公司的发展小趣事

随着公司业务的不断发展,统明亮开始积极拓展全球市场。它通过与国内外知名企业的合作,不断提升自身的品牌影响力和市场竞争力。同时,统明亮还积极参加各类国际展会和交流活动,与全球各地的客户建立了紧密的合作关系。这些努力使得统明亮在全球LED市场中的份额不断扩大,其品牌影响力也得到了进一步提升。

请注意,由于篇幅限制,以上仅为三个简要故事。如果需要更多关于DOMINANT公司的发展故事,建议查阅相关报道和资料。

E-Mark Inc公司的发展小趣事

GHI公司一直致力于提升产品品质和安全性。为了进入欧洲高端市场,GHI公司决定对其核心产品进行E-Mark认证。在认证过程中,GHI公司不断完善质量管理体系,提升生产工艺水平,确保产品质量的稳定性和可靠性。最终,GHI公司的产品成功获得了E-Mark认证,并在欧洲市场获得了良好的口碑和市场份额。

FLEX LTD公司的发展小趣事

JKL公司是一家创新型电子企业,专注于研发新能源汽车电子控制系统。为了推动新能源汽车的发展并满足欧洲市场的需求,JKL公司决定对其产品进行E-Mark认证。在认证过程中,JKL公司积极投入研发资源,不断创新技术,提升产品的智能化和安全性。最终,JKL公司的产品成功获得了E-Mark认证,并在欧洲市场得到了广泛应用和认可。这一认证不仅加速了JKL公司新能源汽车技术的市场推广速度,也提升了公司在国际市场的竞争力。

DMS Electronic Components, Inc公司的发展小趣事

DMS深知品质对于企业的重要性,因此从一开始就建立了严格的质量管理体系。公司采用先进的生产设备和工艺,对每一个环节都进行严格把关,确保产品质量符合国际标准。DMS还积极参与国际认证,通过ISO9001、CE、UL等认证,进一步提升了品牌的国际竞争力。

上海如韵(CONSONANCE)公司的发展小趣事

在发展过程中,如韵始终关注社会责任和可持续发展问题。公司积极参与社会公益活动,为弱势群体提供帮助和支持。同时,如韵注重环保和节能减排工作,在产品设计和生产过程中严格遵守相关环保法规和标准。

为了推动行业的可持续发展,如韵还积极参与行业交流和合作活动,与同行分享经验和资源。通过与产业链上下游企业的紧密合作和协同创新,如韵为推动电子行业的绿色发展和技术进步做出了积极贡献。

问答坊 | AI 解惑

基于EL7558BC的DC/DC变换器的设计与实现

基于EL7558BC的DC/DC变换器的设计与实现   摘要:对HSOP封装的EL7558BC降压型开关整流器芯片的使用特点进行了分析,给出了利用该整流器芯片设计DC/DC变换器的外围电路和设计方法。并通过实验验证了该设计方法。 关键词:DC/DC变换器;EL7 ...…

查看全部问答>

有人用SV做过设计吗?

SV做验证不必说了,但据说将来SV也可以做设计,而且是趋势。现在有用SV做设计的吗,如果有,其流程是什么?用什么工具综合和布局布线?目前据我所知,两大主流FPGA供应商xilinx和altera的开发工具还不支持SV做设计。…

查看全部问答>

Dshow 播放mp3的问题

   hr |= m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pMediaControl);    hr |= m_pGraph->QueryInterface(IID_IMediaEvent, (void **)&m_pIMediaEvent);    hr |= m_pGraph->QueryInterface(IID_ ...…

查看全部问答>

EVC开发GPRS短信收发程序

请问谁有EVC开发的GPRS短信收发程序?能传一个给我吗?谢谢!E-mail: wusthanbo1983@163.com…

查看全部问答>

求助:怎么取得目录占用的空间大小

各位大虾,请教:怎么获取一个目录占用的空间的大小(即目录中所有文件占用空间的和)?…

查看全部问答>

stm8s-discovery外部中断问题

、、开发环境iar;st_link;stm8sdiscovery系统版;无法进入中断;大家帮忙看看啊。以下是全部代码,stm8_conf.h里面的_EXTI已经配置了。 #include "stm8s.h" #include "stm8s_type.h" #include "stm8s_conf.h" #include "s ...…

查看全部问答>

AVR T0中断分析

#pragma interrupt_handler TimeCountr0_Interrupt:20                    void TimeCountr0_Interrupt(void){//中断程序 ...…

查看全部问答>

Si4432带宽问题

刚接触si4432,用该芯片传输语音,在我设置Fd=45K,Rb=5.6Kbps的时候,频谱仪上看到的带宽是95K左右,通信正常。但当我把设置改成Fd=5.6K的时候,频谱仪上看到的带宽还是那么多,接收端也收不到信号了,是怎么回事呢,这个带宽怎么设置就变窄了,有 ...…

查看全部问答>

求助:IAR for MSP430堆栈设置求指教....

MSP430 链接时出现附图所示错误,说CSTACK尺寸太大,改小后问题解决。只是我担心改小后有其它问题,故请教是否有其它更好的办法?导致该问题的原因是什么?有会的网友请帮忙指教一下,谢谢! StackSet…

查看全部问答>

抢楼

来抢楼了,哈哈 …

查看全部问答>