极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 26222|回复: 15

为什么去掉delay()后就出错了?

[复制链接]
发表于 2012-9-24 11:02:40 | 显示全部楼层 |阅读模式
两个arduino通过UART进行通信,A板连接开关,B板连接LED,当按一下开关时,LED灯亮,再按一下LED灯灭。

下面是发射部分的程序:

int buttonpin =3;  开关连接到D3
char flag;        定义一个控制开关亮灭的标志
boolean onoff=false;  记录开关状态
void setup()
{
  pinMode(buttonpin, INPUT);    设置D3为输入端口
   Serial.begin(9600);            设置串口波特率为9600
  }
void loop()
{
  if( digitalRead(buttonpin)==LOW)   当开关按下时
  {
  delay(10);                        
  if( digitalRead(buttonpin)==HIGH)  松开开关时
  {
  delay(10);                         
   onoff=(!onoff);                  onoff变成相反的状态
    if (onoff==false)                  如果onoff值为false,发送灭灯标志a
  {
    flag='a';  
  Serial.print(flag );
   }
if(onoff==true)                       如果onoff值为true,发送亮灯标志b
{
  flag='b';
  Serial.print(flag );  
}
  }
  }
}

这里面的delay(10)作用是什么呢?为什么去掉程序中的delay(10)就出错了呢?求高手解答
回复

使用道具 举报

发表于 2012-9-24 12:13:57 | 显示全部楼层
当你按下键时,马上就去检测是否松开是行不通的,有一段小小的时间才会弹开,一般是10~30ms,这个delay是按键降噪用的。
回复 支持 反对

使用道具 举报

发表于 2012-9-24 12:32:46 | 显示全部楼层
楼上正解
按下,或松开时,机械开关的触点有最多30ms的不稳定忽通忽断阶段,通过延时跳过这段
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-24 13:08:21 | 显示全部楼层
matrixy 发表于 2012-9-24 12:13
当你按下键时,马上就去检测是否松开是行不通的,有一段小小的时间才会弹开,一般是10~30ms,这个delay是按 ...

那如果我不用delay(),应该怎样修改程序呢?
回复 支持 反对

使用道具 举报

发表于 2012-9-24 13:31:28 | 显示全部楼层
不想被芯片独占空等10ms?
用定时器中断触发功能,定10ms后触发检测按键代码
或者按键加阻容做个硬件除抖,软件就不用任何延时检测了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-24 13:44:33 | 显示全部楼层
test01 发表于 2012-9-24 13:31
不想被芯片独占空等10ms?
用定时器中断触发功能,定10ms后触发检测按键代码
或者按键加阻容做个硬件除抖 ...

arduino中有定时器吗?已经用硬件消抖了,延时的作用应该不是消抖吧?
回复 支持 反对

使用道具 举报

发表于 2012-9-24 14:02:44 | 显示全部楼层
有定时器的,不过中断触发需要调用库函数
当在开关电路加了硬件消抖,那延时语句可以去掉了。木有硬件消抖,那就不能去
回复 支持 反对

使用道具 举报

发表于 2012-9-24 15:53:27 | 显示全部楼层
机械开关的触点有最多30ms的不稳定忽通忽断阶段。软件必须要加delay().除非是硬件加消抖功能。
回复 支持 反对

使用道具 举报

发表于 2012-9-24 21:56:48 | 显示全部楼层
延时的作用就是防抖~!
回复 支持 反对

使用道具 举报

发表于 2012-9-24 22:03:55 | 显示全部楼层
如果没有延时的话你按一下开关,flag可以在a,b中变化 了N次,最后停留在那个值上就是未知的了~!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-26 09:31:00 | 显示全部楼层
test01 发表于 2012-9-24 14:02
有定时器的,不过中断触发需要调用库函数
当在开关电路加了硬件消抖,那延时语句可以去掉了。木有硬件消抖 ...

已经用了硬件消抖的,但是去掉延时还是有问题,请问一下定时器怎么样用
回复 支持 反对

使用道具 举报

发表于 2012-9-26 11:16:33 | 显示全部楼层
void loop()
{
  if( digitalRead(buttonpin)==HIGH)   当开关按下时
   {
  delay(20);                        
  if( digitalRead(buttonpin)==HIGH)  松开开关时
   {
  delay(10);                        
   onoff=(!onoff);                  onoff变成相反的状态
     if (onoff==false)                  如果onoff值为false,发送灭灯标志a
   {
回复 支持 反对

使用道具 举报

发表于 2012-9-26 13:25:28 | 显示全部楼层
羽衣甘蓝 发表于 2012-9-26 09:31
已经用了硬件消抖的,但是去掉延时还是有问题,请问一下定时器怎么样用

修正硬件电路吧,说明没起作用,或作用不完全。能用硬件尽量硬件,除非节省成本才用软件消抖
http://www.geek-workshop.com/thread-1827-1-1.html  这贴有定时器
回复 支持 反对

使用道具 举报

发表于 2013-6-24 17:57:13 | 显示全部楼层
求接受部分的程序。。。
回复 支持 反对

使用道具 举报

发表于 2013-6-24 17:58:16 | 显示全部楼层
求接受部分的程序和连线。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-5 18:43 , Processed in 0.039978 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表