找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3346|回復(fù): 13
收起左側(cè)

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

[復(fù)制鏈接]
ID:237797 發(fā)表于 2018-12-9 20:37 | 顯示全部樓層 |閱讀模式
要求K1,K2都能控制燈,控制邏輯關(guān)系是:K1一直按下,燈亮6S后,如果K2按下燈微亮(亮度10%),K2沒有按下燈全亮,K1松開不按下燈滅;如此反復(fù)循環(huán)。


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

本人寫的單片機(jī)程序如下:
  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. //可調(diào)pwm函數(shù)
  14. void pwm(unsigned char a)   //改變a的值調(diào)整占空比
  15. {
  16. U8 i;
  17. led=0X00;
  18. {
  19.   for(i=0;i<255;i++)
  20.   {
  21.    if(i<a)        //改變a的值調(diào)整占空比
  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的大小值調(diào)整占空比         
  40.   }
  41.   }
  42.   else
  43.   {
  44.   led=0;
  45.   }
  46.   }
復(fù)制代碼

回復(fù)

使用道具 舉報

ID:410399 發(fā)表于 2018-12-10 08:11 | 顯示全部樓層
把while括住整個main函數(shù)的內(nèi)容
回復(fù)

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

共陽極的
回復(fù)

使用道具 舉報

ID:237797 發(fā)表于 2018-12-10 15:47 | 顯示全部樓層
mosqu 發(fā)表于 2018-12-10 08:11
把while括住整個main函數(shù)的內(nèi)容

while整個main函數(shù),運行就停在開機(jī)延時哪里,K2不起作用了
回復(fù)

使用道具 舉報

ID:443406 發(fā)表于 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的大小值調(diào)整占空比         
    }
    else
    {
      led=0;
    }
  }
}
回復(fù)

使用道具 舉報

ID:304235 發(fā)表于 2018-12-10 16:43 | 顯示全部樓層
6S用定時器中斷來定時。main函數(shù)內(nèi)先初始化變量 然后再用while函數(shù)進(jìn)行循環(huán)。
下面程序有個框架, 你再根據(jù)自己的需求改一改,調(diào)試調(diào)試。。
#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;
        }
}
回復(fù)

使用道具 舉報

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

今天晚上用你的方法試試。
回復(fù)

使用道具 舉報

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

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

使用道具 舉報

ID:237797 發(fā)表于 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的大小值調(diào)整占空比         
    }
    else
    {
      led=0;
    }
  }
}
我按照這樣把開燈后燈亮這6S注釋了,能滿足我的K1,K2控制燈的要求,就是K1按下要工作6S不行,也要這6S期間K1也是一直按下去的,在這6S之間要的K1斷開,要求燈也要滅。
回復(fù)

使用道具 舉報

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

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

使用道具 舉報

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

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表