找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3610|回复: 10
收起左侧

单片机如何让按键控制LED灯常亮30分钟后熄灭,下次按按键后继续亮30分钟后熄灭

  [复制链接]
ID:685954 发表于 2020-7-16 19:01 | 显示全部楼层 |阅读模式
本帖最后由 79498 于 2020-7-17 12:00 编辑

用定时器做的,但是LED灯只是第一次闪烁后常亮30分钟后熄灭,第二次按按键后就是一直亮了,不知道为什么,请一些高手解答下。

测试代码如下  最重要的就是第一次定时可以 第二次就不行了   STC15W100的芯片


#include  "reg52.h"
#include  "intrins.h"
#define uchar unsigned char
#define uint unsigned int
typedef unsigned int u1;
typedef unsigned char u2;      //
unsigned char d;
unsigned char n=0;
uchar min=1; sec=59; //
uchar flag;//

sbit led2=P3^0;  //
sbit led1=P3^1;  //
sbit cd=P3^2;    //
sbit uv=P3^3;    //
sbit k1=P3^4;   
bit flash;//
bit  key;

sfr IE2=0xAF;
sfr AUXR=0x8E;
sfr T2H=0xD6;
sfr T2L=0xD7;

void shijian(); //


/*************************************

*************************************/
void delay_1s()   
{
int a,b;
       
        for(a=1000;a>0;a--)
          for(b=150;b>0;b--);
}

/*************************************

*************************************/
               
void keypros()      
{

if(k1==0)
                {
                delay_1s();
                        if(k1==0)
                        {
                        flash=~flash;       
                  key=1;
                        }
                }
                while(!k1);
}

/*************************************

*************************************/

void ledflash()
{
                if(flash==1&&key==1)
                {
                        for(d=0;d<10;d++)
                        {
                  led1=0;
                        delay_1s();
                        led1=1;
                        delay_1s();       
                        }
                          key=0;
                                led1=0;
                    uv=1;
                       
                }
    if(flash==0)
                {       
                        led1=1;
                    uv=0;
                }
}


/*************************************

*************************************/

void Int1Init()                  //
{
  IT0=1;
        EX0=1;
        EA=1;
}

/*************************************

*************************************/
void Timer2Init()                  //
{
        IE2|=0x04;
        T2H=(65536-50000)/256;          
        T2L=(65536-50000)%256;
        EA=1;   //
        AUXR|=0x10; //
       
}


/*************************************

*************************************/


void main()        
{
        led1=1;
  uv=0;
        led2=1;
        flash=0;
          Timer2Init();
        while(1)
        {        
                keypros();  
                ledflash();
                Int1Init();
               
        }

       

        }

/*************************************

*************************************/



void Int0()    interrupt 0     //
{
       

        if(cd==0)
        {
        uv=0;                      //
        led2=~led2;                //
        }
        else
        {
        led2=1;
        }
}

/*************************************

*************************************/
void Timer2() interrupt 12
{
  T2H=(65536-50000)/256;          
        T2L=(65536-50000)%256;
        flag++;
        if(min==0&&sec==0)
{
  uv=0;
}
if(flag>=20)
        {
        flag=0;
                sec--;
                if(sec<=0)
                {
                sec=59;
                        min--;
                        if(min<=0)
                        {
                          min=0;
                                sec=0;
                                AUXR|=0x00;
                               
                        }
                }
        }
        }

回复

使用道具 举报

ID:562338 发表于 2020-7-16 20:19 | 显示全部楼层
是不是计时没清0,
回复

使用道具 举报

ID:791503 发表于 2020-7-16 20:31 | 显示全部楼层
定时器要设置成重载型,你这个一次定时,肯定后面就没有了。
回复

使用道具 举报

ID:213173 发表于 2020-7-16 23:08 | 显示全部楼层
定时器周期50ms,按键按下灯亮,赋值变量36000,定时中断一次变量减1,减到0灯灭结束。
回复

使用道具 举报

ID:267932 发表于 2020-7-17 09:25 | 显示全部楼层
如果你可以在线仿真调试的话,看下每个变量的数据变化,你应该就可以找到原因啦。
回复

使用道具 举报

ID:311846 发表于 2020-7-17 09:29 | 显示全部楼层
发程序啊!你这样只能用猜的了,我猜你某个变量没清除、标志位没处理好或者定时器没清
回复

使用道具 举报

ID:716656 发表于 2020-7-17 11:18 | 显示全部楼层
  1. #include <reg51.h>
  2. #define uchar unsigned char//o궨òå
  3. #define uint unsigned int//o궨òå
  4. sbit LED1 = P2^2;
  5. sbit KEY = P2^3;
  6. uchar u,num;

  7. sfr AUXR=0x8E;
  8. void init()
  9. {
  10.         KEY=1;
  11.         LED1=1;
  12.         TMOD=0x01;
  13.         TH0=(65536-45872)/256; //11.0592M?50ms??45872
  14.         TL0=(65536-45872)%256;
  15.         EA=1;
  16.         ET0=1;
  17. }

  18. void delay_1ms(uint t)//Ñóê±
  19. {
  20.         uint i;
  21.         while(--t)
  22.                 for(i=0;i<600;i++);
  23. }

  24. void main()
  25. {
  26.         init();
  27.         while(1)
  28.         {
  29.                 if(KEY==0)
  30.                 {
  31.                         delay_1ms(20);
  32.                         if(KEY==0)
  33.                         {
  34.                                 while(KEY==0);
  35.                                 LED1=0;
  36.                                 TR0=1;
  37.                         }
  38.                 }
  39.         }
  40. }


  41. void T0_time() interrupt 1
  42. {
  43.         TH0=(65536-45872)/256; //11.0592M?50ms??45872
  44.         TL0=(65536-45872)%256;
  45.         num++;
  46.         if(num==40)
  47.         {
  48.                 num=0;
  49.                 LED1=1;
  50.                 TR0=0;
  51.         }
  52. }
复制代码
回复

使用道具 举报

ID:716656 发表于 2020-7-17 11:19 | 显示全部楼层

我试着写了下,用proteus看了下。可以用
回复

使用道具 举报

ID:804648 发表于 2020-7-17 11:47 | 显示全部楼层
可以用定时器查询,或者递增
回复

使用道具 举报

ID:685954 发表于 2020-7-20 14:18 | 显示全部楼层
感谢各位大佬讲解,已经弄好了 定时器清零后未赋值,所以工作一次
回复

使用道具 举报

ID:809311 发表于 2020-8-7 16:38 | 显示全部楼层
不用单片机。用电容。容量足够大就可以实现。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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