一、目的
二、设备模块
三、背景任务和原理接线
四、步骤
五、效果
六、心得
**

一、目的

**
掌握串口通信的基本知识,先照葫芦画瓢,跟着大概了解做一遍,慢慢了解;
掌握蓝牙模块的知识;
掌握定时器产生波特率的写法;
掌握串口中断的写法。

二、设备

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相关推荐

  1. STM32系列——手把手教你蓝牙模块HC05、HC06的使用,重在“用起来”(HAL库)

    前言 不论是HC05还是HC06,我们用到的都是蓝牙模块的透传功能,只需要用到4个引脚:RXD.TXD.VCC(5V).GND. HC-05的使用 1.HC-05有6个引脚,但是我们只用到4个. 2. ...

  2. 蓝牙模块HC05与HC06的连接

    在Win10环境下的HC05与HC06的连接介绍         用于电脑无法识别蓝牙情况下的曲线救国,开始是失败的操作 曾在电脑管家尝试解决问题WIN+R ,services.msc,发现无法解决问 ...

  3. #yyds干货盘点#HC-05与HC-06蓝牙模块对比

    HC-05与HC-06蓝牙串行端口通讯模块 HC-05和HC-06的硬件相同,都采用英国剑桥的CSR (Cambridge Silicon Radio) 公司的BC417143芯片,支持蓝牙2.1+E ...

  4. HC-05蓝牙模块遇到的问题与解决方法及实现和手机通信

    文章目录 1.蓝牙模块的调试--解决无法与设置AT命令的问题 1)问题1:没有搜索到串口 方法1:网上下载驱动 方法2:自己更新驱动 2)问题2:串口打开失败--PL2303HXA自2012已停产,请 ...

  5. 蓝牙模块HC05遇到的一些常见的问题

    调模块总是让人很头疼,有时候遇到一些其实很简单的问题也找不到原因,着实难受.这里写一点我在配置HC05遇到的一些常见的问题和对一些问题的理解. 如果你觉得对你有帮助,希望点个赞再走,如果按照本文没解决 ...

  6. 蓝牙模块HC-05使用指南

    概述 HC-05蓝牙模块是一种基于蓝牙协议的简单无线通信设备.该模块基于BC417单芯片蓝牙IC,符合蓝牙v2.0标准,支持UART和USB接口. 具有两种工作模式:命令响应工作模式和自动连接工作模式 ...

  7. 学习记录--蓝牙模块HC05(串口收发)

    主要实现:PC上位机与蓝牙之间的通信(收发) 一,HC05模式等一系列设置 参考博客: (11条消息) stm32之蓝牙模块HC-05使用_一剃解千愁的博客-CSDN博客_stm32蓝牙模块的使用 ( ...

  8. 蓝牙模块hc05原理图_使用步进电机和Android App的蓝牙控制迷你升降机

    背景知识视频教程 使用App Inventor创建Android应用​viadean.com Arduino微控制器:学习Arduino制作项目 - 国外课栈​viadean.com Arduino ...

  9. 20220727使用汇承科技的蓝牙模块HC-05配对手机进行蓝牙串口的演示

    20220727使用汇承科技的蓝牙模块HC-05配对手机进行蓝牙串口的演示 2022/7/27 18:55 Android11:摩托罗拉 motorola edge s 6GB+128GB 骁龙870 ...

最新文章

  1. 计算机文化基础教程教案,新版《计算机文化基础》教案.doc
  2. 关于vue.js element ui 表单验证 this.$refs[formName].validate()的问题
  3. firefox BUG --输入法转换时,关闭浏览器. 5555....... 心碎...
  4. python getsize_Python getsizeof()和getsize()区分详解
  5. 实践出真知:微服务经验之避坑指南
  6. 傅里叶变换和拉普拉斯变换公式总结
  7. Python实现粒子群(PSO)带惩罚函数多目标优化
  8. 仿网易云和支付宝首页嵌套滑动
  9. 惠斯通电桥平衡条件推导
  10. 优酷Android包瘦身治理思路
  11. Git学习:来自fengyu的b站听课笔记
  12. 有了这些网站,让你有看不完的好电影!
  13. 建立牢固的多功能Smartphone应用程序
  14. 获取最新、最全的小红书地理位置签到数据。
  15. 我们无法创建新分区。【错误:0x80042468】
  16. 浙大计算机科学与技术专业课表,周亚金 - 浙江大学 - 计算机科学与技术
  17. 校园闲置物品交易平台毕业设计学习
  18. 牛客练习赛43 c Tachibana Kanade Loves Review
  19. Arduino寄存器(模拟比较器)
  20. 关于双字节字符(16 byte)

热门文章

  1. 深度学习计算框架综述(十三)HVX 计算优化实践—VCAP Hexagon 计算框架介绍
  2. 摄影测量激光雷达(华测 RTK)操作流程
  3. C语言define定义数组和函数指针
  4. C++ 定义二维数组
  5. Team30 Group Introduction--内有帅哥,欢迎来扰
  6. python中int占几个字节_python int占几个字节
  7. 酷绅下午茶:那些年 那些事(一)_型牌男装在线定做 - 阿里巴巴博客
  8. 【FPGA教程案例37】通信案例7——基于FPGA的FFT,IFFT傅里叶变换和逆变换
  9. 【应用统计学】参数统计-抽样分布
  10. 多元线性回归分析详细介绍