标题:
帮帮忙谢谢了30秒内按钮按5次以上绿灯亮如果在30秒不到5次就红灯亮,我怎么写都写不好
[打印本页]
作者:
jkl8687
时间:
2014-10-26 18:13
标题:
帮帮忙谢谢了30秒内按钮按5次以上绿灯亮如果在30秒不到5次就红灯亮,我怎么写都写不好
帮我写一个30秒内按钮按5次以上绿灯亮如果在30秒不到5次就红灯亮,我怎么写都写不好
作者:
a110
时间:
2014-10-26 20:01
程序帖上来看看
作者:
jkl8687
时间:
2014-10-26 20:34
#include<reg52.h> #define uint unsigned int unsigned long temp,temp1,temp2; sbit k1=P1^0; sbit LED=P0^0; //LED1灯 void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void main() { k1=0; LED=0; temp=0; temp1=0; temp2=0; while(1) { if(temp2==1) temp++; if(temp==1000)//达到时间从新开始 { temp=0; //时间清零 temp2=0; temp1=0; } if((k1==0)&&(temp1==0)) //第一次按下判断 { temp1=1; } else if((k1==1)&&(temp1==1))//第一次放开判断 { temp1=0; temp2=1;//置起标志 } if((k1==0)&&(temp2==1))//第二次按下判断 { LED=1; temp2=0; temp=0; } } }
作者:
神火飞鱼
时间:
2014-10-26 21:56
建议你建多个变量a程=,按一下a加1,30
作者:
神火飞鱼
时间:
2014-10-26 22:01
建议你建多个变量a=0,按一下a加1,30秒到判断a大于5就绿灯亮,a=0.否则则红灯亮,a=0
作者:
神火飞鱼
时间:
2014-10-26 22:04
还要最好加个按键消抖
作者:
skyhanfeng
时间:
2014-10-26 22:41
#include<reg52.h>
unsigned int temp,temp1;
sbit k1=P1^0;
sbit LED=P0^0;//lLED1
sbit LED1=P0^1;//lLED2
void delay(unsigned char xms)
{
unsigned char i,j;
for(i=xms; i>0; i--)
{
for(j=110; j>0; j--);
}
}
void main()
{
temp = 0;
temp1 = 0;
while(1)
{
while(k1==0)// 判断K1是否按下
{
temp++;
delay(1);
temp1++;
if(temp1<30000)//判断是否在30毫秒内
{
if(temp >= 5) //判断次数是否5次以上
{
LED =0;
LED1 = 1;
temp1 = 0;
temp = 0;
}
else
{
LED =1;
LED1 = 0;
}
}
}
}
}
作者:
skyhanfeng
时间:
2014-10-26 22:42
希望能够帮到你
作者:
mqwu
时间:
2014-10-28 11:06
上午刚写了一个, 运行还不错
//用一个外部中断做按5次的键,一个定时器来判断30秒溢出, 如果定时器在30秒内按了5次, 外部中断重新赋初值,这样防止定时器在30秒溢出,绿灯亮。反之,定时器溢出将使得红灯亮, 用12M crystal 和数码管+38译码器
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
code uchar number[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar a[6];
sbit ENLED = P1^4;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit Green_LED =P2^0;
sbit Red_LED =P2^1;
void timer1_init()
{
TMOD |= 0x10;
TMOD &= 0xdf;
TH1 = 0x3C;
TL1 = 0xB0;
TR1 = 1;
}
void interrupter_init()
{
ET1 = 1;
EA=1; //諾ÖÖD¶Ï¿a
EX0=1; //ía2¿ÖD¶Ï0¿a
IT0=1; //±ßÑØ′¥·¢
}
void Scanning_Numerical_LED(void)
{
static uchar j = 0;
switch(j)
{
case 0: ADDR0 = 0;ADDR1 = 0;ADDR2 = 0;j++;P0 = number[a[0]];break;
case 1: ADDR0 = 1;ADDR1 = 0;ADDR2 = 0;j++;P0 = number[a[1]];break;
case 2: ADDR0 = 0;ADDR1 = 1;ADDR2 = 0;j++;P0 = number[a[2]];break;
case 3: ADDR0 = 1;ADDR1 = 1;ADDR2 = 0;j++;P0 = number[a[3]];break;
case 4: ADDR0 = 0;ADDR1 = 0;ADDR2 = 1;j++;P0 = number[a[4]];break;
case 5: ADDR0 = 1;ADDR1 = 0;ADDR2 = 1;j = 0;P0 = number[a[5]];break;
default: break;
}
}
main()
{
ENLED = 0; ADDR3 = 1;
timer1_init();
interrupter_init();
while(1)
{
Scanning_Numerical_LED();
}
}
void ISR_Key(void) interrupt 0 using 1
{
uchar counter1;
counter1++;
if (counter1==5)
{
counter1=0;
TH1 = 0x3C; //50 ms setting;
TL1 = 0xB0;
}
}
void interrupt_timer1() interrupt 3
{
uint sec;
uchar counter;
TH1 = 0x3C; //50 ms setting;
TL1 = 0xB0;
counter++;
if(counter ==20)
{
counter = 0;
sec++;
if (sec>=30)
Red_LED=1;
else Green_LED=1;
if (sec==1000)
sec=0;
a[0] = sec%10;
a[1] = sec/10%10;
a[2] = sec/100%10;
a[3] = sec/1000%10;
a[4] = sec/10000%10;
a[5] = sec/100000%10;
}
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1