极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 179289|回复: 42

【学习心得】关于定时器中断的使用

  [复制链接]
发表于 2013-4-7 13:13:00 | 显示全部楼层 |阅读模式
本帖最后由 Fortware 于 2013-4-7 16:57 编辑

看了这么久,第一次发帖,做点贡献。
最近了解了一下Arduino 的中断,除了外部中断外,还有定时器中断,前面已经有大神介绍过中断的概念,这里就不详细介绍了。
下面的程序是用定时器中断让13引脚 led灯每500ms变化一次。(使用的库在帖子底端)

  1. // led灯接UNO的13管脚
  2. #include <MsTimer2.h>               //定时器库的 头文件

  3. void flash()                        //中断处理函数,改变灯的状态
  4. {                        
  5.   static boolean output = HIGH;
  6.   digitalWrite(13, output);
  7.   output = !output;
  8. }

  9. void setup()
  10. {
  11.   pinMode(13, OUTPUT);

  12.   MsTimer2::set(500, flash);        // 中断设置函数,每 500ms 进入一次中断
  13.   MsTimer2::start();                //开始计时
  14. }

  15. void loop()
  16. {

  17. }
复制代码


再提供一种方法,利用  mills()同样函数可以实现中断的功能。mills()函数功能是获取系统运行的时间长度,单位ms。最大为9小时22分,如果超出时间将从0开始。函数的返回值为unsigned long型。
下面程序的功能让led灯亮灭各500ms :

  1. unsigned long ledOn=500,ledOff=500; //定义led灯变化的时间长度,每500ms变化一次
  2. int ledStatus;                      //定义LED灯的状态,HIGH or LOWm
  3. void setup()
  4. {
  5.     pinMode(13,OUTPUT);
  6.     digitalWrite(13,HIGH);
  7.     ledStatus=HIGH;
  8. }
  9. void loop()
  10. {
  11.     unsigned long nowtime=millis(); //获取当前的系统运行时间长度
  12.     if(ledStatus==HIGH)             //如果当前lled灯状态为高电平,则执行该程序
  13.     {
  14.       if(nowtime>ledOn)             //检测系统运行时间长度是否到500ms
  15.       {
  16.         ledOn=nowtime;              //记录当前时间长度,第一次为500ms,赋值给ledOn
  17.         ledOff=nowtime+500;         //计算出下一次led灯变化的时刻,第一次运行程序时应该在1000ms时关灯
  18.         digitalWrite(13,LOW);       //关掉led灯
  19.         ledStatus=LOW;              //记录当前led灯状态,下一次使用     
  20.       }
  21.     }
  22.    
  23.   else{      
  24.          if(nowtime>ledOff)
  25.          {   
  26.           ledOff=nowtime;
  27.           ledOn=nowtime+500;
  28.           digitalWrite(13,HIGH);
  29.           ledStatus=HIGH;
  30.          }
  31.        }
  32. }
复制代码

如果需要,可以控制led灯在某一时间段或某一时刻亮灭。

PS:使用mills()函数的好处在于占用的整个程序运行时间短,如果用用延时函数,在延时的时间内,CPU不能干别的事儿。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-4-7 13:24:08 | 显示全部楼层
{:soso_e179:}{:soso_e179:}{:soso_e179:}拜读了
回复 支持 反对

使用道具 举报

发表于 2013-4-7 15:29:57 | 显示全部楼层
用MsTimer后会有其他什么功能受影响吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-7 16:55:22 | 显示全部楼层
用MsTimer后会有其他什么功能受影响吗


暂时还没发现的
回复 支持 反对

使用道具 举报

发表于 2013-4-7 21:50:22 | 显示全部楼层
好!学习了!
回复 支持 反对

使用道具 举报

发表于 2013-4-27 11:38:32 | 显示全部楼层
刚在弄I2C的温湿度传感器(AM2311),学习中。
回复 支持 反对

使用道具 举报

发表于 2013-6-6 13:41:08 | 显示全部楼层
两种方法那种比较好呢
回复 支持 反对

使用道具 举报

发表于 2013-6-6 16:38:09 | 显示全部楼层
希望大神解答一下:

第一种中断方式,是否就是等同硬件中断;而第二种实际上利用时间寄存器,而且又写了一段需要CPU执行时间的代码,是不是软中断?

第一种中断应该比第二种好!不知道我的说法对不对?
回复 支持 反对

使用道具 举报

发表于 2013-6-15 09:20:23 | 显示全部楼层
表示
Mega2560用不了
回复 支持 反对

使用道具 举报

发表于 2013-7-5 09:58:37 | 显示全部楼层
{:soso_e179:}  学习了两种思路。2560得用FlexiTimer2库就得到一样的效果
回复 支持 反对

使用道具 举报

发表于 2013-8-16 16:14:25 | 显示全部楼层
不知M16能不能用MsTimer2这个库~~~
回复 支持 反对

使用道具 举报

发表于 2013-9-12 12:10:20 | 显示全部楼层
感觉第二种不能叫严格意义上的中断,试想如果程序中还有其他代码,如果在执行其他代码时时间到了,if里的代码也不会被执行
回复 支持 反对

使用道具 举报

发表于 2013-9-12 23:57:02 | 显示全部楼层
请问arduino有没有库函数可以随时开关定时器?难道真的需要了解其中的寄存器,对其进行位操作才可以做到么?
回复 支持 反对

使用道具 举报

发表于 2014-1-24 09:26:30 | 显示全部楼层
楼主威武~~很好
回复 支持 反对

使用道具 举报

发表于 2014-1-28 11:34:30 | 显示全部楼层
很好地库,谢谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-25 17:13 , Processed in 0.046565 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表