手机控制由易安卓5.8编写的。
APP原理图与线路图由PADS9.5编辑。
一些调试工具由易语言编辑。
http://www.51hei.com/bbs/dpj-54638-1.html 单路
http://www.51hei.com/bbs/dpj-54161-1.html 四路
模拟315M/433M 2272解码程序
工作频率:72M
说明:10路继电器输出,10LED指示,1LED电源指示,1微动开关K1。
按K1进入编辑模式,LED指示灯全亮。
在编辑模式下 ,按下遥控器钮,LED1亮>>LED2亮>>....>>LED10亮>>全亮(此模式存储的遥控码是关闭所有的LED)>>退出编辑模式。
在编辑模式下 ,按K1退出编辑模式或存储有效的遥控码。
在编辑模式下 ,长按K1 (3S) 调整遥控模式。
在正常模式下,长按K1 (3S) 删除所有存储的遥控码。
在正常模式下 , 按下遥控器钮,及相应的LED.继电器亮灭。
注意: 同一条遥控码 在同一个LED上存两条,相当于亮了又灭,无动作。
优点: 能接收2262的1.2M-4.7M电阻编码,几乎所有的315M遥控器都兼容。
由于定时读引脚,抗干扰能力强 ,和硬件解码距离无区别。
成品由洞洞板制作。
STM32选用STM32103C8T6最小系统开发板。
WiFI模块选用ESP8266 ESP-07,软件升级到V1.62版。
无线模块选用315M或433M超外差模块
3.3V选用DC12-DC3.3转换模块
所有资料51hei提供下载:
STM32-v1.62.7z
(5.07 MB, 下载次数: 77)
8266升级资料.7z
(1.39 MB, 下载次数: 57)
单片机源程序如下:
- /*******************************************************************************
- *
- * 软件功能: 遥控解码10# 主频72M
- *
- *******************************************************************************/
- #include "stm32f10x.h"
- //-----变量&常量定义-----
- #define DaiMaTiaoSu_100 100 //遥控条数
- #define YaoKongSu_5 10 //遥控码长度
- #define Key_600 600 //长按键时间计数,3秒时间
- u16 T2RL = 124*2-1; //定时器重装值;
- u8 ircode[9]; //[0-5]2次脉冲解码值 [6-8]解码最终值
- u8 Tm1[50]; //0空位 1-24遥控码脉冲 25同步码 26-49第二次遥控码脉冲
- u8 Tm_bz[]={ 31 ,156 ,114 ,134 ,2 ,16 ,8 };
- //基准:0-1同步码时间范围, 2-3 同步码124a范围, 4-5 宽窄脉冲码4-12a范围, 6 宽窄脉冲
- 码中间值
- //遥控码发射时钟=1a, 1M电阻:1a=31us 5M电阻:1a=156us
- //由于stc89c52单片机中断时间内执行指令数少,只能到 1a=60us.用stc15fXX是1T模式(同时钟频率
- 下是89c52单片机6-12倍)————全兼容
- u16 E2BiaoJi; //Flash空位位置值
- u8 ms =1; //防止误触延时&计数
- u8 BJ_500ms = 0; //解码值有效时间0.5S标记
- u8 BJ_PulsrGood = 0; //脉冲读完标记
- u8 BJ_Traversal=0; //Flash遍历标记
- u8 BJ_edit = 0; //进入编辑标记
- u8 BJ_KeyLong=0; //长按键标记
- u8 BJ_KeyShort=0; //短按键标记
- u16 Key_JiShu=0; //长按键3秒计数
- u16 JIBU=0; //按键第几步标记
- u16 LED_ZT=0; //LED状态缓存标记
- u32 Net_No=0; //定时联网检测处理
- u8 WiFi_200=0; //200MS标记
- u8 WiFi_OK=0; //模块返回数据与比对值匹配标记
- u8 WiFi_Hao; //返回消息的通道号
- u8 Index; //比对值索引;
- u8 WiFi_Step=0; //模块启动执行到的步数
- /*以下为WiFi模块接收处理函数*/
- void WiFi_initial(void); //模块初始化流程
- void WiFi_initial0(u8 dat,u8 Ten, u8 sx);//AT初始化流程_子程序
- void WiFi_initial1(u8 dat,u8 Ten, u8 sx);//AT初始化流程_子程序
- void Command(u8 *ptr, u8 len); //命令的汇总处理,收到的数据格式
- void AT_CIPSEND(u8 *ptr,u8 len); //AT命令组装并发送
- u8 LED_state(u8 *ptr,u8 len); //LED状态提取准备返回
- void Check(u8 *ptr, u8 len, u8 Ten); //位异或校验
-
-
- /*以下为模拟2262解码调用函数 */
- void Configuration_2262(void);//初始化
- void BM_KeyLong(void); //长按键处理_删除遥控码及处理遥控条码输出状态
- void BM_KeyShort(void); //短按键处理_进入退出编辑模式,存储遥控条码等功能
- void LED_add(void); //编辑模式下LED顺序累加
- void Decoding(u8 add); //脉冲解码 ,接收到脉冲编译成遥控条码
- void BM_PulsrDecoding(void); //脉冲解码>>接收到的两次编码比较>>接收的编码和防止误
- 触延时编码比较
- void LED_KeyLong_State(void); //LED长按键后的状态
- void BM_Flash_Traversal(void); //Flash中查找对应值
- void LED_Mode(u16 add,u16 add1); //LED动作程序,LED模式变换
- /*************************************************
- 函数: int main(void)
- 功能: main主函数
- 参数: 无
- 返回: 无
- **************************************************/
- int main(void)
- {
- RCC_Configuration(); //复位和时钟控制配置72M
- GPIO_Configuration(); //初始化GPIO配置
- delay_init(SYSCLK_MHZ); //SysTick定时器做为延时函数的初始化程序
- (SYSCLK_MHZ=72)
- ConfigTimer_TIM2(124); //定时器2配置 1ns
- ConfigTimer_TIM3(5); //定时器3配置 1ms
- USART1_Configuration(115200); //初始化USART1配置
- IWDG_Init_1S(); //初始化独立看门狗时间:1S
- Configuration_2262(); //2622模拟解码初始化
- //printf("向串口输出字符串\r\n");
- while (1)
- { //AT流程用
- UartDriver(); //调用串口驱动 监测数据帧的接收 有命令
- 到达时
- if(WiFi_200) //200ms进入流程标记
- {
- WiFi_200=0; //200ms标记
- WiFi_initial(); //模块初始化&工
- 作流程
- LED_KeyLong_State(); //LED在长按按
- 键下的状态
- }
- //2262模拟解码流程用
- if(BJ_PulsrGood) //脉冲读完标记
- { BJ_PulsrGood=0; BM_PulsrDecoding(); } //2622模拟解码用
- if(BJ_Traversal) //Flash遍历标记
- { BJ_Traversal=0; BM_Flash_Traversal(); }//Flash中查找对应值
-
- if(BJ_KeyLong) //长按键标记
- { BJ_KeyLong=0; BM_KeyLong(); }
- if(BJ_KeyShort) //短按键标记
- { BJ_KeyShort=0; BM_KeyShort(); }
- }
- }
- /*===============================================================================
- 以下为AT控制流程
- ===============================================================================*/
- /*************************************************
- 函数: void WiFi_initial()
- 功能: AT初始化流程 200ms进入一次中断标记进入
- 参数: 无
- 返回: 无
- **************************************************/
- void WiFi_initial(void)
- {
- switch (WiFi_Step) //第几步索引值
- { //--------------------正常模式-入口---------------------------------
- case 0:
- WiFi_initial0(0,1,0);//AT就绪查询
- break;
- case 1:
- WiFi_initial0(1,2,0);//关闭回显
- break;
- case 2:
- WiFi_initial0(7,3,0);//启用多线程
- break;
- case 3:
- WiFi_initial0(8,4,0);//启用服务器功能
- break;
- case 4:
- Index=0; WiFi_Step=5;//比对值索引
- break;
- case 5:
- if(Net_No++>1500)
- {Net_No=0; WiFi_Step=6; }//5分钟联网检测
- break;
- case 6:
- WiFi_initial0(11,7,4); //查询网络连接信息
- break;
- case 7:
- WiFi_initial1(3,13,4); //扫描当前可用的 AP
- break;
- //------------------------退出设置模式-入
- 口-----------------------------
- case 10:
- WiFi_initial1(0,11,0); //配置 ESP8266 SoftAP 当前参数,保存到
- Flash
- break;
- case 11:
- WiFi_initial1(1,12,0); //设置 ESP8266 Station 的 IP 地址,保存到
- Flash
- break;
- case 12:
- WiFi_initial1(2,13,0); //连接 AP,保存到 Flash
- break;
- case 13:
- WiFi_initial0(9,0,0); //重启模块
- break;
- //----------------连接临时AP后查询反馈-入
- 口---------------------------------
- case 15:
- WiFi_initial0(0,16,15);//AT就绪查询
- break;
- case 16:
- if(BJ_edit)
- WiFi_initial0(10,28,28);//查询指令连接AP情况
- else
- WiFi_initial0(10,0,0);//查询指令连接AP情况
- break;
- //------------------设置模式-入口-----------------------------------
- case 20:
- WiFi_initial0(0,21,20);//AT就绪查询
- break;
- case 21:
- WiFi_initial0(2,22,20);//设置为AT工作模式
- break;
- case 22:
- WiFi_initial0(3,23,20);//设置SoftAP配置
- break;
- case 23:
- WiFi_initial0(4,24,20);//设置上电时动连接 AP
- break;
- case 24:
- WiFi_initial0(5,25,20);//退出与AP的连接
- break;
- case 25:
- WiFi_initial0(6,26,20);//设置DHCP,不保存到Flash,确保自动获取IP
- break;
- case 26:
- WiFi_initial0(7,27,20);//启用多线程
- break;
- case 27:
- WiFi_initial0(8,28,20);//启用服务器功能
- break;
- case 28:
- Index=0; WiFi_Step=29;//比对值索引
- break;
- default:
- break;
- }
- }
- /*************************************************
- 函数: void WiFi_initial0(u8 dat,u8 Ten, u8 sx)
- 功能: AT初始化流程_ 发往WiFi模块命令用
- 参数: dat-命令索引值 Ten—成功跳转值索引 sx=失败跳转值
- 返回: 无
- **************************************************/
- void WiFi_initial0(u8 dat,u8 Ten, u8 sx)
- {
- static u8 WiFi_0[] = "AT\r\n"; //AT就绪查询
- static u8 WiFi_1[] = "ATE0\r\n"; //关闭回显
- static u8 WiFi_2[] = "AT+CWMODE_DEF=3\r\n"; //设置为AT模式,保存到
- Flash
- static u8 WiFi_3[] = "AT+CWSAP_CUR=\"AT-01\",\"12345678\",8,4\r\n"; //配置
- ESP8266 SoftAP 当前参数,不保存到Flash
- static u8 WiFi_4[] = "AT+CWAUTOCONN=1\r\n"; //设置上电时自动连接 AP
- ,保存到Flash
- static u8 WiFi_5[] = "AT+CWQAP\r\n"; //退出与AP的连接
- static u8 WiFi_6[] = "AT+CWDHCP_CUR=1,1\r\n"; //设置 DHCP,不
- 保存到Flash ,确保自动获取IP
- static u8 WiFi_7[] = "AT+CIPMUX=1\r\n"; //启用多线程
- static u8 WiFi_8[] = "AT+CIPSERVER=1,19730\r\n"; //启用服务器功能
- static u8 WiFi_9[] = "AT+RST\r\n"; //重启模块
- static u8 WiFi_10[] = "AT+CIFSR\r\n"; //查询本地 IP 地
- static u8 WiFi_11[] = "AT+CIPSTATUS\r\n"; //查询网络连接信息
- static u8 WiFi_fasong=1; //命令发送标记
- static u8 JiShi=0; //命令发送时间计数
- static u8 WiFi_Len[] = { sizeof(WiFi_0)-1, sizeof(WiFi_1)-1, sizeof(WiFi_2)-1,
- sizeof(WiFi_3)-1, sizeof(WiFi_4)-1, sizeof(WiFi_5)-1,
- sizeof
- (WiFi_6)-1, sizeof(WiFi_7)-1, sizeof(WiFi_8)-1, sizeof(WiFi_9)-1, sizeof(WiFi_10)-1,
- sizeof(WiFi_11)-1};
- static u8 * WiFi_Ptr[] = {&WiFi_0[0], &WiFi_1[0], &WiFi_2[0], &WiFi_3[0],
- &WiFi_4[0], &WiFi_5[0], &WiFi_6[0], &WiFi_7[0],
- &WiFi_8
- [0], &WiFi_9[0], &WiFi_10[0], &WiFi_11[0]};
- static u8 WiFi_syz[] = { 1,1,1,1, 1,1,1,1, 1,1,2,3 }; //WiFi模块收到数据比对值
- 索引
-
- Shi_LED2=0;
- Index=WiFi_syz[dat];//比对值索引
- if(WiFi_fasong) //发送数据
- { WiFi_fasong=0; UartWrite(WiFi_Ptr[dat], WiFi_Len[dat]); }
- if(WiFi_OK) //比对成功返回标记
- { WiFi_OK=0; WiFi_fasong=1; JiShi=0; WiFi_Step=Ten; Shi_LED2=1;return;}
- if(JiShi++>10) //超时认定失败
- { WiFi_fasong=1; JiShi=0; WiFi_Step=sx;}
- Shi_LED2=1;
- }
- /*************************************************
- 函数: void WiFi_initial1(u8 dat,u8 Ten, u8 sx)
- 功能: AT初始化流程_ 发往WiFi模块命令用
- 参数: dat-命令索引值 Ten—成功跳转值索引 sx=失败跳转值
- 返回: 无
- **************************************************/
- void WiFi_initial1(u8 dat,u8 Ten, u8 sx)
- {
- static u8 Zfc_0[]="AT+CWSAP_DEF=\"AT_01\",\""; //配置 ESP8266 SoftAP 当前参数,
- 保存到 Flash
- static u8 Zfc_1[]="12345678";
- static u8 Zfc_2[]="\",8,4\r\n";
- static u8 Zfc_3[]="AT+CWJAP_DEF=\""; //连接 AP,保存到 Flash
- static u8 Zfc_4[]="XX0XX";
- static u8 Zfc_5[]="\",\"";
- static u8 Zfc_6[]="\"\r\n";
- static u8 Zfc_7[]="AT+CIPSTA_DEF=\""; //设置 ESP8266 Station 的 IP 地址
- ,保存到 Flash
- static u8 Zfc_8[]="AT+CWLAP=\""; //扫描当前可用的 AP
- static u8 WiFi_fasong=1; //命令发送标记
- static u8 JiShi=0; //命令发送时间计数
- static u8 WiFi_syx[] = { 1,1,1,4 }; //WiFi模块收到数据比对值索引
-
- u8 WiFi1[60];
- u8 WiFi1_len=0;
- u8 WiFi1_TAN=0;
-
- Shi_LED2=0;
- Index=WiFi_syx[dat] ; //比对值索引
- if(WiFi_fasong) //发送数据
- { WiFi_fasong=0;
-
- switch(dat)
- {
- case 0: WiFi1_len=Add_Merge0(WiFi1,WiFi1_len,Zfc_0);
- //配置 ESP8266 SoftAP 当前参数,保存到 Flash
- WiFi1_TAN= WiFi1_len;
- WiFi1_len=FLASH_read_8
- (FLASH_Address[2],WiFi1,WiFi1_len);//FLASH读出密码
- if(WiFi1_TAN==WiFi1_len)
- WiFi1_len=Add_Merge0
- (WiFi1,WiFi1_len,Zfc_1);
- WiFi1_len=Add_Merge0
- (WiFi1,WiFi1_len,Zfc_2);
- break;
- case 1: WiFi1_len=Add_Merge0(WiFi1,WiFi1_len,Zfc_7);
- //设置 ESP8266 Station 的 IP 地址,保存到 Flash
- WiFi1_TAN= WiFi1_len;
- WiFi1_len=FLASH_read_8
- (FLASH_Address[3],WiFi1,WiFi1_len);//FLASH读出IP
- if(WiFi1_TAN==WiFi1_len)
- WiFi1_len=Add_character
- (WiFi1,WiFi1_len,'0');
- WiFi1_len=Add_Merge0
- (WiFi1,WiFi1_len,Zfc_6);
- break;
- case 2: WiFi1_len=Add_Merge0(WiFi1,WiFi1_len,Zfc_3);
- //连接 AP,保存到 Flash
- WiFi1_TAN= WiFi1_len;
- WiFi1_len=FLASH_read_8
- (FLASH_Address[1],WiFi1,WiFi1_len);//FLASH读出账号
- if(WiFi1_TAN==WiFi1_len)
- WiFi1_len=Add_Merge0
- (WiFi1,WiFi1_len,Zfc_4);
- WiFi1_len=Add_Merge0
- (WiFi1,WiFi1_len,Zfc_5);
- WiFi1_TAN= WiFi1_len;
- WiFi1_len=FLASH_read_8
- (FLASH_Address[2],WiFi1,WiFi1_len);//FLASH读出密码
- if(WiFi1_TAN==WiFi1_len)
- WiFi1_len=Add_Merge0
- (WiFi1,WiFi1_len,Zfc_1);
- WiFi1_len=Add_Merge0
- (WiFi1,WiFi1_len,Zfc_6);
- break;
- case 3: WiFi1_len=Add_Merge0(WiFi1,WiFi1_len,Zfc_8);
- //扫描当前可用的 AP
- WiFi1_TAN= WiFi1_len;
- WiFi1_len=FLASH_read_8
- (FLASH_Address[1],WiFi1,WiFi1_len);//FLASH读出账号
- if(WiFi1_TAN==WiFi1_len)
- WiFi1_len=Add_Merge0
- (WiFi1,WiFi1_len,Zfc_4);
- WiFi1_len=Add_Merge0
- (WiFi1,WiFi1_len,Zfc_6);
- break;
- default:break;
- }
- UartWrite(WiFi1, WiFi1_len);
- }
- if(WiFi_OK) //比对成功返回标记
- { WiFi_OK=0; WiFi_fasong=1; JiShi=0; WiFi_Step=Ten; Shi_LED2=1;return;}
- if(JiShi++>10) //超时认定失败
- { WiFi_fasong=1; JiShi=0; WiFi_Step=sx;}
- Shi_LED2=1;
- }
- /*************************************************
- 函数: void UartAction(u8 *ptr, u8 len)
- 功能: 串口动作函数,根据接收到的数据响应的动作
- 参数: buf-接收到的数据帧指针,len-数据帧长度
- 返回: 无
- **************************************************/
- void UartAction(u8 *ptr, u8 len)
- {
- static u8 cmd0[] = "+IPD,"; //收到数据标识
- static u8 cmd1[] = "OK";
- static u8 cmd2[] = "STAIP,\""; //IP查询返回标识
- static u8 cmd3[] = "STATUS:5"; //查询网络连接信息返回标识
- static u8 cmd4[] = "+CWLAP:"; //扫描当前可用的AP返回标识
- static u8 LinS[] = "@@J000.000.000.000";
- u8 cmdLen[] = { sizeof(cmd0)-1, sizeof(cmd1)-1, sizeof(cmd2)-1, sizeof(cmd3)-1,
- sizeof(cmd4)-1};
- u8 *cmdPtr[] = {&cmd0[0], &cmd1[0], &cmd2[0], &cmd3[0], &cmd4[0]};
- u8 LinS_Tem = 3;
- u8 FanHui,i;
-
- if (len >= cmdLen[Index]) //首先接收到的数据长度要不小于对比值长度
- {
- FanHui=Compare(ptr,len,cmdPtr[Index],cmdLen[Index]);
- if (FanHui>0) //查找到匹配值
- {
- switch(Index)
- {
- case 0: Command(ptr, FanHui); //数据进一步处理
- break;
- case 1: WiFi_OK=1;
- break;
- case 2: WiFi_OK=1; //IP
- 查询进一步处理
- for (i=0; i<16; i++) //返
- 回临时IP值
- { LinS[LinS_Tem++] =
- ptr[FanHui++]; }
- AT_CIPSEND
- (LinS,LinS_Tem);
- break;
- case 3: WiFi_OK=1;
- break;
- case 4: WiFi_OK=1;
- break;
- default:break;
- }
- }
- }
- }
- /*************************************************
- 函数: void Command(u8 *ptr, u8 len)
- 功能: 收到数据处理 数据格式; +IPD,0,15:@@AAT_00
- 参数: ptr-待处理数据 len-处理的起始位
- 返回: 无
- **************************************************/
- void Command(u8 *ptr, u8 len)
- {
- static u8 Zfc_0[]="AT+CWJAP_CUR=";
- static u8 Zfc_1[]="\r\n";
- static u8 Zfc_2[]="-err";
-
- u8 HuiDa[60]; //回答字符串
- u8 HuiDa_len = 0; //回答字符串位置
- u8 GeSu; //到达数据长度
- u8 Ten; //特定标记位置
- u16 i;
- u32 Det;
-
- //计算校验值位置与数据长度-------------------
- if ( ptr[len+3]==':' && ptr[len+4]=='@' )
- {
- Ten=len+5; //定位命令字位置
- GeSu =ptr[len+2]-48; //计算收到数据长度
- }
- else if (ptr[len+4]==':' && ptr[len+5]=='@' )
- {
- Ten=len+6; //定位命令字位置
- GeSu =(ptr[len+2]-48)*10;
- GeSu =GeSu+(ptr[len+3]-48); //计算收到数据长度
- }
- else
- return;
- if(GeSu<3) //收到数据长度不够
- return;
- //校验数据正确性-----------------------------
- ptr[0] = ptr[Ten]; // ptr[0]作为临时变量使用,存放收到的校验值
- Check(ptr, Ten, GeSu); // 计算校验值
- if(ptr[0] != ptr[Ten]) // 收到的校验值与计算的校验值比对
- return;
- //5分钟联网检测-----------------------------
- Net_No=0;
- //发送数据命令头部组装-----------------------
- Ten++; //移到命令位
- GeSu=GeSu-3; //去除3位标识位
- WiFi_Hao=ptr[len]; //保存收到数据的通道号,发送数据用这个通道
- HuiDa_len = Add_character(HuiDa,HuiDa_len,'@'); //待发送数据组装
- HuiDa_len++; //校验值位
- HuiDa_len = Add_character(HuiDa,HuiDa_len,ptr[Ten]); //待发送数据组装
- if(ptr[Ten]=='A') //LED状态消息处理
- {
- if(ptr[++Ten]=='0') ptr[0]=0; else ptr[0]=1; //ptr[0]作为临时变量
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
|