本帖最后由 cjf89 于 2016-8-26 11:54 编辑
供电正常
连接进入互联网
连接完成
硬件部分
PCB布局:由图中三种颜色的线可以看出该
威廉希尔官方网站
板是四层板,该威廉希尔官方网站
板布局美观符合电气规范。
原理图:可以看出应用了
单片机做主控制器,
电源部分经过了滤波及稳压,有七个自定义IO口
元器件:从元器件的组成来看,本款产品大量应用了贴片式元器件及
半导体,集成度比较高。
软件部分:可以看出本款产品的程序比较成熟应用到了,调用子函数,及通过软件防抖和互联网的三次握手程序。
#include
#include "stdio.h"
#include "types.h"
#include "STC12C5A.h"
#include "zlp2p.h"
#include "common_lib.h"
#define CMD_LEN 36
zl_u8 com_cmd_buf[CMD_LEN];//用来指定送往串口1或者2的数据长度字节,和拷贝串口1或2得到的存入缓存内数据的长度
// 延续之前的方式状态机
#define STATE_0 0
#define STATE_1 1
// 缓冲区
char buf_Net2Serial_in[R_BUF_N2SIN_SIZE+1];
char buf_Serial2Net_in[R_BUF_S2NIN_SIZE+1];
struct SRotateBuf rbuf_Net2Serial_in;
struct SRotateBuf rbuf_Serial2Net_in;
#if S1_S2_MODE == S1_S2_PROTOCOL
char buf_Net2Serial_out[R_BUF_N2SOUT_SIZE+1];
char buf_Serial2Net_out[R_BUF_S2NOUT_SIZE+1];
struct SRotateBuf rbuf_Net2Serial_out;
struct SRotateBuf rbuf_Serial2Net_out;
#endif
char temp_c;//备用,从缓存区读出一个字节数据存入此值中
// 发送完毕标志
zl_u8 send_over_Serial2Net, send_over_Net2Serial;
zl_u8 g_commstart=0;
zl_u8 net_recv_flag=0; /* 是否有新的一帧命令从串口收到*/
zl_s32 g_commstop_time,g_last_time/* 上一次采样和扫描时间*/;
zl_u8 g_state = STATE_0;
//ADC相关定义,cpu内部的ad转换器//ADC开发备用。根据需要可以改为别的参数
#define ADC_POWER 0X80
#define ADC_FLAG 0X10
#define ADC_START 0X08
#define ADC_SPEED 0X60
//以下是板子动作控制,包括继电器,按键,LED灯
//端口定义
***it PIN_LED1 = P0^0;
***it PIN_LED2 = P0^1;
***it PIN_LED3 = P0^2;
***it PIN_LED4 = P0^3;
***it PIN_KEY1 = P0^4;
***it PIN_KEY2 = P0^5;
***it PIN_KEY3 = P0^6;
***it PIN_KEY4 = P0^7;
***it PIN_18b20 = P2^0;
***it PIN_relay = P2^1;
//按键发送表
zl_u8 key_table[]={'f','g','h','i','1','0'};//按键按下,会输出f1, f2, f3, f4 对应按键1-4按下
zl_u8 baundrate_table[]={0xa0/* 1200 */, 0xd0/* 2400 */, 0xe8/* 4800 */, 0xf4/* 9600 */,
0xfa/* 19200 */,0xfd/* 38400 */, 0xfe/* 57600 */, 0xff/* 115200 */};
#if S1_S2_MODE == S1_S2_PROTOCOL
void ProcessingProtocol();
void NetRecv();
void SerialRecv();
#endif
extern zl_u8 rbuf_is_empty(struct SRotateBuf DT_XDATA *prbuf) REENTRANT_SIG;
extern zl_u8 rbuf_write(struct SRotateBuf DT_XDATA *prbuf, zl_u8 c) REENTRANT_SIG;
extern zl_u8 rbuf_read(struct SRotateBuf DT_XDATA *prbuf, zl_u8 DT_XDATA *pc) REENTRANT_SIG;
extern void rbuf_init();
extern void TRIGER_SERIAL_2_NET_OUT();
extern void TRIGER_NET_2_SERIAL_OUT() ;
extern void NetRecv();
extern void SerialRecv();
void serial_init()
{
SCON = 0x50;/* SM0 SM1 =1 SM2 REN TB8 RB8 TI RI */
TMOD = 0x20;
PCON = 0x80;
TH1 = baundrate_table[BANDURATE];//在此设置串口1的波特率
TCON = 0x40;
ES = 1;
EA = 1;
}
void NetSerialInit()
{
S2CON = 0x50;
/* start BRTR, don't set S1BRS = 1(use T1 as serial1 timer) */
AUXR = 0x18;
AURX1|=0x10;
/* 115200 when at 22.1184M */
SET_BAUNDRATEx12(baundrate_table[BANDURATE], 0); //在此设置串口2的波特率
/* ES2 enalbe */
IE2 = 0x01;
EA = 1;
}
void port_init()
{
PIN_relay = PIN_LED1 = PIN_LED2 = PIN_LED3 = PIN_LED4 = 1;//初始化IO端口,释放继电器,关闭LED灯
}
//LED灯控制///////////////////////////////////////////////////////////////////////////////////////
void ctr_io()//继电器闭合发送a1,打开a0;LED1亮b1,灭b0;LED2亮c1,灭c0;LED3亮d1,灭d0;LED1亮e1,灭e0;
{
switch(com_cmd_buf[0])
{
case 'a':
{if(com_cmd_buf[1] == '1')
PIN_relay = 0;
else if(com_cmd_buf[1] == '0')
PIN_relay = 1;
break;}
case 'b':
{if(com_cmd_buf[1] == '1')
PIN_LED1 = 0;
else if(com_cmd_buf[1] == '0')
PIN_LED1 = 1;
break;}
case 'c':
{if(com_cmd_buf[1] == '1')
PIN_LED2 = 0;
else if(com_cmd_buf[1] == '0')
PIN_LED2 = 1;
break; }
case 'd':
{if(com_cmd_buf[1] == '1')
PIN_LED3 = 0;
else if(com_cmd_buf[1] == '0')
PIN_LED3 = 1;
break; }
case 'e':
{if(com_cmd_buf[1] == '1')
PIN_LED4 = 0;
else if(com_cmd_buf[1] == '0')
PIN_LED4 = 1;
break; }
default: ;
}
}
//按键处理函数////////////////////////////////////////////////////////////////////////////////////////////////
void key_service()//按键按下,会输出f-g1, 对应按键1-4按下,弹起时会输出f-g0,对应按键1-4
{
// 按键 key_table[]
if(PIN_KEY1 == 0)
{
DelayWithInstruct(120);//延时120ms,防抖动
if(PIN_KEY1 == 0)
{
rbuf_write_bulke(&rbuf_Net2Serial_out, &key_table[0], 1);/*发给主串口,给外界, 函数实参第一个是缓存地址
不同的缓存地址代表发往不同处rbuf_Net2Serial_out代表发往串口1,即串口1输出数据;rbuf_Serial2Net_out
代表发往串口2,即串口2输出数据给网络,参数2代表要发的数据地址,参数3代表发数据字节数*/
rbuf_write_bulke(&rbuf_Net2Serial_out, &key_table[4], 1);
TRIGER_NET_2_SERIAL_OUT();
rbuf_write_bulke(&rbuf_Serial2Net_out, &key_table[0], 1);//发给次串口,给网络模块
rbuf_write_bulke(&rbuf_Serial2Net_out, &key_table[4], 1);
TRIGER_SERIAL_2_NET_OUT();
while(PIN_KEY1 == 0);//等待按键弹起
rbuf_write_bulke(&rbuf_Net2Serial_out, &key_table[0], 1);
rbuf_write_bulke(&rbuf_Net2Serial_out, &key_table[5], 1);
TRIGER_NET_2_SERIAL_OUT();
rbuf_write_bulke(&rbuf_Serial2Net_out, &key_table[0], 1);//发给次串口,给网络模块
rbuf_write_bulke(&rbuf_Serial2Net_out, &key_table[5], 1);
TRIGER_SERIAL_2_NET_OUT();
}
}
if(PIN_KEY2 == 0)
{
DelayWithInstruct(120);//延时120ms,防抖动
if(PIN_KEY2 == 0)
{
rbuf_write_bulke(&rbuf_Net2Serial_out, &key_table[1], 1);
rbuf_write_bulke(&rbuf_Net2Serial_out, &key_table[4], 1);
TRIGER_NET_2_SERIAL_OUT();
rbuf_write_bulke(&rbuf_Serial2Net_out, &key_table[1], 1);
rbuf_write_bulke(&rbuf_Serial2Net_out, &key_table[4], 1);
TRIGER_SERIAL_2_NET_OUT();
while(PIN_KEY2 == 0);//等待按键弹起
rbuf_write_bulke(&rbuf_Net2Serial_out, &key_table[1], 1);
rbuf_write_bulke(&rbuf_Net2Serial_out, &key_table[5], 1);
TRIGER_NET_2_SERIAL_OUT();
rbuf_write_bulke(&rbuf_Serial2Net_out, &key_table[1], 1);//发给次串口,给网络模块
rbuf_write_bulke(&rbuf_Serial2Net_out, &key_table[5], 1);
TRIGER_SERIAL_2_NET_OUT();
}
}
if(PIN_KEY3 == 0)
{
DelayWithInstruct(120);//延时120ms,防抖动
if(PIN_KEY3 == 0)
{
rbuf_write_bulke(&rbuf_Net2Serial_out, &key_table[2], 1);
rbuf_write_bulke(&rbuf_Net2Serial_out, &key_table[4], 1);
TRIGER_NET_2_SERIAL_OUT();
rbuf_write_bulke(&rbuf_Serial2Net_out, &key_table[2], 1);
rbuf_write_bulke(&rbuf_Serial2Net_out, &key_table[4], 1);
TRIGER_SERIAL_2_NET_OUT();
while(PIN_KEY3 == 0);//等待按键弹起
rbuf_write_bulke(&rbuf_Net2Serial_out, &key_table[2], 1);
rbuf_write_bulke(&rbuf_Net2Serial_out, &key_table[5], 1);
TRIGER_NET_2_SERIAL_OUT();
rbuf_write_bulke(&rbuf_Serial2Net_out, &key_table[2], 1);//发给次串口,给网络模块
rbuf_write_bulke(&rbuf_Serial2Net_out, &key_table[5], 1);
TRIGER_SERIAL_2_NET_OUT();
}
}
if(PIN_KEY4 == 0)
{
DelayWithInstruct(120);//延时120ms,防抖动
if(PIN_KEY4 == 0)
{
rbuf_write_bulke(&rbuf_Net2Serial_out, &key_table[3], 1);
rbuf_write_bulke(&rbuf_Net2Serial_out, &key_table[4], 1);
TRIGER_NET_2_SERIAL_OUT();
rbuf_write_bulke(&rbuf_Serial2Net_out, &key_table[3], 1);
rbuf_write_bulke(&rbuf_Serial2Net_out, &key_table[4], 1);
TRIGER_SERIAL_2_NET_OUT();
while(PIN_KEY4 == 0);//等待按键弹起
rbuf_write_bulke(&rbuf_Net2Serial_out, &key_table[3], 1);
rbuf_write_bulke(&rbuf_Net2Serial_out, &key_table[5], 1);
TRIGER_NET_2_SERIAL_OUT();
rbuf_write_bulke(&rbuf_Serial2Net_out, &key_table[3], 1);//发给次串口,给网络模块
rbuf_write_bulke(&rbuf_Serial2Net_out, &key_table[5], 1);
TRIGER_SERIAL_2_NET_OUT();
}
}
}
//循环查询处理函数//////////////////////////////////////////////////////////////////////////////////////////////////
void ProcessingProtocol(void)
{
zl_u8 ret;
SET_WATCH_DOG;
switch(g_state)
{
case STATE_0: //定时器初始化、IO初始化、ADC初始化、寄存器初始化
//进入下一个状态
{Timer_Init(); //定时器初始化1ms
//Adc_init(); //ADC初始化
port_init();
g_state = STATE_1;
break;}
case STATE_1:
{
if(g_commstart == 1 && TimePassed(g_commstop_time, 10))
{
g_commstart=0; // 处理后清除
if(RotateBufDataSize(&rbuf_Serial2Net_in) > 0 )
{
// 拷贝出来
ret=rbuf_read_bulke(&rbuf_Serial2Net_in, com_cmd_buf, CMD_LEN, FALSE);
/*串口1或者2得到的数据先存入缓存中,如buf_Serial2Net_in和 buf_Net2Serial_in,此函数表示从已有数据的缓存中
读取数据。其中实参1表示指向这两个缓存的结构体变量,参数2表示,读出数据存储地地址,参数3表示读出长度,参数4表示是否
是真读,即缓存数据被出来,这些空间可以继续写数据,如果FALSE测是真读,数据被读出来了,如果是true则是仅仅复制出那些数据,
原来缓存数据还存在,这些空间不能被写入新数据*/
ctr_io();
rbuf_write_bulke(&rbuf_Serial2Net_out, com_cmd_buf, CMD_LEN);
TRIGER_SERIAL_2_NET_OUT();
}
}
else if(net_recv_flag==1&& TimePassed(g_commstop_time, 10))
{
net_recv_flag=0;
if(RotateBufDataSize(&rbuf_Net2Serial_in) > 0 )
{ret=rbuf_read_bulke(&rbuf_Net2Serial_in, com_cmd_buf, CMD_LEN, FALSE);
ctr_io();
rbuf_write_bulke(&rbuf_Net2Serial_out, com_cmd_buf, CMD_LEN);
TRIGER_NET_2_SERIAL_OUT();
}
}
key_service();
}
}
}
//主函数///////////////////////////////////////////////////////////////////////////////////////////////////////////
main()
{
rbuf_init();
serial_init();
NetSerialInit();
while(1)
{
#if S1_S2_MODE == S1_S2_PROTOCOL
ProcessingProtocol();
#endif
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
人机界面:下面是电脑串口通讯调试成功的截图及电脑控制端的截图
人机互动:
通过发送指定的代码达到继电器闭合及LED1灯开启
手机客户端连接上开发板。
后续将上传本人的智能家居系统项目,敬请关注!!!