完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 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灯开启 手机客户端连接上开发板。
|
|
相关推荐
|
|
楼主的报告太过简单了
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
1023 浏览 0 评论
【KV260视觉入门套件试用体验】四、KV260 视觉入门套件和固件更新
1594 浏览 0 评论
【KV260视觉入门套件试用体验】Vitis AI Library体验之OCR识别
1194 浏览 0 评论
【KV260视觉入门套件试用体验】Vitis AI 通过迁移学习训练自定义模型
1693 浏览 0 评论
【KV260视觉入门套件试用体验】KV260系列之Petalinux镜像+Resnet 50探索
1358 浏览 0 评论
【AMD KV260视觉入门开发套件试用】4、简单几步体验ubuntu 20.04.3 LTS运行人员检测应用
1649浏览 1评论
2013浏览 1评论
【KV260视觉入门套件试用体验】老刘记事儿KV260初体验之Micro-SD选型提速研究(三)
884浏览 1评论
【KV260视觉入门套件试用体验】KV260部署yolov3实现车辆和行人检测
2551浏览 1评论
【KV260视觉入门套件试用体验】基于KV260的人脸识别的实现与展示
890浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 13:59 , Processed in 0.609327 second(s), Total 76, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号