2019-04-13 23:05:51 qq_32945473 阅读数 512
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3414 人正在学习 去看看 朱有鹏

51单片机连接HC05-C发送指令

1.蓝牙模块AT模式设置

AT模式:用于设置蓝牙模块的名字,密码等,我们可以通过:

  1. 在通电前按住黑色复位键,然后接通电源,这时蓝牙模块上LED灯会每隔2秒闪烁一次则表示您成功进入AT模式。
  2. 找到任意的找到串口助手并打开
  3. 在打开的串口助手选择正确的端口和波特率
  4. 在输入框中输入AT,在发送数据,如果返会OK则成功
  5. AT+NAME=zoe //设置蓝牙名称为zoe
  6. AT+ROLE=0 //设置主从模式:0从机,1主机
  7. AT+PSWD=1234 //设置配对密码,如1234

2.连接的引脚

51单片机 HC05-C
VCC Vcc
RXD TXD
TXD RXD
GND GND

1.有关程序

#include <reg52.h> 		  //包含所用到的头文件
#include <string.h>
#include <stdio.h>

sbit LED1 = P1^0;				//设置LED灯的口子
unsigned char Read_Buffer[];    //定义读入数据数组
void main(void)
{

	TMOD=0x20;		   			//设置定时器T1工作在方式2(自动装载的8bit Timer)    
	TH1=0xfd;					//设置波特率9600,所需要的Timer初值
	TL1=0xfd;
	TR1=1;						//启动Timer
	TI=1;						//允许串口的发送中断(RI串口的接受中断)
	REN=1;          			//允许串行口接受数据
	SM0=0;						//串口工作方式2
	SM1=1;
	EA=1;           			//开启总中断
	ES=1;						//开启串口中断

	while(1){;}	
}

void ser() interrupt 4
{
	if (RI)
	{
		RI=0;
		Read_Buffer[0]=SBUF;	
		if (Read_Buffer[0] == '1')
		{
			LED1 = 0;
		}else
		{
			LED1 = 1;
		}
			
	}
    
}
2019-05-31 22:23:09 qq_36863664 阅读数 458
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3414 人正在学习 去看看 朱有鹏

一、问题

通过蓝牙助手(或串口调试助手)调试,HC-05与PC机能正常通信;
与89C51相连接,HC-05也能接收到数据,但接收到的是乱码。

二、解决办法

波特率一致(我设置的是4800);
波特率加倍(不知道为啥要加倍,或者可能是我设置了什么)。

2017-05-05 09:49:08 T_NULL 阅读数 9525
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3414 人正在学习 去看看 朱有鹏

买个蓝牙模块以为是HC-06,没有底板,测试半天反应,后面才发现是HC-05,HC-05和HC-06的测试方法稍有不同

一、HC-05蓝牙模块连线

先上一个自己的接线(有点丑,凑活着测试一下)


下面是接线原理图,HC-06,HC-05,HC-04的接线原理图后面的资料里面有


我当时不知道自己的蓝牙模块的型号,就先给蓝牙模块上点,然后一一将PIO0-PIO11引脚接到开发板的LED灯上,根据灯的闪亮情况就知道是HC-05还是HC-06了,两个的LED灯的接线引脚不同,HC-05是PIO8,而HC-06是PIO1

接线的时候,蓝牙模块TXD引脚接单片机的RXD,蓝牙模块TXD引脚接单片机的TXD,电源接3.3V(我直接接到开发板的3.3V电源),GND接地,LED接指示灯(也是直接接到开发板的LED),KEY可以悬空,但是配置的时候要先接高电平

二、配置蓝牙模块

开始不知道模块是主机还是从机,反正是手机搜索不到,配置蓝牙模块的时候要TTL-USB转接器,连接方式电源接电源,地接地,蓝牙模块TXD接转接器RXD,蓝牙模块RXD接转接器TXD,测试的时候把蓝牙模块的LED灯接上(我接到开发板的,记得上电),要用指示灯判断蓝牙模块的状态

接好蓝牙模块和TTL-USB转接器的连线后,就可以将转接器接到电脑,对于HC-05模块转接器接电脑之前要把KEY引脚接到一个高电平(我接到开发板的高电平的),然后再把转接器接到电脑,等待指示灯间隔大概一秒闪一下,就连接上了,连上之后将KEY悬空,如果不把KEY引脚接到高电平,直接接转接器,指示灯会闪的很快,这是没连上的

连接上之后就可以用软件测试了,用串口调试助手和SSCOM32都可以,建议用SSCOM32,因为HC-05发送时要换行,SSCOM32有自动换行,如果用串口调试助手的话,要自己加上一个换行,串口调试助手好像只能找到COM1-COM4,我接到COM5的就找不到端口了

选择对应的端口号,HC-05的波特率一定要设置成38400,自动换行,下面是我测试命令,更多的命令在后面的文件中有,那个AT+NAME?获得名字好像不能用,设置名字可以用



HC-05的常用命令

设置名字:AT+NAME=MYBT

获得波特率:AT+UART?

设置波特率:AT+UART=4800

获得密码:AT+PSWD?

设置密码:AT+PSWD=1234

获得主从模式:AT+ROLE?

设置主从模式:AT+ROLE=1或0(1是主模式,0是从模式),设置成从模式才能被手机搜索到

3、蓝牙模块连接手机进行数据传输

要将蓝牙模块设置从模式哦

首先要将蓝牙模块和单片机连接好,前面已经说过了

我们的测试思路是将蓝牙模块和手机模块连接,连接后蓝牙模块对于单片机来说就是串口通信了,所以使用串口通信就可以使用蓝牙模块了

测试程序是单片机收到什么数据就发送什么数据回去


下面是单片机的程序

注意要将波特率设置成蓝牙模块一样的波特率,前面蓝牙设置成的4800,所以串口的也要设置成4800(11.0592MHZ的晶振)

程序将接收到的数据返回去,下载程序的时候要和蓝牙模块断开,因为都要用RXD,TXD,下载完后再连接蓝牙模块

#include<reg51.h>
void UsartConfiguration();
void main(){
	UsartConfiguration();
	while(1);
}

void UsartConfiguration(){
	SCON=0x50;		//设置为工作方式1			
	TMOD=0x20;		//设置计数器工作方式2
	PCON=0x80;		//波特率加倍
	TH1=0xF4;		//计数器初值设置,波特率是4800
	TL1=0xF4;
	ES=1;			//开中断
	EA=1;						
	TR1=1;			//开计数器
}
void Usart() interrupt 4{
	unsigned char receiveData;
	
	receiveData=SBUF; 	//接收数据
	RI = 0;           
	SBUF=receiveData; 	//将接收到的数据返回
	while(!TI);		  
	TI=0;			  
}

单片机的程序写好了,然后就是安卓端的程序了,安卓端为了最大的简化代码,我们最简单的写程序,实现和单片机的数据传输,只要可以和单片机通信,其他的程序在此基础上进行进一步扩充就比较容易了

1.蓝牙模块和单片机连接好之后,指示灯会快速闪烁,打开手机蓝牙,如果蓝牙模块连接正确,配置正确,就可以搜索到,然后配对,如果不知道蓝牙模块的密码或者名字,可以自己用AT命令配置成自己知道的再去配对,配置方法前面已经说过了

2.安卓端的程序

为了最大化的简化代码,实现通信,安卓程序我们写的比较简单,写之前先参考下:http://www.cnblogs.com/cxcco/archive/2012/01/15/2322783.html 关于安卓蓝牙开发

连接之前一定要先配对,蓝牙要打开,程序发送26个英文字母,手机收到26个英文字母,程序流程大概就是  

获得适配器->从适配其中取得已经配对的设备->找到要配对的设备->和该设备建立连接->获得输出和输入流->进行数据传输

下面是主要程序:


public class MainActivity extends Activity {
	
	private BluetoothAdapter mBtAdapter;
	private TextView inforTV;
	private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
	
	
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        
        inforTV = (TextView) findViewById(R.id.show_infor);
        
        //取得蓝牙适配器
        mBtAdapter = BluetoothAdapter.getDefaultAdapter();
        if(mBtAdapter != null){
        	if(!mBtAdapter.isEnabled()){
        		Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        		startActivity(intent);
        	}        	
        }
        //myHandler = new MyHandler(MainActivity.this.getMainLooper());
        //获得已经配对的设备
        Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();
        
        BluetoothSocket socket = null;
        InputStream inStream = null;
        OutputStream outStream = null;
		
        if(pairedDevices.size() > 0){
        	for(BluetoothDevice device : pairedDevices){
        		inforTV.append(device.getName()+"\n"+device.getAddress()+"\n\n");
        		//从已经配对的设备中找到要连接的设备,在测试时将MYBT改成自己的蓝牙模块的名字
        		if("MYBT".equals(device.getName())){
        			try {
        				//和已经配对的要连接的设备建立连接
						socket = device.createRfcommSocketToServiceRecord(MY_UUID);
						socket.connect();
        			} catch (IOException e) {
						inforTV.append("创建或连接异常!\n");
						if(socket != null){
							try {
								socket.close();
							} catch (IOException e1) {
								inforTV.append("关闭异常!\n");
							}
						}
					}
        			inforTV.append("创建成功!\n");
        			try {
        				//获取输出和输入流
						outStream = socket.getOutputStream();
						inStream = socket.getInputStream();
					} catch (IOException e) {
						inforTV.append("获取流异常!\n");
					}
        			inforTV.append("获取成功!\n");
        			try {
        				//输出一个字母时,接收一个字母
        				for(int i=0; i<26; i++){
        					outStream.write('A'+i);
        					inforTV.append(""+(char)(inStream.read()));
        				}
					} catch (IOException e) {
						inforTV.append("传输失败!\n");
					}
        		}
        	}
        }
        else{
        	inforTV.append("未发现设备!\n");
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}




修改程序时,要将MYBT该成自己的蓝牙模块的名字,运行程序后等待连接一会,如果连接成功了,蓝牙模块的指示灯会快速闪两下后停一会儿,然后快速闪两下,程序在后面的资料里后。

以上就是全部的HC-05的蓝牙模块的连接,配置,和安卓的通信,希望可以和大家继续探讨。

资料链接:

串口调试助手,SSCOM32软件


蓝牙模块简单的安卓通信程序


HC-05,HC-06蓝牙模块资料


2019-10-01 10:11:00 L_Y_D_I 阅读数 119
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3414 人正在学习 去看看 朱有鹏

蓝牙HC05是主从一体的蓝牙串口模块;拿到模块需要对该模块进行配置,比如蓝牙名称、连接时的密码、主从和波特率等。

一、需要的工具:

usb转ttl模块(CH340G)

蓝牙HC-05(我买的是兼容版的,功能没差)

杜邦线4根

                                                         

二、连线

连接usb转ttl模块和蓝牙模块,把两个模块的VCC口相连,GND口相连,TX和RX交叉相连(既TX连RX,RX连TX)

注意:请勿将电源接到信号脚上,会直接烧坏模块!输入电压禁止超过7V!

注意:蓝牙模块的VCC只能接5V,不能接3.3V!

三、开始设置

连接好两个模块之后,按住蓝牙模块上的小按钮(按住上电是配置模式,直接上电是正常使用模式),然后把usb转ttl模块插上电脑(一直按住小按钮直到通电)。

注意:红灯快闪是正常使用模式,红灯慢闪是配置模式

然后打开串口调试助手,点击通用串口,如上图所示;选择usb转ttl模块的端口(具体是哪个,可以去查看设备管理器中usbttl是哪个com口,如下图所示);

之后选择蓝牙串口,点击AT按钮,如果左边界面出现OK字样就证明已经连接成功了,然后就开始根据需求进行配置

配置:(点完都要再点下手动发送,然后在看左边窗口是否返回ok,才算成功设置)

  • 点击设置从机。
  • 点击设置模式,在右上角改1为0然后点击手动发送。
  • 点击设置波特率,PS:波特率要和单片机的波特率设置为一样,通常51单片机的程序都是用9600,这里默认9600(跟单片机上的晶振的多少而设,11.0592为9600)。
  • 设置密码,默认1234,自己随意设置。
  • 设置名称,自己随意设置。

四、Android手机与HC-05简单通讯

通过以上步骤配置后,就可以进行简单配置通讯了

1、HC-05与单片机相连(TX连RX,RX连TX)

2、烧录以下事例,主要是对led的控制,数据的收发(有人说烧录程序时,要把蓝牙连接的tx/rx口断开,经测试无需断开,没有任何影响;要是觉得有影响,可以在每次烧录程序前断开该两端口即可)

#include <reg52.h>

sbit led1 = P1^0;
sbit led2 = P1^1;

char i, date, num;

/*串口初始化配置*/
void UartConfiguration() 
{
    TMOD=0x20;      //设置计数器1的工作方式2
    TH1=0xfd;       //设置计数器1的初值,决定波特率
    TL1=0xfd;       //设置计数器1的初值,决定波特率
    PCON=0x00;      // 波特率倍增0x00不加倍       0x80加倍
    SCON=0x50;      //设置工作方式1 开启接受允许
    EA=1;           //开启总中断
    ES=1;           //开启串口接受中断
    TR1=1;         //计数器1开始运行
}

/*发送数据*/
void sendDate(char date)
{
    SBUF=date;       //接收到的数据放入发送缓存器发送
    while(!TI);      //等待发送数据完成
    TI=0;            //清除发送完成标志位
}

//发送字符串
void  PostString(unsigned char *p)  
{  
	while(*p)  	   //若指针指向地址为空,则跳出循环
	{  
		sendDate(*p); //指针第一次默认指向首地址
		delay(20);  //延时,提高发送准确度
		p++;  
	}	  
}

void main()
{
    UartConfiguration();
    while(1)
    {
        if(num == 20) 
        {                  
            num = 0;                       
            sendDate('1');  //发送字符1 
            //比如发送DHT11的温湿度到手机上 
            //PostString("38.1");                  
        }                  
    }

}

/*中断函数*/
void Uart() interrupt 4
{
    date=SBUF;        //取出接受到的数据
    RI=0;             //清除接受中断标志位
    //收到的数据是date
    if (date==0x31){led1=0;}    
    if (date==0x08){led2=0;}         
    if (date==0x05){led1=1;led2=1;}
    num++;
}

3、Android机打开蓝牙串口调试助手(文末提供下载地址,网上的都是广告,功能都用不到,看得心烦,然后自己敲了一个)

                                                

查看手机是否连接至HC-05了,然后通过发送代码中的特定指令,对LED灯的开关及HC-05向手机发送数据的测试

4、至此通过HC-05Android手机对单片机的控制就完成了,是不是很简单o(* ̄) ̄*)o

 

点击下载以上用到的工具

Android蓝牙串口调试助手
PC串口调试助手

2019-11-10 10:25:16 RiseC 阅读数 49
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3414 人正在学习 去看看 朱有鹏

HC-05的接线及使用

单个使用时只需接rx,tx,vcc,gnd四个引脚并将模块的rx与单片机的tx连接(硬串口或软串口),tx与单片机的rx连接(硬串口或软串口)

进入蓝牙的设置模式

在蓝牙模块通电之前按住蓝牙模块上的按键直到通电(慢闪)说明就进入了设置模式接下来就可以通过 以下代码进入AT

进入AT命令模式(设置蓝牙参数)

注意事项

  1. 一定要查看该蓝牙的传输波特率是多少。
  2. 串口的波特率一定要和程序的波特率一致。
  3. 把串口界面调成如下图所示
    在这里插入图片描述

进入AT模式的代码(注意在通电之前让蓝牙模块进入设置模式)

#include <SoftwareSerial.h>

// Pin10为RX,接HC05的TXD
// Pin11为TX,接HC05的RXD
SoftwareSerial BT(10, 11);
char val;

void setup() {
Serial.begin(9600);
Serial.println(“BT is ready!”);
// HC-05用AT命令查一下一般为9600或38400
BT.begin(38400);
}

void loop() {
if (Serial.available()) {
val = Serial.read();
BT.print(val);
}

if (BT.available()) {
val = BT.read();
Serial.print(val);
}

进入AT模式响应

打开arduino的串口监视器把波特率设置为与2,步骤中的波特率一致,输入以下命令,
回复OK说明模块正常工作在AT模式

常用AT命令如下

AT+UART?//查看蓝牙模块的波特率
AT+NAME=名称//设置/查询设备名称
设置/查询—模块角色:
AT+ ROLE?
0——从机(Slave)
1——主机(Master)
2——回环角色(Slave-Loop)
默认值:0

AT+ROLE=0//设置为从机(一般在用手机控制小车的蓝牙设置为从机)

AT+PSWD=配对码//设置
AT+ PSWD?//查询—配对码

AT+UART= //设置波特率
AT+ UART? //查询 串口(波特率)

完整小车蓝牙控制代码

请看资源(可私聊提供技术服务)

没有更多推荐了,返回首页