找回密码
 立即注册

QQ登录

只需一步,快速开始

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

下面是单片机按一次灯亮且报警,松开按键解除报警怎么改让它按键按下报警,再按解除...

[复制链接]
跳转到指定楼层
楼主
#include "reg51.h"         
void     delay(unsigned int i);
sbit K=P0^0;                     
sbit beep=P1^0;                  
sbit green=P1^1;                 
sbit red=P1^2;                  
void  main()
{
  green=0;     
  red=1;   
  while(1)
   {
     if(K==0)            
      {
        delay(200);   
        if(K==0)        
          {
            green=1;   
            red=0;      
            beep=0;     
            delay(100);
            red=1;      
            beep=1;  
               
         }
      }
     else
        green=0;     
   }
}

void     delay(unsigned int i)            
{
unsigned int k;
for(k=0;k<i;k++);
}


IIX@DE)[(OLQ@4[%9(1%5MO.png (44.32 KB, 下载次数: 42)

IIX@DE)[(OLQ@4[%9(1%5MO.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:752974 发表于 2022-9-23 15:12 | 只看该作者
可以采用计数的方法,定义一个变量,初始值为0,按一次按键加1,然后判断变量的值,当变量等于1时报警,为2时接触报警,同时清变量。
回复

使用道具 举报

板凳
ID:1045628 发表于 2022-9-23 16:04 | 只看该作者
用一个变量做标识,
char a = 1;

if(K == 0)//这是检测到按下的状态?
{
if(a)
{
     a = 0;
     //报警亮灯代码

    //
}
else
{
     a = 1;
     //解除报警,灭灯代码

     //
}
}

不过你这个按键识别应该在软件上做一个防抖动滤波

回复

使用道具 举报

地板
ID:1045628 发表于 2022-9-23 17:33 | 只看该作者
rctty 发表于 2022-9-23 16:04
用一个变量做标识,
char a = 1;

这里的K == 0  改成按下到弹起整个过程的状态,可以通过另一个变量来解决,
比如改成 b == 1,
就有
先判断按下到谈起的状态
if(K == 0)//按钮按下
{
     while(K == 0);//等待按钮弹起
    b = 1;
}

当然,这里的while强制等待是不太合适的,这样会卡住单片机的运行,可以通过定时器之类的方法进行改善


回复

使用道具 举报

5#
ID:1045644 发表于 2022-9-24 09:52 | 只看该作者
munuc_w 发表于 2022-9-23 15:12
可以采用计数的方法,定义一个变量,初始值为0,按一次按键加1,然后判断变量的值,当变量等于1时报警,为2 ...

可不可以写一下具体程序,初学单片机,好多都还不懂
回复

使用道具 举报

6#
ID:1045644 发表于 2022-9-24 10:17 | 只看该作者
rctty 发表于 2022-9-23 17:33
这里的K == 0  改成按下到弹起整个过程的状态,可以通过另一个变量来解决,
比如改成 b == 1,
就有

你好,请问能不能帮我写一下具体的程序,初学单片机然后有些还不是很懂,谢谢
回复

使用道具 举报

7#
ID:176854 发表于 2022-9-24 15:51 | 只看该作者
根据上面的建议修改的程序

#include "reg51.h"         
void     delay(unsigned int i);
sbit K=P0^0;                     
sbit beep=P1^0;                  
sbit green=P1^1;                 
sbit red=P1^2;      
unsigned char Flag = 0;
void  main()
{
  green=0;     
  red=1;   
  while(1)
   {
     if(K==0)            
      {
        while(K==0);                       
        Flag = ~Flag;
      }
     if(Flag)
                 {
                   green=1;   
       red=0;      
       beep=0;     
       delay(100);
       red=1;      
       beep=1;
                 }
                 else
                 {
                   green=0;
                         red=1;
       beep=1;                         
                 }
   }
}

void     delay(unsigned int i)            
{
unsigned int k;
for(k=0;k<i;k++);
}

回复

使用道具 举报

8#
ID:137736 发表于 2022-9-24 21:30 | 只看该作者
设置个标注位,按键翻转标注位,检测标注位决定是否报警。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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