標(biāo)題:
433M無(wú)線遙控臺(tái)燈單片機(jī)程序
[打印本頁(yè)]
作者:
wxmlx
時(shí)間:
2021-7-3 16:25
標(biāo)題:
433M無(wú)線遙控臺(tái)燈單片機(jī)程序
/********************************************************
功能:433M無(wú)線遙控臺(tái)燈,觸摸,無(wú)級(jí)調(diào)光
作者:白菜
軟件環(huán)境:IAR FOR STM8 1.40.1
注意:IAR for stm8s中 中斷號(hào)需要在官方文檔中加2 2013-7-6
注意:當(dāng)亮度等級(jí)為255時(shí)候,PWM_Buf[255]中 應(yīng)該是PWM_Buf[0]-PWM_Buf[254]
注意 Opton Byte 中的ARF0要激活
本開(kāi)源項(xiàng)目針對(duì)新手,老鳥(niǎo)勿噴。
*********************************************************/
#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 //調(diào)節(jié)的時(shí)候故意限制到10,亮度等級(jí)從0-254
#define POWER_ON 1 //
#define POWER_OFF 0 //
#define BOTH_WARM_COLD 0//暖光冷光一起調(diào)節(jié)
#define COLD_ONLY 1//冷光
#define WARM_ONLY 2//暖光
#define MATCHING_CODE 1// 對(duì)碼中
#define NOT_MATCHING_CODE 0// 不是對(duì)碼
#define MAX_MODE_VAL 10
#define PLUS_MINUS_STEP 20 //+ - 鍵 單步 增加減少的量
uchar PowerMode = POWER_OFF ; //
uchar ModeVal = 0 ; // 模式的值,斷電上電默認(rèn)為0 共10種模式
uchar ModeVal_Light_Warm[MAX_MODE_VAL] = {254,254,254,254,254,228,178,127,76,36} ; // 由暖變冷,然后保持 亮度降低 每個(gè)模式的暖光 亮度等級(jí) 0-254
uchar ModeVal_Lignt_Cold[MAX_MODE_VAL] = {0 ,76,127,178,228,228,178,127,76,36} ; // 每個(gè)模式的冷光 亮度等級(jí) 0-254
uchar ColdLightLevel=178 ; //冷光 亮度等級(jí) 大概70%的功率
uchar WarmLightLevel=178 ; //暖光 亮度等級(jí)
uchar ModeFlag = 0 ; //0-->沒(méi)有用模式按鍵點(diǎn)燈 1-->有
uchar KeyModeContinuousNum = 0 ; //其他按鍵按下后,模式按鍵連續(xù)單擊次數(shù),,用來(lái)判斷是否 用其他按鍵微調(diào)過(guò)該模式,是的話 長(zhǎng)按MODE 按鍵可以修改該模式
uchar KeyModeLongCnt = 0 ; //mode按鍵 長(zhǎng)按后計(jì)數(shù)
uchar LastColdLightLevel = 178 ; //上次的亮度等級(jí)值
uchar LastWarmLightLevel = 178 ;
uint8 SelWarmColdVal = BOTH_WARM_COLD ; //兩者同時(shí)調(diào)整
uint8 MathCodeFlag = NOT_MATCHING_CODE ; //不在對(duì)碼中
uint8 MatchTimes = 0 ; // 按下匹配次數(shù)
uint16 RF_AddrValH1 = 0 ; //第一次按鍵接收的地址
uint16 RF_AddrValL1 = 0 ; //第一次按鍵接收的地址
uint8 KeyC_Press = 0 ; //遙控C鍵按下后 做標(biāo)志用 用來(lái)一直增加亮度
uint8 KeyD_Press = 0 ; //遙控D鍵按下后 做標(biāo)志用 用來(lái)一直減小亮度
int main( void )
{
uint8 StrTemp[6] = {0} ;
//uint8 i ;
uint8 key_val ;
// asm("sim"); // 禁止中斷
ClockInit();
IWDG_Init() ; //獨(dú)立看門(mén)狗初始化
GPIO_Init();
//PD2做輸入 機(jī)械按鍵
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"); //開(kāi)中斷
__enable_interrupt(); //開(kāi)中斷
PowerOff();//關(guān)LED
//剛上電等電源穩(wěn)定在操作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() ; //讀機(jī)械按鍵
ReadKeyTouch() ;//讀觸摸按鍵值
if(KeyOnOffShortPress)
{
KeyOnOffShortPress = 0 ;
PowerMode = !PowerMode ; //
if(POWER_OFF == PowerMode) //關(guān)機(jī)
{
PowerOff();//關(guān)LED
//存儲(chǔ)亮度值到EEPROM
StrTemp[0] = ColdLightLevel ;
StrTemp[1] = WarmLightLevel ;
Write_eeprom_Byte(EEPROM_COLD_ADDR,StrTemp,2) ;
KeyC_Press = 0 ;//假如正在變化則暫停
KeyD_Press = 0 ;
}
else //開(kāi)機(jī)
{
SetLightCold(ColdLightLevel) ; //調(diào)節(jié)冷光燈光亮度,傳入?yún)?shù)為亮度等級(jí)0-255
SetLightWarm(WarmLightLevel) ; //調(diào)節(jié)暖光燈光亮度,傳入?yún)?shù)為亮度等級(jí)0-255
SelWarmColdVal = BOTH_WARM_COLD ; //開(kāi)燈時(shí)默認(rèn)兩者一起調(diào)整
KeyOnOffLongPressUpFlag = 0 ; //清除在關(guān)燈下誤觸發(fā)的長(zhǎng)按按鈕,留下的長(zhǎng)按抬起信號(hào)
TouchKeyDirection = TOUCH_PLUS ; //上電默認(rèn) 觸摸按鍵長(zhǎng)按亮度加
}
#ifdef DEBUG_MODE
BeepFlag = 1 ;
#endif
}
if(JiXieKeyCodePress)
{
JiXieKeyCodePress = 0 ;
MathCodeFlag = MATCHING_CODE ; // 進(jìn)入對(duì)碼
BeepFlag = 1 ;//蜂鳴器叫一下
#ifdef DEBUG_MODE
UartSendByte(0xaa);
#endif
}
if( MATCHING_CODE == MathCodeFlag ) // 在對(duì)碼中
{
if(rf_ture) //按鍵短按
{
rf_ture = 0 ;
if( 0 == MatchTimes ) //第一個(gè)按鍵
{
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) ) //兩次一樣認(rèn)為可靠
{
MyRF_AddrH = RF_AddrValH1 ;
MyRF_AddrL = RF_AddrValL1 & 0XFFF0 ; //記錄 RF 地址,低四位為按鍵值
//存儲(chǔ)到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 ; //回到正常工作狀態(tài)
}
MatchTimes = 0 ; // 按下匹配次數(shù)
#ifdef DEBUG_MODE
UartSendByte(MyRF_AddrH>>8);
UartSendByte(MyRF_AddrH>>0);
UartSendByte(MyRF_AddrL>>8);
UartSendByte(MyRF_AddrL>>0);
#endif
}
}
}
else //不在對(duì)碼中,按鍵可以點(diǎn)燈
{
if(POWER_OFF == PowerMode) //關(guān)燈狀態(tài)下
{
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 ; //模式鍵 長(zhǎng)按計(jì)數(shù)
if( ( rf_addh_old == MyRF_AddrH ) && ( ( rf_addl_old & 0XFFF0 ) == MyRF_AddrL ) ) //遙控地址位(高6位位地址位)與預(yù)設(shè)地址一致
{
key_val = 0 ;
key_val = rf_addl_old & 0x000F ;
if( KEYA == key_val ) //開(kāi)關(guān)鍵按下
{
#ifdef DEBUG_MODE
UartSendByte(0x0A);
BeepFlag = 1 ; //叫一下
#endif
PowerMode = POWER_ON ; //開(kāi)燈狀態(tài)
SetLightCold(ColdLightLevel) ; //調(diào)節(jié)冷光燈光亮度,傳入?yún)?shù)為亮度等級(jí)0-255
SetLightWarm(WarmLightLevel) ; //調(diào)節(jié)暖光燈光亮度,傳入?yún)?shù)為亮度等級(jí)0-255
SelWarmColdVal = BOTH_WARM_COLD ; //開(kāi)燈時(shí)默認(rèn)兩者一起調(diào)整
KeyOnOffLongPressUpFlag = 0 ; //清除在關(guān)燈下誤觸發(fā)的長(zhǎng)按按鈕,留下的長(zhǎng)按抬起信號(hào)
TouchKeyDirection = TOUCH_PLUS ; //上電默認(rèn) 觸摸按鍵長(zhǎng)按亮度加
}
}
}
if(KeyOnOffLongPress) //觸摸按鍵長(zhǎng)按
{
SetLightCold(ColdLightLevel) ; //調(diào)節(jié)冷光燈光亮度,傳入?yún)?shù)為亮度等級(jí)0-255
SetLightWarm(WarmLightLevel) ; //調(diào)節(jié)暖光燈光亮度,傳入?yún)?shù)為亮度等級(jí)0-255
}
if(KeyOnOffLongPressUpFlag) //觸摸按鍵 長(zhǎng)按后抬起
{
KeyOnOffLongPressUpFlag = 0 ;
SelWarmColdVal = BOTH_WARM_COLD ; //開(kāi)燈時(shí)默認(rèn)兩者一起調(diào)整
KeyOnOffLongPressUpFlag = 0 ; //清除在關(guān)燈下誤觸發(fā)的長(zhǎng)按按鈕,留下的長(zhǎng)按抬起信號(hào)
TouchKeyDirection = TOUCH_PLUS ; //上電默認(rèn) 觸摸按鍵長(zhǎng)按亮度加
PowerMode = POWER_ON ; //開(kāi)燈狀態(tài)
}
}
else //開(kāi)燈狀態(tài)下
{
if(KeyOnOffLongPress) //觸摸按鍵長(zhǎng)按
{
if(TouchKey4msCnt>5) //20ms一次
{
TouchKey4msCnt = 0 ;
if( TOUCH_PLUS == TouchKeyDirection )
{
if(WarmLightLevel < MAX_LIGHT_LEVEL) //還不是最大亮度等級(jí)
{
WarmLightLevel++; //亮度加1
}
SetLightWarm(WarmLightLevel) ; //更新亮度
if(ColdLightLevel < MAX_LIGHT_LEVEL) //還不是最大亮度等級(jí)
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
代碼:
433M無(wú)線遙控臺(tái)燈程序.rar
(1.86 MB, 下載次數(shù): 64)
2021-7-3 16:24 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
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