实例9、stc8a蓝牙模块HC05或者HC06模块,控制小车。利用定时器1产生通信的波特率9600
一、目的
二、设备模块
三、背景任务和原理接线
四、步骤
五、效果
六、心得
**
一、目的
**
掌握串口通信的基本知识,先照葫芦画瓢,跟着大概了解做一遍,慢慢了解;
掌握蓝牙模块的知识;
掌握定时器产生波特率的写法;
掌握串口中断的写法。
二、设备
stc8a自制开发板;
OLED屏幕;
HC05蓝牙模块;
stc下载软件里面的串口助手;
手机,以及手机端的蓝牙调试软件
三、背景任务
我们现在在一个大数据的时代,蓝牙是非常重要的一个手段,比如蓝牙耳机,蓝牙音箱等等;蓝牙怎么回事,我们尝试初步学习下。
任务:
手机开蓝牙,和单片机端蓝牙匹配;
手机开蓝牙软件,单片机端蓝牙接收到手机发过来的不同指令,LED0和LED1不同的亮灭状态,验证通信的正常。
如果通信正常,判断正常,那么就可以控制小车了。
**
原理接线
**
蓝牙模块
接线
用单片机的串口1,(UART1,就是P30和P31通信引脚)和蓝牙通信。
蓝牙模块的RXD接单片机的P30(TXD),蓝牙模块的TXD接单片机的P31(TXD);
VCC--------5V
GND--------GND。
**
串口知识简单讲解:
**
串口就是一个通信的名字,比如4G,5G这种,通过串口进行通信,就是说A和B都要一个串口,不然通信不了,不在一个频道。
好了,A和B都有串口了,那么两边的对话暗号协议等等要一致,不然鸡同鸭讲,说不通,还得找翻译,所以有串口的通信格式的模式的设置。包括波特率,奇偶校验,等等。后面慢慢学习。先知道,需要这么设置。
主要是波特率先讲多一点点
oo
波特率
就是A和B对话,两个人说话的速度。
两个人速度要一样,不然都听不懂,不在一个频道。单片机的串口的波特率,可以用定时器产生,我们现在使用定时器1产生波特率,给一个对话的心脏,因为定时器0我们用来计算小车运行的时间了。现在我们就用定时器1做波特率发生器。
波特率越快,交流越快,但是有时候数据会丢失等等,所以我们设定一个稳定可靠点的波特率,我们设置为9600,bps单位
缓冲区****
单片机接收到外部的数据,通过串口接收。
会暂时把数据放到缓冲区里面,缓冲区的名字是SBUF(串口1的缓冲区);
当外部数据继续进来,会把SBUF刷新掉,
所以要把SBUF的数据及时拿出来,先放着。
串口中断:
串口接收一个字节的数据,就会触发串口中断;
如果中断允许打开,就会跳到串口的中断服务函数里面。执行里面的代码;
可以在里面做简单的数据判断,看下是不是我们需要的,不是,我们就不要,是,我们继续接收。
x
单片机串口端的设置,主要是串口波特率发生,串口模式设置,打开串口中断,3个步骤。
x
x
看看下载软件的案例代码。
我们摘取我们需要的部分。
里面主要由有几个子函数,一个主函数。我们只需要子函数的串口中断函数,另外的发送的函数不要。因为我们单片机只接受手机蓝牙发过来的信息,单片机不发信息给手机蓝牙。
。
#include "reg51.h"
#include "intrins.h"#define FOSC 11059200UL
#define BRT (65536 - FOSC / 115200 / 4)sfr AUXR = 0x8e;bit busy;
char wptr;
char rptr;
char buffer[16];void UartIsr() interrupt 4 using 1
{if (TI){TI = 0;busy = 0;}if (RI){RI = 0;buffer[wptr++] = SBUF;wptr &= 0x0f;}
}void UartInit()
{SCON = 0x50;TMOD = 0x00;TL1 = BRT;TH1 = BRT >> 8;TR1 = 1;AUXR = 0x40;wptr = 0x00;rptr = 0x00;busy = 0;
}void UartSend(char dat)
{while (busy);busy = 1;SBUF = dat;
}void UartSendStr(char *p)
{while (*p){UartSend(*p++);}
}void main()
{UartInit();ES = 1;EA = 1;UartSendStr("Uart Test !\r\n");while (1){if (rptr != wptr){UartSend(buffer[rptr++]);rptr &= 0x0f;}}
}
改造一下代码:实现串口1,波特率9600,接收到
0+N两个都验证接收到,才对第三个进行处理判断。为了防止数据的错误的接收,需要验证字头等内容。这里我们验证0和N就好了,自己定义也行。
‘0’+‘N’+‘R’======LED0=1,LED1=0;
‘0’+‘N’+‘L’,LED0=1,LED1=1;
‘0’+‘N’+‘D’,LED0=0,LED1=1;
‘0’+‘N’+‘F’,LED0=0,LED1=0;
好。前面的基本概念:
串口
波特率
串口中断,缓冲区
蓝牙模块,
我们有了基本了解。
我们开始动手:
1、配置蓝牙模块,让蓝牙模块的波特率是9600;
2、设置单片机程序,是波特率9600,串口1中断打开;
3、可以通信。
1、配置蓝牙。
https://www.cnblogs.com/Sonny-xby/p/11197973.html
接线:
用蓝牙模块和下载模块直接相连接,不要单片机开发板。
接线,蓝牙模块的VCC—5V0,GND–GND,蓝牙模块的RXD—下载模块的TXD,蓝牙模块的TXD接下载模块的RXD;
下载模块先不插电脑;先按住蓝牙模块的按钮,然后下载模块插进电脑。
三秒后放手松开按钮。
(带小黑色按钮的,要选按着黑色按钮,然后再加电(即插上电脑的USB口)
不带按钮的,要给KEY接线端接上一个电压(VCC),然后再插入电脑,即可
当蓝牙模块state灯变为慢闪,则表明已经进入AT模式。
HC-05蓝牙模块:使用AT命令配置详细步骤
进入AT命令模式方法:
先按住按键,再给模块上电,此时灯是慢闪,进入AT命令模式,默认波特率是38400。
注意:不按按钮给模块上电,是通信模式,灯光为快闪。
常用AT命令:
看不同的AT指令集,要多百度测试下。
这个是HC-05的指令集AT指令集。有一些可能不太合适使用。
AT+VERSION? 返回HC-05的软件版本号
AT+NAME? 返回HC-05的名字
AT+UART? 返回蓝牙波特率
AT+UART=115200,0,0 设置串口波特率115200,1位停止位,无校验
【AT+UART=,, param1: 波特率 param2: 停止位, 0=1位,1=2位 param3: 校验位, 0=无校验,1=奇校验,2=偶校验 默认设置为9600,0,0】
AT+NAME=bluetooth 修改蓝牙模块的名字为bluetooth
AT+PSWD? 查询配对密码
AT+PSWD=”1234” 设置密码1234
AT+ROLE? 查询主从状态,=1:设置成主,=0:设置成从,=2:设置成回环
AT+ROLE=0 设置成从
AT+ORGL 恢复出厂默认设置
使用串口监视器就可以发送指令进行设置了。)
蓝牙的代码,手机蓝牙连接之后,输入0nr,显信息,等等
#include "stc8a8k.h"
#include "intrins.h"
#include "4pinOLED.h"
//波特率是9600
#define FOSC 11059200UL
#define BRT (65536 - FOSC / 9600 / 4)sbit LED0=P0^0;
sbit LED1=P0^1;
//蓝牙接收到字符,左,右,前进,后退,停止,调头,开始循迹
bit cmdflag_REC=0; //接收数据的标记位
bit cmdflag=0;
unsigned char cmdnum=0; //接收数据的个数
unsigned char cmddat=0; //接收的数据
unsigned char cmdbuff[5]=0; //接收缓冲字节
void delay_tms(unsigned int tms)
{unsigned int i,j;for(i=tms;i>0;i--)for(j=0;j<1100;j++);
}
void UartIsr() interrupt 4 using 1
{ if(RI) //是否接收中断{RI=0;cmddat=SBUF; //将缓冲区的数据一个字节,赋值给cmddat,中转一下,不然下次数据进来,把缓冲区刷新了,数据就不见了if(cmddat=='0'&&(cmdnum==0)) //接收数据第一帧{cmdbuff[cmdnum]=cmddat;cmdflag=1; //开始接收数据}elseif(cmdflag==1) //如果不是第一个数据,说明帧头校验通过,就继续接收,{cmdnum++;cmdbuff[cmdnum]=cmddat;//0---1--2--0if(cmdnum>=2){cmdnum=0;cmdflag=0;cmdflag_REC=1;// 停止接收} }}}void UartInit()
{SCON = 0x50; //8位数据,可变波特率AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12TAUXR &= 0xFE; //串口1选择定时器1为波特率发生器TMOD &= 0x0F; //设定定时器1为16位自动重装方式TL1 = 0xE8; //设定定时初值TH1 = 0xFF; //设定定时初值ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1
}void main()
{UartInit();ES = 1;EA = 1;OLED_Init();OLED_Clear();//清空屏幕OLED_ShowString(0,0,"eeeefxx",16);//显示字符串while (1){//***********************蓝牙控制的代码,前进,后退,左转,右转,停止,调头if(cmdflag_REC==1) //{cmdflag_REC=0;if(cmdbuff[0]=='0'&&cmdbuff[1]=='n') //第一个字节为O,第二个字节为N,第三个字节为控制码,手机端发送的应该是0NB等switch(cmdbuff[2]){case 'f' : // 前进forwardOLED_ShowString(0,0,"forward",16);//显示字符串LED0=1;LED0=0;break;case 'b': // 后退backxxxLED0=0;LED0=1;OLED_ShowString(0,0,"backxxx",16);//显示字符串break;case 'l': // 左转leftxxxLED0=1;LED0=1;OLED_ShowString(0,0,"leftxxx",16);//显示字符串break;case 'r': // 右转rightxxLED0=0;LED0=0;OLED_ShowString(0,0,"rightxx",16);//显示字符串break;case 's': // 停止stopxxxOLED_ShowString(0,0,"stopxxx",16);//显示字符串LED0=1;LED0=0;delay_tms(500);LED0=0;LED0=1;delay_tms(500);LED0=1;LED0=0;delay_tms(500);LED0=0;LED0=1;delay_tms(500);break;default:break;} }}
}
实例9、stc8a蓝牙模块HC05或者HC06模块,控制小车。利用定时器1产生通信的波特率9600相关推荐
- STM32系列——手把手教你蓝牙模块HC05、HC06的使用,重在“用起来”(HAL库)
前言 不论是HC05还是HC06,我们用到的都是蓝牙模块的透传功能,只需要用到4个引脚:RXD.TXD.VCC(5V).GND. HC-05的使用 1.HC-05有6个引脚,但是我们只用到4个. 2. ...
- 蓝牙模块HC05与HC06的连接
在Win10环境下的HC05与HC06的连接介绍 用于电脑无法识别蓝牙情况下的曲线救国,开始是失败的操作 曾在电脑管家尝试解决问题WIN+R ,services.msc,发现无法解决问 ...
- #yyds干货盘点#HC-05与HC-06蓝牙模块对比
HC-05与HC-06蓝牙串行端口通讯模块 HC-05和HC-06的硬件相同,都采用英国剑桥的CSR (Cambridge Silicon Radio) 公司的BC417143芯片,支持蓝牙2.1+E ...
- HC-05蓝牙模块遇到的问题与解决方法及实现和手机通信
文章目录 1.蓝牙模块的调试--解决无法与设置AT命令的问题 1)问题1:没有搜索到串口 方法1:网上下载驱动 方法2:自己更新驱动 2)问题2:串口打开失败--PL2303HXA自2012已停产,请 ...
- 蓝牙模块HC05遇到的一些常见的问题
调模块总是让人很头疼,有时候遇到一些其实很简单的问题也找不到原因,着实难受.这里写一点我在配置HC05遇到的一些常见的问题和对一些问题的理解. 如果你觉得对你有帮助,希望点个赞再走,如果按照本文没解决 ...
- 蓝牙模块HC-05使用指南
概述 HC-05蓝牙模块是一种基于蓝牙协议的简单无线通信设备.该模块基于BC417单芯片蓝牙IC,符合蓝牙v2.0标准,支持UART和USB接口. 具有两种工作模式:命令响应工作模式和自动连接工作模式 ...
- 学习记录--蓝牙模块HC05(串口收发)
主要实现:PC上位机与蓝牙之间的通信(收发) 一,HC05模式等一系列设置 参考博客: (11条消息) stm32之蓝牙模块HC-05使用_一剃解千愁的博客-CSDN博客_stm32蓝牙模块的使用 ( ...
- 蓝牙模块hc05原理图_使用步进电机和Android App的蓝牙控制迷你升降机
背景知识视频教程 使用App Inventor创建Android应用viadean.com Arduino微控制器:学习Arduino制作项目 - 国外课栈viadean.com Arduino ...
- 20220727使用汇承科技的蓝牙模块HC-05配对手机进行蓝牙串口的演示
20220727使用汇承科技的蓝牙模块HC-05配对手机进行蓝牙串口的演示 2022/7/27 18:55 Android11:摩托罗拉 motorola edge s 6GB+128GB 骁龙870 ...
最新文章
- 计算机文化基础教程教案,新版《计算机文化基础》教案.doc
- 关于vue.js element ui 表单验证 this.$refs[formName].validate()的问题
- firefox BUG --输入法转换时,关闭浏览器. 5555....... 心碎...
- python getsize_Python getsizeof()和getsize()区分详解
- 实践出真知:微服务经验之避坑指南
- 傅里叶变换和拉普拉斯变换公式总结
- Python实现粒子群(PSO)带惩罚函数多目标优化
- 仿网易云和支付宝首页嵌套滑动
- 惠斯通电桥平衡条件推导
- 优酷Android包瘦身治理思路
- Git学习:来自fengyu的b站听课笔记
- 有了这些网站,让你有看不完的好电影!
- 建立牢固的多功能Smartphone应用程序
- 获取最新、最全的小红书地理位置签到数据。
- 我们无法创建新分区。【错误:0x80042468】
- 浙大计算机科学与技术专业课表,周亚金 - 浙江大学 - 计算机科学与技术
- 校园闲置物品交易平台毕业设计学习
- 牛客练习赛43 c Tachibana Kanade Loves Review
- Arduino寄存器(模拟比较器)
- 关于双字节字符(16 byte)
热门文章
- 深度学习计算框架综述(十三)HVX 计算优化实践—VCAP Hexagon 计算框架介绍
- 摄影测量激光雷达(华测 RTK)操作流程
- C语言define定义数组和函数指针
- C++ 定义二维数组
- Team30 Group Introduction--内有帅哥,欢迎来扰
- python中int占几个字节_python int占几个字节
- 酷绅下午茶:那些年 那些事(一)_型牌男装在线定做 - 阿里巴巴博客
- 【FPGA教程案例37】通信案例7——基于FPGA的FFT,IFFT傅里叶变换和逆变换
- 【应用统计学】参数统计-抽样分布
- 多元线性回归分析详细介绍