|
本帖最后由 Soul110 于 2016-2-22 15:53 编辑
消抖:
消抖是为了避免在按键按下或是抬起时电平剧烈抖动带来的影响。也就是在一段时间内检查两次来确保按键被按下。如果不消抖,按键一次会被代码识别为多次按下。利用millis()功能来记录按键按下后的时间。
为什么不用delay():
虽然创建一个使用delay()的闪烁LED很简单,并且许多例子将很短的delay用于消除开关抖动,delay()确实拥有很多显著的缺点。在delay函数使用的过程中,读取传感器值、计算、引脚操作均无法执行,因此,它所带来的后果就是使其他大多数活动暂停。其他操作定时的方法请参加millis()函数和它的例子。大多数熟练的程序员通常避免超过10毫秒的delay(),除非程序非常简单。 但某些操作在delay()执行时任然能够运行,因为delay函数不会使中断失效。通信端口RX接收到得数据会被记录,PWM(analogWrite)值和引脚状态会保持,中断也会按设定的执行。
本教程采用硬件为:
ALPHA 并行扩展板 一块;
ALPHA MEGA328-U 一块;
ALPHA 微动开关模块 一块;
ALPHA 11 LED模块 一块。
搭建电路
1. ALPHA MEGA328-U模块插入并行扩展版1号槽位。
2. ALPHA 11 LED模块插入1号槽位,堆叠于MEGA328-U上。
3. ALPHA 微动开关模块插入并行扩展板2号槽位。
4. USB线连接计算机与ALPHA MEGA328-U。
如图:
本次实验目的为红、绿、蓝三个按键,在经过消抖时间的处理下,能够各自控制对应的LED的灯的亮灭。
- /*
- Debounce
- 每次按键按下,输入脚从低电平到高电平,输出引脚就被触发从低电平到高电平或者高电平到低电平。
- 两次触发之间设置一个最小延时来消除抖动。
- 三个按键对应三盏LED灯,各自按键控制对应的LED灯,互不干扰
- */
-
-
- const int buttonPin1 = 15; //初始化按键引脚
- const int buttonPin2 = 16;
- const int buttonPin3 = 17;
- const int ledPin1 = 2; // 初始化LED的引脚
- const int ledPin2 = 3;
- const int ledPin3 = 4;
-
- int ledState1 = HIGH; // 设置LED输出脚状态为高电平
- int ledState2 = HIGH;
- int ledState3 = HIGH;
- int buttonState1; // 设置读取输入脚的状态
- int buttonState2;
- int buttonState3;
- int lastButtonState1 = LOW; // 上一次读取到的输入状态为低电平
- int lastButtonState2 = LOW; // 上一次读取到的输入状态
- int lastButtonState3 = LOW; // 上一次读取到的输入状态
-
-
- long lastDebounceTime1 = 0; // 最后一次输出脚触发时间
- long lastDebounceTime2 = 0;
- long lastDebounceTime3 = 0;
- long debounceDelay = 50; // 设置消抖时间,增加它,如果输出不稳定
- void setup() {
- pinMode(buttonPin1, INPUT); //初始化按键的输入模式
- pinMode(buttonPin2, INPUT);
- pinMode(buttonPin3, INPUT);
- pinMode(ledPin1, OUTPUT); //初始化灯的输出模式
- pinMode(ledPin2, OUTPUT);
- pinMode(ledPin3, OUTPUT);
-
-
- digitalWrite(ledPin1, ledState1);// 设置LED状态为高电平
- digitalWrite(ledPin2, ledState2);
- digitalWrite(ledPin3, ledState3);
- }
- void runing1() //第一个按键对应第一盏灯
- { if ((millis() - lastDebounceTime1) > debounceDelay) // 比较按键的相差时间,若大于消抖时间,则说明时间不管读取到什么,时间已经比消抖延时长,所以认为它是真实的当前状态
- { if (digitalRead(buttonPin1) != buttonState1) // 如果按键状态改变:
- {
- buttonState1 = digitalRead(buttonPin1); // 新的按键状态为high才会触发LED
- if (buttonState1 == HIGH) //如果按键状态为高时,
- {
- ledState1 = !ledState1; //改变对应的灯的电平
- }
- }
- }
- digitalWrite(ledPin1, ledState1); // 输出LED灯的状态
- lastButtonState1 = digitalRead(buttonPin1); // 存储读取到的信息.按键会变成上次的输入状态:
- }
- void runing2() //第2个按键对应第2盏灯
- { if ((millis() - lastDebounceTime2) > debounceDelay)
- { if (digitalRead(buttonPin2) != buttonState2)
- {
- buttonState2 = digitalRead(buttonPin2);
- if (buttonState2 == HIGH)
- {
- ledState2 = !ledState2;
- }
- }
- }
- digitalWrite(ledPin2, ledState2);
- lastButtonState2 = digitalRead(buttonPin2);
- }
- void runing3() //第3个按键对应第3盏灯
- { if ((millis() - lastDebounceTime3) > debounceDelay)
- { if (digitalRead(buttonPin3) != buttonState3)
- {
- buttonState3 = digitalRead(buttonPin3);
- if (buttonState3 == HIGH)
- {
- ledState3 = !ledState3;
- }
- }
- }
- digitalWrite(ledPin3, ledState3);
- lastButtonState3 = digitalRead(buttonPin3);
- }
- void loop() {
- if (digitalRead(buttonPin1)!= lastButtonState1) //读取按键状态,存储到变量 // 检查是否按下按键(也就是输入了low或high),自从上一次按下之后你已经等了很久(忽略噪声的情况下)如果按键状态改变,那就是按下了或者是噪声
- {
- lastDebounceTime1 = millis(); // 重置消抖时间
- }
- runing1(); //调用第一个按键的函数
- if (digitalRead(buttonPin2)!= lastButtonState2) //读取按键状态,存储到变量 // 检查是否按下按键(也就是输入了low或high),自从上一次按下之后你已经等了很久(忽略噪声的情况下)如果按键状态改变,那就是按下了或者是噪声
- {
- lastDebounceTime1 = millis(); // 重置消抖时间
- }
- runing2(); //调用第二个按键的函数
- if (digitalRead(buttonPin3)!= lastButtonState3) //读取按键状态,存储到变量 // 检查是否按下按键(也就是输入了low或high),自从上一次按下之后你已经等了很久(忽略噪声的情况下)如果按键状态改变,那就是按下了或者是噪声
- {
- lastDebounceTime1 = millis(); // 重置消抖时间
- }
- runing3(); //调用第三个按键的函数
- }
复制代码
稍后会上传效果视频……
希望本教程会对大家有所帮助!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|