2024年蓝牙模块HC-05与51单片机的连接_hc05蓝牙模块密码,2024年最新C C++性能优化最佳实践

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

输入正确的密码后,继电器高电平,LED构成回路后点亮,返回给手机端计费信息和成功解锁提示。数码管开始计时,每10毫秒变动一次,8个数码管两个一组,分别显示小时、分钟、秒、十毫秒。当处于计费状态时,手机端发送数据,返回无法发送的字样。按下按键S4后,停止计费,返回到手机端计时时长和本次费用,数码管清零,等待下次解锁。

二.单片机工作原理

51单片机有P0、P1、P2、P3四个端口。本次实验将其中P0用于数码管的显示数字,P1用于流水灯的显示,P2端口的第1位(P2^1)接在继电器的DIO端,在单片机内控制高低电平。P3端口的第0位连接蓝牙的TX端,是单片机串口的接收端,P3端口的第1位连接蓝牙的RX端,是单片机串口的发送端。按键S4在内部连接P3端口的第2位,为外部中断0。按键S5在内部连接P3端口的第3位,为外部中断1。开启定时器0,设置好计数器的初始值;外部中断0,1打开;串口中断打开,设置好波特率9600,0,0与蓝牙模块一致即可。

串口的中断触发后,需要软件清除RI(接收中断)与TI(发送中断)值为0,SBUF存放串口接收数据或发送数据,在C语言代码中赋值相同寄存器,在物理上分为发送和接收,每次1字节缓冲。

定时器0设置工作方式0,13位计数器,计数到8192。晶振为11.0592MHz,每个机器周期需要12个时钟周期,计数5000次,所以每次进入中断的时间为5000*12/11.0592M=0.00543s,所以每次进入中断时间为0.005秒,数码管需要每10ms进入一次,所以每次加到2的时候,数码管变动。计数器初值为(8192-5000),分别存放入TH0与TL0,高低位。

外部中断直接设置触发方式ITx=0/1低电平触发或下降沿触发后,开启外部中断,EXx=1后,编写相应中断函数即可。

蓝牙模块首先按住复位键上电,即进入AT指令模式,对它输入AT指令进行设置名字、串口波特率、主从回环等后,连接到单片机上即可使用。

三.模块工作原理

二维码扫描APP:

通过谷歌开源ZXing库开发了一款安卓APP,并安装到手机,扫描出数据后通过蓝牙模块输入到单片机中。

扫描后为“12345678”。

蓝牙模块HC-05:

TX连接单片机P3.0口,RX连接单片机P3.1口。

在蓝牙模块连接到单片机上前,首先通过USB-TTL转接器,连接到电脑上后,通过串口调试助手调试。首先进入命令调试模式,输入AT指令,设置模块的参数。

设置蓝牙的名称,用指令

AT+name=”LiMou”\r\n 设置蓝牙模块名字为LiMou,方便后续查找。

设置自动连接模式的串口波特率为9600,用指令

AT+uart=9600,0,0\r\n        设置波特率为9600,停止位1位,无校验位。

用于手机与单片机之间的通信者,发送密码到密码上,在接入计费系统时,向手机端发送解锁成功标志,并提供计费标准。解锁失败发送解锁失败指示。

测试问题:

如果串口收不到数据,换一个模块。

如果单片机收到数据错误,调整波特率,通过串口助手调节。

继电器模块:

继电器电源连接VCC,GND接地,DIO连接单片机P2.1端口,继电器的模块的开闭表示单车的开闭锁。在继电器下接入一个LED的小灯,用它的亮灭来表示继电器是否上电,是否已经开锁。

LED:

连接通过继电器构成回路,长脚(正极)接电源,短脚(负极)接继电器常闭端,继电器公共触点引到地,构成回路,点亮小灯(在继电器DIO高电平时)。

数码管:

给P1口送编码即可,0-F的编码分别为0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71。

其中P26为段选通,P27为位选通。

用于计时模块和指示通过蓝牙传入的密码数据。

按键:

根据不同按键连接的端口触发不同的中断,编写对应的中断函数。在本系统中,外部中断0通过独立键盘模块按键S4实现,低电平触发,在计费状态下,停止计费,并向手机发送计费结果。

外部中断1通过独立键盘模块按键S5实现,下降沿触发,当在非计费状态下,清空数码管显示为全0。

流水灯:

流水灯连接到单片机的P1端口,直接对P1口赋值即可,高电平为灭,低电平亮。用于指示接收数据的ASCII码和错误输入提示,全亮。

51单片机代码:

#include "reg51.h"
#include <intrins.h>
sbit lock = P2 ^ 1;
sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;

unsigned char digit_led_pointer = 0;
unsigned char count = 0;
unsigned char opened = 0;

unsigned char code table[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };	// 数码管0-f表

unsigned char led[] = { 0, 1, 2, 3, 4, 0, 0, 0 };	//存放8个数码管显示的数字


void delay(unsigned int i)		//延迟函数
{
	while (--i);
}

void clear_digit(void)			//清空数码管,全变成0
{
	unsigned char i = 0;
	for (; i < 8; ++i)
		led[i] = 0;
	digit_led_pointer = 0;
}


void send(unsigned char dat)	//通过串口发送到蓝牙模块上,蓝牙模块发送出去一个字节的字符
{
	ES = 0;
	SBUF = dat;
	while (!TI);
	TI = 0;
	ES = 1;
}

void send_str(unsigned char * str)	//通过蓝牙模块发送一个字符串
{
	while (*str != '\0')
		send(*str++);
}


void display(unsigned char dig)		//输入密码阶段的显示,在已经输入的密码后续进行输入
{
	led[digit_led_pointer++] = dig;
	if (digit_led_pointer == 8)
	{
		//判断如果输入密码为12345678的话,返回解锁成功
		if (led[7] == 8 && led[6] == 7 && led[5] == 6 && led[4] == 5 && led[3] == 4 && led[2] == 3 && led[1] == 2 && led[0] == 1 && (opened == 0))
		{
			//开锁状态置位
			opened = 1;
			lock = 1;	//开锁继电器,高电平,点亮LED
			clear_digit();
			send_str("price: 1Yuan/min\n");
			send_str("lock successfully!\n");
		}
		else
		{
			delay(10000000);	//输入8位密码后,延迟显示错误密码
			clear_digit();
			//解锁失败
			send_str("lock fail!\n");	//向手机发送提示信息
		}
		digit_led_pointer = 0;
	}
}


//计时模块,每次进入该函数,为10毫秒
void time_add_10ms()
{
	led[7]++;
	//100进位,每次10毫秒
	if (led[7] == 10)
	{
		led[7] = 0; led[6]++;
	}

	if (led[6] == 10)
	{
		led[6] = 0; led[5]++;
	}

	//60进位,为秒数
	if (led[5] == 10)
	{
		led[5] = 0; led[4]++;
	}

	if (led[4] == 6)
	{
		led[4] = 0; led[3]++;
	}
	//分钟数
	if (led[3] == 10)
	{
		led[3] = 0; led[2]++;
	}

	if (led[2] == 10)
	{
		led[2] = 0; led[1]++;
	}
	//小时数,如果100个小时清零
	if (led[1] == 10)
	{
		led[1] = 0; led[0]++;
	}

	if (led[0] == 10)
		clear_digit();
}

//定时器0,为1号中断
void timer0_ISR(void) interrupt 1
{
	if (opened == 1)
	{
		//晶振为11.0592MHz,每个机器周期需要12个时钟周期,计数5000次,所以每次进入中断的时间为
		//	5000*12/11.0592M=0.00543s,每次进入add_10ms函数需要计数2次,所以每次count==2的时候,数码管显示+1
		TL0 = (8192 - 5000) % 32;
		TH0 = (8192 - 5000) / 32;
		count++;


![img](https://img-blog.csdnimg.cn/img_convert/3bb3b4da3a8a6ea817dd2669370fc4df.png)
![img](https://img-blog.csdnimg.cn/img_convert/5116666038b0ba0b28a33a07c8b5fb20.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

...(img-irmyiBjE-1715677149702)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值