智能硬件william hill官网
直播中

陈佳方

8年用户 12经验值
私信 关注
[资料]

【P2P物联网试用体验】+初次上电

本帖最后由 cjf89 于 2016-8-26 11:54 编辑

供电正常
IMG_20160816_103231.jpg.JPG 连接进入互联网
IMG_20160816_101850.jpg.JPG IMG_20160816_101847.jpg.JPG
连接完成  
IMG_20160816_101836.jpg.JPG 硬件部分
PCB布局:由图中三种颜色的线可以看出该威廉希尔官方网站 板是四层板,该威廉希尔官方网站 板布局美观符合电气规范。
主控板pcb.png pcb.png
原理图:可以看出应用了单片机做主控制器,电源部分经过了滤波及稳压,有七个自定义IO口
原理图6.png 原理图.png
元器件:从元器件的组成来看,本款产品大量应用了贴片式元器件及半导体,集成度比较高。
元器件4.png 元器件.png
软件部分:可以看出本款产品的程序比较成熟应用到了,调用子函数,及通过软件防抖和互联网的三次握手程序。
#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
        }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////


人机界面:下面是电脑串口通讯调试成功的截图及电脑控制端的截图 串口通讯调试.png 电脑连接测试.png
人机互动:
通过发送指定的代码达到继电器闭合及LED1灯开启
手机互动.jpg
手机客户端连接上开发板
手机控制端.jpg 后续将上传本人的智能家居系统项目,敬请关注!!!


  • IMG_20160816_101836.jpg.JPG
  • IMG_20160816_101847.jpg.JPG
  • IMG_20160816_101850.jpg.JPG
  • IMG_20160816_103231.jpg.JPG

回帖(1)

Elecfans管家

2016-8-24 11:41:20
楼主的报告太过简单了
举报

更多回帖

发帖
×
20
完善资料,
赚取积分