標(biāo)題: 433M無(wú)線遙控臺(tái)燈單片機(jī)程序 [打印本頁(yè)]

作者: wxmlx    時(shí)間: 2021-7-3 16:25
標(biāo)題: 433M無(wú)線遙控臺(tái)燈單片機(jī)程序
  1. /********************************************************
  2. 功能:433M無(wú)線遙控臺(tái)燈,觸摸,無(wú)級(jí)調(diào)光
  3. 作者:白菜
  4. 軟件環(huán)境:IAR FOR STM8 1.40.1
  5. 注意:IAR for stm8s中 中斷號(hào)需要在官方文檔中加2 2013-7-6
  6. 注意:當(dāng)亮度等級(jí)為255時(shí)候,PWM_Buf[255]中 應(yīng)該是PWM_Buf[0]-PWM_Buf[254]
  7. 注意 Opton Byte 中的ARF0要激活
  8. 本開(kāi)源項(xiàng)目針對(duì)新手,老鳥(niǎo)勿噴。
  9. *********************************************************/
  10. #include <iostm8s003f3.h>
  11. #include"sys.h"
  12. #include"uart.h"
  13. #include"intrinsics.h"
  14. #include"timer1_pwm.h"
  15. #include"timer2.h"
  16. #include"2262decode.h"
  17. #include"key.h"
  18. #include"stm8s_eeprom.h"
  19. #include"stm8s_beep.h"
  20. #include"iwdg.h"
  21. //#define  DEBUG_MODE
  22. #define LED 4 //the LED on the PD4
  23. #define LED_OFF() PD_ODR |= (1<<(LED))
  24. #define LED_ON() PD_ODR &= ~ (1<<(LED))

  25. #define  MAX_LIGHT_LEVEL   254
  26. #define  MIN_LIGHT_LEVEL   10  //調(diào)節(jié)的時(shí)候故意限制到10,亮度等級(jí)從0-254
  27. #define  POWER_ON     1  //
  28. #define  POWER_OFF     0  //
  29. #define   BOTH_WARM_COLD    0//暖光冷光一起調(diào)節(jié)
  30. #define   COLD_ONLY         1//冷光
  31. #define   WARM_ONLY         2//暖光
  32. #define   MATCHING_CODE       1// 對(duì)碼中
  33. #define   NOT_MATCHING_CODE   0// 不是對(duì)碼
  34. #define  MAX_MODE_VAL    10
  35. #define  PLUS_MINUS_STEP 20 //+ - 鍵 單步 增加減少的量

  36. uchar  PowerMode = POWER_OFF ; //
  37. uchar  ModeVal = 0 ;   // 模式的值,斷電上電默認(rèn)為0  共10種模式
  38. uchar  ModeVal_Light_Warm[MAX_MODE_VAL] = {254,254,254,254,254,228,178,127,76,36} ; // 由暖變冷,然后保持 亮度降低 每個(gè)模式的暖光  亮度等級(jí)  0-254
  39. uchar  ModeVal_Lignt_Cold[MAX_MODE_VAL] = {0  ,76,127,178,228,228,178,127,76,36} ; //                              每個(gè)模式的冷光  亮度等級(jí)  0-254

  40. uchar  ColdLightLevel=178    ; //冷光  亮度等級(jí) 大概70%的功率
  41. uchar  WarmLightLevel=178    ; //暖光  亮度等級(jí)

  42. uchar  ModeFlag = 0 ; //0-->沒(méi)有用模式按鍵點(diǎn)燈  1-->有
  43. uchar  KeyModeContinuousNum = 0  ; //其他按鍵按下后,模式按鍵連續(xù)單擊次數(shù),,用來(lái)判斷是否 用其他按鍵微調(diào)過(guò)該模式,是的話 長(zhǎng)按MODE 按鍵可以修改該模式
  44. uchar  KeyModeLongCnt = 0 ; //mode按鍵 長(zhǎng)按后計(jì)數(shù)

  45. uchar  LastColdLightLevel = 178 ;  //上次的亮度等級(jí)值
  46. uchar  LastWarmLightLevel = 178 ;

  47. uint8  SelWarmColdVal = BOTH_WARM_COLD ; //兩者同時(shí)調(diào)整

  48. uint8  MathCodeFlag = NOT_MATCHING_CODE ; //不在對(duì)碼中
  49. uint8  MatchTimes = 0 ; // 按下匹配次數(shù)

  50. uint16  RF_AddrValH1 = 0 ; //第一次按鍵接收的地址
  51. uint16  RF_AddrValL1 = 0 ; //第一次按鍵接收的地址

  52. uint8 KeyC_Press = 0 ; //遙控C鍵按下后 做標(biāo)志用  用來(lái)一直增加亮度
  53. uint8 KeyD_Press = 0 ; //遙控D鍵按下后 做標(biāo)志用  用來(lái)一直減小亮度

  54. int main( void )
  55. {
  56.     uint8 StrTemp[6] = {0} ;
  57.     //uint8 i ;
  58.     uint8 key_val ;
  59. // asm("sim");  // 禁止中斷
  60.      ClockInit();  
  61.     IWDG_Init() ;  //獨(dú)立看門(mén)狗初始化
  62.         GPIO_Init();

  63.     //PD2做輸入 機(jī)械按鍵
  64.     PD_DDR_DDR2 = 0 ;  // PD0輸入
  65.     PD_CR1_C12 = 1 ;   // 輸入帶上拉
  66.     PD_CR2_C22 = 0 ;   // 禁止中斷
  67.    
  68.         Timer1_PWM_Init() ;
  69.         Timer2_Init();  //125us中斷,遙控解碼用
  70.         Uart1_Init();
  71.         
  72.     UartSendByte(0X51);
  73. // asm("rim"); //開(kāi)中斷
  74.         __enable_interrupt(); //開(kāi)中斷
  75.         PowerOff();//關(guān)LED
  76.     //剛上電等電源穩(wěn)定在操作EEPROM
  77. //        Delay_Ms(2) ;
  78. /*   Write_eeprom_Byte(EEPROM_ADDR,str1,6) ;*/
  79.     Read_eeprom_Byte(EEPROM_ADDR, StrTemp,6)  ;
  80.     MyRF_AddrH = (uint16)StrTemp[0]*256 + StrTemp[1] ;
  81.     MyRF_AddrL = (uint16)StrTemp[2]*256 + StrTemp[3] ;
  82.     ColdLightLevel = StrTemp[4] ;
  83.     WarmLightLevel = StrTemp[5] ;
  84.     if( (ColdLightLevel<MIN_LIGHT_LEVEL) || (ColdLightLevel>MAX_LIGHT_LEVEL) )
  85.     {
  86.         ColdLightLevel = MAX_LIGHT_LEVEL ;
  87.     }
  88.     if((WarmLightLevel<MIN_LIGHT_LEVEL) || (WarmLightLevel>MAX_LIGHT_LEVEL) )
  89.     {
  90.         WarmLightLevel = MAX_LIGHT_LEVEL ;
  91.     }
  92. #ifdef     DEBUG_MODE
  93.     for(i=0;i<6;i++)
  94.     {
  95.         UartSendByte(StrTemp[i]);
  96.     }
  97. #endif   
  98.    
  99.     InitBeep() ;//初始化蜂鳴器

  100. #ifdef   DEBUG_MODE
  101.     BeepFlag = 1 ; //叫一下
  102. #endif
  103.    
  104.         while(1)
  105.         {
  106.             ReadKey() ; //讀機(jī)械按鍵
  107.             ReadKeyTouch() ;//讀觸摸按鍵值
  108.         if(KeyOnOffShortPress)
  109.         {
  110.             KeyOnOffShortPress = 0 ;
  111.             PowerMode = !PowerMode ; //
  112.             if(POWER_OFF == PowerMode) //關(guān)機(jī)
  113.             {
  114.                 PowerOff();//關(guān)LED
  115.                 //存儲(chǔ)亮度值到EEPROM
  116.                 StrTemp[0] = ColdLightLevel ;
  117.                 StrTemp[1] = WarmLightLevel ;
  118.                 Write_eeprom_Byte(EEPROM_COLD_ADDR,StrTemp,2) ;
  119.                 KeyC_Press = 0 ;//假如正在變化則暫停
  120.                 KeyD_Press = 0 ;
  121.             }
  122.             else //開(kāi)機(jī)
  123.             {
  124.                 SetLightCold(ColdLightLevel) ; //調(diào)節(jié)冷光燈光亮度,傳入?yún)?shù)為亮度等級(jí)0-255
  125.                 SetLightWarm(WarmLightLevel) ; //調(diào)節(jié)暖光燈光亮度,傳入?yún)?shù)為亮度等級(jí)0-255   
  126.                 SelWarmColdVal = BOTH_WARM_COLD ; //開(kāi)燈時(shí)默認(rèn)兩者一起調(diào)整
  127.                 KeyOnOffLongPressUpFlag = 0 ; //清除在關(guān)燈下誤觸發(fā)的長(zhǎng)按按鈕,留下的長(zhǎng)按抬起信號(hào)
  128.                 TouchKeyDirection = TOUCH_PLUS ; //上電默認(rèn) 觸摸按鍵長(zhǎng)按亮度加
  129.             }
  130. #ifdef       DEBUG_MODE
  131.             BeepFlag = 1 ;
  132. #endif
  133.         }

  134.         if(JiXieKeyCodePress)
  135.         {
  136.             JiXieKeyCodePress = 0 ;
  137.             MathCodeFlag = MATCHING_CODE ; // 進(jìn)入對(duì)碼  
  138.             BeepFlag = 1 ;//蜂鳴器叫一下
  139. #ifdef   DEBUG_MODE            
  140.             UartSendByte(0xaa);  
  141. #endif
  142.         }
  143.         
  144.                 if( MATCHING_CODE == MathCodeFlag ) // 在對(duì)碼中
  145.                 {
  146.                         if(rf_ture)            //按鍵短按
  147.                         {
  148.                                 rf_ture = 0 ;
  149.                                 if( 0 == MatchTimes ) //第一個(gè)按鍵
  150.                                 {
  151.                                         RF_AddrValH1 = rf_addh_old ;
  152.                                         RF_AddrValL1 = rf_addl_old ;
  153.                                         MatchTimes ++ ;
  154.                     BeepFlag = 1 ;//蜂鳴器叫一下
  155. #ifdef   DEBUG_MODE                     
  156.                     UartSendByte(0X0B);
  157. #endif
  158.                   
  159.                                 }
  160.                                 else if( 1 == MatchTimes ) //第二次按下
  161.                                 {
  162.                                         if( (RF_AddrValH1 == rf_addh_old) && (RF_AddrValL1 == rf_addl_old) )  //兩次一樣認(rèn)為可靠
  163.                                         {
  164.                                                 MyRF_AddrH = RF_AddrValH1 ;
  165.                                                 MyRF_AddrL = RF_AddrValL1 & 0XFFF0 ;           //記錄 RF 地址,低四位為按鍵值
  166.                                                 //存儲(chǔ)到EEPROM
  167.                         StrTemp[0] = MyRF_AddrH >> 8 ;
  168.                         StrTemp[1] = MyRF_AddrH & 0X00FF ;
  169.                         StrTemp[2] = MyRF_AddrL >> 8 ;
  170.                         StrTemp[3] = MyRF_AddrL & 0X00FF ;
  171.                         Write_eeprom_Byte(EEPROM_RF_ADDRH,StrTemp,4) ;
  172.                         
  173.                                                 MulBeepFlag = 2 ; // 叫2聲
  174.                                                 MathCodeFlag = NOT_MATCHING_CODE ; //回到正常工作狀態(tài)
  175.                                         }
  176.                     MatchTimes = 0 ; // 按下匹配次數(shù)
  177. #ifdef   DEBUG_MODE                    
  178.                     UartSendByte(MyRF_AddrH>>8);
  179.                                         UartSendByte(MyRF_AddrH>>0);
  180.                                         UartSendByte(MyRF_AddrL>>8);
  181.                                         UartSendByte(MyRF_AddrL>>0);
  182. #endif
  183.                                 }
  184.                         }
  185.                         
  186.                 }
  187.                 else  //不在對(duì)碼中,按鍵可以點(diǎn)燈
  188.                 {
  189.                 if(POWER_OFF == PowerMode)  //關(guān)燈狀態(tài)下
  190.                         {
  191.                                 if(rf_ture)   //按鍵短按
  192.                                 {   
  193. #ifdef   DEBUG_MODE
  194.                         UartSendByte(rf_addh_old>>8);
  195.                                         UartSendByte(rf_addh_old>>0);
  196.                                         UartSendByte(rf_addl_old>>8);
  197.                                         UartSendByte(rf_addl_old>>0);
  198. #endif
  199.                                     rf_ture=0 ;
  200.                                         KeyModeLongCnt=0 ; //模式鍵 長(zhǎng)按計(jì)數(shù)
  201.                                         if( ( rf_addh_old == MyRF_AddrH ) && ( ( rf_addl_old & 0XFFF0 ) == MyRF_AddrL ) )  //遙控地址位(高6位位地址位)與預(yù)設(shè)地址一致
  202.                                         {               
  203.                                         key_val = 0 ;
  204.                                         key_val = rf_addl_old & 0x000F ;
  205.                                                 if( KEYA == key_val )  //開(kāi)關(guān)鍵按下
  206.                             {
  207. #ifdef   DEBUG_MODE
  208.                                 UartSendByte(0x0A);
  209.                             BeepFlag = 1 ;  //叫一下
  210. #endif
  211.                                 PowerMode = POWER_ON ; //開(kāi)燈狀態(tài)
  212.                                                         SetLightCold(ColdLightLevel) ; //調(diào)節(jié)冷光燈光亮度,傳入?yún)?shù)為亮度等級(jí)0-255
  213.                                                         SetLightWarm(WarmLightLevel) ; //調(diào)節(jié)暖光燈光亮度,傳入?yún)?shù)為亮度等級(jí)0-255   
  214.                             SelWarmColdVal = BOTH_WARM_COLD ; //開(kāi)燈時(shí)默認(rèn)兩者一起調(diào)整
  215.                             KeyOnOffLongPressUpFlag = 0 ; //清除在關(guān)燈下誤觸發(fā)的長(zhǎng)按按鈕,留下的長(zhǎng)按抬起信號(hào)
  216.                             TouchKeyDirection = TOUCH_PLUS ; //上電默認(rèn) 觸摸按鍵長(zhǎng)按亮度加
  217.                             }        
  218.                                         }
  219.          
  220.                                 }
  221.                 if(KeyOnOffLongPress)  //觸摸按鍵長(zhǎng)按
  222.                 {
  223.                     SetLightCold(ColdLightLevel) ; //調(diào)節(jié)冷光燈光亮度,傳入?yún)?shù)為亮度等級(jí)0-255
  224.                                         SetLightWarm(WarmLightLevel) ; //調(diào)節(jié)暖光燈光亮度,傳入?yún)?shù)為亮度等級(jí)0-255
  225.                 }
  226.                 if(KeyOnOffLongPressUpFlag) //觸摸按鍵 長(zhǎng)按后抬起
  227.                         {
  228.                             KeyOnOffLongPressUpFlag = 0 ;
  229.                     SelWarmColdVal = BOTH_WARM_COLD ; //開(kāi)燈時(shí)默認(rèn)兩者一起調(diào)整
  230.                     KeyOnOffLongPressUpFlag = 0 ; //清除在關(guān)燈下誤觸發(fā)的長(zhǎng)按按鈕,留下的長(zhǎng)按抬起信號(hào)
  231.                     TouchKeyDirection = TOUCH_PLUS ; //上電默認(rèn) 觸摸按鍵長(zhǎng)按亮度加
  232.                     PowerMode = POWER_ON ; //開(kāi)燈狀態(tài)
  233.                         }
  234.                
  235.                         }
  236.                 else //開(kāi)燈狀態(tài)下
  237.                 {
  238.                                 if(KeyOnOffLongPress)  //觸摸按鍵長(zhǎng)按
  239.                         {
  240.                             if(TouchKey4msCnt>5) //20ms一次
  241.                             {
  242.                                 TouchKey4msCnt = 0 ;
  243.                                 if( TOUCH_PLUS == TouchKeyDirection )
  244.                                 {
  245.                                     if(WarmLightLevel < MAX_LIGHT_LEVEL)  //還不是最大亮度等級(jí)
  246.                                     {
  247.                                         WarmLightLevel++; //亮度加1
  248.                                     }  
  249.                                     SetLightWarm(WarmLightLevel) ; //更新亮度
  250.                
  251.                                     if(ColdLightLevel < MAX_LIGHT_LEVEL)  //還不是最大亮度等級(jí)
  252. ……………………

  253. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

代碼: 433M無(wú)線遙控臺(tái)燈程序.rar (1.86 MB, 下載次數(shù): 64)

作者: 51hei團(tuán)團(tuán)    時(shí)間: 2021-7-3 19:17
好東東,原理圖能分享一下嗎?或者說(shuō)明一下電路連接
作者: cdiyy    時(shí)間: 2021-7-13 17:53
原理圖可以分享一下嗎,好東西




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