久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3553|回復: 13
收起左側

單片機按鍵控制燈問題,不能按照我的要求工作

[復制鏈接]
ID:237797 發表于 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.   }
復制代碼

回復

使用道具 舉報

ID:410399 發表于 2018-12-10 08:11 | 顯示全部樓層
把while括住整個main函數的內容
回復

使用道具 舉報

ID:359468 發表于 2018-12-10 09:21 | 顯示全部樓層
好好檢查一下邏輯和共陰陽極
回復

使用道具 舉報

ID:443039 發表于 2018-12-10 09:29 | 顯示全部樓層
要了解單片機的工作流程啊,裸機工作你的工作代碼都要放在while里面,初始化代碼放在while外面
回復

使用道具 舉報

ID:443178 發表于 2018-12-10 12:17 | 顯示全部樓層
你的共陽極是不是倆摩羯錯誤
回復

使用道具 舉報

ID:443178 發表于 2018-12-10 12:17 | 顯示全部樓層
檢查一下共陽極和共陰極是否混亂
回復

使用道具 舉報

ID:237797 發表于 2018-12-10 15:46 | 顯示全部樓層
sprouty195 發表于 2018-12-10 09:21
好好檢查一下邏輯和共陰陽極

共陽極的
回復

使用道具 舉報

ID:237797 發表于 2018-12-10 15:47 | 顯示全部樓層
mosqu 發表于 2018-12-10 08:11
把while括住整個main函數的內容

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

使用道具 舉報

ID:443406 發表于 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;
    }
  }
}
回復

使用道具 舉報

ID:304235 發表于 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;
        }
}
回復

使用道具 舉報

ID:237797 發表于 2018-12-11 08:00 | 顯示全部樓層
djh635498852 發表于 2018-12-10 16:43
6S用定時器中斷來定時。main函數內先初始化變量 然后再用while函數進行循環。
下面程序有個框架, 你再根 ...

今天晚上用你的方法試試。
回復

使用道具 舉報

ID:237797 發表于 2018-12-11 08:03 | 顯示全部樓層
futon18 發表于 2018-12-10 16:16
void main()
{
  while(1)

我開始程序就是你這樣的,進去燈一直亮。不受控制。我也想了好久,感覺邏輯上沒有錯,控制就是不正常;后面才把while放在我貼上來的程序位置。
回復

使用道具 舉報

ID:237797 發表于 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斷開,要求燈也要滅。
回復

使用道具 舉報

ID:237797 發表于 2018-12-11 21:15 | 顯示全部樓層
本帖最后由 lclbf 于 2018-12-12 07:50 編輯
djh635498852 發表于 2018-12-10 16:43
6S用定時器中斷來定時。main函數內先初始化變量 然后再用while函數進行循環。
下面程序有個框架, 你再根 ...

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产一区二区三区 | 18av在线播放| 日本久久久影视 | 特黄小视频 | www.色五月.com | 91资源在线| 成人av网站在线观看 | 美女在线视频一区二区三区 | 日本精品久久 | 精品国产乱码久久久久久闺蜜 | av片免费观看 | 亚洲一区视频在线 | 成人午夜影院 | 成人午夜网站 | 国产欧美在线播放 | 欧美日韩在线观看一区二区三区 | 麻豆亚洲 | 中文字幕综合 | 中文字幕在线免费视频 | 97视频网站 | 国产成人精品网站 | 一区二区在线观看免费视频 | 日韩欧美精品在线 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 草久在线视频 | 97在线播放 | 在线看91 | 午夜电影福利 | 国产精品久久久亚洲 | 羞羞视频网站在线观看 | 久久久免费少妇高潮毛片 | 国产精品美女久久久久aⅴ国产馆 | 国产美女在线观看 | 91精品久久久久久久 | 亚洲综合视频一区 | 日韩欧美精品 | 狠狠涩 | 亚洲www啪成人一区二区 | 成人在线精品 | 精品一区在线 | 欧美精品一区三区 |