赞
踩
蓝牙 -- 最好用的 串口透传 模块
透传 -- 透明传送,指的是在数据传输的过程中,通过无线的方式这组数据不发生任何形式的改变,
仿佛传输过程是透明的,同时保证传输质量,最终原封不动的传送到接收者手里
只要通过串口编程 获得数据即可
波特率: 9600 MHZ
// 学会串口 就能使用蓝牙模块
-- 就能通过蓝牙 模块进行交互-- 比如通过蓝牙在串口上发送指令让单片机执行
================================================
通过USB转TTL 来插入电脑,就可以实现手机和电脑的串口数据传输
AT命令修改蓝牙名称:
AT + NAME = 新的名字
通过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+CWMODE=3
//1.是station(设备模式) 2.AP(路由模式) 3.双模
AT+CWJAP="CU_a2ry","c5m66yaa"
// 第一个“”填wifi名字,第二个“”填 wifi密码
//连接成功 弹出:
WIFI CONNECTED
WIFI GOT IP
==================
AT+CIFSR
+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"
=============================
1.先通过网络调试助手创建服务器
2.在通过AT指令连接服务器:
AT+CIPSTART="TCP","192.168.1.9",8880
//连接成功:
CONNECTOK
3. 发送数据:
AT+CIPSEND=4 //设置即将发送数据的长度--4个字节发出上面AT指令后出现 >
就可以在发送框里面传输 后面传输(注意不能添加新行)---------------------------------------
这种模式效率太低: 每次都 AT+CIPSEND=4
我们就可以设置为透传:1. AT+CIPMODE=1 //开启透传模式
2. AT+CIPSEND //带回车 -- 开始发送接收数据
3. 随便怎么 发送,接收
4.退出透传模式 发送 +++ 不带换新行
========================================
代码实现 51 和wifi模块的连接
code 关键字 -- 单独空间存储数据#include"reg52.h"
#include<string.h>#define SIZE 12
sfr AUXR = 0x8E;
sbit D5 = P3^7;char cmd[SIZE];
code char LJWL[]="AT+CWJAP=\"CU_a2ry\",\"c5m66yaa\"\r\n"; //通过\r\n输出新行 -- 连接网络
code char LJFWQ[] ="AT+CIPSTART=\"TCP\",\"192.168.1.9\",8880\r\n"; // 链接服务器
char TCMS[]="AT+CIPMODE=1\r\n"; //开启透传模式
char SJCS[]="AT+CIPSEND\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) //9600bps@11.0592MHz
{
AUXR=0x01; //减少定时器辐射 -- 抗干扰
SCON =0x50; //配置 串口口工作方式1,REN 使能接收
//不配 PCON -- 不设置倍数关系
//配置定时器1为 8位自动重装
TMOD &=0xF0; //高位清零
TMOD |=0x20; //00 10 -- 配置为定时器1为: 1 0 模式 -- 8位自动重装
//定义初值
TL1=0xFD;
TH1=0xFD; // 9600 波特率的初值
TR1= 1; // 定时器 -- 启动
EA =1; // 开启总中断
ES=1; // 开启串口中断
}
void sendByte(char a)
{
SBUF = a;
while(!TI);
TI=0;
}
void sendString(char *str)
{while(*str!='\0')
{
sendByte(*str);
str++;
}}
void main()
{
D5=1;//配置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) // 中断处理函数中,对于接收中断的响应
{
RI=0; //清楚接收中断标志位
cmd[i] = SBUF;
i++;
if(i==SIZE)
i=0;
if(strstr(cmd,"en")){//收到 o-pen 开灯
D5=0;
i=0;
memset(cmd,'\0',SIZE);
}
else if(strstr(cmd,"se")){//收到c-lose 关灯
D5=1;
i=0;
memset(cmd,'\0',SIZE);
}
}
}
=============================
优化 上面代码 通过TCP 通信点灯:#include"reg52.h"
#include<string.h>#define SIZE 12
sfr AUXR = 0x8E;
sbit D5 = P3^7;char cmd[SIZE];
code char LJWL[]="AT+CWJAP=\"CU_a2ry\",\"c5m66yaa\"\r\n"; //通过\r\n输出新行 -- 连接网络
code char LJFWQ[] ="AT+CIPSTART=\"TCP\",\"192.168.1.9\",8880\r\n"; // 链接服务器
char TCMS[]="AT+CIPMODE=1\r\n"; //开启透传模式
char SJCS[]="AT+CIPSEND\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) //9600bps@11.0592MHz
{
AUXR=0x01; //减少定时器辐射 -- 抗干扰
SCON =0x50; //配置 串口口工作方式1,REN 使能接收
//不配 PCON -- 不设置倍数关系
//配置定时器1为 8位自动重装
TMOD &=0xF0; //高位清零
TMOD |=0x20; //00 10 -- 配置为定时器1为: 1 0 模式 -- 8位自动重装
//定义初值
TL1=0xFD;
TH1=0xFD; // 9600 波特率的初值
TR1= 1; // 定时器 -- 启动
EA =1; // 开启总中断
ES=1; // 开启串口中断
}
void sendByte(char a)
{
SBUF = a;
while(!TI);
TI=0;
}
void sendString(char *str)
{while(*str!='\0')
{
sendByte(*str);
str++;
}}
void main()
{
int mark = 0;
D5=1;//配置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();
mark=1;
}
else{
sendString("mengxianggiegie\r\n");
Delay1000ms();
}
}
}void uartHandler() interrupt 4
{
static i = 0;
if(RI) // 中断处理函数中,对于接收中断的响应
{
RI=0; //清楚接收中断标志位
cmd[0] = SBUF;
if(cmd[0] == '1'){//收到 o-pen 开灯
D5=0;
i=0;
}
else if(cmd[0] == '0' ){//收到c-lose 关灯
D5=1;
i=0;
}
}
}
========================
#include"reg52.h"
#include<string.h>#define SIZE 12
sfr AUXR = 0x8E;
sbit D5 = P3^7;
sbit D6 = P3^6;char buffer[SIZE];
code char LJWL[]="AT+CWJAP=\"CU_a2ry\",\"c5m66yaa\"\r\n"; //通过\r\n输出新行 -- 连接网络
code char LJFWQ[] ="AT+CIPSTART=\"TCP\",\"192.168.1.9\",8880\r\n"; // 链接服务器
char TCMS[]="AT+CIPMODE=1\r\n"; //开启透传模式
char SJCS[]="AT+CIPSEND\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) //9600bps@11.0592MHz
{
AUXR=0x01; //减少定时器辐射 -- 抗干扰
SCON =0x50; //配置 串口口工作方式1,REN 使能接收
//不配 PCON -- 不设置倍数关系
//配置定时器1为 8位自动重装
TMOD &=0xF0; //高位清零
TMOD |=0x20; //00 10 -- 配置为定时器1为: 1 0 模式 -- 8位自动重装
//定义初值
TL1=0xFD;
TH1=0xFD; // 9600 波特率的初值
TR1= 1; // 定时器 -- 启动
EA =1; // 开启总中断
ES=1; // 开启串口中断
}
void sendByte(char a)
{
SBUF = a;
while(!TI);
TI=0;
}
void sendString(char *str)
{while(*str!='\0')
{
sendByte(*str);
str++;
}}
void main()
{
int mark = 0;
D5=1; //状态灯一开始是熄灭状态//配置C51串口的 通信方式:
UartInit();
Delay1000ms(); //给esp wifi 模块上电时间
sendString(LJWL); // 链接网络 Delay1000ms();
while(!AT_Connect_Net_Flag); // 等到有效才去执行下面的代码
while(!AT_OK_Flag);
AT_OK_Flag=0;
sendString(LJFWQ); //连接服务器
while(!AT_OK_Flag);
AT_OK_Flag=0; //用完清零, 方便下次做判断
sendString(TCMS); //开启透传
while(!AT_OK_Flag);
AT_OK_Flag=0;
sendString(SJCS); //接收数据
while(!AT_OK_Flag);
if(AT_Connect_Net_Flag){
D5=0; // 通过灯判断是否联网成功 -- 点亮表示成功
}
if(AT_OK_Flag){
D6=0; //代表连接服务器,并且打开 透传 成功
}
while(1){
Delay1000ms();
//往发送缓冲区 写入数据-- 就完成数据的发送
//sendString("mengxianggiegie\r\n");
sendString("mengxianggiegie\r\n");
}
}void uartHandler() interrupt 4
{
static i = 0;
char tmp;
if(RI) // 中断处理函数中,对于接收中断的响应
{
RI=0; //清楚接收中断标志位
tmp = SBUF;
if(tmp == 'W' || tmp == 'O'|| tmp == 'L' ){ //匹配到W开头的时候,把下标定义为0,方便后面的[0] [5]的位置比较
i=0;
}
buffer[i++]=tmp;
if(buffer[0]=='W' && buffer[5]=='G'){//联网成功 WIFI GOT
AT_Connect_Net_Flag=1; //标志修改为联网状态
memset(buffer,'\0',SIZE);
}if(buffer[0]=='O' && buffer[1]=='K'){//联网成功 WIFI GOT
AT_OK_Flag=1;
memset(buffer,'\0',SIZE);
}
/*
if(buffer[0]=='F' && buffer[1]=='A'){//联网失败 FAIL
for(i=0;i<3;++i){
D5=0;
Delay1000ms();
D5=1;
Delay1000ms();
}
sendString(LJWL);
memset(buffer,'\0',SIZE);
}
*/
if(buffer[0] == 'L'&& buffer[2] == '1'){//收到 o-pen 开灯
D5=0;
memset(buffer,'\0',SIZE);
}
else if(buffer[0] == 'L'&& buffer[2] == '0'){//收到c-lose 关灯
D5=1;
memset(buffer,'\0',SIZE);
}
if(i==12)
i=0;
}
}注释部分为进一步优化,没能连接成功就 AT+RET -- 重启 or 重新连接
==============================
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。