若果您有单片机或嵌入式基础,葡萄娱乐场HC05蓝牙5.0模块

壹 、注意事项

转自嵌入式A途达M

一 、烧写程序时,要把蓝牙5.0tx,rx信号线拔掉,对烧写程序有震慑。

学号16020311003  姓名:杨虎成

贰 、执行HC05集命令时,均以\r\n结尾。串口中断若采纳“发送新行”时,不用添加\r\n。原理相同。

【嵌牛导读】多品尝自个儿入手用嵌入式化解难题

② 、准备软硬件

【嵌牛鼻子】嵌入式在大部分电气中有不小的效果

一 、硬件:单片机STC89C52奥迪Q7C开发板,Bluetooth模块HC05

【嵌牛提问】嵌入式系统在电子元件中如何行事

二 、软件:串口工具SSCOM3.3,手提式有线电话机蓝牙( Bluetooth® )客户端

【嵌牛正文】

   
 手提式有线电话机Bluetooth客户端链接:http://mobile.baidu.com/simple/item?docid=5014650&source=aladdin@wise\_app\_13@button&from=1015530c&ala=wise\_app@strong@蓝牙串口调试助手&go\_bfe=1action=content&action=content

智能插座远程序控制制电器很好玩!假如您有嵌入式单片机基础,你也足以协调入手做3个…

三 、蓝牙5.0模块HC05端口定义(6引脚)

——————————————————

state——蓝牙5.0连接景况,未连接输出低,连接后输出高

祥和DIY用的机件清单(大部分都以手头拆机的):

TX——信号发

1)STC51种类单片机(天猫商城上几块钱就能买到,自身纯手工业焊了一块板子)

RX——信号收

2)空调器控制面板上拆的继电器,有四路,刚好能够操纵多少个插座

GND——地

3)蓝牙5.0POS机(天猫商城上一毛钱包邮很多,小编那款叫“开店宝”),用于做蓝牙5.0串口透传

+5V

4)废旧插座一个

EN——使能端,供给进入AT情势时接3.3V,接单片机i/o引脚即可,高电平

是因为日常插座都是共火线和共零线,为了兑现四路单独主宰,必要改造插座,将七个插孔的火线分开,然后与四路继电器相连,

④ 、进入AT情势展开参数和状态的设置

 

三种工作模式:命令响应工作格局和自动连接工作格局

全体控制流:手提式无线电话机APP –> BluetoothPOS –> 51单片机 –> 继电器 –>
插座

指令响应工作方式(AT情势)

手提式有线电话机APP通过蓝牙( Bluetooth® )发送数据到蓝牙( Bluetooth® )POS,蓝牙( Bluetooth® )POS作为多个蓝牙( Bluetooth® )透传设备,将控制指令数据通过串口发送给单片机,单片机通过GPIO口来支配继电器,最后兑现对插座的决定。(其实该蓝牙( Bluetooth® )POS是个STM32单片机,能够无需51单片机,直接将STM32的GPIO引出来去决定,借使你入手能力强的话,鉴于自身动手能力一般,焊接不佳那么细的芯片引脚,所以干脆拿了个51单片机来中间转播一下)。

state——接任意单片机i/o

  

rx——接usb转串口的tx端,P3^0

上面奉上代码:

tx——接usb转串口的rx端,P3^1

插座的通断是因而单片机来决定,结合蓝牙5.0POS机做透传,即可直接通过蓝牙5.0来控制继电器。

gnd——接地

  

5v——接5V电

51单片机代码相比较简单,放出完整代码。

en——接任意单片机i/o,高电平

#include <stc89c5xrc.h>

① 、须求接通en,并给高电平

#include <string.h>

二 、通讯线路:电脑–>usb转串口–>hc05蓝牙( Bluetooth® )模块(电脑与蓝牙5.0模块间开始展览串口传输)

#define FOSC 22118400L //定义晶振频率

三 、按住蓝牙模块的key键不松,单片机开发板上电,蓝牙( Bluetooth® )模块提示灯进入慢闪状态,表达进入AT格局

#define BAUD 115200  //定义波特率

四 、通过电脑串口工具得以安装蓝牙( Bluetooth® )的劳作参数与气象

#define SMOD  1

五 、执行电脑串口工具SSCOM3.3,设置比特率38400,7个人数据,一个人截至位

#define RX_BUFF_SIZE 64

⑥ 、发送测试指令AT\r\n,要是回去OK表示通讯不荒谬。

#define ERR_CODE_RSP 0xD0  //错误码

柒 、能够实施自个儿所需的授命了。

/*概念四路开关控制引脚*/

⑧ 、发送过来私下认可状态指令AT+O福睿斯GL\r\n,假设回去OK表示设置成功。

sbit PLUG_1 = P2^4 ;

出厂私下认可状态:

sbit PLUG_2 = P2^7  ;

①.设备类:0

sbit PLUG_3 = P2^6 ;

②.查询码:0x009e8b33

sbit PLUG_4  = P2^5 ;

③.模块工作角色:Slave Mode

unsigned char rx_buff[RX_BUFF_SIZE] = {0}; //串口接收缓冲区

④.一而再形式:钦点专用蓝牙( Bluetooth® )设备连接方式

volatile unsigned char rx_count = 0; //接收计数器

⑤.串口参数:Porter率—38400bits/s;停止位:1个人;校验位:无

volatile unsigned char pos = 0;    //读取计数器,记录当前读取字节数 

⑥.配对码:“1234”

volatile unsigned char msg_code = 0x00;  //存款和储蓄控制码

⑦.设备名称:“H-C-二零一零-06-01”

volatile unsigned char status_code = 0x70;  //存款和储蓄状态码

..

/** 串口发送 **/

玖 、设置Porter率9600与单片机串口匹配,1结束位,0校验位

void byte_send(unsigned char ch)

· 执行AT+UART=9600,1,0\r\n。返回OK

{

十 、查看UARubiconT状态是或不是变动成功,执行AT+UA奥迪Q7T?,再次来到+UA翼虎T:9600,1,0  OK

    SBUF = ch ;

1一 、参数状态设置完结,可断电,准备进入工作情势

    while(!TI);

5、进入机关连接工作情势开始展览蓝牙( Bluetooth® )匹配

    TI = 0;

state——接任意单片机i/o

}

rx——接单片机的tx端,P3^1,与命令相应形式相反

/** 判断缓存是还是不是有数量可读取 **/

tx——接单片机的rx端,P3^0

unsigned char is_rx_buffer_empty(void)

gnd——接地

{

5v——接5V电

    return !(rx_count – pos);

en——可不接

}

① 、不需求接通en

/** 读缓冲区二个字节 **/

② 、通信线路:手提式有线电话机Bluetooth控制端–>hc05蓝牙( Bluetooth® )模块–>单片机

unsigned char uart_read(void)

叁 、单片机开发板上电,蓝牙5.0模块提示灯进入快闪状态,表明进入机关连接工作格局

{

肆 、手提式无线话机开Bluetooth,即可搜到蓝牙5.0模块,连接

    unsigned char c;

五 、打开手提式有线电话机端Bluetooth串口工具,连接成功,Bluetooth模块提醒灯进入双闪状态

    c = rx_buff[pos++];

陆 、至此连接成功,准备发送数据

    if(rx_count == pos){

 

        rx_count = pos = 0;

#include <reg52.h>

    } 

void main(void)

    return c;

{

}

while(1);

/** 音信处理 **/

}

/** 不难起见,就用了2个字节做控制码

设置参数状态,匹配测试用上述几行代码即可。

    bit0 ~ bit3: 分别对应四路开关,置0为关,置为1为开

 

    bit4 ~ bit8: 作为参数类型(0x06:查询开关状态 0x07:设置开关状态)

⑤ 、利用蓝牙5.0向单片机发送数据

**/

一 、通讯线路:手提式有线电话机蓝牙5.0控制端输出字符‘0’–>hc05蓝牙5.0模块–>单片机接收字符‘0’(单片机与蓝牙5.0模块间开始展览串口传输)–>单片机控制灯1亮

void msg_process(void)

贰 、通讯线路:手提式有线话机蓝牙5.0控制端输出字符‘1’–>hc05蓝牙5.0模块–>单片机接收字符‘1’(单片机与蓝牙5.0模块间实行串口传输)–>单片机控制灯2亮

{

三 、通讯线路:手提式有线电话机Bluetooth控制端输出别的字符–>hc05蓝牙5.0模块–>单片机接收该字符(单片机与蓝牙( Bluetooth® )模块间展开串口传输)–>单片机控制灯3亮

    if(is_rx_buffer_empty())
//如果设计成八个字节作为控制码,此处要改为while循环

四 、该程序源码

        return;

#include <reg52.h>

    msg_code = uart_read();

typedef unsigned char u8;
typedef unsigned int u16;
u8 r_buf; //Bluetooth接收到的字符存款和储蓄缓冲区
sbit led1 = P1^0; //灯1,当接收字符0时,灯1亮
sbit led2 = P1^1; //灯2,当接过字符1时,灯2亮
sbit led3 = P1^2; //灯2,当接到此外字符时,灯3亮
sbit led4 = P1^3; //蓝牙( Bluetooth® )连接情形灯,当蓝牙( Bluetooth® )连接时,灯4亮
sbit state = P3^6; //蓝牙( Bluetooth® )连通的动静标志位
void delay(u16 z) //延迟函数
{  
u16 x,y;  
for(x=z;x>0;x–)   
for(y=125;y>0;y–); 

void InitUACRUISERT() //串口发轫化9600
{
//开头化串口定时器9600
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;   
       TH1 = 0xFD;
       TL1 = 0xFD;
TR1 = 1;
ES = 1;
EA = 1;
}
void SendOneByte(unsigned char c) //发送字符函数
{
    SBUF = c;
    while(!TI);
    TI = 0;
}
void main(void)
{
    InitUART();
led1 = 1;
led2 = 1;
led3 = 1;  
led4 = 1;
r_buf = ‘2’;
while(1)
{
if(state == 1)//Bluetooth连通状态判断
{
led4 = 0;    //假设蓝牙5.0匹配成功,灯4亮
}
else
{
led4 = 1;    //假诺蓝牙( Bluetooth® )匹配不成功,灯4不亮
}
}
}
void UAMuranoTInterrupt(void) interrupt 4 //串口接收字符
{
    if(RI)
    {
        RI = 0;
        //add your code here!
r_buf = SBUF;
if(r_buf == ‘0’)//假若为字符‘0’,灯1亮
{
led1 = 0;
delay(1000);
led1 = 1;
}
if(r_buf == ‘1’)//假若为字符‘1’,灯2亮
{
led2 = 0;
delay(1000);
led2 = 1;
}
else //假如为任何字符,灯3亮
{
led3 = 0;
delay(1000);
led3 = 1;
}
   SendOneByte(r_buf);//回发该字符
    }
}

    switch((msg_code & 0xF0) >> 4)

    {

        case 0x6:  //Get the status

            msg_reply(status_code);

            break;

        case 0x7:  //Set and get status

            PLUG_1 = msg_code & 0x01 ;

            PLUG_2 = (msg_code & 0x02) >> 1 ;

            PLUG_3 = (msg_code & 0x04) >> 2 ;

            PLUG_4 = (msg_code & 0x08) >> 3 ;

            status_code = msg_code; //保存此次处理结果

            msg_reply(status_code);

            break;

        default:  //Err code

            msg_reply(ERR_CODE_RSP);       

    }

}

/** 音讯响应 **/

void msg_reply(unsigned char msg)

{

    //byte_send(‘:’);//unknow reason

    delay(1500);

    byte_send(msg);

    byte_send(‘:’);
//将’:’作为间隔符,蓝牙5.0POS收到该符号,才认为一条数据接受完结

}

/** 串口初阶化 **/

void uart_init(void)

{

    SCON = 0x50 ;

    TMOD = 0x20 ;

    PCON |= 0x80 ;    //set smod

    TH1 = TL1 = 256 – FOSC*(SMOD+1)/32/12/BAUD ;

    TR1 = 1;

    ES = 1 ;

    EA = 1 ;

}

/** 串口中断处理 **/

void  serial() interrupt 4  using 1

{

    if(RI)

    {

        RI = 0;

        if(rx_count > RX_BUFF_SIZE)

            rx_count = 0;

        rx_buff[rx_count++] = SBUF ;

    }

}

/** 主函数 **/

void main(void)

{

    P2 = 0x00;

    uart_init();

    while(1)

    {

      msg_process();

    }

}

音信处理函数,一定要放在主循环中,有的开发者习惯在暂停响应函数中做音讯处理,简单导致串口数据丢失。中断中必将只做简单的拍卖,本代码中只是将中止接收到的数目存到数组中。

测试:

假诺当前开关状态为: 0101

用串口助手输入16进制:

输入:0x60 返回:0x75 0x3A
//查询当下开关状态,0x3A为’:’对应16进制ASCII码

输入:0x77 重回:0x77 0x3A //设置开关0、开关壹 、开关2 开,开关3关门

操作成功后,会听到继电器开启、闭合的动静,能够用万用表衡量是还是不是导通恐怕切断。