羽衣甘蓝 发表于 2012-9-24 11:02:40

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

两个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)就出错了呢?求高手解答

matrixy 发表于 2012-9-24 12:13:57

当你按下键时,马上就去检测是否松开是行不通的,有一段小小的时间才会弹开,一般是10~30ms,这个delay是按键降噪用的。

test01 发表于 2012-9-24 12:32:46

楼上正解
按下,或松开时,机械开关的触点有最多30ms的不稳定忽通忽断阶段,通过延时跳过这段

羽衣甘蓝 发表于 2012-9-24 13:08:21

matrixy 发表于 2012-9-24 12:13 static/image/common/back.gif
当你按下键时,马上就去检测是否松开是行不通的,有一段小小的时间才会弹开,一般是10~30ms,这个delay是按 ...

那如果我不用delay(),应该怎样修改程序呢?

test01 发表于 2012-9-24 13:31:28

不想被芯片独占空等10ms?
用定时器中断触发功能,定10ms后触发检测按键代码
或者按键加阻容做个硬件除抖,软件就不用任何延时检测了

羽衣甘蓝 发表于 2012-9-24 13:44:33

test01 发表于 2012-9-24 13:31 static/image/common/back.gif
不想被芯片独占空等10ms?
用定时器中断触发功能,定10ms后触发检测按键代码
或者按键加阻容做个硬件除抖 ...

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

test01 发表于 2012-9-24 14:02:44

有定时器的,不过中断触发需要调用库函数
当在开关电路加了硬件消抖,那延时语句可以去掉了。木有硬件消抖,那就不能去

Randy 发表于 2012-9-24 15:53:27

机械开关的触点有最多30ms的不稳定忽通忽断阶段。软件必须要加delay().除非是硬件加消抖功能。

zhangdeyue1 发表于 2012-9-24 21:56:48

延时的作用就是防抖~!
:)

zhangdeyue1 发表于 2012-9-24 22:03:55

如果没有延时的话你按一下开关,flag可以在a,b中变化 了N次,最后停留在那个值上就是未知的了~!:lol

羽衣甘蓝 发表于 2012-9-26 09:31:00

test01 发表于 2012-9-24 14:02 static/image/common/back.gif
有定时器的,不过中断触发需要调用库函数
当在开关电路加了硬件消抖,那延时语句可以去掉了。木有硬件消抖 ...

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

飞翔的红猪 发表于 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
   {

test01 发表于 2012-9-26 13:25:28

羽衣甘蓝 发表于 2012-9-26 09:31 static/image/common/back.gif
已经用了硬件消抖的,但是去掉延时还是有问题,请问一下定时器怎么样用

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

111111 发表于 2013-6-24 17:57:13

求接受部分的程序。。。

111111 发表于 2013-6-24 17:58:16

求接受部分的程序和连线。。。
页: [1] 2
查看完整版本: 为什么去掉delay()后就出错了?