(STM32笔记2)基于hc05的蓝牙实验

2023-11-19

实验任务:开机检测 HC05 蓝牙模块是否存在,如果检测不成功,则报错。检测成功之后,显示模块的主从状态,并显示模块是否处于连接状态, DS0 闪烁,提示程序运行正常。按 KEY0 按键,可以开启/关闭自动发送数据(通过蓝牙模块发送);按 KEY1 按键可以切换模块的主从状态。蓝牙模块接收到的数据,将直接显示在 LCD 上(仅支持 ASCII 字符显示)。

HC05模块

图中是正点原子的hc05的引脚连接,普通某宝上掏的hc05 key---en   led----state相连接(相关资料自己找)

main.c

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"	 
//#include "usmart.h"	
#include "usart3.h"
#include "hc05.h" 
#include "string.h"
//主从
void HC05_Role_Show(void)
{
	if(HC05_Get_Role()==1)LCD_ShowString(30,140,200,16,16,"ROLE:Master");	
	else LCD_ShowString(30,140,200,16,16,"ROLE:Slave ");	
}
//连接
void HC05_Sta_Show(void)
{												 
	if(HC05_LED)LCD_ShowString(120,140,120,16,16,"STA:Connected ");			//连接成功
	else LCD_ShowString(120,140,120,16,16,"STA:Disconnect");	 			//未连接				 
}	

int main(void)
{
	u8 t;
	u8 key;
	u8 sendmask=0;
	u8 sendcnt=0;
	u8 sendbuf[20];	  
	u8 reclen=0;  	
	delay_init();	    	  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	
	uart_init(115200);	 	
	LED_Init();				
	KEY_Init();				
  LCD_Init();				
	 
	POINT_COLOR=RED;
	LCD_ShowString(30,30,200,16,16,"ALIENTEK STM32F1 ^_^");	
	LCD_ShowString(30,50,200,16,16,"HC05 BLUETOOTH COM TEST");	
	LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");
	delay_ms(1000);	
	while(HC05_Init())
	{
		LCD_ShowString(30,90,200,16,16,"ATK-HC05 Error!"); 
		delay_ms(500);
		LCD_ShowString(30,90,200,16,16,"Please Check!!!"); 
		delay_ms(100);
	}
	LCD_ShowString(30,90,210,16,16,"KEY1:ROLE KEY0:SEND/STOP");    
  LCD_ShowString(30,160,200,16,16,"Send:");	
	LCD_ShowString(30,180,200,16,16,"Receive:"); 
	POINT_COLOR=BLUE;
	HC05_Role_Show();
	delay_ms(100);
	USART3_RX_STA=0;
	while(1)
	{
		key=KEY_Scan(0);
		if(key==KEY1_PRES)//按下key1
		{
			key=HC05_Get_Role();
			if(key!=0xff)
			{
				key=!key;  					//状态取反	   
				if(key==0)HC05_Set_Cmd("AT+ROLE=0");
				else HC05_Set_Cmd("AT+ROLE=1");
				HC05_Role_Show();
				HC05_Set_Cmd("AT+RESET");	//复位ATK-HC05模块
				delay_ms(200);
			}
		}
		else if(key==KEY0_PRES) //按下key0
		{
			sendmask=!sendmask;				//发送/停止发送  	 
			if(sendmask==0)LCD_Fill(30+40,160,240,160+16,WHITE);
		}else delay_ms(10);
		if(t==50)
		{
			if(sendmask)
			{
				sprintf((char*)sendbuf,"ALIENTEK HC05 %d\r\n",sendcnt);
				LCD_ShowString(30+40,160,200,16,16,sendbuf);
				u3_printf("ALIENTEK HC05 %d\r\n",sendcnt);	
				sendcnt++;
				if(sendcnt<99)sendcnt=0;
				
			}
			HC05_Sta_Show();
			t=0;
			LED0=!LED0;
		}
		//接收数据
		if(USART3_RX_STA&0x8000)
		{
			LCD_Fill(30,200,240,320,WHITE);	
			reclen=USART3_RX_STA&0x7fff;
			USART3_RX_BUF[reclen]=0;	 	//加入结束符
			if(reclen==9||reclen==8) 		//控制DS1检测
			{
				//这两句控制led1关和亮
				if(strcmp((const char*)USART3_RX_BUF,"+LED1 ON")==0)LED1=0;	//打开LED1
				if(strcmp((const char*)USART3_RX_BUF,"+LED1 OFF")==0)LED1=1;//关闭LED1
			}
 			LCD_ShowString(30,200,209,119,16,USART3_RX_BUF);//显示接收到的数据
 			USART3_RX_STA=0;	 
		}	 	
			t++;
		}
}

	
	
	

main中while循环判断key0和key1,实现相关功能,

sprintf((char*)sendbuf,"ALIENTEK HC05 %d\r\n",sendcnt);这句话中sprint的语法和printf很像,printf是讲结果送到屏幕,sprintf是将结果送到字符串。与printf相比,sprintf多了一个需要传送到的字符串的变量的名称。

举一个例子如下:

#include<stdio.h>
 
main() {
    char strA[20];
    printf("This is a string.\n");
    sprintf(strA,"This is a string.\n");
    printf("%s",strA);     
}

 程序最后加入如检测ds1的代码,手机助手连接蓝牙后进行手机输入,单片机进行反馈。

hc05.h的代码简单说一下查询当前主从状态的代码HC05_Get_Role

//查角色
u8 HC05_Get_Role(void)
{	
	u8 retry=0x0a;
	u8 temp,t;
	while(retry--)
	{
		HC05_KEY=1;
		delay_ms(5);
		u3_printf("AT+ROLE?\r\n");
		for(t=0;t<15;t++)//次循环用于等待hc05相应
		{
			delay_ms(10);
			if(USART3_RX_STA&0X8000)break;
		}	
		HC05_KEY=0;
		if(USART3_RX_STA&0x8000)
		{
			temp=USART3_RX_STA&0x7fff;
			USART3_RX_STA=0;
			if(temp==13&&USART3_RX_BUF[0]=='+')//接收到正确的应答了
			{
				temp=USART3_RX_BUF[6]-'0';
				break;
			}
		}
	}
	if(retry==0)temp=0xff;
	return temp;
}

拉高拉低key进入退出at模式if判断串口三的数据将数据的存在buf里面,将数据的大小放在STA里面,正长回应是

+ ROLE:<Param>/r/n
OK/r/n

加上回车换行是13个,temp判断是否是13长度,并判断第一个是啥字符

我们得到的是ASCII,必须减掉‘0’的ASCII值才能得到数字。

                                                                                                                                                            hc05初始化中    GPIO_SetBits()函数               

  • 实现功能:控制某个GPIO引脚的输出电平(拉高 / 拉低)
  • GPIO_SetBits   拉高引脚输出电平
  • GPIO_ResetBits 拉低引脚输出电平

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(STM32笔记2)基于hc05的蓝牙实验 的相关文章

  • python笔记2--python 中安装package注意事项

    python笔记2 python 中安装package注意事项 使用python时候 经常需要安装相关的包 安装方法包括两种 1 直接使用easy install或者pip安装 2 下载package源码安装 1 直接使用easy inst
  • macbook上的vim怎么设置语法高亮和显示行号

    在我写这篇文章之前我的vim就很普通 没有语法高亮 无法显示行号 但是我通过在网上不断查阅一些处理方法和经验之后 我终于能将我MacBook电脑上的vim配置出语法高亮和显示行号了 作为一名乐于分享 乐于助人的新手程序员 我决定把我的解决办
  • 《Web应用安全权威指南》学习笔记

    第1章 什么是Web应用的安全隐患 第2章 搭建试验环境 邮件发送服务器Postfix POP3服务器Dovecot SSH服务器OpenSSH Web应用调试工具Fiddler 第3章 Web安全基础 HTTP回话管理 同源策略 Cook

随机推荐

  • k8s安全04--kube-apiserver 安全配置

    k8s安全04 kube apiserver 安全配置 1 介紹 2 安全配置 2 1 配置 insecure port 2 2 RBAC 2 3 Service Accounts 2 4 Researching Pod Security
  • Nginx 无法转发本地端口

    问题描述 本文主要分析解决 centos 下 nginx 配置端口转发后不生效 通过 nginx 配置 server 转发后 无法达到预期的转发目的 并出现502错误的问题 假设虚拟机 ip 为 192 168 0 8 并且在虚拟机内部署一
  • ISO七层模型

    物理层 O S I 模型的最低层或第一层 该层包括物理连网媒介 如电缆连线连接器 物理层的协议产生并检测电压以便发送和接收携带数据的信号 在你的桌面P C 上插入网络接口卡 你就建立了计算机连网的基础 换言之 你提供了一个物理层 尽管物理层
  • uni-app项目在微信开发者工具打开时报错[ app.json 文件内容错误] app.json: 在项目根目录未找到 app.json

    uni app项目在微信开发者工具打开时控制台报错 app json 文件内容错误 app json 在项目根目录未找到 app json env Windows mp 1 06 2303220 lib 2 32 0 解决方案 以下是一个u
  • 前端基础之ES6

    1 前后端对比 2 ES6 ECMAScript6 0 以下简称ES6 ECMAScript是一种由Ecma国际通过ECMA 262标准化的脚本 是JavaScript语言的下一代标准 2015年6月正式发布 从ES6开始的版本号采用年号
  • S-DES加密

    S DES加密 Simplified Data Encryption Standard S DES 是一个供教学的非安全的加密算法 它与DES的特性和结构类似 但参数小 明文分组为8位 主密钥分组为10位 采用两轮迭代 S DES加密过程包
  • 第十一讲、FPGA开发中xilinx vivado 平台时序分析系列课程-边沿对齐input delay ddr双沿采样时序约束与收敛

    我们在使用一些以太网PHY和FPGA接口是RGMII接口是DDR双沿结构 还有ADC芯片也也是DDR双沿采样接口 以及CMOS视频传感器也有很多DDR双沿源同步接口 我们这里以IMX222视频传感器的的DDR为例约束input ddr 接口
  • FPGA提示产生latch的报错

    在fpga的设计中有时会遇到 latch 的报错 1 latch是什么 Latch 就是锁存器 是一种在异步电路系统中 对输入信号电平敏感的单元 用来存储信息 锁存器在数据锁存使能时 数据被锁存 输入信号不起作用 这违背了组合逻辑中输出随输
  • selenium元素定位方法 id,name,class

    1 导入selenium from selenium import webdriver from time import sleep 2 打开浏览器 最大化 driver webdriver Chrome driver maximize w
  • Java 学习路线大全,再也不用迷路啦(持续更新)

    路线特点 最新 完整一条龙 从入门到入土 表示推荐学习 给出目标 学习建议 关键知识点 最优资源以及各类资源推荐 视频 书籍 文档 项目 工具等 划分阶段 更有计划 且在最后给出持续学习的方向 探索 Java 程序员发展的无限可能 前言 首
  • SQLSERVER排查CPU占用高的情况

    一般排查都是用下面的脚本 一般会用到三个视图 sys sysprocesses dm exec sessions dm exec requests sys sysprocesses 系统表是一个很重要的系统视图 主要用来定位与解决Sql S
  • 存储类型auto,static,extern,register的区别 <转>

    变量和函数的属性包括数据类型和数据的存储类别 存储类别指数据在内存中存储方式 静态和动态 包含auto static register extern四种 内存中 具体点来说内存分为三块 静态区 堆区 栈区 外部变量和全局变量存放在静态区 局
  • 半监督学习——数据精馏(论文阅读)

    论文地址 https arxiv org pdf 1712 04440 pdf 1 论文与摘要 Data Distillation Towards Omni Supervised Learning 摘要 作者提出一种特殊的半监督学习方法 取
  • android 最新动态,浅谈Android动态页面(一)

    这是一个很微妙的东西 可能平时经常用到 但是没注意 我想对这个内容进行一个总结并提出一些看法 谈的是动态页面 不是动态布局 一 什么是动态页面 什么是动态页面 我认为是一种在开发时的设计思想 最终展示的页面会随着数据的改变而改变 或者说会根
  • OpenCV中如何读取URL图像文件

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 由来 最近知识星球收到的提问 觉得是一个很有趣的问题 就通过搜集整理归纳了一番 主要思想是通过URL解析来生成数据 转为图像 Mat对象 但是在Python语言与C 语言
  • Java基础学习总结(1)——equals方法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 equals方法介绍 1 1 通过下面的例子掌握equals的用法 1 package cn galc test 2 3 public class TestEquals
  • 简单spring cloud服务升级实现

    1 升级原则 隔离性 v1升级到v2时 相互独立 互不不干扰 稳定性 服务不停止 完成升级 接口保持畅通 2 具体实现 2 1 eureka项目 搭建eureka 网上很多 就省略了 2 2 feign接口项目 2 2 1 依赖
  • React Hooks

    React Hooks 为什么使用 React Hook useState hook useReducer hook useEffect hook useRef hook useLayoutEffect hook useImperative
  • GPIO口的八种工作状态

    一直对GPIO的工作状态不是很熟悉 导致在设置IO状态时 经常会设置成推挽上拉 或者推挽下拉 开漏上拉等问题 虽然看起来没有影响MCU工作 但感觉这是一种无知的表现 现在总结下GPIO口的八种工作状态 其中四种输入状态 四种输出状态 一 输
  • (STM32笔记2)基于hc05的蓝牙实验

    实验任务 开机检测 HC05 蓝牙模块是否存在 如果检测不成功 则报错 检测成功之后 显示模块的主从状态 并显示模块是否处于连接状态 DS0 闪烁 提示程序运行正常 按 KEY0 按键 可以开启 关闭自动发送数据 通过蓝牙模块发送 按 KE