嵌入式单片机MSP430F149学习笔记(一)HC06蓝牙模块的使用

姓名:周唯 ;学号:20011210136;学院:通信工程学院

原链接:https://blog.csdn.net/weixin_44323997/article/details/115802184?spm=1001.2014.3001.5501

【嵌牛导读】如何使用msp430单片机的hc06蓝牙模块?

【嵌牛鼻子】单片机、msp430、hc06蓝牙模块

【嵌牛提问】什么是msp430?什么是蓝牙通信?

【嵌牛正文】

一、msp430单片机的概念

MSP430系列单片机是美国德州仪器TI)1996年开始推向市场的一种16位超低功耗、具有精简指令集(RISC)的混合信号处理器(Mixed Signal Processor)。

MSP430单片机称之为混合信号处理器,是由于其针对实际应用需求,将多个不同功能的模拟电路、数字电路模块和微处理器集成在一个芯片上,以提供“单片机”解决方案。该系列单片机多应用于需要电池供电的便携式仪器仪表中。

简而言之,单片机就是一个控制器,能够对输入的电压进行控制,并输出我们想要的模式。

二、hc06蓝牙模块的介绍

HC-06 蓝牙串口通信模块,是基于 Bluetooth Specification V2.0 带 EDR 蓝牙协议的数传模块。无线工作频段为 2.4GHz ISM,调制方式是 GFSK。模块最大发射功率为 4dBm,接收灵敏度-85dBm,板载 PCB 天线,可以实现 10 米距离通信。模块采用邮票孔封装方式,模块大小 27mm×13mm×2mm,方便客户嵌入应用系统之内。自带 LED 状态指示灯,可直观判断蓝牙的连接状态。模块采用 CSR 的 BC417 芯片,支持 AT 指令,用户可根据需要更改角色(主、从模式)以及串口波特率、设备名称等参数,使用灵活。

三、单片机与蓝牙模块的连接


图1 单片机与hc06蓝牙模块连接示意图

由图1可知,单片机和hc06蓝牙模块之间的通信是通过串口进行通信,hc06的TXD接单片机的RXD,hc06的RXD接单片机的TXD,而单片机的串口则根据不同型号的msp430芯片而定,本文中所使用的为f149芯片,故txd和rxd分别问p3.4,p3.5


图2 实物连接图

图2为实物连接图,本实验步骤为 手机打开蓝牙>搜寻hc06蓝牙并连接>发送数据即 字符1或2或3>hc06蓝牙模块收到信息并通过串口将数据传给单片机>单片机对收到的数据进行处理>根据收到的字符不同控制灯的亮灭

四、代码

本实验所用的软件为IAR软件,工程中的主要文件为主文件main.c和配置文件Config.h

mian.c代码如下:

/********************************************************************

//DM430-A型开发板串口接收发送程序,使用单片机的串口0,显示操作通过串口调试助手

//通过电脑与串口线连接开发板串口座,使用串口调试助手发送数据到开发板板

//开发板板会将收到的数据再发送到串口调试助手,接收采用中断模块,发送用查询

//板载的BSL模块可以通过跳线帽设置为USB转串口模式,笔记本电脑没有串口可以直接代替

//开发板的BSL区的RXD和TXD0连接,TXD和RXD0连接即可

//注意使用BSL模块作为USB转串口功能的时候,RTS和TCK跳线帽、DTR和RESET跳线帽要断开

//波特率更改请通过config.h文件,直接更改baud参数即可

//调试环境:EW430 V5.30

//作者:阿迪 www.avrgcc.com

//时间:2011.09.19

********************************************************************/

#include <msp430x14x.h>

#include "Config.h"                    //开发板配置头文件,主要配置IO端口信息

uchar control;

//***********************************************************************

//              MSP430IO口初始化

//***********************************************************************

void Port_Init()

{

  LED8SEL  = 0x00;                      //设置IO口为普通I/O模式,此句可省

  LED8DIR  = 0xFF;                      //设置IO口方向为输出

  LED8PORT = 0xFF;                      //P2口初始设置为FF


  DATASEL  = 0x00;                      //设置IO口为普通I/O模式,此句可省

  DATADIR  = 0xFF;                      //设置IO口方向为输出

  DATAPORT = 0xFF;                      //P4口初始设置为FF


  CTRSEL  =  0x00;                      //设置IO口为普通I/O模式,此句可省

  CTRDIR |=  BIT3 + BIT4;              //设置IO口方向为输出,控制口在P63,P64

  CTRPORT =  0xFF;                      //P6口初始设置为FF 

}

//*************************************************************************

//              MSP430串口初始化

//*************************************************************************

void UART_Init()

{

  U0CTL|=SWRST + CHAR;                //复位SWRST,8位数据模式

  U0TCTL|=SSEL1;                      //SMCLK为串口时钟

  U0BR1=baud_h;                      //BRCLK=8MHZ,Baud=BRCLK/N,低位

  U0BR0=baud_l;                      //N=UBR+(UxMCTL)/8,高位

  U0MCTL=0x00;                        //微调寄存器为0,波特率9600bps

  ME1|=UTXE0;                        //UART0发送使能

  ME1|=URXE0;                        //UART0接收使能

  U0CTL&=~SWRST;                      //对SWRST进行清零,表示设置已经完成

  IE1|=URXIE0;                        //接收中断使能位,采用发送查询,接收中断,当接收到数据的时候触发中断,将数据存储到buffer缓存器中


  P3SEL|= BIT4 + BIT5;                //设置IO口为第二功能模式,启用UART功能

  P3DIR|= BIT4;                      //P3.4为TXD,设置TXD0口方向为输出

}

//*************************************************************************

//              串口0发送数据函数

//*************************************************************************

void Send_Byte(uchar data)

{

  while(!(IFG1&UTXIFG0));          //发送寄存器空的时候发送数据

    U0TXBUF=data;

}

//*************************************************************************

//              串口0发送字符串函数

//*************************************************************************

void Print_Str(uchar *s)

{

    while(*s != '\0')

    {

        Send_Byte(*s++);

    }

}

//*************************************************************************

//              处理来自串口0的接收中断

//*************************************************************************

#pragma vector=UART0RX_VECTOR

__interrupt void UART0_RX_ISR(void)

{

  //uchar data=0;

  control = U0RXBUF;                      //接收到的数据存起来

  Send_Byte(control);                    //将接收到的数据再发送出去

}

//*************************************************************************

//          主函数

//*************************************************************************

void main(void)

{

  WDT_Init();                        //看门狗设置

  Clock_Init();                      //系统时钟设置

  UART_Init();                        //串口设置初始化

  Close_LED();                        //关闭数码管显示

  Print_Str("I AM READY\n");            //发送字符串测试

  _EINT();                            //开中断


  P2SEL = 0x00; //p2都设置为io口输出

  P2DIR = 0x03;//设置p2.0 p2.1为输出


  while(1)                            //无限循环

    {

      if(control=='1')

    {

    P2OUT = 0x01;//设置p2.0为输出高电平

    }


      if(control=='2')

    {

    P2OUT = 0x02;//设置p2.1为输出高电平

    }


      if(control=='3')

    {

    P2OUT = 0x00;//设置p2.0 p2.1为输出低电平

    }


    }

}


Config.h文件代码如下:

#define CPU_F ((double)8000000)

#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))

#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

#define uchar unsigned char

#define uint  unsigned int

#define ulong unsigned long

/*当BRCLK=CPU_F时用下面的公式可以计算,否则要根据设置加入分频系数*/

#define baud          9600                                //设置波特率的大小

#define baud_setting  (uint)((ulong)CPU_F/((ulong)baud))  //波特率计算公式

#define baud_h        (uchar)(baud_setting>>8)            //提取高位

#define baud_l        (uchar)(baud_setting)              //低位

#define LED8PORT        P2OUT                  //P2接8个LED灯

#define LED8SEL        P2SEL                  //P2接8个LED灯

#define LED8DIR        P2DIR                  //P2接8个LED灯

#define DATAPORT P4OUT                  //数据口所在端口P4

#define DATASEL        P4SEL                  //数据口功能寄存器,控制功能模式

#define DATADIR        P4DIR                  //数据口方向寄存器

#define CTRPORT         P6OUT                  //控制线所在的端口P6

#define CTRSEL          P6SEL                  //控制口功能寄存器,控制功能模式

#define CTRDIR          P6DIR                  //控制口方向寄存器

#define DCTR0         P6OUT &= ~BIT4          //数码管段控制位信号置低

#define DCTR1          P6OUT |=  BIT4          //数码管段控制位信号置高

#define WCTR0         P6OUT &= ~BIT3          //数码管位控制位信号置低

#define WCTR1          P6OUT |=  BIT3          //数码管位控制位信号置高

//***********************************************************************

// 共阴数码管显示的断码表

//***********************************************************************

uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

              0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//***********************************************************************

//                  系统时钟初始化

//***********************************************************************

void Clock_Init()

{

  uchar i;

  BCSCTL1&=~XT2OFF;                //打开XT2振荡器

  BCSCTL2|=SELM1+SELS;              //MCLK为8MHZ,SMCLK为8MHZ

  do{

    IFG1&=~OFIFG;                  //清楚振荡器错误标志

    for(i=0;i<100;i++)

      _NOP();

  }

  while((IFG1&OFIFG)!=0);          //如果标志位1,则继续循环等待

  IFG1&=~OFIFG;

}

//***********************************************************************

//              MSP430内部看门狗初始化

//***********************************************************************

void WDT_Init()

{

  WDTCTL = WDTPW + WDTHOLD;      //关闭看门狗

}

//***********************************************************************

// 关闭数码管

//***********************************************************************

void Close_LED()

{

  DATASEL  = 0x00;                      //设置IO口为普通I/O模式,此句可省

  DATADIR  = 0xFF;                      //设置IO口方向为输出

  DATAPORT = 0xFF;                      //P4口初始设置为FF


  CTRSEL  =  0x00;                      //设置IO口为普通I/O模式,此句可省

  CTRDIR |=  BIT3 + BIT4;              //设置IO口方向为输出,控制口在P63,P64

  CTRPORT =  0xFF;                      //P6口初始设置为FF 


  DCTR1;                                //关掉数码管,以免显示乱码                 

  WCTR1;                   

  DATAPORT=0xFF;                        //关数码管           

  WCTR0;

}


五、实验效果

效果图如下



发送1 设置p2.0为输出高电平 灯亮

发送2 设置p2.1为输出高电平 灯亮

发送3 设置p2.0 p2.1为输出低电平 灯灭

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343