目录:
1,语言基础:https://blog.youkuaiyun.com/SumubeiFZ/article/details/118603957
2,串口通讯:https://blog.youkuaiyun.com/SumubeiFZ/article/details/118638228
3,基础实验操作:https://blog.youkuaiyun.com/SumubeiFZ/article/details/118638290
4,中断:https://blog.youkuaiyun.com/SumubeiFZ/article/details/118638320
中断(Interrupt):
指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
Arduino的定时器中断
定时器中断:利用板子里的定时器来让中断定时发生,可以精确控制时间。
需要注意的是:实现该功能需要先在Arduino开发环境中导入FlexiTimer2库,这个库可以在官网上下载。
例子程序:
该程序运行效果:
每隔1000毫秒,产生一次时钟中断,并进入中断服务程序 onTimer(), 向串口打印一串文字。
#include <MsTimer2.h> //定时器库的头文件
int num = 0; //计数值
//中断服务程序
void onTimer()
{
Serial.print("timer ");
Serial.println(num++);
}
void setup()
{
Serial.begin(9600); //初始化串口
MsTimer2::set(1000, onTimer); //设置中断,每1000ms进入一次中断服务程序 onTimer()
MsTimer2::start(); //开始计时_开启定时器中断
//MsTimer2::stop(); //关闭定时器中断
}
void loop()
{
}
程序上传后,打开Arduino IDE的串口监视窗口,可见打印的文字:
timer 0
timer 1
timer 2
…
Arduino的外部中断
在函数 Loop() 中,里面的 if() 条件需要我们不断检测循环里面的代码,如果存在很多的语句需要判断的话,处理器就有可能在处理别的事务,来不及处理你要的判断。对于这些情况,你就可以使用中断接收这些事件。当发生这种情况时,中断程序可以看作是一段独立于主程序之外的程序,当中断触发时,控制器会暂停当前正在运行的主程序,而跳转去运行中断程序,中断程序运行完后,会再回到之前主程序暂停的位置,继续运行主程序。如此便可做到实时响应处理事件的效果。
示例代码:
int ledPIN = 13;//写需要使用的引脚
void setup()
{
pinMode(ledPIN, OUTPUT);
attachInterrupt(0, stuffHappened, FALLING);
//这里0是中断号(在Arduino UNO中,中断0是指D2引脚,中断1是指D3引脚。其他板子并不同)
//FALLING:常数,高电平变为低电平时,ISR才会被调用(在按下按钮时所要发生的事:D2从高电平变为低电平)
}
void loop()
{
}
void stuffHappened()//函数:中断服务程序(简称ISR)
{
digitalWrite(ledPIN, HIGH);
}
//ISR本身只是将“L”灯点亮
测试:1,当Arduino复位时,“L”LED应该熄灭。然后当你按下按钮时,“L”LED应立即点亮并保持。
2,若将attachInterrupt的参数FALLING改为RISING,并将Arduino重新启动,灯保持亮灯状态。此时中断引脚上一直都是高电平,没有出现低电平。当按住按钮时,LED保持熄灭状态直到你松开它放开它时触发中断,因为按下按钮时D2是低电平,而松开时才上升到高电平。
mode中断触发方式:
- LOW: 低电平触发。
- CHANGE:管脚状态改变触发。
- RISING:上升沿触发。
- FALLING:下降沿触发。
转载自: 布尔博客 – 高校青年技术社区