亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標題: 單片機按鍵控制燈問題,不能按照我的要求工作 [打印本頁]

作者: lclbf    時間: 2018-12-9 20:37
標題: 單片機按鍵控制燈問題,不能按照我的要求工作
要求K1,K2都能控制燈,控制邏輯關系是:K1一直按下,燈亮6S后,如果K2按下燈微亮(亮度10%),K2沒有按下燈全亮,K1松開不按下燈滅;如此反復循環。


編譯沒有問題,現在不能按照我的要求工作。現象是:按下K1燈亮6S后,如果K2按下燈微亮(亮度10%),K2沒有按下燈全亮,K1松開不按下燈應該滅,現在燈不滅了,也不循環。程序一直工作在循環(whlie)里面沒有跳出來,若是把while注解了不用,K1按下延時6S燈滅。問題出在哪里?

本人寫的單片機程序如下:
  1. #include<reg51.h>
  2. typedef unsigned char U8;
  3. sbit led=P1^0;
  4. sbit sun=P1^1;
  5. sbit pir=P1^2;
  6. void delay10ms(unsigned int c)
  7. {
  8. unsigned char a,b;
  9. for(;c>0;c--)
  10.   for(a=38;a>0;a--)
  11.    for(b=130;b>0;b--);
  12. }
  13. //可調pwm函數
  14. void pwm(unsigned char a)   //改變a的值調整占空比
  15. {
  16. U8 i;
  17. led=0X00;
  18. {
  19.   for(i=0;i<255;i++)
  20.   {
  21.    if(i<a)        //改變a的值調整占空比
  22.     led=0xFF;
  23.    else
  24.     led=0x00;
  25.   }
  26. }
  27. }
  28. void main()
  29. {
  30. if(sun==0)
  31. {
  32.   led=1;
  33.   delay10ms(600);
  34.   while(1)
  35.   {
  36.    if(pir==1)
  37.     led=1;
  38.     else
  39.      pwm(25);    //改變1到255的大小值調整占空比         
  40.   }
  41.   }
  42.   else
  43.   {
  44.   led=0;
  45.   }
  46.   }
復制代碼


作者: mosqu    時間: 2018-12-10 08:11
把while括住整個main函數的內容
作者: sprouty195    時間: 2018-12-10 09:21
好好檢查一下邏輯和共陰陽極
作者: wanzxcasd    時間: 2018-12-10 09:29
要了解單片機的工作流程啊,裸機工作你的工作代碼都要放在while里面,初始化代碼放在while外面
作者: 1143735626    時間: 2018-12-10 12:17
你的共陽極是不是倆摩羯錯誤
作者: 1143735626    時間: 2018-12-10 12:17
檢查一下共陽極和共陰極是否混亂
作者: lclbf    時間: 2018-12-10 15:46
sprouty195 發表于 2018-12-10 09:21
好好檢查一下邏輯和共陰陽極

共陽極的
作者: lclbf    時間: 2018-12-10 15:47
mosqu 發表于 2018-12-10 08:11
把while括住整個main函數的內容

while整個main函數,運行就停在開機延時哪里,K2不起作用了

作者: futon18    時間: 2018-12-10 16:16

void main()
{
  while(1)
  {
   if(sun==0)
   {
     led=1;
     delay10ms(600);

     if(pir==1)
      led=1;
      else
       pwm(25);    //改變1到255的大小值調整占空比         
    }
    else
    {
      led=0;
    }
  }
}
作者: djh635498852    時間: 2018-12-10 16:43
6S用定時器中斷來定時。main函數內先初始化變量 然后再用while函數進行循環。
下面程序有個框架, 你再根據自己的需求改一改,調試調試。。
#include<reg52.h>
typedef unsigned char U8;
sbit led=P1^0;
sbit sun=P1^1;
sbit pir=P1^2;
U8 j;

void pwm(unsigned char a)  
{
U8 i;
led=0X00;
{
  for(i=0;i<255;i++)
  {
   if(i<a)      
    led=0xFF;
   else
    led=0x00;
  }
}
}

void delay10ms(unsigned int c)
{
unsigned char a,b;
for(;c>0;c--)
  for(a=38;a>0;a--)
   for(b=130;b>0;b--);
}

void Timer1Init(void)               
{       
        TMOD &= 0x0F;               
        TL1 = 0x00;               
        TH1 = 0xDC;       
        TF1 = 0;               
        TR1 = 1;               
}

void main()
{
        Timer1Init();
        while(1)
        {
                if(j == 600)
                {
                        led = 1;
                        TR1 = 0;
                }
               
                if(!pir)
                {
                        delay10ms(5);
                        if(!pir)
                        {
                                 pwm(25);
                        }
                }
               
                if(!sun)
                {
                        delay10ms(5);
                        if(!sun)
                        {
                                 led = 0;
                                 TR1 = 1;
                        }
                }
               
        }
}

void Timer0() interrupt 1
{
        if(!sun)
        {
                TL1 = 0x00;               
                TH1 = 0xDC;
                j++;
        }else
        {
                j = 0;
        }
}
作者: lclbf    時間: 2018-12-11 08:00
djh635498852 發表于 2018-12-10 16:43
6S用定時器中斷來定時。main函數內先初始化變量 然后再用while函數進行循環。
下面程序有個框架, 你再根 ...

今天晚上用你的方法試試。
作者: lclbf    時間: 2018-12-11 08:03
futon18 發表于 2018-12-10 16:16
void main()
{
  while(1)

我開始程序就是你這樣的,進去燈一直亮。不受控制。我也想了好久,感覺邏輯上沒有錯,控制就是不正常;后面才把while放在我貼上來的程序位置。
作者: lclbf    時間: 2018-12-11 21:14
#include<reg52.h>
typedef unsigned char U8;
sbit led=P1^0;
sbit sun=P1^1;
sbit pir=P1^2;
U8 j;

void pwm(unsigned char a)  
{
U8 i;
led=0X00;
{
  for(i=0;i<255;i++)
  {
   if(i<a)      
    led=0xFF;
   else
    led=0x00;
  }
}
}

void delay10ms(unsigned int c)
{
unsigned char a,b;
for(;c>0;c--)
  for(a=38;a>0;a--)
   for(b=130;b>0;b--);
}

void main()
{
  while(1)
  {
   if(sun==0)
   {
//     led=1;
//     delay10ms(600);

     if(pir==1)
      led=1;
      else
       pwm(25);    //改變1到255的大小值調整占空比         
    }
    else
    {
      led=0;
    }
  }
}
我按照這樣把開燈后燈亮這6S注釋了,能滿足我的K1,K2控制燈的要求,就是K1按下要工作6S不行,也要這6S期間K1也是一直按下去的,在這6S之間要的K1斷開,要求燈也要滅。
作者: lclbf    時間: 2018-12-11 21:15
本帖最后由 lclbf 于 2018-12-12 07:50 編輯
djh635498852 發表于 2018-12-10 16:43
6S用定時器中斷來定時。main函數內先初始化變量 然后再用while函數進行循環。
下面程序有個框架, 你再根 ...

按照你這個程序我沒有調試出來,按下K2的時候燈變暗了,但是燈還會閃爍。后來發現燈閃爍是因為開關按下加了消抖延時的原因。




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