找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4367|回复: 6
收起左侧

STC8单片机及ESP8266的物联模块控制程序PCB(多屏多媒体互动HDMI切换及管理)

  [复制链接]
ID:255733 发表于 2019-3-1 12:01 | 显示全部楼层 |阅读模式
基于STC8F2A08S2及ESP8266的设计的物联模块,可以任意设置模块中的IP地址。模块支持8路的IO输出,4路的IO输入。有C51源码调试程序。

Altium DesignerPCB图如下:(51hei附件中可下载工程文件)

基于ESP8266物联模块

基于ESP8266物联模块
0.png

单片机源程序如下:
  1. /*      
  2.                 多屏多媒体互动HDMI切换及管理程序

  3.                 使用STC单片机:STC8F2A08S2
  4.                 Copyright 201.01.25
  5.                 All rights reserved.
  6.                 文件名 :HDMI-RS232.c
  7.                 模块名称:
  8.                 作者:戴
  9.                 功能概要:
  10.                 版本:4.1.0
  11.                 修改人 :                                                                                                                                                   
  12.                 完成日期:
  13.                 升级说明:
  14. */
  15. #include "STC8Fxx.h"
  16. #include "intrins.h"

  17. #define INT8U unsigned char
  18. #define INT16U unsigned int

  19. #define FOSC            22118400UL
  20. #define BRT1                         (256 - FOSC / 115200 / 32)
  21. #define BRT2                         (65536 - (FOSC / 9600 / 4))

  22. #define OK                                1                                  //设置成功标识状态
  23. #define FLASE                        0                                //设置失败标识状态

  24. #define LAMP_CMD_ON                0x31                        //控制位 开
  25. #define LAMP_CMD_OFF        0x30                        //控制位 关

  26. #define CMD_HDMI1                0xFE                        //HDMI指令起始码
  27. #define CMD_HDMI2                0x00                        //HDMI指令机器码   机器地址码为:01~F0H 00H为广播码,出厂默认值
  28. #define CMD_HDMI3                0x33                        //HDMI指令操作码   波特率设置:31H :2400bits/S 32H :4800bits/S 33H :9600bits/S 34H :19200bits/S
  29. #define CMD_HDMI31                0x31                        //HDMI指令操作数   HDMI输入:1#端口31 2#端口32 3#端口33
  30. #define CMD_HDMI32                0x32
  31. #define CMD_HDMI33                0x33
  32. #define CMD_HDMI4                0xAA                        //HDMI指令结束码
  33. #define CMD_RET_CODEOK        0xF0                        //HDMI指令返回码  F0成功
  34. #define CMD_RET_CODEEER        0xF1                        //HDMI指令返回码  F1失败
  35. #define BEGINCODE                0x2B                        //串口通讯格式前置码         +
  36. #define ENDCODE                        0x23                        //串口通讯格式结束码         #
  37. #define FUNCODE_ENQ                0x30                        //功能格式码  查询切换器状态码

  38. #define HDMI1FUNCODE        0x31                        //切换HDMI1功能码
  39. #define HDMI2FUNCODE        0x32                        //切换HDMI2功能码
  40. #define HDMI3FUNCODE        0x33                        //切换HDMI3功能码

  41. #define HDMI_CHANNEL1        0x31                        //HDMI输入通道号
  42. #define HDMI_CHANNEL2        0x32                        //HDMI输入通道号
  43. #define HDMI_CHANNEL3        0x33                        //HDMI输入通道号
  44. #define ENTER1                        0x0d                        //回车符
  45. #define ENTER2                        0x0a                        //回车符
  46. //#define WIFI_NAME_LEN        7                                //WiFi SSID号
  47. //#define WIFI_PASS_LEN        11                                //WiFi Password

  48. //=========================================================
  49. /*    WiFi模块控制指令定义 ASCII码                          */

  50. #define WIFI_MODE_SERVER 0x31                        //开启server 自动建立后,TCP server 监听 0为关闭server模式
  51. #define WIFI_MODE_SEND_ID 0x30                        //发送数据传输连接的ID          1

  52. #define WIFI_MODE_STA        0x31                        //模块设置为STA模式
  53. #define WIFI_MODE_AP        0x32                        //模块设置为AP模式
  54. #define WIFI_MODE_APSTA        0x33                        //模块设置为AP和STA共存模式
  55. #define WIFI_MODE_MUX0        0x30                        //单路连接参数
  56. #define WIFI_MODE_MUX1        0x31                        //多路连接参数
  57. #define WIFI_MODE_MODE0        0x30                        //非透传模式参数
  58. #define WIFI_MODE_MODE1        0x31                        //透传模式参数
  59. #define CODE_EQU                0x3D                        //  =
  60. #define CODE_PLUS                0x2B                        //        +
  61. #define CODE_QUO                0x22                        //  "
  62. #define CODE_SEM                0x2C                        //  ,
  63. #define CODE_HDMI                0x23

  64. //=========================================================
  65. /*    STC0F2A08S2(EEPROM读写)                           */
  66. #define CMD_IDLE 0
  67. #define CMD_READ 1
  68. #define CMD_PROGRAM 2
  69. #define CMD_ERASE 3
  70. //#define ENABLE_IAP 0x80 //if SYSCLK<30MHz
  71. //#define ENABLE_IAP 0x81 //if SYSCLK<24MHz
  72. #define ENABLE_IAP 0x82 //if SYSCLK<20MHz
  73. //#define ENABLE_IAP 0x83 //if SYSCLK<12MHz
  74. //#define ENABLE_IAP 0x84 //if SYSCLK<6MHz
  75. //#define ENABLE_IAP 0x85 //if SYSCLK<3MHz
  76. //#define ENABLE_IAP 0x86 //if SYSCLK<2MHz
  77. //#define ENABLE_IAP 0x87 //if SYSCLK<1MHz
  78. #define IAP_ADDRESS1 0x0000
  79. #define IAP_ADDRESS2 0x0200
  80. #define IAP_ADDRESS3 0x0400
  81. #define IAP_ADDRESS4 0x0600
  82. #define IAP_ADDRESS5 0x0800

  83. sbit         ledx                = P5^5;                                
  84. sbit        device_5        = P5^4;
  85. sbit        DEVICE1                = P1^6;
  86. sbit        DEVICE2                = P1^7;
  87. sbit        LAMP1                = P3^2;
  88. sbit        LAMP2                = P3^3;
  89. sbit        LAMP3                = P3^4;
  90. sbit        LAMP4                = P3^5;
  91. sbit        LAMP5                = P3^6;
  92. sbit        LAMP6                = P3^7;

  93. INT8U HDMI_ID_STR[7] = "ID=SZHT";
  94. //INT8U CMD_HDMI[4] = "HDMI";
  95. //INT8U CMD_PORT_STATUS[4] = "PORT";
  96. INT8U LAMP_CODE[6] = {0x01,0x02,0x04,0x08,0x10,0x20};
  97. INT8U DECIVE_CODE[3] = {0x01,0x02,0x04};
  98. //=========================================================
  99. /*    WiFi模块控制指令定义                           */
  100. //INT8U xdata WIFI_NAME[7] = "SZHT008";                //WiFi SSID名称         
  101. //INT8U xdata WIFI_RST[3] = "RST";
  102. //INT8U xdata WIFI_PASS[11] = "szht@123456";        //WiFi登陆密码   
  103. //INT8U xdata WIFI_MODE_TCP[3] = "UDP";                // UDP        
  104. //INT8U xdata WIFI_MODE_IP[11] = "192.168.0.1";// IP
  105. INT8U xdata WIFI_MODE_PORT[4] = "9099";                                                
  106. INT8U xdata CMD_WIFI_AT[2] = "AT";
  107. INT8U xdata CMD_WIFI_WORKMODE[6] = "CWMODE";        //设置WiFi模块的工作模式         
  108. //INT8U xdata CMD_WIFI_PASS[5] = "CWJAP";                        //设置WiFi模块的用户名和密码
  109. INT8U xdata CMD_WIFI_MUX[6] = "CIPMUX";                        //启动连接模式
  110. INT8U xdata CMD_WIFI_SERVER[9] = "CIPSERVER";        //多连接TCP Server模式
  111. //INT8U xdata CMD_WIFI_START[8] = "CIPSTART";                //建立TCP连接或注册         
  112. //INT8U xdata CMD_WIFI_TRAMODE[7] = "CIPMODE";                //WiFi模块传输模式
  113. INT8U xdata CMD_WIFI_SEND[7] = "CIPSEND";                        //开始发送数据
  114. //INT8U xdata CMD_WIFI_IP[4] = "PING";        
  115. //INT8U xdata CMD_WIFI_END[3] = "+++";                        //结束透传模式 注意:+++后面没有回车符

  116. INT8U IPA_ID[4];
  117. INT8U UART1_BUF[24];                                                        //可接收缓冲区
  118. INT8U UART2_BUF[2];

  119. INT8U DHMI_ID;        //计数标示
  120. INT8U r_buf_num=0,r_data_len=0;                                        //串口参数变量
  121. INT8U PORT1_STATUS_CMD=0,PORT1_STATUS=0;                //控制端口参数变量
  122. INT8U PORT3_STATUS_CMD=0,PORT3_STATUS=0;
  123. INT8U P1_STATUS,P3_STATUS;
  124. INT8U port_status1,port_status3;
  125. INT16U TIMER_NUM=0;

  126. code INT8U CMD_EER_DATA[5] = "FLASE";                        //发送错误代码
  127. code INT8U CMD_OK_DATA[2] = "OK";                                //发送正确代码

  128. //==============================================================
  129. INT8U HexToBit(INT8U bBit) reentrant;
  130. void s1end_uart_one(INT8U s1data);                 /*        串口1发送数据          */
  131. void UART_one_Interrupt_Receive(void);         /*        串口1中断接收          */
  132. //==============================================================
  133. void s2end_uart_two(INT8U s2data);                 /*        串口2发送数据          */
  134. void UART_two_Interrupt_Receive(void);         /*        串口2中断接收          */
  135. //==============================================================
  136. void wifi_init(void);                                                 /* 初始化WIFI模块          */
  137. void com_reset();
  138. void delay();                                                         /*        一秒延时                  */
  139. void com_send_error() reentrant;                 /*        发送错误代码      */
  140. void com_send_ok() reentrant;                         /*        发送正确代码      */
  141. void com_send_status() reentrant;                 /*        发送设备ID代码    */
  142. INT8U check_cmd_pack_start();                         /* 检查包头合理性    */
  143. void parse_cmd1();                                            /* 功能分析函数      */
  144. void parse_cmd2();                                            /* 功能分析函数      */
  145. void parse_cmd3();                                            /* 功能分析函数      */
  146. void parse_cmd4();                                            /* 功能分析函数      */
  147. void parse_cmd5();                                                 /* 功能分析函数      */
  148. void parse_cmd6();                                                 /* 功能分析函数      */
  149. void send_wifi_cmd_rst(INT8U cmd[],INT8U cmd_len) reentrant ;
  150. void send_settings_cmd_send(INT8U cmd[],INT8U cmd_len,INT8U send_len) reentrant;
  151. void send_settings_cmd_send1(INT8U cmd[],INT8U cmd_len,INT8U send_len1,INT8U send_len2) reentrant;
  152. void send_settings_cmd_one(INT8U cmd[],INT8U cmd_len) reentrant;
  153. void send_settings_cmd_one_enter_1(INT8U cmd[],INT8U cmd_len,INT8U valuelen);
  154. void send_settings_cmd_one_enter_2(INT8U cmd1[],INT8U cmd_len1,INT8U valuelen1,INT8U cmd2[],INT8U cmd_len2);
  155. void send_settings_cmd_one_wifi(INT8U cmd1[],INT8U cmd1_len,INT8U cmd2[],INT8U cmd2_len);
  156. void send_settings_cmd_one_net(INT8U cmd1[],INT8U cmd1_len,INT8U cmd2[],INT8U cmd2_len,INT8U cmd3[],INT8U cmd3_len);
  157. void UART_TC_ONE(INT8U *str);                         /* 发送一串字符函数  */
  158. void send_settings_cmd_two(INT8U hdmiID) reentrant;
  159. void send_hdmi_cmd(INT8U hdmi) reentrant;
  160. void send_port_cmd(INT8U port_val,INT8U port) reentrant;
  161. void send_cmd_ping_ip();
  162. //==============================================================
  163. //    STC12C5A16S2(EEPROM读写)
  164. void Delayx(INT8U n);
  165. void IapIdle();
  166. void IapWriteByte(INT16U addr, INT8U dat);
  167. void IapEraseSector(INT16U addr);
  168. INT8U IapReadByte(INT16U addr);

  169. /******************************************************************************************
  170. * 函数名称    :void HexToBit(INT8U bBit) reentrant        
  171. * 功能描述    :十六进制字节后4为字节函数
  172. ******************************************************************************************/
  173. INT8U HexToBit(INT8U bBit) reentrant
  174. {
  175.         bBit =(bBit & 0x0f);                                    //屏蔽高四位
  176.         bBit = bBit + 0x30;
  177.         return bBit;
  178. }
  179. /******************************************************************************************
  180. * 函数名称    :s1end_uart_one(INT8U s1data)        
  181. * 功能描述    :串口1发送数据的函数
  182. ******************************************************************************************/
  183. void s1end_uart_one(INT8U s1data)            
  184. {

  185.         ES = 0 ;
  186.         SBUF = s1data ;
  187.         while(TI==0);         
  188.         TI = 0;
  189.         ES = 1 ;

  190. }
  191. /******************************************************************************************
  192. * 函数名称    :s2end_uart_two(INT8U s2data)        
  193. * 功能描述    :串口2发送数据
  194. ******************************************************************************************/
  195. void s2end_uart_two(INT8U s2data)               
  196. {
  197.   IE2  = 0x01 ;                                                        //ES2  = 1 ;
  198.   S2CON&=0xfd ;                                                        //S2TI = 0 ;                                                                                                         

  199.   S2BUF = s2data;
  200.   while((S2CON&0x02)!=0x02);
  201.   S2CON &= ~0x02;
  202.   IE2  = 0x01 ;                                                        //ES2  = 1 ;
  203.   ES = 1;
  204. }
  205. /******************************************************************************************
  206. * 函数名称    :com_reset()
  207. * 功能描述    :将串口中的设置值,初始化函数
  208. ******************************************************************************************/
  209. void com_reset()
  210. {
  211.         r_buf_num =0;
  212.         r_data_len=0;
  213. }
  214. void send_settings_cmd_send(INT8U cmd[],INT8U cmd_len,INT8U send_len) reentrant                         // 发送字串带回车符 0x0D 0x0A
  215. {
  216.         INT8U i = 0;
  217.         send_settings_cmd_one(CMD_WIFI_AT,2);
  218.         s1end_uart_one(CODE_PLUS);
  219.         for(i=0;i<cmd_len;++i)                                                                                // 发送指令格式
  220.         {
  221.                 s1end_uart_one(cmd[i]);
  222.         }
  223.         s1end_uart_one(CODE_EQU);
  224.         s1end_uart_one(WIFI_MODE_SEND_ID);
  225.         s1end_uart_one(CODE_SEM);
  226.         s1end_uart_one(send_len);
  227.         s1end_uart_one(ENTER1);
  228.         s1end_uart_one(ENTER2);

  229. }
  230. void send_settings_cmd_send1(INT8U cmd[],INT8U cmd_len,INT8U send_len1,INT8U send_len2) reentrant                         // 发送字串带回车符 0x0D 0x0A
  231. {
  232.         INT8U i = 0;
  233.         send_settings_cmd_one(CMD_WIFI_AT,2);
  234.         s1end_uart_one(CODE_PLUS);
  235.         for(i=0;i<cmd_len;++i)                                                                                // 发送指令格式
  236.         {
  237.                 s1end_uart_one(cmd[i]);
  238.         }
  239.         s1end_uart_one(CODE_EQU);
  240.         s1end_uart_one(WIFI_MODE_SEND_ID);
  241.         s1end_uart_one(CODE_SEM);
  242.         s1end_uart_one(send_len1);
  243.         s1end_uart_one(send_len2);
  244.         s1end_uart_one(ENTER1);
  245.         s1end_uart_one(ENTER2);

  246. }
  247. void send_settings_cmd_one(INT8U cmd[],INT8U cmd_len) reentrant // 发送字串不带回车符
  248. {
  249.         INT8U i = 0;
  250.         for(i=0;i<cmd_len;++i)                                                                                // 发送指令格式
  251.         {
  252.                 s1end_uart_one(cmd[i]);
  253.         }

  254. }
  255. void send_settings_cmd_one_enter_1(INT8U cmd[],INT8U cmd_len,INT8U valuelen)  //发送Wifi模块一般指令,带回车符。
  256. {
  257.         INT8U i = 0;
  258.         for(i=0;i<cmd_len;++i)                                                                                // 发送指令格式
  259.         {
  260.                 s1end_uart_one(cmd[i]);

  261.         }
  262.         s1end_uart_one(CODE_EQU);
  263.         s1end_uart_one(valuelen);

  264.         s1end_uart_one(ENTER1);
  265.         s1end_uart_one(ENTER2);

  266. }
  267. void send_settings_cmd_one_enter_2(INT8U cmd1[],INT8U cmd_len1,INT8U valuelen1,INT8U cmd2[],INT8U cmd_len2)  //发送Wifi模块一般指令,带回车符。
  268. {
  269.         send_settings_cmd_one(cmd1,cmd_len1);
  270.         s1end_uart_one(CODE_EQU);
  271.         s1end_uart_one(valuelen1);
  272.         s1end_uart_one(CODE_SEM);

  273.         send_settings_cmd_one(cmd2,cmd_len2);

  274.         s1end_uart_one(ENTER1);
  275.         s1end_uart_one(ENTER2);

  276. }

  277. /*********************************************************************************************
  278. * 函数名:UART串口2发送字符串函数
  279. * 调 用:UART_TC_TWO (?);
  280. * 参 数:需要UART串口发送的数据(8位/1字节)
  281. * 返回值:无
  282. * 结果:向串口发送一个字符串,长度不限。
  283. * 备 注:例:UART_TC("d9887321[        DISCUZ_CODE_0        ]quot;); 此函数需要#include <string.h>头文件支持。
  284. /**********************************************************************************************/
  285. void send_settings_cmd_two(INT8U hdmiID) reentrant
  286. {
  287.         s2end_uart_two(CMD_HDMI1);
  288.         s2end_uart_two(CMD_HDMI2);
  289.         s2end_uart_two(CMD_HDMI3);
  290.         s2end_uart_two(hdmiID);
  291.         s2end_uart_two(CMD_HDMI4);

  292. }

  293. /******************************************************************************************
  294. * 函数名称    :com_send_error()
  295. * 功能描述    :通讯中接收到错误码发出的函数
  296. ******************************************************************************************/
  297. void com_send_error() reentrant
  298. {
  299.         INT8U p=0,k=0;
  300.         for(k=0;k<5;k++)                                       
  301.         {                                                               
  302.                 s1end_uart_one(CMD_EER_DATA[k]);
  303.         }
  304.         s1end_uart_one(ENTER1);
  305.         s1end_uart_one(ENTER2);
  306. }
  307. /******************************************************************************************
  308. * 函数名称    :com_send_ok()
  309. * 功能描述    :通讯中接收到成功码发出的函数
  310. ******************************************************************************************/
  311. void com_send_ok() reentrant
  312. {
  313.         INT8U p=0,k=0;
  314.         for(k=0;k<2;k++)                                       
  315.         {                                                               
  316.                 s1end_uart_one(CMD_OK_DATA[k]);
  317.         }
  318.         s1end_uart_one(ENTER1);
  319.         s1end_uart_one(ENTER2);
  320. }
  321. /******************************************************************************************
  322. * 函数名称    :com_send_status()
  323. * 功能描述    :通讯中接收到设备ID码发出的函数
  324. ******************************************************************************************/
  325. void com_send_status() reentrant
  326. {
  327.         INT8U k,i;
  328.         for(k=0;k<7;k++) { s1end_uart_one(HDMI_ID_STR[k]); }
  329.         for(i=4;i>0;i--) { IPA_ID[i-1] = IapReadByte(IAP_ADDRESS1+i); }
  330.         for(k=4;k>0;k--) { s1end_uart_one(IPA_ID[k-1]); }

  331.         s1end_uart_one(ENTER1);
  332.         s1end_uart_one(ENTER2);

  333. //        for(k=0;k<3;k++) { s1end_uart_one(WIFI_MODE_TCP[k]); }                                                 //发送TCP或UDP
  334. //        s1end_uart_one(CODE_EQU);
  335. //        for(k=0;k<10;k++) {        s1end_uart_one(WIFI_MODE_IP[k]); }                                                   //发送IP地址
  336. //        s1end_uart_one(CODE_SEM);
  337. //        for(k=0;k<4;k++) { s1end_uart_one(WIFI_MODE_PORT[k]); }                                                   //发送端口号

  338. }
  339.                                                         
  340. //void delay()                                                          /*        一秒延时                  */
  341. //{
  342. //        INT16U j,g;
  343. //        j=0;
  344. //        g=0;
  345. //        for(j=0;j<5;j++)
  346. //                {
  347. //                for(g=0;g<500;g++)
  348. //                        {
  349. //                            _nop_();
  350. //                                _nop_();
  351. //                                _nop_();
  352. //                                _nop_();
  353. //                                _nop_();
  354. //                        }
  355. //                }
  356. //}

  357. void InitUART(void)         //初始化6T模式
  358. {
  359.         SCON = 0x50;
  360.         TMOD = 0x20;

  361. //        PCON = 0x80;//波特率加倍
  362.         TH1 = TL1 = BRT1;
  363.         TR1 = 1;
  364.         AUXR = 0x40;
  365.         ES = 1;
  366.         EA=1;


  367.         S2CON = 0x50;                 //串口2工作在方式1 10位异步收发 S2REN=1允许接收
  368.         T2L = BRT2;                 //设置波特率重装值
  369.         T2H = BRT2>>8;                 //独立波特率发生器初值

  370.         AUXR |= 0x14;                 //BRTR=1 独立波特率发生器开始计数
  371.         IE2 = 0x01;                        //开串口2中断 ES2=1
  372. }
  373. /******************************************************************************************
  374. * 函数名称    :UART_one_Interrupt_Receive(void)
  375. * 功能描述    :WiFi模块程序
  376. ******************************************************************************************/
  377. void wifi_init(void)
  378. {
  379.         ledx = 0;
  380.         send_settings_cmd_one(CMD_WIFI_AT,2);
  381.         s1end_uart_one(CODE_PLUS);
  382.         send_settings_cmd_one_enter_1(CMD_WIFI_WORKMODE,6,WIFI_MODE_APSTA);          // CWMODE 设置WiFi模块工作模式:AP和STA共存模式
  383.         ledx = 1;
  384.         Delayx(100);
  385.                                                                                                                                                   // 1-STA模式,2-AP模式,3-AP和STA模式共存
  386.         ledx = 0;
  387.         send_settings_cmd_one(CMD_WIFI_AT,2);
  388.         s1end_uart_one(CODE_PLUS);
  389.         send_settings_cmd_one_enter_1(CMD_WIFI_MUX,6,WIFI_MODE_MUX1);                                // CIPMUX 设置连接方式:0-单连接 ,1-多连接
  390.         ledx = 1;
  391.         Delayx(100);

  392.         ledx = 0;
  393.         send_settings_cmd_one(CMD_WIFI_AT,2);
  394.         s1end_uart_one(CODE_PLUS);
  395.         send_settings_cmd_one_enter_2(CMD_WIFI_SERVER,9,WIFI_MODE_SERVER,WIFI_MODE_PORT,4);        
  396.         ledx = 1;
  397.         Delayx(500);
  398.         ledx = 0;
  399. //        send_settings_cmd_one(CMD_WIFI_AT,2);
  400. //        s1end_uart_one(CODE_PLUS);
  401. //        send_settings_cmd_one_enter(CMD_WIFI_TRAMODE,7,WIFI_MODE_MODE1);                // CIPMODE 设置透传模式:0-非透传,1-透传。
  402. //        Delayx(20);

  403. //        send_settings_cmd_one(CMD_WIFI_AT,2);                                                                        //连接TCP/IP服务器
  404. //        s1end_uart_one(CODE_PLUS);
  405. //        send_settings_cmd_one(CMD_WIFI_START,8);                                                                // CIPSTART
  406. //        s1end_uart_one(CODE_EQU);                                                               
  407. //        send_settings_cmd_one_net(WIFI_MODE_TCP,3,WIFI_MODE_IP,10,WIFI_MODE_PORT,4);

  408. //        Delayx(1000);
  409. //        send_settings_cmd_one(CMD_WIFI_AT,2);
  410. //        s1end_uart_one(CODE_PLUS);
  411. //        send_settings_cmd_send(CMD_WIFI_SEND,7);
  412. }
  413. /******************************************************************************************
  414. * 函数名称    :PORT_Init(void)
  415. * 功能描述    :I/O端口初始化程序
  416. ******************************************************************************************/
  417. void PORT_Init(void)
  418. {
  419.         P54 = P16 = P17 = 0;
  420.         P32 = P33 = P34 = P35 = P36 = P37 = 0;
  421.         P1_STATUS = IapReadByte(IAP_ADDRESS3);
  422.         P3_STATUS = IapReadByte(IAP_ADDRESS4);
  423.         port_status1 = 0;
  424.         port_status3 = 0;
  425. }
  426. /******************************************************************************************
  427. * 函数名称    :Timer0Init(void)
  428. * 功能描述    :定时器0初始化程序
  429. ******************************************************************************************/
  430. void Timer0Init(void)                        //2毫秒@22.1184MHz
  431. {
  432.         AUXR |= 0x80;                                //定时器时钟1T模式
  433.         TMOD &= 0xF0;                                //设置定时器模式
  434.         TL0 = 0x33;                                        //设置定时初值
  435.         TH0 = 0x53;                                        //设置定时初值
  436.         TF0 = 0;                                        //清除TF0标志
  437.         TR0 = 1;                                        //定时器0开始计时
  438.         ET0 = 1;                                    //使能定时器中断
  439.     EA = 1;
  440. }
  441. /******************************************************************************************
  442. * 函数名称    :UART_one_Interrupt_Receive(void)
  443. * 功能描述    :串口1中断接收程序
  444. ******************************************************************************************/
  445. void UART_one_Interrupt_Receive(void) interrupt 4                          // 串口1中断接收,下位机10ms发送一次
  446. {
  447.           INT8U i = 0,p = 0,temp,stat1,stat2;

  448.         if(RI==1)
  449.           {
  450.                 temp = SBUF ;        
  451.                 RI = 0 ;
  452.                 UART1_BUF[r_buf_num] = temp;
  453.                
  454.                 if(UART1_BUF[0] == BEGINCODE)
  455.                 {
  456.                          if(UART1_BUF[r_buf_num] != ENDCODE)                                                  //进行接收指令头判断
  457.                         {
  458.                                 if(UART1_BUF[1] == '3')
  459.                                 {
  460.                                         com_reset();               
  461.                                         return;
  462.                                 }
  463.                                 r_buf_num++;
  464.                                 r_data_len = r_buf_num;
  465.                         }
  466.                         else
  467.                         {                                                                                
  468.                                 stat1 = UART1_BUF[9];
  469.                                 stat2 = UART1_BUF[r_data_len];

  470.                                 switch(stat1)
  471.                                 {
  472.                                 case 'H':                                                            //HDMI码 0x48="H"
  473.                                         parse_cmd1();                                                               
  474.                                         com_reset();                                                //清空接收缓冲区的计数值
  475.                                 break;
  476.                                 case 'L':                                                                //LAMP码 0x4C="L"
  477.                                         parse_cmd2();                                                               
  478.                                         com_reset();
  479.                                 break;                                                                  
  480.                                 case 'D':                                                           //DEVICE码 0x44="D"
  481.                                         parse_cmd3();                                                               
  482.                                         com_reset();
  483.                                 break;
  484.                                 case 'W':                                                           //WRITE写ID码 0x57="W"
  485.                                         parse_cmd4();                                                               
  486.                                         com_reset();
  487.                                 break;
  488.                                 case 'R':                                                           //读现在读灯控及设备控制状态
  489.                                         parse_cmd5();                                                               
  490.                                         com_reset();
  491.                                 break;
  492.                                 case 'S':                                                            //读灯控及设备控制状态STATUS
  493.                                         parse_cmd6();                                                         
  494.                                         com_reset();
  495.                                 break;

  496.                                 default:
  497.                                         com_reset();                                                //清空接收缓冲区的计数值         

  498.                                 }

  499.                          }
  500.                  }
  501.                  else
  502.                  {

  503.                         com_reset();                                                                   //清空接收缓冲区的计数值
  504.                 }
  505.         }
  506.         else
  507.         {
  508.                 TI = 0 ;
  509.         }
  510. }
  511. /******************************************************************************************
  512. * 函数名称    :UART_two_Interrupt_Receive(void)
  513. * 功能描述    :串口2中断接收程序
  514. ******************************************************************************************/
  515. void UART_two_Interrupt_Receive(void) interrupt 8                           // 串口2中断接收
  516. {
  517.         INT8U k = 0,i = 0,temp;
  518.           k = S2CON ;
  519.           k = k&0x01;                                                        //if(S2RI==1) //

  520.           if(k==1)
  521.         {
  522.             S2CON = S2CON&0xfe;                                //S2RI=0;
  523.                 temp = S2BUF ;
  524.                 if(i <= 2)
  525.                 {
  526.                         UART2_BUF[i] = temp;
  527.                         i++;
  528.                 }
  529.                 if(UART2_BUF[0] == CMD_RET_CODEOK)
  530.                 {
  531.                         send_settings_cmd_send(CMD_WIFI_SEND,7,0x32);
  532.                         Delayx(20);
  533.                         com_send_ok();        
  534.                 }
  535.                 if(UART2_BUF[0] == CMD_RET_CODEEER)
  536.                 {
  537.                         send_settings_cmd_send(CMD_WIFI_SEND,7,0x35);
  538.                         Delayx(20);
  539.                         com_send_error();
  540.                 }

  541.         }
  542.            else
  543.         {
  544.             S2CON = S2CON&0xfd;         //S2TI=0;
  545.         }
  546. }
  547. /******************************************************************************************
  548. * 函数名称    :parse_cmd()
  549. * 功能描述    :串口接收数据功能分析函数
  550. ******************************************************************************************/
  551. void parse_cmd1()
  552. {
  553.         INT8U stat1=UART1_BUF[r_buf_num-1];
  554.         switch(stat1)
  555.         {
  556.         case HDMI_CHANNEL1:
  557.                 Delayx(10);                                                                                                  //切换HDMI 1#通道。
  558.                 send_settings_cmd_two(CMD_HDMI31);
  559.                 DHMI_ID = HDMI1FUNCODE;
  560.                
  561.         break;
  562.         case HDMI_CHANNEL2:                                                                          //切换HDMI 2#通道。
  563.                 Delayx(10);
  564.                 send_settings_cmd_two(CMD_HDMI32);
  565.                 DHMI_ID = HDMI2FUNCODE;

  566.         break;
  567.         case HDMI_CHANNEL3:                                                                          //切换HDMI 3#通道。
  568.                 Delayx(10);
  569.                 send_settings_cmd_two(CMD_HDMI33);
  570.                 DHMI_ID = HDMI3FUNCODE;

  571.         break;
  572.         case FUNCODE_ENQ:                                                                        //查询灯控与设备控制状态
  573.                 Delayx(10);
  574.                 send_settings_cmd_send(CMD_WIFI_SEND,7,0x32);
  575.                 Delayx(20);
  576.                 s1end_uart_one(port_status1);
  577.                 s1end_uart_one(port_status3);
  578.                 s1end_uart_one(ENTER1);
  579.                 s1end_uart_one(ENTER2);

  580.         break;

  581.         default:
  582.                 com_reset();                                                                        //清空接收缓冲区的计数值                        
  583.         }        
  584. }
  585. void parse_cmd2()
  586. {
  587.         INT8U stat1=UART1_BUF[r_buf_num-2],stat2=UART1_BUF[r_buf_num-1];
  588.         if(stat1 == LAMP_CMD_ON)                                                           //开灯
  589.         {
  590.                 PORT1_STATUS = stat2;
  591.                 PORT1_STATUS_CMD = HexToBit(PORT1_STATUS);
  592. //                s1end_uart_one(PORT1_STATUS_CMD);                           //调试用
  593.                 switch(PORT1_STATUS_CMD)
  594.                 {
  595.                 case '1':                                                                                // 打开 P1.4 第一盏灯。
  596.                         LAMP1 = 1;
  597.                         port_status1 |= LAMP_CODE[0];                                                                          
  598.                 break;
  599.                 case '2':                                                                                // 打开 P1.6 第二盏灯。
  600.                         LAMP2 = 1;
  601.                         port_status1 |= LAMP_CODE[1];                                                                                 
  602.                 break;
  603.                 case '3':                                                                                // 打开 P1.7 第三盏灯。
  604.                         LAMP3 = 1;
  605.                         port_status1 |= LAMP_CODE[2];                                                                          
  606.                 break;
  607.                 case '4':                                                                                // 打开 P1.7 第四盏灯。
  608.                         LAMP4 = 1;
  609.                         port_status1 |= LAMP_CODE[3];                                                                          
  610.                 break;
  611.                 case '5':                                                                                // 打开 P1.7 第五盏灯。
  612.                         LAMP5 = 1;
  613.                         port_status1 |= LAMP_CODE[4];                                                                          
  614.                 break;
  615.                 case '6':                                                                                // 打开 P1.7 第六盏灯。
  616.                         LAMP6 = 1;
  617.                         port_status1 |= LAMP_CODE[5];                                                                          
  618.                 break;
  619.         
  620.                 default:
  621.                         com_reset();                                                                        //清空接收缓冲区的计数值                        
  622.                 }
  623. //                for(i=0;i<6;i++) { port_status |= LAMP_CODE[i]; }
  624.                 IapEraseSector(IAP_ADDRESS3);
  625.                 IapWriteByte(IAP_ADDRESS3,port_status1);
  626.                 send_settings_cmd_send(CMD_WIFI_SEND,7,0x32);
  627.                 Delayx(20);
  628.                 com_send_ok();        
  629.         }
  630.         else
  631.         {
  632.                 PORT1_STATUS = stat2;
  633.                 PORT1_STATUS_CMD = HexToBit(PORT1_STATUS);
  634. //                s1end_uart_one(PORT1_STATUS_CMD);                           //调试用
  635.                 switch(PORT1_STATUS_CMD)
  636.                 {
  637.                 case '1':                                                                                // 打开 P1.4 第三盏灯。
  638.                         LAMP1 = 0;
  639.                         port_status1 &= ~LAMP_CODE[0];                                                                          
  640.                 break;
  641.                 case '2':                                                                                // 打开 P1.6 第五盏灯。
  642.                         LAMP2 = 0;
  643.                         port_status1 &= ~LAMP_CODE[1];                                                                                 
  644.                 break;
  645.                 case '3':                                                                                // 打开 P1.7 第六盏灯。
  646.                         LAMP3 = 0;
  647.                         port_status1 &= ~LAMP_CODE[2];                                                                          
  648.                 break;
  649.                 case '4':                                                                                // 打开 P1.7 第六盏灯。
  650.                         LAMP4 = 0;
  651.                         port_status1 &= ~LAMP_CODE[3];                                                                          
  652.                 break;
  653.                 case '5':                                                                                // 打开 P1.7 第六盏灯。
  654.                         LAMP5 = 0;
  655.                         port_status1 &= ~LAMP_CODE[4];                                                                          
  656.                 break;
  657.                 case '6':                                                                                // 打开 P1.7 第六盏灯。
  658.                         LAMP6 = 0;
  659.                         port_status1 &= ~LAMP_CODE[5];                                                                          
  660.                 break;
  661.         
  662.                 default:
  663.                         com_reset();                                                                        //清空接收缓冲区的计数值                        
  664.                 }

  665.                 IapEraseSector(IAP_ADDRESS3);
  666.                 IapWriteByte(IAP_ADDRESS3,port_status1);
  667.                 send_settings_cmd_send(CMD_WIFI_SEND,7,0x32);
  668.                 Delayx(20);
  669.                 com_send_ok();
  670.         }        
  671. }
  672. void parse_cmd3()
  673. {
  674.         INT8U stat1=UART1_BUF[r_buf_num-2],stat2=UART1_BUF[r_buf_num-1];
  675.         if(stat1 == LAMP_CMD_ON)                                                           //开设备
  676.         {
  677.                 PORT3_STATUS = stat2;
  678.                 PORT3_STATUS_CMD = HexToBit(PORT3_STATUS);
  679. //                s1end_uart_one(PORT1_STATUS_CMD);                           //调试用
  680.                 switch(PORT3_STATUS_CMD)
  681.                 {
  682.                 case '1':                                                                                // 打开 P3.2 第一设备。
  683.                         DEVICE1 = 1;
  684.                         port_status3 |= DECIVE_CODE[0];
  685.                 break;
  686.                 case '2':                                                                                // 打开 P3.3 第二设备。
  687.                         DEVICE2 = 1;
  688.                         port_status3 |= DECIVE_CODE[1];
  689.                 break;
  690.                 case '3':                                                                                // 打开 P3.4 第三设备。
  691.                         device_5 = 1;
  692.                         port_status3 |= DECIVE_CODE[2];
  693.                 break;
  694.                
  695.                 default:
  696.                         com_reset();                                                                        //清空接收缓冲区的计数值                        
  697. ……………………

  698. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
控制程序201712(22.1184)08S2.zip (85.68 KB, 下载次数: 56)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:67344 发表于 2019-6-27 17:16 | 显示全部楼层
下载学习一下。
回复

使用道具 举报

ID:137005 发表于 2019-7-24 14:19 | 显示全部楼层
楼主,这ESP8266的参数,如SSID和用户名密码设置,写在程序里不方便呀,能不能独立出来操作设置?
回复

使用道具 举报

ID:347467 发表于 2019-7-25 16:27 | 显示全部楼层
谢谢分享,
回复

使用道具 举报

ID:235188 发表于 2020-3-2 11:56 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:609028 发表于 2020-3-2 16:09 | 显示全部楼层
谢谢分享,
回复

使用道具 举报

ID:385637 发表于 2020-3-2 18:07 | 显示全部楼层
好资料,学习了,不知道现在卖的那些手机扫下就能联网的怎么实现,不然产品卖出去不可能每个都只能联一个网络而已
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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