2015-10-27 09:49:36 baiyuhancooL 阅读数 3814
  • 51单片机综合小项目-第2季第4部分

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

    3399 人正在学习 去看看 朱有鹏
51单片机与hc06蓝牙模块,对于HC-04,HC-06 主机而言,WAKEUP 按下后会放弃记忆,重新搜索新的从机,如果不放弃记
忆,主机将一直搜索上一次配对过的从机,直到搜到并配对成功为止,HC-04/06 的主机有个特性
就是记忆最后一次配对过的从机。WAKEUP 对于从机而言没有意义。
2018-02-22 12:17:38 qq_40277973 阅读数 62330
  • 51单片机综合小项目-第2季第4部分

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

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

不久前开始学习使用蓝牙模块,在模块与51单片机连接的过程中出现了非常多的问题,我想应该也是很多新手和我一样会遇到这样的问题,因此特地写这篇文章,想分享下在学习过程中遇到的问题以及解决方法。


此次学习用到模块是HC-06蓝牙模块,如下图:

该模块某宝有售,价格约为20RMB。某宝上的HC-06有两种,分别是带引脚不带引脚的,建议新手购买带引脚的。我从试验开始到成功,一共使用了四块蓝牙模块。第一次买的是带引脚的,但是模块本身是坏的;第二次买的是不带引脚的,但是由于自身的焊功有限,导致模块损坏,无法使用;第三次是朋友送的蓝牙4.0,由于某些原因无法使用,在此也特别感谢朋友送我蓝牙;第四次购买,就是上图所示的蓝牙,才最终完成了试验。

总结:在某宝购买时,最好货比三家,虽然模块不值钱,但是在购买过程遇到问题会耽误时间,影响开发,非常麻烦。

单片机用了两个,分别是新手常用的开发板还有一个单片机最小模块,两者有什么区别我稍后会说明。

开发板:


单片机最小模块:


我特别标注了两者的晶振,分别为12MHZ11.0594MHZ,就是晶振的不同导致我在学习中问题的发生。以下是学习试验过程。


蓝牙模块的调试:

接线,蓝牙模块的RX接转换模块的TX蓝牙模块的TX接转换模块的RX,如下图所示:


接入电脑,在PC端下载好串口调试助手,软件自搜,此处不再赘述。

附可能会用到的驱动:链接:https://pan.baidu.com/s/1bpYLfCr 密码:yabv

进入到调试助手,其实基本不怎么用调参数了,蓝牙模块基本都默认设置好波特率为9600,因此直接启动软件调试即可。具体调参数的方法可以自行百度其他文章,都有很详细的介绍。

启动串口,成功后左下角显示成功:


发送AT指令,返回OK:


表明串口正常,此时用手机连接蓝牙模块。手机端也是用到调试助手,请自行下载。

搜索蓝牙模块:

备注:我的蓝牙模块此前已经被我改名为Ezio,未改名前默认为HC06。


连接成功:


尝试发送消息hello:


此时在PC端的串口助手上,可以收到来自手机端发送的消息:


在此说明一点,在蓝牙模块上电以后,模块上的LED灯为闪烁状态,此时处于从机模式,与手机成功连接后,LED灯会变为常亮。自此,蓝牙模块调试成功,可以与单片机连接进行试验


蓝牙模块与51单片机接线:

和连接转换模块一样,蓝牙模块的RX连接单片机的TX,蓝牙模块的TX连接单片机的RX,此处说明单片机的RX和TX引脚分别为P3.0和P3.1,如图(图片来自网络):


正确接线后,向单片机中写入程序,程序如下:

#include <reg52.h>

sbit P1_0 = P1^0;	//测试口,可用可不用
sbit P1_3 = P1^3;	//输出口

unsigned char tempbuf;	//存储接收到的信息

/*初始化串口*/
void BlueteethInit()
{
	SCON = 0x50;	//串口模式1,允许接收
	TMOD = 0x20;	//T1工作模式为2,自动重装
	PCON = 0x00;	//波特率不倍增

	REN = 1;

	TH1 = 0xfd;		//设置波特率为9600
	TL1 = 0xfd;

	RI = 0;

	EA = 1;
	ES = 1;

	TR1 = 1;
}

void main()
{
	BlueteethInit();
	P1_0 = 0;
	P1_3 = 0;
	TI = 0;
	while(1)
	{
		if(tempbuf == 0x31)	//可以使用
			P1_3 = 1;
		if(tempbuf == 0)	//不可以使用
			P1_3 = 0;
		if(tempbuf == 'A')	//可以使用
			P1_3 = 1;
		if(tempbuf == 'B')	//可以使用
			P1_3 = 0;
	}
}

void Serial(void) interrupt 4
{
	tempbuf = SBUF;
	RI = 0;	//读标志清零
	SBUF = tempbuf;	//将内容返回到手机端,可在手机查看发送的内容
	while(!TI);
	TI = 0;	//写标志清零
}

该程序为最简单的测试程序,利用蓝牙接收手机发来的信息,控制P1.3口输出高或者低电平,以测试是否正确接收到信息。


第一步,用蓝牙模块与开发板接线,并成功用手机与蓝牙模块连接,尝试发送信息,过程如图所示:


无论是发送数字或者是其他字符,都可以看见返回的是乱码,因此可以知道,单片机接收的也是乱码,故程序中的判断:

while(1)
	{
		if(tempbuf == 0x31)	//可以使用
			P1_3 = 1;
		if(tempbuf == 0)	//不可以使用
			P1_3 = 0;
		if(tempbuf == 'A')	//可以使用
			P1_3 = 1;
		if(tempbuf == 'B')	//可以使用
			P1_3 = 0;
	}

无法正确执行,P1.3口自然也无法根据需要来输出高或者低电平。

第二步,用蓝牙模块与单片机最小模块接线,成功用手机连接收尝试发送信息,如下图所示:


可见,此时返回的内容与发出的内容相同,经测试此时程序也可以正确执行,使用万用表可以检查出P1.3口输出电平的变化,表明此时蓝牙模块可以正常使用。

特别说明:

if(tempbuf == 0x31)	//可以使用
	P1_3 = 1;
if(tempbuf == 0)	//不可以使用
	P1_3 = 0;

当发送数字消息时,应为十六进制,因此在判断时,如接收到1,应判断是否等于0x31,而不是判断是否等于1。此处经过测试,发送1时,判断tempbuf == 0x31,该判断有效;当发送0时,判断tempbuf == 0,判断无效。判断字符加单引号即可。

第三步,为什么使用两个相同的单片机会导致结果不同?这也是困扰了我很久的问题,后来经过检查,才知道原来就是晶振的问题。此处PO一下大神关于晶振的说明,暂时未看懂:https://www.zhihu.com/question/30930577

但可以得出的结论就是,如果使用串口通信,应使用的晶振为11.0594MHZ,否则可能出现乱码的情况。

另附:开发板上的晶振如图:


是可以更换的,某宝也有售,可以根据需要的晶振购买。


2018-10-02 22:34:20 qimi923511491 阅读数 14335
  • 51单片机综合小项目-第2季第4部分

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

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

需要的工具:

usb转ttl模块*1


模块如下:

        要想使用HC-05蓝牙模块进行单片机之间通讯或者单片机和蓝牙设备之间通讯,首先要配置好HC-05蓝牙模块的参数。设置好蓝牙的名称、密码、波特率等待。

step1:

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

然后下载蓝牙串口配置软件进行配置:提取码:6d32

软件界面如下:

step2:

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

选择好端口设置上的COM口,其它配置默认不需要改,点击打开串口。如果硬件连接和端口设置没问题的话这时候就可以连接成功了。

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


手机连接51单片机+蓝牙

  1. 点击设置从机。
  2. 点击设置模式,在右上角改1为0然后点击手动发送。
  3. 点击设置波特率,PS:这里设置的波特率和刚刚端口设置中的波特率是不一样的,这个是正常模式下蓝牙和单片机通讯的波特率,端口设置中的波特率是配置模式下的波特率,修改这里的波特率不是改变配置模式的波特率,下次配置蓝牙模块的端口设置中的波特率还是保持默认。波特率要和单片机的波特率设置为一样,通常51单片机的程序都是用9600,这里默认9600。
  4. 设置密码,看个人喜好。
  5. 设置名称,看个人喜好。

如果以上设置中出现什么问题的话,点击恢复出厂设置重新设置一边。如果没问题的话就可以开始把蓝牙换到单片机上进行使用了。

 

step3:

        吧蓝牙和单片机串口进行连接,蓝牙和单片机的连接和上面的一样,注意TX和RX之间要交叉连接。

        只要连接好蓝牙,烧录好单片机程序,蓝牙就会把单片机串口发送来的数据向已经连接上的蓝牙设备进行发送。

51单片机的demo:

/*串口初始化配置*/
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 main()
{
    UartConfiguration();

    sendDate('1');  //发送字符1

    while(1);
}

/*中断函数*/
void Uart() interrupt 4
{
    uchar date;
    date=SBUF;        //取出接受到的数据
    RI=0;			  //清除接受中断标志位

    //收到的数据是date
	
}

这是51单片机向串口发送数据的例程,其中while(!TI)是等待消息发送成功,如果发送不成功的话会一直等待阻塞程序。

        而且51单片机的串口中断是一个字节一个字节地接收数据的,比如手机向单片机发送了数据“123”,单片机中的中断函数Uart()会进入三次,把数据“123”分三次接收完,一次接收一个字符,所以要在其中添加自己的逻辑把单个字符组合成一个字符串来进行处理。

                                 

糖醋咸鱼的个人空间

                                          

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

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

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

买个蓝牙模块以为是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蓝牙模块资料


2016-08-23 21:18:00 weixin_33872660 阅读数 152
  • 51单片机综合小项目-第2季第4部分

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

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

51单片机的蓝牙模块,是在蓝牙通讯的基础上,进行蓝牙51模块与外部蓝牙发射接收设备之间,相互收发数据。并且其引脚为VCC,GND,TXD,RXD,可以通过串口通信与外部上位机或单片机通信。

代码如下(注意蓝牙模块是5V供电)

#include<reg52.h>

void init();
void delay(unsigned int ms);

unsigned char input;
void display(unsigned char num_decimal);
unsigned char code character[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90};

sbit SegSelection1=P2^0;
sbit SegSelection2=P2^1;
sbit SegSelection3=P2^2;
sbit SegSelection4=P2^3;
sbit p1=P1^0;
sbit p2=P1^1;

void main()
{
p1=1;
p2=0;
init();

while(1)
{

display(input);
}
}

void init(void)
{
EA = 1;
ES = 1;
PCON = 0x00;
SCON = 0x50; //串口工作在方式1,并且启动串行接收

TMOD = 0x20;
TH1 = 0xFd; //设置波特率 9600
TL1 = 0xFd;
TR1 = 1;
}

void rt() interrupt 4 //中断4:串行收发数据
{
EA=0;
if(RI==1)
{
input=SBUF-48;
RI=0;

SBUF=input+48;
while(!TI);
TI=0;
}
EA=1;
}

void display(unsigned char num_decimal)    //在数码管显示传输的数据
{
unsigned int thousand,hundred,tens,unit;

thousand=num_decimal/1000;
hundred=(num_decimal-thousand*1000)/100;
tens=(num_decimal-thousand*1000-hundred*100)/10;
unit=num_decimal%10;

SegSelection1=0;
P0=character[thousand];
delay(5);
SegSelection1=1;

SegSelection2=0;
P0=character[hundred];
delay(5);
SegSelection2=1;

SegSelection3=0;
P0=character[tens];
delay(5);
SegSelection3=1;

SegSelection4=0;
P0=character[unit];
delay(5);
SegSelection4=1;
}

void delay(unsigned int ms)
{
unsigned int x;
while(ms--)
for(x=110;x>0;x--);
}

转载于:https://www.cnblogs.com/chengxinhust/p/5800872.html

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