电子说
课程目标
相关知识
中断程序: 中断程序可以看作是一段独立于主程序之外的程序,当中断触发时,控制器会暂停当前正在运行的主程序,而跳转去运行中断程序,中断程序运行完后,会再回到之前主程序暂停的位置,继续运行主程序。
在程序的运行中,我们时常需要监控一些事件的发生,比如对某一传感器的返回数据进行解析。随着程序功能增加,轮询到指定功能时需要等待的时间变长,效率会很低。而使用中断方式检测,可以到达实时检测的效果。
**Arduino的中断函数:**外部中断和定时中断
外部中断的定义: 一般由外设发出中断请求,如:键盘中断、打印机中断、外部中断需外部中断源发出中断请求才能发中断。
attach interrupt(interrupt,function,mode)
1)interrupt: 中断号,UNO只用0,1,即代表D2,D3口
2)function:调用中断函数,中断发生时调用的函数
3)mode:中断触发模式
low 当针脚输入为低时,触发中断
change 当针脚输入发生变化时,触发中断
rising 当针脚由低变高时,触发中断
falling 当针脚由高到低时,触发中断
定时中断的定义: 是指主程序在运行一段程序过后自动进行的中断服务程序。
常见的定时库有FlexiTimer2.h和Ms.Timer2.h
void start() 开启定时中断
void stop() 关闭定时中断
#include< MsTimer2.h >
void flash()
{
static boolean cutput=HIGH;
digitalWrite(13,OUTPUT);
OUTPUT=!OUTPUT;
MsTimer2:set(500,flash);
MsTimer2:start();
}
void loop()
{}
使用外部中断注意:
1.中断服务程序不能够有参数和返回值,即void Function name(void){}
2.在中断函数中delay()函数将不起作用
3.在中断函数中millis()函数的值不会增加
4.得到的串行数据将会丢失
5.需在中断函数内部更改的值需声明为volatile类型
电路搭建
所需材料
ArduinoUNO * 1
震动传感器模块 * 1
LED * 1
220Ω电阻 * 1
杜邦线若干
电路连接
程序编写
练习一:震动监测
不使用中断的方式实现监测到震动后,LED点亮两秒后熄灭,再次监测到震动后,再次点亮。
图形化方式:
直接用条件判断的方式实现了这个功能
代码方式:
/* 项目名称:条件判断制作震动监测
* 项目时间:2022.03.15
* 项目作者:MRX
*/
const int LedPin = 9;
const int SensorPin = 2;
void setup() {
pinMode(LedPin,OUTPUT);
pinMode(SensorPin,INPUT);
digitalWrite(LedPin,LOW);
}
void loop() {
if(digitalRead(SensorPin) == LOW){
digitalWrite(LedPin,HIGH);
delay(1000);
}
else{
digitalWrite(LedPin,LOW);
}
}
练习二:震动监测
使用中断方式实现上述功能。
图形化方式:
代码方式:
/* 项目名称:中断制作震动监测
* 项目时间:2022.03.15
* 项目作者:MRX
*/
const int LedPin = 9;
const int SensorPin = 2;
char state = LOW;
void setup() {
pinMode(LedPin,OUTPUT);
pinMode(SensorPin,INPUT);
attachInterrupt(0, blink, FALLING);
digitalWrite(LedPin,LOW);
}
void loop() {
if (state == HIGH) { // 如果state为HIGH
state = LOW;
digitalWrite(LedPin, HIGH); // 亮灯
delay(500); //延时500ms
}
else {
digitalWrite(LedPin, LOW); // 否则,关灯
}
}
void blink() { //中断函数blink()
state = !state; //一旦中断触发,state状态反转
}
全部0条评论
快来发表一下你的评论吧 !