找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3709|回复: 2
打印 上一主题 下一主题
收起左侧

51单片机实现不同按键不同功能源程序 按键延迟

[复制链接]
跳转到指定楼层
楼主
ID:11498 发表于 2019-6-18 11:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
家里的壁挂管线机的一个程序,有2个抽水泵,一个是水位计控制水箱水泵,水位计是SW,有水位1,无水0。另外一个泵就是排水水泵,按键按下之后排水开始,然后延时关闭。加热也是一样,按下加热,延时关闭。现在的问题是,水位计自动上下水的程序写了之后,按键就会有点延迟,必须要长按才能有反应,这个是与水位计有水位长期触发按键有关。还有就是,按键1按下后,马上再按按键2,是没有反应的,必须要按键1的程序执行完之后再按按键2才有反应。
想知道怎么样才能让按键水位各不干扰,按下执行程序再按别的按键能同时执行别的程序。

单片机源程序如下:
  1. void main()
  2. {
  3.         while(1)
  4.         {
  5.                         if(sw==0)                         //sw水位开关 无水位1秒后抽水
  6.                         {                                         
  7.                                 delay(1000);                 
  8.                                 if(sw==0)                 
  9.                                 {
  10.                                         sb1=1;                  //泵1运行
  11.                                 }
  12.                         }

  13.                         if(sw==1)                         //有水位1秒后关泵
  14.                         {
  15.                                 delay(1000);                 
  16.                                 if(sw==1)                 
  17.                                 {
  18.                                         sb1=0;                  //泵1停止
  19.                                 }
  20.                         }


  21.                         if(aj1==0)                         //按键1
  22.                         {
  23.                                 delay(10);                 
  24.                                 if(aj1==0)                 
  25.                                 {
  26.                                         while(!aj1);//等待按键释放
  27.                                         sb2=1;                  //泵2运行
  28.                                         delay(5000);
  29.                                         sb2=0;                  //泵2停止
  30.                                 }
  31.                         }

  32.                         if(aj2==0)                         //按键2
  33.                         {
  34.                                 delay(10);                 
  35.                                 if(aj2==0)                 
  36.                                 {
  37.                                         while(!aj2);//等待按键释放
  38.                                         jr=1;                  //加热运行
  39.                                         delay(15000);
  40.                                         jr=0;                  //加热停止
  41.                                                 
  42.                                 }
  43.                         }

  44.         }

  45. }
复制代码



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:66287 发表于 2019-6-25 08:58 | 只看该作者
在定时器中断中检测按键,再置位相应标志,再在主程序中执行相应动作即可。
万不可在程序中出现类似delay(1000);  之类的东西!
回复

使用道具 举报

板凳
ID:565305 发表于 2019-6-25 10:18 | 只看该作者
多浪费个变量做按住的计时,main 循环中要加 delay_ms 以划分时间片

按住计时大致写法是:( 假设 按住时 key=0 ,松手时 key=1 。 key_count 是 s8 类型,初值为 0)

有了 key_count 就可以玩不少花样,比方说去抖、判断按下瞬间、判断松开瞬间。而且 main 程序逻辑并未阻塞,只是靠 count 做计数,下述代码对并发性事务毫无阻塞。
if( key==0)
{  if(key_count==0) do_press_key(); if(key_count<100) key_count++; }
else
{  if(key_count>0) do_release_key();  key_count=0; }

(补充:例如去抖需要8毫秒,并且 main 循环每 ms 呼叫上述代码,就需要修改为下述形式

    if( key==0)
    {  if(key_count==8) do_press_key(); if(key_count<100) key_count++; }
    else
    {  if(key_count>8) do_release_key();  key_count=0; }


回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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