标题: 按下按键后想延时2秒再执行LED点亮,办法想了很多就是不行,求大神 [打印本页]
作者: 2500 时间: 2016-7-15 22:00
标题: 按下按键后想延时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); //等待按键释放
}
}
}
作者: zl2168 时间: 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仿真一下,确认有效。
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1
书中电路和程序设计有详细说明,程序语句条条有注解。
作者: zl2168 时间: 2016-7-15 22:42
你在51黑提了几个问题,好像也给你解答了几个,书上都有,好好学习吧。
作者: Jesse_ice 时间: 2016-7-15 22:53
中断里面写了num3++键盘检测里面就不要写了,上面语句意思是按键按下,3一直在加。在中断里面加个判断num3等于2关闭定时器应该就行了3
作者: ChenGping 时间: 2016-7-16 10:10
真在学习
作者: 3154 时间: 2016-7-16 14:56
定时器中断
作者: jubaolun 时间: 2016-7-16 15:03
如果要时间很准,就用定时器.
作者: cyy998 时间: 2016-7-16 16:33
建议把TR0=1写到按键函数里,就是按下按键才打开定时器,然后定时器中断函数最后面加上TR0=0,就是完成一次计时关闭定时器,等下次按键再打开。
另外地板同学说的问题也必须改正,只要if(mun3==3)就行了。
作者: songdaxuan 时间: 2016-7-16 20:03
按下按键 ---打开定时器---延时两秒----打开LED
作者: 超级小太阳 时间: 2016-7-16 21:13
我觉得程序写的好麻烦
作者: ahshmj 时间: 2016-7-16 21:16
“ num3=0;
num3++; ”什么意思?就是num3=1?
num1一直是加,什么时候为0?
作者: 2500 时间: 2016-7-17 17:15
我一开机就需要使用定时器 因为开机的时候必须延迟2秒其它程序才起作用。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |