网站开发高级工程师,国内付费代理ip哪个好,wordpress可以做企业网站,网站平台建设及运营推广策划方案HC-08蓝牙模块:
蓝牙 -- 最好用的 串口透传 模块
透传 -- 透明传送#xff0c;指的是在数据传输的过程中#xff0c;通过无线的方式这组数据不发生任何形式的改变#xff0c; 仿佛传输过程是透明的#xff0c;同时保证传输质量#xff0c;最终原封不动的传送到接收者手…
HC-08蓝牙模块:
蓝牙 -- 最好用的 串口透传 模块
透传 -- 透明传送指的是在数据传输的过程中通过无线的方式这组数据不发生任何形式的改变 仿佛传输过程是透明的同时保证传输质量最终原封不动的传送到接收者手里
只要通过串口编程 获得数据即可
波特率: 9600 MHZ
// 学会串口 就能使用蓝牙模块 -- 就能通过蓝牙 模块进行交互-- 比如通过蓝牙在串口上发送指令让单片机执行
通过USB转TTL 来插入电脑就可以实现手机和电脑的串口数据传输
AT命令修改蓝牙名称: AT NAME 新的名字 wifi模块:
基本概念
通过wifi模块 让 51单片机上网:
使用的wifi模块 -- ESP-8266 -- 高度基础的wifi MCU -- 支持RTOS(实时系统) 和 wifi协议栈 基于AT指令设计:
AT指令 --是从终端设备 or 数据终端设备 or 数据电路终端设备发送的
每条AT命令行只能包含一条AT指令对于由终端设备主动向PC段报告的URC or response响应也要求一行最多有一个 不允许上限的一行有多条指令 or 响应 -- AT指令以回车作为结尾 响应 or 上报 以回车 换行作为结尾 ESP-8266 -- 一般 默认波特率 -- 115200 因为都是AT指令去驱动so玩wifi模块都是 通过 串口调试助手 接下来玩以下 AT指令:
通过命令 配置 9600 的波特率:
AT UART 9600,8,1,0,0 //8 个 数据位 1 个停止位
常用AT指令:
1.设置3种工作模式:
ATCWMODE3 //1.是station(设备模式) 2.AP路由模式 3.双模
2. 以设备模式接入家中的路由器配置:
ATCWJAPCU_a2ry,c5m66yaa // 第一个“”填wifi名字第二个“”填 wifi密码
//连接成功 弹出: WIFI CONNECTED WIFI GOT IP 3.查询IP地址:
ATCIFSR
CIFSR:APIP,192.168.4.1 CIFSR:APMAC,ce:50:e3:77:dd:4e CIFSR:STAIP,192.168.1.17 CIFSR:STAMAC,cc:50:e3:77:dd:4e
4.接收发送数据 1.先通过网络调试助手创建服务器 2.在通过AT指令连接服务器 ATCIPSTARTTCP,192.168.1.9,8880 //连接成功: CONNECT OK 3. 发送数据: ATCIPSEND4 //设置即将发送数据的长度--4个字节 发出上面AT指令后出现 就可以在发送框里面传输 后面传输(注意不能添加新行) --------------------------------------- 这种模式效率太低: 每次都 ATCIPSEND4 5.透传: 我们就可以设置为透传: 1. ATCIPMODE1 //开启透传模式 2. ATCIPSEND //带回车 -- 开始发送接收数据 3. 随便怎么 发送接收 4.退出透传模式 发送 不带换新行 程序 代码实现 51 和wifi模块的连接 code 关键字 -- 单独空间存储数据 #includereg52.h #includestring.h #define SIZE 12 sfr AUXR 0x8E; sbit D5 P3^7; char cmd[SIZE]; code char LJWL[]ATCWJAP\CU_a2ry\,\c5m66yaa\\r\n; //通过\r\n输出新行 -- 连接网络 code char LJFWQ[] ATCIPSTART\TCP\,\192.168.1.9\,8880\r\n; // 链接服务器 char TCMS[]ATCIPMODE1\r\n; //开启透传模式 char SJCS[]ATCIPSEND\r\n; //数据接收 void Delay1000ms() //11.0592MHz { unsigned char i, j, k; i 43; j 6; k 203; do { do { while (--k); } while (--j); } while (--i); } void UartInit(void) //9600bps11.0592MHz { AUXR0x01; //减少定时器辐射 -- 抗干扰 SCON 0x50; //配置 串口口工作方式1REN 使能接收 //不配 PCON -- 不设置倍数关系 //配置定时器1为 8位自动重装 TMOD 0xF0; //高位清零 TMOD |0x20; //00 10 -- 配置为定时器1为: 1 0 模式 -- 8位自动重装 //定义初值 TL10xFD; TH10xFD; // 9600 波特率的初值 TR1 1; // 定时器 -- 启动 EA 1; // 开启总中断 ES1; // 开启串口中断 } void sendByte(char a) { SBUF a; while(!TI); TI0; } void sendString(char *str) { while(*str!\0) { sendByte(*str); str; } } void main() { D51; //配置C51串口的 通信方式: UartInit(); while(1){ //Delay1000ms(); //往发送缓冲区 写入数据-- 就完成数据的发送 //sendString(mengxianggiegie\r\n); sendString(LJWL); // 链接网络 Delay1000ms(); Delay1000ms(); Delay1000ms(); Delay1000ms(); Delay1000ms(); sendString(LJFWQ); //连接服务器 Delay1000ms(); Delay1000ms(); Delay1000ms(); Delay1000ms(); Delay1000ms(); sendString(TCMS); //开启透传 Delay1000ms(); Delay1000ms(); Delay1000ms(); Delay1000ms(); Delay1000ms(); sendString(SJCS); //接收数据 Delay1000ms(); Delay1000ms(); Delay1000ms(); Delay1000ms(); Delay1000ms(); } } void uartHandler() interrupt 4 { static i 0; if(RI) // 中断处理函数中对于接收中断的响应 { RI0; //清楚接收中断标志位 cmd[i] SBUF; i; if(iSIZE) i0; if(strstr(cmd,en)){//收到 o-pen 开灯 D50; i0; memset(cmd,\0,SIZE); } else if(strstr(cmd,se)){//收到c-lose 关灯 D51; i0; memset(cmd,\0,SIZE); } } } 优化 上面代码 通过TCP 通信点灯: #includereg52.h #includestring.h #define SIZE 12 sfr AUXR 0x8E; sbit D5 P3^7; char cmd[SIZE]; code char LJWL[]ATCWJAP\CU_a2ry\,\c5m66yaa\\r\n; //通过\r\n输出新行 -- 连接网络 code char LJFWQ[] ATCIPSTART\TCP\,\192.168.1.9\,8880\r\n; // 链接服务器 char TCMS[]ATCIPMODE1\r\n; //开启透传模式 char SJCS[]ATCIPSEND\r\n; //数据接收 void Delay1000ms() //11.0592MHz { unsigned char i, j, k; i 43; j 6; k 203; do { do { while (--k); } while (--j); } while (--i); } void UartInit(void) //9600bps11.0592MHz { AUXR0x01; //减少定时器辐射 -- 抗干扰 SCON 0x50; //配置 串口口工作方式1REN 使能接收 //不配 PCON -- 不设置倍数关系 //配置定时器1为 8位自动重装 TMOD 0xF0; //高位清零 TMOD |0x20; //00 10 -- 配置为定时器1为: 1 0 模式 -- 8位自动重装 //定义初值 TL10xFD; TH10xFD; // 9600 波特率的初值 TR1 1; // 定时器 -- 启动 EA 1; // 开启总中断 ES1; // 开启串口中断 } void sendByte(char a) { SBUF a; while(!TI); TI0; } void sendString(char *str) { while(*str!\0) { sendByte(*str); str; } } void main() { int mark 0; D51; //配置C51串口的 通信方式: UartInit(); while(1){ //Delay1000ms(); //往发送缓冲区 写入数据-- 就完成数据的发送 //sendString(mengxianggiegie\r\n); if(!mark){ //第一次打开链接服务器 和网络 sendString(LJWL); // 链接网络 Delay1000ms(); Delay1000ms(); Delay1000ms(); Delay1000ms(); sendString(LJFWQ); //连接服务器 Delay1000ms(); Delay1000ms(); Delay1000ms(); sendString(TCMS); //开启透传 Delay1000ms(); Delay1000ms(); Delay1000ms(); sendString(SJCS); //接收数据 Delay1000ms(); Delay1000ms(); Delay1000ms(); mark1; } else{ sendString(mengxianggiegie\r\n); Delay1000ms(); } } } void uartHandler() interrupt 4 { static i 0; if(RI) // 中断处理函数中对于接收中断的响应 { RI0; //清楚接收中断标志位 cmd[0] SBUF; if(cmd[0] 1){//收到 o-pen 开灯 D50; i0; } else if(cmd[0] 0 ){//收到c-lose 关灯 D51; i0; } } } 上方代码优化 -- 读取返回 结果以便 观察进度 #includereg52.h #includestring.h #define SIZE 12 sfr AUXR 0x8E; sbit D5 P3^7; sbit D6 P3^6; char buffer[SIZE]; code char LJWL[]ATCWJAP\CU_a2ry\,\c5m66yaa\\r\n; //通过\r\n输出新行 -- 连接网络 code char LJFWQ[] ATCIPSTART\TCP\,\192.168.1.9\,8880\r\n; // 链接服务器 char TCMS[]ATCIPMODE1\r\n; //开启透传模式 char SJCS[]ATCIPSEND\r\n; //数据接收 char AT_OK_Flag 0; char AT_Connect_Net_Flag 0; void Delay1000ms() //11.0592MHz { unsigned char i, j, k; i 43; j 6; k 203; do { do { while (--k); } while (--j); } while (--i); } void UartInit(void) //9600bps11.0592MHz { AUXR0x01; //减少定时器辐射 -- 抗干扰 SCON 0x50; //配置 串口口工作方式1REN 使能接收 //不配 PCON -- 不设置倍数关系 //配置定时器1为 8位自动重装 TMOD 0xF0; //高位清零 TMOD |0x20; //00 10 -- 配置为定时器1为: 1 0 模式 -- 8位自动重装 //定义初值 TL10xFD; TH10xFD; // 9600 波特率的初值 TR1 1; // 定时器 -- 启动 EA 1; // 开启总中断 ES1; // 开启串口中断 } void sendByte(char a) { SBUF a; while(!TI); TI0; } void sendString(char *str) { while(*str!\0) { sendByte(*str); str; } } void main() { int mark 0; D51; //状态灯一开始是熄灭状态 //配置C51串口的 通信方式: UartInit(); Delay1000ms(); //给esp wifi 模块上电时间 sendString(LJWL); // 链接网络 Delay1000ms(); while(!AT_Connect_Net_Flag); // 等到有效才去执行下面的代码 while(!AT_OK_Flag); AT_OK_Flag0; sendString(LJFWQ); //连接服务器 while(!AT_OK_Flag); AT_OK_Flag0; //用完清零 方便下次做判断 sendString(TCMS); //开启透传 while(!AT_OK_Flag); AT_OK_Flag0; sendString(SJCS); //接收数据 while(!AT_OK_Flag); if(AT_Connect_Net_Flag){ D50; // 通过灯判断是否联网成功 -- 点亮表示成功 } if(AT_OK_Flag){ D60; //代表连接服务器并且打开 透传 成功 } while(1){ Delay1000ms(); //往发送缓冲区 写入数据-- 就完成数据的发送 //sendString(mengxianggiegie\r\n); sendString(mengxianggiegie\r\n); } } void uartHandler() interrupt 4 { static i 0; char tmp; if(RI) // 中断处理函数中对于接收中断的响应 { RI0; //清楚接收中断标志位 tmp SBUF; if(tmp W || tmp O|| tmp L ){ //匹配到W开头的时候把下标定义为0方便后面的[0] [5]的位置比较 i0; } buffer[i]tmp; if(buffer[0]W buffer[5]G){//联网成功 WIFI GOT AT_Connect_Net_Flag1; //标志修改为联网状态 memset(buffer,\0,SIZE); } if(buffer[0]O buffer[1]K){//联网成功 WIFI GOT AT_OK_Flag1; memset(buffer,\0,SIZE); } /* if(buffer[0]F buffer[1]A){//联网失败 FAIL for(i0;i3;i){ D50; Delay1000ms(); D51; Delay1000ms(); } sendString(LJWL); memset(buffer,\0,SIZE); } */ if(buffer[0] L buffer[2] 1){//收到 o-pen 开灯 D50; memset(buffer,\0,SIZE); } else if(buffer[0] L buffer[2] 0){//收到c-lose 关灯 D51; memset(buffer,\0,SIZE); } if(i12) i0; } } 注释部分为进一步优化没能连接成功就 ATRET -- 重启 or 重新连接