【蓝牙控制点亮Led灯】

完整资料和技术指导请看:

博客地址       

 

昨天遇到这个问题,需要使用 手机蓝牙 与 单片机连接的蓝牙完成 通信控制。以点亮led 为目的进行测试开发。因为没有搞过蓝牙模块,又对这个东西不太自信。所以断断续续折腾了一整天。 最终还是 搞定了,所以 把整个过程梳理一下,也希望能帮助到大家,小白们,看过来吧。

 

 开发器件: 蓝牙模块(HC-05)、最小系统板(晶振11.0592使用了9600的波特率)、单片机(STC89C52RC)、

   USB转TTL烧录器、一些 杜邦线、 另加一个 蓝牙功能完好的手机或者平板+蓝牙串口软件(个人用的是蓝牙串口

      在测试的过程中 还使用到了一个Arduino的板子,但其实没有什么用。上边的 设备就够用了。

 

本文中 涉及到的所有测试软件、手机软件、开发工具、源代码,包括HEX文件,一些单片机小工具。我会统一 打包到 CSDN 下载库。

如果在开发的过 程中遇到什么问题,也欢迎交流,毕竟解决bug 才是进步的源泉。

 

  废话不说,直接看成果。

 

 

       如图所示,USB给单片机5V供电,下载器 的 VCC和GND 连接最小系统的VIN和GND。最小系统通过5V和GND连接蓝牙模块,TXD连接RXD,RXD连接TXD,完成与蓝牙模块的供电 和 串口通信连接。最小系统使用GND和P2.0与led连接,P2.0接led的正极。(ps:此处是低电平点亮led,如果需要高电平点亮led,可能需要连接vcc和P2.0)。

     开启最小系统的开关,此时 HC-05的指示灯闪烁,打开手机的蓝牙 选择 连接设备,然后选择检测到的设备进行连接,连接成功,蓝牙模块 会 2s一闪,连闪两次。即可发送数据。发送0会点亮led,发送其他会熄灭 led。至于代码在 文末。

 

功能已经 实现了,现在 讲一下我的整个实现流程:

 

1.单独调试 蓝牙模块 HC-05 ,完成一些设置,设置主从站。

2.整个设备的硬件连接。

3.程序的解析 和 测试。

4.涉及到的一些知识,和学到的一些内容。

 

------------------------------------------------------------------------------

1.单独调试 蓝牙模块 HC-05 ,完成一些设置,设置主从站。

    第一部分:

    首先,连接,蓝牙HC-05通过USB转TTL的下载线,连接电脑。

在完成 硬件连接 之后,先不要上电,上电的同时,按着 蓝牙模块的HC- 05的一个按键(小黑点),上电完成之后,松开按键,指示灯会1s一闪。说明 模块进入 AT 指令模式。进入AT模式,可以通过串口发送AT指令 进行硬件的设置。

 

电脑端使用SSCOM42 的串口助手:选择合适的 Com口,选择38500,38500是蓝牙模块AT模式的可用波特率。

 

关于AT指令的内容在这里:

 

    ATK-HC05蓝牙模块的详细说明:  https://blog.csdn.net/u011318735/article/details/17429879

 

我个人只需要 几条命令就可以完成调试:(具体的说明请进入 上方链接查看)具体用到用不到,记不太清楚了。

 AT+STATE:这个指令用来查询蓝牙模块当前的状态。

AT+INQM:设置或查询访问模式,格式如此。

AT+RESET:该指令顾名思义,是复位HC05蓝牙设备的,

AT+PSWD:这个指令时设置蓝牙模块的配对密码

AT+ROLE:该指令用于选择HC05蓝牙模块的角色,

 

    AT+ROLE=0\r\n  将蓝牙模块设置成从角色,只能被动连接

    AT+ROLE=1\r\n  将蓝牙模块设置成主角色,可以查询周围SPP蓝牙从设备,并发送连接

 

AT_UART:这个指令是设置串口的参数,

 

    AT+UART=9600,0,0  此处一定设置成9600,因为是蓝牙模块的正常工作波特率,因为这个东西废了很多时间。

 

正常 情况下发送如下指令:

     AT+ROLE=0

    AT+PSWD=1234

    

    AT+UART=9600,0,0

    AT+STATE              返回 +STATE:INITIALIZED    OK         ====》说明处于初始化状态,是正常情况,完成设置就能断电了

 

主要就是设置主从站,密码,波特率。就算是完成了,通过SSCOM42设置 成功,会返回 OK。具体的细节去参考上边的博客。

 

    功能测试:通过AT完成设置之后,蓝牙模块就可以使用了,断电,再上电,蓝牙模块的指示灯会闪烁,此时通过手机搜索蓝牙,可以搜索到蓝牙模块,通过1234密码连接,此时蓝牙模块的指示灯会 2s一闪烁,每次闪烁 2次,说明连接成功。

此时 可以通过手机蓝牙发送 数据到 蓝牙模块,并通过电脑端的 SSCOM42或者其他的串口助手查看到 接收的信息。 需要关闭串口,设置波特率9600,再打开串口,因为 蓝牙模块的 AT模式下 波特率是 38500,在正常工作模式下是 9600。

------------------------------------------------------------------------------

 

 

2.整个设备的硬件连接。

    

硬件的连接如图所示,我觉得比较清楚了,就不写什么说明了,注意串口通信 是 TXD接RXD ,RXD接TXD,就够用了。

手机端的软件:就不打包了,我是从 360商店下载的,用的是左边的蓝牙串口软件。

------------------------------------------------------------------------------

3.程序的解析 和 测试。

普通 点亮 led闪烁 的程序:

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
sbit led = P2^0;
void delay50ms();
void main()
{
        led = 0;
        while(1)
        {							   
		led = ~led; 
		delay50ms();
	}

}

void delay50ms(void)   //误差 0us
{
    unsigned char a,b;
    for(b=173;b>0;b--)
        for(a=143;a>0;a--);
}

串口通信中 点亮led的程序:真的不想贴 源代码,想挣个积分的,但是又不想折磨你们,还是给你们吧,然后

//**** 声明 ********************************************************************
/*******************************************************************************
 * 下面来自互联开源程序,由广州汇承信息科技有限公司收集
 * 方便用户参考学习,本公司不提供任何技术支持
 * 程序仅供测试参考,不能应用在实际工程中,不一定能通过编译
 * 公司网站  http://www.hc01.com/
 * 淘宝网址  http://hc-com.taobao.com/
*******************************************************************************/
               		       
/*-----------------------------------------------------------------------------
* 实 验 名		 : RS232串口试验
* 实验说明     : 单片机串口接收数据控制灯亮灭
* 连接方式     : 
* 注    意		 : 该试验使用的晶振是11.0592
*******************************************************************************/

#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint  unsigned int

uchar PuZh[36] = "广州汇承信息科技有限公司www.hc01.com";

//--定义使用的IO--//

sbit LED=P2^0;


//--声明全局函数--//   
void UsartConfiguration();
void Delay_1ms(uint i);


/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无 * 输出 : 无
***********************************************************************/
void Com_Int(void) interrupt 4
{
	uchar i;
  uchar receive_data;
	
  EA = 0;
	
  if(RI == 1) //当硬件接收到一个数据时,RI会置位
	{ 		
		RI = 0;
		receive_data = SBUF;//接收到的数据
			
		if(receive_data == '1')	 
		{
				LED = 0;//接收到1亮灯
		}
		else
		{
				LED = 1; //其他情况灯灭
		}
		
	}
		
		for(i=0; i<36; i++)
		{
			SBUF = PuZh[i];   //将要发送的数据放入到发送寄存器
			while(!TI);		    //等待发送数据完成
			TI=0;			        //清除发送完成标志位
			Delay_1ms(1);
		}
		EA = 1;
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		   : 主函数
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/

void main()
{

	UsartConfiguration();//初始化串口
	
	while(1);	
}
	
/*******************************************************************************
* 函 数 名       : UsartConfiguration()
* 函数功能		   : 设置串口
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/

void UsartConfiguration()
{	
	SCON=0X50;			//设置为工作方式1,8位数据,可变波特率
	TMOD=0X20;			//设置计数器工作方式2
	PCON=0X00;			//波特率不加倍
	TH1=0XFd;		    //计数器初始值设置,9600@11.0592MHz
	TL1=0XFd;
	TR1=1;					//打开计数器
	ES = 1;         //开串口中断
  EA = 1;         //开总中断
}


/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms
* x * 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
  uchar x,j;
  
  for(j=0;j<i;j++)
    for(x=0;x<=148;x++);
}

恩,就这些。

------------------------------------------------------------------------------

 

4.涉及到的一些知识,和学到的一些内容。

   在学习的过程中,了解了 JATG 烧录线 和 串口烧录的区别,以及 JATG不能烧录STC89C52的芯片。

   了解了EA为什么接VCC,以及关于 中断的 一些内容。

   了解了低电平 点亮 led 和 高电平点亮led 的区别。

   认识到了波特率的重要性,因为波特率的问题,整整折腾了一天。

------------------------------------------------------------------------------

 

 

 

 

(如果真的有积分,希望你们能下载)涉及到的所有资料:https://download.csdn.net/download/ca1m0921/10454017

  

有什么 问题欢迎交流。

 

 

 

 

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值