Fortware 发表于 2013-4-7 13:13:00

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

本帖最后由 Fortware 于 2013-4-7 16:57 编辑

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

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

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

void setup()
{
pinMode(13, OUTPUT);

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

void loop()
{

}

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

unsigned long ledOn=500,ledOff=500; //定义led灯变化的时间长度,每500ms变化一次
int ledStatus;                      //定义LED灯的状态,HIGH or LOWm
void setup()
{
    pinMode(13,OUTPUT);
    digitalWrite(13,HIGH);
    ledStatus=HIGH;
}
void loop()
{
    unsigned long nowtime=millis(); //获取当前的系统运行时间长度
    if(ledStatus==HIGH)             //如果当前lled灯状态为高电平,则执行该程序
    {
      if(nowtime>ledOn)             //检测系统运行时间长度是否到500ms
      {
      ledOn=nowtime;            //记录当前时间长度,第一次为500ms,赋值给ledOn
      ledOff=nowtime+500;         //计算出下一次led灯变化的时刻,第一次运行程序时应该在1000ms时关灯
      digitalWrite(13,LOW);       //关掉led灯
      ledStatus=LOW;            //记录当前led灯状态,下一次使用   
      }
    }
   
else{      
         if(nowtime>ledOff)
         {   
          ledOff=nowtime;
          ledOn=nowtime+500;
          digitalWrite(13,HIGH);
          ledStatus=HIGH;
         }
       }
}
如果需要,可以控制led灯在某一时间段或某一时刻亮灭。

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




wing 发表于 2013-4-7 13:24:08

{:soso_e179:}{:soso_e179:}{:soso_e179:}拜读了

MicroCao 发表于 2013-4-7 15:29:57

用MsTimer后会有其他什么功能受影响吗

Fortware 发表于 2013-4-7 16:55:22


用MsTimer后会有其他什么功能受影响吗

暂时还没发现的

txmg 发表于 2013-4-7 21:50:22

好!学习了!

xch396352170 发表于 2013-4-27 11:38:32

刚在弄I2C的温湿度传感器(AM2311),学习中。

GoStop 发表于 2013-6-6 13:41:08

两种方法那种比较好呢
:)

拾瑞 发表于 2013-6-6 16:38:09

希望大神解答一下:

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

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

FoieDEEEE_仲敬 发表于 2013-6-15 09:20:23

表示
Mega2560用不了

wanji 发表于 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里的代码也不会被执行

awdr2046 发表于 2013-9-12 23:57:02

请问arduino有没有库函数可以随时开关定时器?难道真的需要了解其中的寄存器,对其进行位操作才可以做到么?

灬天然呆灬 发表于 2014-1-24 09:26:30

楼主威武~~很好

lcokenm 发表于 2014-1-28 11:34:30

很好地库,谢谢!
页: [1] 2 3
查看完整版本: 【学习心得】关于定时器中断的使用