标题:
433M无线遥控台灯单片机程序
[打印本页]
作者:
wxmlx
时间:
2021-7-3 16:25
标题:
433M无线遥控台灯单片机程序
/********************************************************
功能:433M无线遥控台灯,触摸,无级调光
作者:白菜
软件环境:IAR FOR STM8 1.40.1
注意:IAR for stm8s中 中断号需要在官方文档中加2 2013-7-6
注意:当亮度等级为255时候,PWM_Buf[255]中 应该是PWM_Buf[0]-PWM_Buf[254]
注意 Opton Byte 中的ARF0要激活
本开源项目针对新手,老鸟勿喷。
*********************************************************/
#include <iostm8s003f3.h>
#include"sys.h"
#include"uart.h"
#include"intrinsics.h"
#include"timer1_pwm.h"
#include"timer2.h"
#include"2262decode.h"
#include"key.h"
#include"stm8s_eeprom.h"
#include"stm8s_beep.h"
#include"iwdg.h"
//#define DEBUG_MODE
#define LED 4 //the LED on the PD4
#define LED_OFF() PD_ODR |= (1<<(LED))
#define LED_ON() PD_ODR &= ~ (1<<(LED))
#define MAX_LIGHT_LEVEL 254
#define MIN_LIGHT_LEVEL 10 //调节的时候故意限制到10,亮度等级从0-254
#define POWER_ON 1 //
#define POWER_OFF 0 //
#define BOTH_WARM_COLD 0//暖光冷光一起调节
#define COLD_ONLY 1//冷光
#define WARM_ONLY 2//暖光
#define MATCHING_CODE 1// 对码中
#define NOT_MATCHING_CODE 0// 不是对码
#define MAX_MODE_VAL 10
#define PLUS_MINUS_STEP 20 //+ - 键 单步 增加减少的量
uchar PowerMode = POWER_OFF ; //
uchar ModeVal = 0 ; // 模式的值,断电上电默认为0 共10种模式
uchar ModeVal_Light_Warm[MAX_MODE_VAL] = {254,254,254,254,254,228,178,127,76,36} ; // 由暖变冷,然后保持 亮度降低 每个模式的暖光 亮度等级 0-254
uchar ModeVal_Lignt_Cold[MAX_MODE_VAL] = {0 ,76,127,178,228,228,178,127,76,36} ; // 每个模式的冷光 亮度等级 0-254
uchar ColdLightLevel=178 ; //冷光 亮度等级 大概70%的功率
uchar WarmLightLevel=178 ; //暖光 亮度等级
uchar ModeFlag = 0 ; //0-->没有用模式按键点灯 1-->有
uchar KeyModeContinuousNum = 0 ; //其他按键按下后,模式按键连续单击次数,,用来判断是否 用其他按键微调过该模式,是的话 长按MODE 按键可以修改该模式
uchar KeyModeLongCnt = 0 ; //mode按键 长按后计数
uchar LastColdLightLevel = 178 ; //上次的亮度等级值
uchar LastWarmLightLevel = 178 ;
uint8 SelWarmColdVal = BOTH_WARM_COLD ; //两者同时调整
uint8 MathCodeFlag = NOT_MATCHING_CODE ; //不在对码中
uint8 MatchTimes = 0 ; // 按下匹配次数
uint16 RF_AddrValH1 = 0 ; //第一次按键接收的地址
uint16 RF_AddrValL1 = 0 ; //第一次按键接收的地址
uint8 KeyC_Press = 0 ; //遥控C键按下后 做标志用 用来一直增加亮度
uint8 KeyD_Press = 0 ; //遥控D键按下后 做标志用 用来一直减小亮度
int main( void )
{
uint8 StrTemp[6] = {0} ;
//uint8 i ;
uint8 key_val ;
// asm("sim"); // 禁止中断
ClockInit();
IWDG_Init() ; //独立看门狗初始化
GPIO_Init();
//PD2做输入 机械按键
PD_DDR_DDR2 = 0 ; // PD0输入
PD_CR1_C12 = 1 ; // 输入带上拉
PD_CR2_C22 = 0 ; // 禁止中断
Timer1_PWM_Init() ;
Timer2_Init(); //125us中断,遥控解码用
Uart1_Init();
UartSendByte(0X51);
// asm("rim"); //开中断
__enable_interrupt(); //开中断
PowerOff();//关LED
//刚上电等电源稳定在操作EEPROM
// Delay_Ms(2) ;
/* Write_eeprom_Byte(EEPROM_ADDR,str1,6) ;*/
Read_eeprom_Byte(EEPROM_ADDR, StrTemp,6) ;
MyRF_AddrH = (uint16)StrTemp[0]*256 + StrTemp[1] ;
MyRF_AddrL = (uint16)StrTemp[2]*256 + StrTemp[3] ;
ColdLightLevel = StrTemp[4] ;
WarmLightLevel = StrTemp[5] ;
if( (ColdLightLevel<MIN_LIGHT_LEVEL) || (ColdLightLevel>MAX_LIGHT_LEVEL) )
{
ColdLightLevel = MAX_LIGHT_LEVEL ;
}
if((WarmLightLevel<MIN_LIGHT_LEVEL) || (WarmLightLevel>MAX_LIGHT_LEVEL) )
{
WarmLightLevel = MAX_LIGHT_LEVEL ;
}
#ifdef DEBUG_MODE
for(i=0;i<6;i++)
{
UartSendByte(StrTemp[i]);
}
#endif
InitBeep() ;//初始化蜂鸣器
#ifdef DEBUG_MODE
BeepFlag = 1 ; //叫一下
#endif
while(1)
{
ReadKey() ; //读机械按键
ReadKeyTouch() ;//读触摸按键值
if(KeyOnOffShortPress)
{
KeyOnOffShortPress = 0 ;
PowerMode = !PowerMode ; //
if(POWER_OFF == PowerMode) //关机
{
PowerOff();//关LED
//存储亮度值到EEPROM
StrTemp[0] = ColdLightLevel ;
StrTemp[1] = WarmLightLevel ;
Write_eeprom_Byte(EEPROM_COLD_ADDR,StrTemp,2) ;
KeyC_Press = 0 ;//假如正在变化则暂停
KeyD_Press = 0 ;
}
else //开机
{
SetLightCold(ColdLightLevel) ; //调节冷光灯光亮度,传入参数为亮度等级0-255
SetLightWarm(WarmLightLevel) ; //调节暖光灯光亮度,传入参数为亮度等级0-255
SelWarmColdVal = BOTH_WARM_COLD ; //开灯时默认两者一起调整
KeyOnOffLongPressUpFlag = 0 ; //清除在关灯下误触发的长按按钮,留下的长按抬起信号
TouchKeyDirection = TOUCH_PLUS ; //上电默认 触摸按键长按亮度加
}
#ifdef DEBUG_MODE
BeepFlag = 1 ;
#endif
}
if(JiXieKeyCodePress)
{
JiXieKeyCodePress = 0 ;
MathCodeFlag = MATCHING_CODE ; // 进入对码
BeepFlag = 1 ;//蜂鸣器叫一下
#ifdef DEBUG_MODE
UartSendByte(0xaa);
#endif
}
if( MATCHING_CODE == MathCodeFlag ) // 在对码中
{
if(rf_ture) //按键短按
{
rf_ture = 0 ;
if( 0 == MatchTimes ) //第一个按键
{
RF_AddrValH1 = rf_addh_old ;
RF_AddrValL1 = rf_addl_old ;
MatchTimes ++ ;
BeepFlag = 1 ;//蜂鸣器叫一下
#ifdef DEBUG_MODE
UartSendByte(0X0B);
#endif
}
else if( 1 == MatchTimes ) //第二次按下
{
if( (RF_AddrValH1 == rf_addh_old) && (RF_AddrValL1 == rf_addl_old) ) //两次一样认为可靠
{
MyRF_AddrH = RF_AddrValH1 ;
MyRF_AddrL = RF_AddrValL1 & 0XFFF0 ; //记录 RF 地址,低四位为按键值
//存储到EEPROM
StrTemp[0] = MyRF_AddrH >> 8 ;
StrTemp[1] = MyRF_AddrH & 0X00FF ;
StrTemp[2] = MyRF_AddrL >> 8 ;
StrTemp[3] = MyRF_AddrL & 0X00FF ;
Write_eeprom_Byte(EEPROM_RF_ADDRH,StrTemp,4) ;
MulBeepFlag = 2 ; // 叫2声
MathCodeFlag = NOT_MATCHING_CODE ; //回到正常工作状态
}
MatchTimes = 0 ; // 按下匹配次数
#ifdef DEBUG_MODE
UartSendByte(MyRF_AddrH>>8);
UartSendByte(MyRF_AddrH>>0);
UartSendByte(MyRF_AddrL>>8);
UartSendByte(MyRF_AddrL>>0);
#endif
}
}
}
else //不在对码中,按键可以点灯
{
if(POWER_OFF == PowerMode) //关灯状态下
{
if(rf_ture) //按键短按
{
#ifdef DEBUG_MODE
UartSendByte(rf_addh_old>>8);
UartSendByte(rf_addh_old>>0);
UartSendByte(rf_addl_old>>8);
UartSendByte(rf_addl_old>>0);
#endif
rf_ture=0 ;
KeyModeLongCnt=0 ; //模式键 长按计数
if( ( rf_addh_old == MyRF_AddrH ) && ( ( rf_addl_old & 0XFFF0 ) == MyRF_AddrL ) ) //遥控地址位(高6位位地址位)与预设地址一致
{
key_val = 0 ;
key_val = rf_addl_old & 0x000F ;
if( KEYA == key_val ) //开关键按下
{
#ifdef DEBUG_MODE
UartSendByte(0x0A);
BeepFlag = 1 ; //叫一下
#endif
PowerMode = POWER_ON ; //开灯状态
SetLightCold(ColdLightLevel) ; //调节冷光灯光亮度,传入参数为亮度等级0-255
SetLightWarm(WarmLightLevel) ; //调节暖光灯光亮度,传入参数为亮度等级0-255
SelWarmColdVal = BOTH_WARM_COLD ; //开灯时默认两者一起调整
KeyOnOffLongPressUpFlag = 0 ; //清除在关灯下误触发的长按按钮,留下的长按抬起信号
TouchKeyDirection = TOUCH_PLUS ; //上电默认 触摸按键长按亮度加
}
}
}
if(KeyOnOffLongPress) //触摸按键长按
{
SetLightCold(ColdLightLevel) ; //调节冷光灯光亮度,传入参数为亮度等级0-255
SetLightWarm(WarmLightLevel) ; //调节暖光灯光亮度,传入参数为亮度等级0-255
}
if(KeyOnOffLongPressUpFlag) //触摸按键 长按后抬起
{
KeyOnOffLongPressUpFlag = 0 ;
SelWarmColdVal = BOTH_WARM_COLD ; //开灯时默认两者一起调整
KeyOnOffLongPressUpFlag = 0 ; //清除在关灯下误触发的长按按钮,留下的长按抬起信号
TouchKeyDirection = TOUCH_PLUS ; //上电默认 触摸按键长按亮度加
PowerMode = POWER_ON ; //开灯状态
}
}
else //开灯状态下
{
if(KeyOnOffLongPress) //触摸按键长按
{
if(TouchKey4msCnt>5) //20ms一次
{
TouchKey4msCnt = 0 ;
if( TOUCH_PLUS == TouchKeyDirection )
{
if(WarmLightLevel < MAX_LIGHT_LEVEL) //还不是最大亮度等级
{
WarmLightLevel++; //亮度加1
}
SetLightWarm(WarmLightLevel) ; //更新亮度
if(ColdLightLevel < MAX_LIGHT_LEVEL) //还不是最大亮度等级
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
代码:
433M无线遥控台灯程序.rar
(1.86 MB, 下载次数: 64)
2021-7-3 16:24 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
51hei团团
时间:
2021-7-3 19:17
好东东,原理图能分享一下吗?或者说明一下电路连接
作者:
cdiyy
时间:
2021-7-13 17:53
原理图可以分享一下吗,好东西
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1