标题: 帮帮忙谢谢了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