找回密码
 立即注册

QQ登录

只需一步,快速开始

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

按下按键后想延时2秒再执行LED点亮,办法想了很多就是不行,求大神

  [复制链接]
跳转到指定楼层
楼主
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
char num,num1,num2,num3;
sbit K1=P3^4;
sbit K2=P3^5;
sbit K3=P3^6;
sbit K4=P3^7;
//sbit K5=P1^4;
//sbit L1=P1^4;
//sbit L2=P0^5;
//sbit L3=P0^6;
sbit LED=P1^0;
sbit LED1=P1^1;
sbit LED2=P1^2;
sbit LED3=P1^3;
sbit LED4=P1^4;
sbit LED5=P1^5;
sbit beep=P2^3;
void init();
void delay(uint z)            //延时函数
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void keyscan()        //按键函数
{
if(K2==0)                     //检测K1按键是否被按下,确定按下后延长2秒LED亮
  {
   delay(10);
  
  if(K2==0)
    { num3=0;
      num3++;
    if(num3>=2)
        {     
      LED5=0;
    beep=0;
    }   
    while(!K2);         //等待按键释放
      }
   
  }
}
void init()                  //定时器初始化
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void T0_time()interrupt 1   //中断函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;

if(num==20)           //一秒时间到  
{
  num3++;
  num1++;
num=0;
  }
}

void main()   
{init();

while(1)
{LED3=0;
   if(num1==2)
{
   
  keyscan() ;
  LED=0;
  

  }
  }
}








程序是开机后2m秒按键才开始生效。2秒后按下K2。LED和蜂鸣器2秒后亮和响。可是我怎么写 都是按下马上就亮了和响了。
我这样写也不行
void keyscan()        //按键函数
{
if(K2==0)                     //检测K2按键是否被按下,确定按下后延长2秒LED亮
  {
   delay(10);
  
  if(K2==0)
    {
delay(2000)
    LED5=0;
    beep=0;
   
    while(!K2);         //等待按键释放
      }
   
  }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:111634 发表于 2016-7-15 22:36 | 只看该作者
本帖最后由 zl2168 于 2016-7-15 22:38 编辑

4种不同方式键控信号灯


4种不同方式分别键控VD0~ VD3


① 无锁按键:S0按下,VD0亮;S0释放,VD0暗;


② 无锁按键(前沿有效):S1按下,VD1亮;S1释放,VD1延时2s后暗。


③ 无锁按键(后沿有效):S2按下,VD2不亮;S2释放,VD2亮,并延时2s后暗。


模拟有锁按键:S3按第一次,VD3亮,并继续保持;按第二次,VD3才暗。



Proteus仿真一下,确认有效。
实例5 不同方式键控灯.rar (31.72 KB, 下载次数: 26)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1


书中电路和程序设计有详细说明,程序语句条条有注解。





回复

使用道具 举报

板凳
ID:111634 发表于 2016-7-15 22:42 | 只看该作者
你在51黑提了几个问题,好像也给你解答了几个,书上都有,好好学习吧。
回复

使用道具 举报

地板
ID:124330 发表于 2016-7-15 22:53 来自手机 | 只看该作者
中断里面写了num3++键盘检测里面就不要写了,上面语句意思是按键按下,3一直在加。在中断里面加个判断num3等于2关闭定时器应该就行了3
回复

使用道具 举报

5#
ID:130668 发表于 2016-7-16 10:10 | 只看该作者
真在学习
回复

使用道具 举报

6#
ID:130180 发表于 2016-7-16 14:56 | 只看该作者
定时器中断
回复

使用道具 举报

7#
ID:105206 发表于 2016-7-16 15:03 | 只看该作者
如果要时间很准,就用定时器.
回复

使用道具 举报

8#
ID:113376 发表于 2016-7-16 16:33 | 只看该作者
建议把TR0=1写到按键函数里,就是按下按键才打开定时器,然后定时器中断函数最后面加上TR0=0,就是完成一次计时关闭定时器,等下次按键再打开。
另外地板同学说的问题也必须改正,只要if(mun3==3)就行了。
回复

使用道具 举报

9#
ID:122633 发表于 2016-7-16 20:03 | 只看该作者
按下按键 ---打开定时器---延时两秒----打开LED
回复

使用道具 举报

10#
ID:130050 发表于 2016-7-16 21:13 | 只看该作者
我觉得程序写的好麻烦  
回复

使用道具 举报

11#
ID:7485 发表于 2016-7-16 21:16 | 只看该作者
   “   num3=0;
       num3++;   ”
什么意思?就是num3=1?

num1一直是加,什么时候为0?
回复

使用道具 举报

12#
ID:125710 发表于 2016-7-17 17:15 | 只看该作者
cyy998 发表于 2016-7-16 16:33
建议把TR0=1写到按键函数里,就是按下按键才打开定时器,然后定时器中断函数最后面加上TR0=0,就是完成一次 ...

我一开机就需要使用定时器  因为开机的时候必须延迟2秒其它程序才起作用。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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