找回密码
 立即注册

QQ登录

只需一步,快速开始

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

帮帮忙谢谢了30秒内按钮按5次以上绿灯亮如果在30秒不到5次就红灯亮,我怎么写都写不好

[复制链接]
跳转到指定楼层
楼主
ID:65605 发表于 2014-10-26 18:13 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
帮我写一个30秒内按钮按5次以上绿灯亮如果在30秒不到5次就红灯亮,我怎么写都写不好
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:44262 发表于 2014-10-26 20:01 来自手机 | 只看该作者
程序帖上来看看
回复

使用道具 举报

板凳
ID:65605 发表于 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;                       }    }  }
回复

使用道具 举报

地板
ID:65400 发表于 2014-10-26 21:56 来自手机 | 只看该作者
建议你建多个变量a程=,按一下a加1,30
回复

使用道具 举报

5#
ID:65400 发表于 2014-10-26 22:01 来自手机 | 只看该作者
建议你建多个变量a=0,按一下a加1,30秒到判断a大于5就绿灯亮,a=0.否则则红灯亮,a=0
回复

使用道具 举报

6#
ID:65400 发表于 2014-10-26 22:04 来自手机 | 只看该作者
还要最好加个按键消抖
回复

使用道具 举报

7#
ID:66840 发表于 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;                                                       
                                        }
                          }                       
                }
        }
}
回复

使用道具 举报

8#
ID:66840 发表于 2014-10-26 22:42 | 只看该作者
希望能够帮到你
回复

使用道具 举报

9#
ID:66032 发表于 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;
      }
                                         
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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