欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機如何讓按鍵控制LED燈常亮30分鐘后熄滅,下次按按鍵后繼續亮30分鐘后熄滅 [打印本頁]

作者: 79498    時間: 2020-7-16 19:01
標題: 單片機如何讓按鍵控制LED燈常亮30分鐘后熄滅,下次按按鍵后繼續亮30分鐘后熄滅
本帖最后由 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;
                               
                        }
                }
        }
        }


作者: 匯源科技    時間: 2020-7-16 20:19
是不是計時沒清0,
作者: sommer78    時間: 2020-7-16 20:31
定時器要設置成重載型,你這個一次定時,肯定后面就沒有了。
作者: wulin    時間: 2020-7-16 23:08
定時器周期50ms,按鍵按下燈亮,賦值變量36000,定時中斷一次變量減1,減到0燈滅結束。
作者: zhai1995    時間: 2020-7-17 09:25
如果你可以在線仿真調試的話,看下每個變量的數據變化,你應該就可以找到原因啦。
作者: 權威人物    時間: 2020-7-17 09:29
發程序啊!你這樣只能用猜的了,我猜你某個變量沒清除、標志位沒處理好或者定時器沒清
作者: 壓著我頭發啦    時間: 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. }
復制代碼

作者: 壓著我頭發啦    時間: 2020-7-17 11:19
壓著我頭發啦 發表于 2020-7-17 11:18

我試著寫了下,用proteus看了下。可以用

作者: pcl001    時間: 2020-7-17 11:47
可以用定時器查詢,或者遞增
作者: 79498    時間: 2020-7-20 14:18
感謝各位大佬講解,已經弄好了 定時器清零后未賦值,所以工作一次
作者: Roy-2010    時間: 2020-8-7 16:38
不用單片機。用電容。容量足夠大就可以實現。




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1