找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1417|回复: 8
收起左侧

这单片机程序搞不懂为啥不是按下指定时间执行?

[复制链接]
ID:594633 发表于 2021-5-28 23:58 | 显示全部楼层 |阅读模式
……
if(key_in==0)
{
delay(500);
if(key_in==0)
   {
        count=0;
        while(key_in==0)
           {
           delay(6000);
           count++;
           }
           if(count>10)        
                {
                relay1=0;
                }
        else count=0;
    }
  }

key_in达到时间后按键抬起的时候才执行relay1=0,不抬起不执行,有点懵…



回复

使用道具 举报

ID:731755 发表于 2021-5-29 07:33 | 显示全部楼层
你的程序不太对,
回复

使用道具 举报

ID:716656 发表于 2021-5-29 09:23 | 显示全部楼层
  1. #include <reg51.h>
  2. #define uchar unsigned char//宏定义
  3. #define uint unsigned int//宏定义

  4. sbit key_in = P3^1;
  5. sbit led = P2^1;
  6. sbit relay1 = P2^0;
  7. uint count;

  8. void delay_1ms(uint t)//延时
  9. {
  10.         uint i;
  11.         while(--t)
  12.                 for(i=0;i<600;i++);
  13. }


  14. void main()
  15. {
  16.         relay1=0;
  17.         key_in=1;
  18.         while(1)
  19.         {
  20.         if(key_in==0)
  21.         {
  22.                 delay_1ms(20);
  23.                 if(key_in==0)
  24.                  {
  25.                          led=0;
  26.                                         count=0;
  27.                                         while(key_in==0)
  28.                                                  {
  29.                                                  delay_1ms(100);
  30.                                                          count++;
  31.                                                  }
  32.                                                  if(count>2)        
  33.                                                 {
  34.                                                 relay1=1;
  35.                                                 }
  36.                                         else count=0;
  37.                         }
  38.                 }
  39.         }

  40. }
复制代码

我用你的框架用普中写了一下,没问题,应该是延时时间不对,太长了?  对应我的程序你修改下
回复

使用道具 举报

ID:594633 发表于 2021-5-29 14:28 | 显示全部楼层

我的运行也没问题。
用的简单的定时功能,累加方式的到长延时。
懵的是key_in持续低电平到指定延时时间够应该是relay=0,但是实际是到了指定延时时间后key_in低电平保持没有让relay=0,而是释放了才执行的,也就是key_in由0变1后才执行的。
回复

使用道具 举报

ID:716656 发表于 2021-5-29 14:45 | 显示全部楼层
kevind 发表于 2021-5-29 14:28
我的运行也没问题。
用的简单的定时功能,累加方式的到长延时。
懵的是key_in持续低电平到指定延时时间 ...

可以把你的程序发出来看看
回复

使用道具 举报

ID:213173 发表于 2021-5-29 16:28 | 显示全部楼层
kevind 发表于 2021-5-29 14:28
我的运行也没问题。
用的简单的定时功能,累加方式的到长延时。
懵的是key_in持续低电平到指定延时时间 ...

改为按键响应后先延时,延时时间到后key_in不论高低执行relay=0;,然后再判断key_in就能满足楼主意图。
        if(key_in==0)
        {
                delay(500);
                if(key_in==0)
                {
                        count=10;
                        while(count--)
                        {
                                delay(6000);
                        }
                        relay1=0;
                        while(!key_in);
                }
        }
回复

使用道具 举报

ID:849913 发表于 2021-5-30 22:25 | 显示全部楼层
这个程序你按着按键不松那么key_in==0始终为真 就会始终在while(key_in==0)中循环不会往下运行,可以把程序都写到while中 这样按键不同抬起来也可以了
if(key_in==0)
{
delay(500);
if(key_in==0)
   {
        count=0;
        while(key_in==0)
           {
           delay(6000);
           count++;
           
           if(count>10)        
                {
                relay1=0;
                }
        else  relay1=1;;
    }
  }
}
回复

使用道具 举报

ID:594633 发表于 2021-5-31 08:58 | 显示全部楼层
wulin 发表于 2021-5-29 16:28
改为按键响应后先延时,延时时间到后key_in不论高低执行relay=0;,然后再判断key_in就能满足楼主意图。
...

感谢&#128522;
回复

使用道具 举报

ID:594633 发表于 2021-5-31 08:58 | 显示全部楼层
老董 发表于 2021-5-30 22:25
这个程序你按着按键不松那么key_in==0始终为真 就会始终在while(key_in==0)中循环不会往下运行,可以把程序 ...

明白了,谢谢。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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