找回密码
 注册

QQ登录

只需一步,快速开始

搜索

STM8 433M无线遥控台灯单片机程序

[复制链接]
eng 发表于 2021-7-6 16:55:39 | 显示全部楼层 |阅读模式
  1. /********************************************************
  2. 功能:433M无线遥控台灯,触摸,无级调光
  3. 作者:白菜
  4. 软件环境:IAR FOR STM8 1.40.1
  5. 注意:IAR for stm8s中 中断号需要在官方文档中加2 2013-7-6
  6. 注意:当亮度等级为255时候,PWM_Buf[255]中 应该是PWM_Buf[0]-PWM_Buf[254]
  7. 注意 Opton Byte 中的ARF0要激活
  8. 本开源项目针对新手,老鸟勿喷。
  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  //调节的时候故意限制到10,亮度等级从0-254
  27. #define  POWER_ON     1  //
  28. #define  POWER_OFF     0  //
  29. #define   BOTH_WARM_COLD    0//暖光冷光一起调节
  30. #define   COLD_ONLY         1//冷光
  31. #define   WARM_ONLY         2//暖光
  32. #define   MATCHING_CODE       1// 对码中
  33. #define   NOT_MATCHING_CODE   0// 不是对码
  34. #define  MAX_MODE_VAL    10
  35. #define  PLUS_MINUS_STEP 20 //+ - 键 单步 增加减少的量

  36. uchar  PowerMode = POWER_OFF ; //
  37. uchar  ModeVal = 0 ;   // 模式的值,断电上电默认为0  共10种模式
  38. uchar  ModeVal_Light_Warm[MAX_MODE_VAL] = {254,254,254,254,254,228,178,127,76,36} ; // 由暖变冷,然后保持 亮度降低 每个模式的暖光  亮度等级  0-254
  39. uchar  ModeVal_Lignt_Cold[MAX_MODE_VAL] = {0  ,76,127,178,228,228,178,127,76,36} ; //                              每个模式的冷光  亮度等级  0-254

  40. uchar  ColdLightLevel=178    ; //冷光  亮度等级 大概70%的功率
  41. uchar  WarmLightLevel=178    ; //暖光  亮度等级

  42. uchar  ModeFlag = 0 ; //0-->没有用模式按键点灯  1-->有
  43. uchar  KeyModeContinuousNum = 0  ; //其他按键按下后,模式按键连续单击次数,,用来判断是否 用其他按键微调过该模式,是的话 长按MODE 按键可以修改该模式
  44. uchar  KeyModeLongCnt = 0 ; //mode按键 长按后计数

  45. uchar  LastColdLightLevel = 178 ;  //上次的亮度等级值
  46. uchar  LastWarmLightLevel = 178 ;

  47. uint8  SelWarmColdVal = BOTH_WARM_COLD ; //两者同时调整

  48. uint8  MathCodeFlag = NOT_MATCHING_CODE ; //不在对码中
  49. uint8  MatchTimes = 0 ; // 按下匹配次数

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

  52. uint8 KeyC_Press = 0 ; //遥控C键按下后 做标志用  用来一直增加亮度
  53. uint8 KeyD_Press = 0 ; //遥控D键按下后 做标志用  用来一直减小亮度

  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() ;  //独立看门狗初始化
  62.         GPIO_Init();

  63.     //PD2做输入 机械按键
  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"); //开中断
  74.         __enable_interrupt(); //开中断
  75.         PowerOff();//关LED
  76.     //刚上电等电源稳定在操作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() ; //读机械按键
  107.             ReadKeyTouch() ;//读触摸按键值
  108.         if(KeyOnOffShortPress)
  109.         {
  110.             KeyOnOffShortPress = 0 ;
  111.             PowerMode = !PowerMode ; //
  112.             if(POWER_OFF == PowerMode) //关机
  113.             {
  114.                 PowerOff();//关LED
  115.                 //存储亮度值到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 //开机
  123.             {
  124.                 SetLightCold(ColdLightLevel) ; //调节冷光灯光亮度,传入参数为亮度等级0-255
  125.                 SetLightWarm(WarmLightLevel) ; //调节暖光灯光亮度,传入参数为亮度等级0-255   
  126.                 SelWarmColdVal = BOTH_WARM_COLD ; //开灯时默认两者一起调整
  127.                 KeyOnOffLongPressUpFlag = 0 ; //清除在关灯下误触发的长按按钮,留下的长按抬起信号
  128.                 TouchKeyDirection = TOUCH_PLUS ; //上电默认 触摸按键长按亮度加
  129.             }
  130. #ifdef       DEBUG_MODE
  131.             BeepFlag = 1 ;
  132. #endif
  133.         }

  134.         if(JiXieKeyCodePress)
  135.         {
  136.             JiXieKeyCodePress = 0 ;
  137.             MathCodeFlag = MATCHING_CODE ; // 进入对码  
  138.             BeepFlag = 1 ;//蜂鸣器叫一下
  139. #ifdef   DEBUG_MODE            
  140.             UartSendByte(0xaa);  
  141. #endif
  142.         }
  143.         
  144.                 if( MATCHING_CODE == MathCodeFlag ) // 在对码中
  145.                 {
  146.                         if(rf_ture)            //按键短按
  147.                         {
  148.                                 rf_ture = 0 ;
  149.                                 if( 0 == MatchTimes ) //第一个按键
  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) )  //两次一样认为可靠
  163.                                         {
  164.                                                 MyRF_AddrH = RF_AddrValH1 ;
  165.                                                 MyRF_AddrL = RF_AddrValL1 & 0XFFF0 ;           //记录 RF 地址,低四位为按键值
  166.                                                 //存储到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 ; //回到正常工作状态
  175.                                         }
  176.                     MatchTimes = 0 ; // 按下匹配次数
  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  //不在对码中,按键可以点灯
  188.                 {
  189.                 if(POWER_OFF == PowerMode)  //关灯状态下
  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 ; //模式键 长按计数
  201.                                         if( ( rf_addh_old == MyRF_AddrH ) && ( ( rf_addl_old & 0XFFF0 ) == MyRF_AddrL ) )  //遥控地址位(高6位位地址位)与预设地址一致
  202.                                         {               
  203.                                         key_val = 0 ;
  204.                                         key_val = rf_addl_old & 0x000F ;
  205.                                                 if( KEYA == key_val )  //开关键按下
  206.                             {
  207. #ifdef   DEBUG_MODE
  208.                                 UartSendByte(0x0A);
  209.                             BeepFlag = 1 ;  //叫一下
  210. #endif
  211.                                 PowerMode = POWER_ON ; //开灯状态
  212.                                                         SetLightCold(ColdLightLevel) ; //调节冷光灯光亮度,传入参数为亮度等级0-255
  213.                                                         SetLightWarm(WarmLightLevel) ; //调节暖光灯光亮度,传入参数为亮度等级0-255   
  214.                             SelWarmColdVal = BOTH_WARM_COLD ; //开灯时默认两者一起调整
  215.                             KeyOnOffLongPressUpFlag = 0 ; //清除在关灯下误触发的长按按钮,留下的长按抬起信号
  216.                             TouchKeyDirection = TOUCH_PLUS ; //上电默认 触摸按键长按亮度加
  217.                             }        
  218.                                         }
  219.          
  220.                                 }
  221.                 if(KeyOnOffLongPress)  //触摸按键长按
  222.                 {
  223.                     SetLightCold(ColdLightLevel) ; //调节冷光灯光亮度,传入参数为亮度等级0-255
  224.                                         SetLightWarm(WarmLightLevel) ; //调节暖光灯光亮度,传入参数为亮度等级0-255
  225.                 }
  226.                 if(KeyOnOffLongPressUpFlag) //触摸按键 长按后抬起
  227.                         {
  228.                             KeyOnOffLongPressUpFlag = 0 ;
  229.                     SelWarmColdVal = BOTH_WARM_COLD ; //开灯时默认两者一起调整
  230.                     KeyOnOffLongPressUpFlag = 0 ; //清除在关灯下误触发的长按按钮,留下的长按抬起信号
  231.                     TouchKeyDirection = TOUCH_PLUS ; //上电默认 触摸按键长按亮度加
  232.                     PowerMode = POWER_ON ; //开灯状态
  233.                         }
  234.                
  235.                         }
  236.                 else //开灯状态下
  237.                 {
  238.                                 if(KeyOnOffLongPress)  //触摸按键长按
  239.                         {
  240.                             if(TouchKey4msCnt>5) //20ms一次
  241.                             {
  242.                                 TouchKey4msCnt = 0 ;
  243.                                 if( TOUCH_PLUS == TouchKeyDirection )
  244.                                 {
  245.                                     if(WarmLightLevel < MAX_LIGHT_LEVEL)  //还不是最大亮度等级
  246.                                     {
  247.                                         WarmLightLevel++; //亮度加1
  248.                                     }  
  249.                                     SetLightWarm(WarmLightLevel) ; //更新亮度
  250.                
  251.                                     if(ColdLightLevel < MAX_LIGHT_LEVEL)  //还不是最大亮度等级
  252. ……………………

  253. …………限于本文篇幅 余下代码请从下载附件…………
复制代码
STM8_433M无线遥控台灯程序.rar (1.86 MB, 售价: 1 E币)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-4-24 14:27

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表