找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

單片機(jī)DIY,無(wú)法實(shí)現(xiàn)用開關(guān)進(jìn)行LED燈色溫切換,不知問(wèn)題出在哪里? 附程序

[復(fù)制鏈接]
ID:706724 發(fā)表于 2022-10-31 16:34 | 顯示全部樓層 |閱讀模式
想利用墻上開關(guān)進(jìn)行開--關(guān)切換LED燈的色溫,第一次開白光亮,第二次開黃光亮,第三次開白光黃光同時(shí)亮。程序借鑒了論壇大佬上傳的。但好像實(shí)現(xiàn)不了,無(wú)法切換!

單片機(jī)源程序如下:
#include<reg51.h>       //*使用S0P-8 STC15F104W芯片*//
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

uint key2_time_cnt;//*按鍵去抖計(jì)數(shù)器*//
uchar key2_lock;//*按鍵有效標(biāo)志*//
uchar key2_num_s;//*開關(guān)開關(guān)有多少種功能*//
char key2_touch_s_flag;//*交流電斷電有效標(biāo)志*//
uint shuzi;//*開關(guān)次數(shù)
uchar SYS1MS;//*時(shí)標(biāo)開關(guān)標(biāo)志*//
uchar AUXR;
sbit W=P3^4;//*白光*//
sbit C=        P3^5;//*黃光*//

sbit PWM=P3^2;//*交流信號(hào)檢測(cè)*//
void Timer0Init()//*定時(shí)器0初始化*//
{
        AUXR &= 0x7F;                //定時(shí)器12T時(shí)鐘模式
        TMOD &= 0xF0;                //設(shè)置定時(shí)器的模式
        TL0 = 0x00;                //*定時(shí)器初值
        TH0 = 0xDC;               
        TF0 = 0;         //清除TFO標(biāo)志        
        TR0 = 1;  //定時(shí)器0開始計(jì)時(shí)                     
                                                        
        EA=1;                   //中斷總開關(guān)
        ET0=1;                  //允許中斷
        
                                
                        
              
}

void key_scan2()//*交流電信號(hào)的判斷*//
{
if(PWM==1)
{
  key2_lock=0;
  key2_time_cnt=0;
  if(key2_touch_s_flag==1)
  {
     
      key2_touch_s_flag=0;
      key2_num_s++;
      if(key2_num_s>2)key2_num_s=0;
  }

}
else if(key2_lock==0)
{
   key2_time_cnt++;
   if(key2_time_cnt>149)
  {
     key2_touch_s_flag=1;
     key2_time_cnt=0;
     key2_lock=1;
     
  }
}
}

void key_service2()//*開關(guān)功能的內(nèi)容*//
{

switch(key2_num_s)
{
  case 0:
        W=1;
        C=0;
        
  
        //key2_num_s=0;
        break;
   case 1:
       W=0;
        C=1;
               

        //key2_num_s=0;
        break;
   case 2:
        W=1;
        C=1;
                                
       // key2_num_s=0;
        break;
  
  }
  
}

void main()//*主程序*//
{
        Timer0Init();
while(1)
{
if(SYS1MS==1)
{
SYS1MS=0;
key_scan2();
}
key_service2();
}
}

void exint0()interrupt 0//*中斷函數(shù)*//
{
      if((TR0&ET0)==1)
  {   
        TR0=0;
         ET0=1;
                                                
        TL0 = 0x00;        //*定時(shí)器低8位初裝數(shù)值*//        
        TH0 = 0xDC;//*        定時(shí)器高8位初裝值*//
                                       
            shuzi++;
            if(shuzi==2)
            {
               shuzi=0;
               SYS1MS=1;
            }
           
            
            TR0=1;
  }
}
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2022-10-31 20:37 | 顯示全部樓層
這個(gè)應(yīng)用電路非常簡(jiǎn)單。市售的家用燈具大量使用。其基本原理就是利用開關(guān)短暫斷電給單片機(jī)提供低電平信號(hào),用以切換燈串的不同組合。單片機(jī)靠濾波電容維持短暫供電。
無(wú)標(biāo)題.jpg





回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2022-10-31 20:45 | 顯示全部樓層
按上圖示意,可以用 STC15F104W  P3.2外部中斷做功能切換。
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-10-31 21:52 | 顯示全部樓層
你開了定時(shí)器的中斷但沒(méi)有中斷函數(shù)
回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2022-11-1 09:18 | 顯示全部樓層
除沙發(fā)說(shuō)的用電容記憶方案外,還有用EEPROM記憶的方案:

1、用內(nèi)部EEPROM做個(gè)計(jì)數(shù)器WY。WY=00,01,10,11。對(duì)應(yīng)不亮,白、黃、白黃燈亮。初始WY=00。
2、每次上電后,將WY+1,如果=00,就改成01,不是00不改以防出現(xiàn)開關(guān)開啟后燈不亮。并據(jù)之輸出燈控制信號(hào),讓對(duì)應(yīng)的燈亮。N秒后再將WY-1,恢復(fù)原態(tài),這里假設(shè)N取1秒。
這樣就成功了。
原理:
1、開關(guān)上電后,由于WY+1,所以會(huì)改變亮燈的狀態(tài),做到依次:白、黃、白黃。
2、N秒后將WY-1,退回原態(tài),這樣只要每次通電多于N分鐘,則下次通電時(shí),燈的狀態(tài)組合就不變了。
3、如果通電時(shí)間<N秒,則WY來(lái)不及-1,恢復(fù)原狀態(tài),下次開燈必然變態(tài)了。
要點(diǎn):WY用非易失性存儲(chǔ)器。這樣掉電后WY不變。

比較:
電容記憶方案:需要檢測(cè)交流電是否掉電,電容儲(chǔ)能必須保證掉電后,系統(tǒng)能繼續(xù)工作N秒以上,節(jié)省了EEPROM。
EEPROM方案:要EEPROM就行了。

回復(fù)

使用道具 舉報(bào)

ID:706724 發(fā)表于 2022-11-4 11:35 | 顯示全部樓層
wulin 發(fā)表于 2022-10-31 20:45
按上圖示意,可以用 STC15F104W  P3.2外部中斷做功能切換。

這個(gè) 單片機(jī)好像是上升沿或下降沿中斷觸發(fā)的。低電平不觸發(fā)的,還沒(méi)想到該怎么寫中斷?本人小白也
回復(fù)

使用道具 舉報(bào)

ID:706724 發(fā)表于 2022-11-4 11:39 | 顯示全部樓層
lkc8210 發(fā)表于 2022-10-31 21:52
你開了定時(shí)器的中斷但沒(méi)有中斷函數(shù)

你好,本人小白請(qǐng)指教一下,我后面改了:
void Timer0()interrupt 1 using 0//*¶¨ê±Æ÷ÖD¶Ïoˉêy*//
{
      if((TR0&TF0)==1)
  {   
                                TR0=0;
        TF0=0;
                                               
                                TL0 = 0x00;        //*¶¨ê±Æ÷μí8λ3õ×°êyÖμ*//       
                                TH0 = 0xDC;//*        ¶¨ê±Æ÷¸ß8λ3õ×°Öμ*//
                                       
            shuzi++;
            if(shuzi==2)
            {
               shuzi=0;
               SYS1MS=1;
            }
           
            
            TR0=1;
  }
}
回復(fù)

使用道具 舉報(bào)

ID:706724 發(fā)表于 2022-11-4 11:41 | 顯示全部樓層
yzwzfyz 發(fā)表于 2022-11-1 09:18
除沙發(fā)說(shuō)的用電容記憶方案外,還有用EEPROM記憶的方案:

1、用內(nèi)部EEPROM做個(gè)計(jì)數(shù)器WY。WY=00,01,10, ...

感謝提供了這么好的思路,先按照電容供電這個(gè)弄,弄好了再學(xué)習(xí)EEPROM這個(gè),實(shí)力不濟(jì)!
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2022-11-4 12:00 | 顯示全部樓層
木示 發(fā)表于 2022-11-4 11:35
這個(gè) 單片機(jī)好像是上升沿或下降沿中斷觸發(fā)的。低電平不觸發(fā)的,還沒(méi)想到該怎么寫中斷?本人小白也

你真是小白,潔白無(wú)瑕,從高電平轉(zhuǎn)換到低電平不就是下降沿?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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