arduino中断函数的学习——定时中断(MsTimer2)

arduino中断函数的学习——定时中断(MsTimer2)

arduino定时器(MsTimer2)学习

学习之前,先认识一下定时器的中断函数吧

void set(unsigned long ms, void (*f)())

这个函数设置定时中断的时间间隔和调用的中断服务程序。ms表示的是定时时间的间隔长度,单位是ms,void(*f)()表示被调用中断服务程序,只写函数名字就可以了。

void start()

开启定时中断

void stop()

关闭定时中断

这三个函数都是在MsTimer2的作用于中进行的,在使用时都要加上作用域。

下面通过一段代码讲解来学习吧

我使用的是arduino nano(用哪一个控制板都没有关系)来验证定时函数,下面的代码想要实现的功能是,每隔两秒进入一次中断,改变a的值,从而控制3号引脚的发光二极管的熄灭和亮。总共会闪烁5次,之后是保留最后一次的a值,并退出中断。加入串口的目的在于,我们能很好的在串口显示器上观察键值的变化,什么时候中断结束。

#include //MsTimer2库

int a; //定义一个全局变量,将在被调用的中断函数中使用

void fals(){ //中断函数

static int i=0; //定义的一个静态变量,每次进入中断时,i保留上一次的值

if(i%2==0){ //通过i来改变a的值,用a来改变pin 3 的电平

a=0;

}

else{

a=1;

}

if(i==9){ //通过串口查看i的值,并在i=9时关闭中断

MsTimer2::stop(); //关闭定时中断的函数

Serial.println("9中断已结束");

}

Serial.println(i); //当i=9时,执行完上面的if语句后还会在串口监视器上显示9

i++;

}

void setup() { //初始化

Serial.begin(9600); //设置波特率

pinMode(3,OUTPUT); //3号引脚,输出模式

digitalWrite(3,1);

MsTimer2::set(2000,fals); //每2秒进入一次中断,中断函数是fals()

MsTimer2::start(); //开启定时中断函数

}

void loop() { //依据中断改变的a值来变换3号引脚的高低电平

if(a==0){

digitalWrite(3,0);

}

else{

digitalWrite(3,1);

}

}

运行效果,发光二极管会闪烁5次,串口输出是单号的时候是亮的,双号的时候的熄灭的。

心得总结

说说在学习MsTimer2中遇到的问题吧,因为我设置的是每两秒进入一次中断,控制板的运行速度非常快,就不会存在中断函数还没执行完毕,下一次中断就又到来了的情况,两秒一次的中断时间足够执行很多行代码了。

起初我是想把loop函数中的程序放在中断函数fals中去执行的,但并不像我想像的那样运行——在中断中改变电平后会持续整个中断的时间,这个问题的原因就是控制板的运行速度太快了,很快就执行完中断回到loop函数,于是我又想在中断中添加个延时函数,但是这并不行,通过查找资料,我才知道在中断函数中,delay()和millis()函数将不起作用。然后我又让loop函数执行一个空循环,arduino的串口监视器有数据输出,但是3号引脚连接的二极管依然不亮。

要运用中断,最好的方式还是只有通过中断来改变变量的值(代码中a的值)来实现控制,灯闪烁的时间由进入中断的间隔来决定。

🌸 相关推荐 🌸

闲鱼审核一般多长时间?凭证要多久?
365bet娱乐场在线

闲鱼审核一般多长时间?凭证要多久?

📅 07-09 👀 7972
ipad拆机检验多少钱
365bet娱乐场在线

ipad拆机检验多少钱

📅 07-06 👀 9746
阴阳师那些没人用的R卡 还可以这样用
365bet中文体育在线

阴阳师那些没人用的R卡 还可以这样用

📅 07-13 👀 4312