嵌入式單片機(jī)MSP430F149學(xué)習(xí)筆記(一)HC06藍(lán)牙模塊的使用

姓名:周唯 ;學(xué)號(hào):20011210136;學(xué)院:通信工程學(xué)院

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

【嵌牛導(dǎo)讀】如何使用msp430單片機(jī)的hc06藍(lán)牙模塊?

【嵌牛鼻子】單片機(jī)、msp430、hc06藍(lán)牙模塊

【嵌牛提問】什么是msp430?什么是藍(lán)牙通信?

【嵌牛正文】

一、msp430單片機(jī)的概念

MSP430系列單片機(jī)是美國德州儀器TI)1996年開始推向市場的一種16位超低功耗、具有精簡指令集(RISC)的混合信號(hào)處理器(Mixed Signal Processor)。

MSP430單片機(jī)稱之為混合信號(hào)處理器,是由于其針對(duì)實(shí)際應(yīng)用需求,將多個(gè)不同功能的模擬電路、數(shù)字電路模塊和微處理器集成在一個(gè)芯片上,以提供“單片機(jī)”解決方案。該系列單片機(jī)多應(yīng)用于需要電池供電的便攜式儀器儀表中。

簡而言之,單片機(jī)就是一個(gè)控制器,能夠?qū)斎氲碾妷哼M(jìn)行控制,并輸出我們想要的模式。

二、hc06藍(lán)牙模塊的介紹

HC-06 藍(lán)牙串口通信模塊,是基于 Bluetooth Specification V2.0 帶 EDR 藍(lán)牙協(xié)議的數(shù)傳模塊。無線工作頻段為 2.4GHz ISM,調(diào)制方式是 GFSK。模塊最大發(fā)射功率為 4dBm,接收靈敏度-85dBm,板載 PCB 天線,可以實(shí)現(xiàn) 10 米距離通信。模塊采用郵票孔封裝方式,模塊大小 27mm×13mm×2mm,方便客戶嵌入應(yīng)用系統(tǒng)之內(nèi)。自帶 LED 狀態(tài)指示燈,可直觀判斷藍(lán)牙的連接狀態(tài)。模塊采用 CSR 的 BC417 芯片,支持 AT 指令,用戶可根據(jù)需要更改角色(主、從模式)以及串口波特率、設(shè)備名稱等參數(shù),使用靈活。

三、單片機(jī)與藍(lán)牙模塊的連接


圖1 單片機(jī)與hc06藍(lán)牙模塊連接示意圖

由圖1可知,單片機(jī)和hc06藍(lán)牙模塊之間的通信是通過串口進(jìn)行通信,hc06的TXD接單片機(jī)的RXD,hc06的RXD接單片機(jī)的TXD,而單片機(jī)的串口則根據(jù)不同型號(hào)的msp430芯片而定,本文中所使用的為f149芯片,故txd和rxd分別問p3.4,p3.5


圖2 實(shí)物連接圖

圖2為實(shí)物連接圖,本實(shí)驗(yàn)步驟為 手機(jī)打開藍(lán)牙>搜尋hc06藍(lán)牙并連接>發(fā)送數(shù)據(jù)即 字符1或2或3>hc06藍(lán)牙模塊收到信息并通過串口將數(shù)據(jù)傳給單片機(jī)>單片機(jī)對(duì)收到的數(shù)據(jù)進(jìn)行處理>根據(jù)收到的字符不同控制燈的亮滅

四、代碼

本實(shí)驗(yàn)所用的軟件為IAR軟件,工程中的主要文件為主文件main.c和配置文件Config.h

mian.c代碼如下:

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

//DM430-A型開發(fā)板串口接收發(fā)送程序,使用單片機(jī)的串口0,顯示操作通過串口調(diào)試助手

//通過電腦與串口線連接開發(fā)板串口座,使用串口調(diào)試助手發(fā)送數(shù)據(jù)到開發(fā)板板

//開發(fā)板板會(huì)將收到的數(shù)據(jù)再發(fā)送到串口調(diào)試助手,接收采用中斷模塊,發(fā)送用查詢

//板載的BSL模塊可以通過跳線帽設(shè)置為USB轉(zhuǎn)串口模式,筆記本電腦沒有串口可以直接代替

//開發(fā)板的BSL區(qū)的RXD和TXD0連接,TXD和RXD0連接即可

//注意使用BSL模塊作為USB轉(zhuǎn)串口功能的時(shí)候,RTS和TCK跳線帽、DTR和RESET跳線帽要斷開

//波特率更改請(qǐng)通過config.h文件,直接更改baud參數(shù)即可

//調(diào)試環(huán)境:EW430 V5.30

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

//時(shí)間:2011.09.19

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

#include <msp430x14x.h>

#include "Config.h"? ? ? ? ? ? ? ? ? ? //開發(fā)板配置頭文件,主要配置IO端口信息

uchar control;

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

//? ? ? ? ? ? ? MSP430IO口初始化

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

void Port_Init()

{

? LED8SEL? = 0x00;? ? ? ? ? ? ? ? ? ? ? //設(shè)置IO口為普通I/O模式,此句可省

? LED8DIR? = 0xFF;? ? ? ? ? ? ? ? ? ? ? //設(shè)置IO口方向?yàn)檩敵?/p>

? LED8PORT = 0xFF;? ? ? ? ? ? ? ? ? ? ? //P2口初始設(shè)置為FF


? DATASEL? = 0x00;? ? ? ? ? ? ? ? ? ? ? //設(shè)置IO口為普通I/O模式,此句可省

? DATADIR? = 0xFF;? ? ? ? ? ? ? ? ? ? ? //設(shè)置IO口方向?yàn)檩敵?/p>

? DATAPORT = 0xFF;? ? ? ? ? ? ? ? ? ? ? //P4口初始設(shè)置為FF


? CTRSEL? =? 0x00;? ? ? ? ? ? ? ? ? ? ? //設(shè)置IO口為普通I/O模式,此句可省

? CTRDIR |=? BIT3 + BIT4;? ? ? ? ? ? ? //設(shè)置IO口方向?yàn)檩敵?控制口在P63,P64

? CTRPORT =? 0xFF;? ? ? ? ? ? ? ? ? ? ? //P6口初始設(shè)置為FF?

}

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

//? ? ? ? ? ? ? MSP430串口初始化

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

void UART_Init()

{

? U0CTL|=SWRST + CHAR;? ? ? ? ? ? ? ? //復(fù)位SWRST,8位數(shù)據(jù)模式

? U0TCTL|=SSEL1;? ? ? ? ? ? ? ? ? ? ? //SMCLK為串口時(shí)鐘

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

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

? U0MCTL=0x00;? ? ? ? ? ? ? ? ? ? ? ? //微調(diào)寄存器為0,波特率9600bps

? ME1|=UTXE0;? ? ? ? ? ? ? ? ? ? ? ? //UART0發(fā)送使能

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

? U0CTL&=~SWRST;? ? ? ? ? ? ? ? ? ? ? //對(duì)SWRST進(jìn)行清零,表示設(shè)置已經(jīng)完成

? IE1|=URXIE0;? ? ? ? ? ? ? ? ? ? ? ? //接收中斷使能位,采用發(fā)送查詢,接收中斷,當(dāng)接收到數(shù)據(jù)的時(shí)候觸發(fā)中斷,將數(shù)據(jù)存儲(chǔ)到buffer緩存器中


? P3SEL|= BIT4 + BIT5;? ? ? ? ? ? ? ? //設(shè)置IO口為第二功能模式,啟用UART功能

? P3DIR|= BIT4;? ? ? ? ? ? ? ? ? ? ? //P3.4為TXD,設(shè)置TXD0口方向?yàn)檩敵?/p>

}

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

//? ? ? ? ? ? ? 串口0發(fā)送數(shù)據(jù)函數(shù)

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

void Send_Byte(uchar data)

{

? while(!(IFG1&UTXIFG0));? ? ? ? ? //發(fā)送寄存器空的時(shí)候發(fā)送數(shù)據(jù)

? ? U0TXBUF=data;

}

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

//? ? ? ? ? ? ? 串口0發(fā)送字符串函數(shù)

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

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;? ? ? ? ? ? ? ? ? ? ? //接收到的數(shù)據(jù)存起來

? Send_Byte(control);? ? ? ? ? ? ? ? ? ? //將接收到的數(shù)據(jù)再發(fā)送出去

}

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

//? ? ? ? ? 主函數(shù)

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

void main(void)

{

? WDT_Init();? ? ? ? ? ? ? ? ? ? ? ? //看門狗設(shè)置

? Clock_Init();? ? ? ? ? ? ? ? ? ? ? //系統(tǒng)時(shí)鐘設(shè)置

? UART_Init();? ? ? ? ? ? ? ? ? ? ? ? //串口設(shè)置初始化

? Close_LED();? ? ? ? ? ? ? ? ? ? ? ? //關(guān)閉數(shù)碼管顯示

? Print_Str("I AM READY\n");? ? ? ? ? ? //發(fā)送字符串測試

? _EINT();? ? ? ? ? ? ? ? ? ? ? ? ? ? //開中斷


? P2SEL = 0x00; //p2都設(shè)置為io口輸出

? P2DIR = 0x03;//設(shè)置p2.0 p2.1為輸出


? while(1)? ? ? ? ? ? ? ? ? ? ? ? ? ? //無限循環(huán)

? ? {

? ? ? if(control=='1')

? ? {

? ? P2OUT = 0x01;//設(shè)置p2.0為輸出高電平

? ? }


? ? ? if(control=='2')

? ? {

? ? P2OUT = 0x02;//設(shè)置p2.1為輸出高電平

? ? }


? ? ? if(control=='3')

? ? {

? ? P2OUT = 0x00;//設(shè)置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

/*當(dāng)BRCLK=CPU_F時(shí)用下面的公式可以計(jì)算,否則要根據(jù)設(shè)置加入分頻系數(shù)*/

#define baud? ? ? ? ? 9600? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //設(shè)置波特率的大小

#define baud_setting? (uint)((ulong)CPU_F/((ulong)baud))? //波特率計(jì)算公式

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

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

#define LED8PORT? ? ? ? P2OUT? ? ? ? ? ? ? ? ? //P2接8個(gè)LED燈

#define LED8SEL? ? ? ? P2SEL? ? ? ? ? ? ? ? ? //P2接8個(gè)LED燈

#define LED8DIR? ? ? ? P2DIR? ? ? ? ? ? ? ? ? //P2接8個(gè)LED燈

#define DATAPORT P4OUT? ? ? ? ? ? ? ? ? //數(shù)據(jù)口所在端口P4

#define DATASEL? ? ? ? P4SEL? ? ? ? ? ? ? ? ? //數(shù)據(jù)口功能寄存器,控制功能模式

#define DATADIR? ? ? ? P4DIR? ? ? ? ? ? ? ? ? //數(shù)據(jù)口方向寄存器

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

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

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

#define DCTR0 ? ? ? ? P6OUT &= ~BIT4? ? ? ? ? //數(shù)碼管段控制位信號(hào)置低

#define DCTR1? ? ? ? ? P6OUT |=? BIT4? ? ? ? ? //數(shù)碼管段控制位信號(hào)置高

#define WCTR0 ? ? ? ? P6OUT &= ~BIT3? ? ? ? ? //數(shù)碼管位控制位信號(hào)置低

#define WCTR1? ? ? ? ? P6OUT |=? BIT3? ? ? ? ? //數(shù)碼管位控制位信號(hào)置高

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

// 共陰數(shù)碼管顯示的斷碼表

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

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

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

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

//? ? ? ? ? ? ? ? ? 系統(tǒng)時(shí)鐘初始化

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

void Clock_Init()

{

? uchar i;

? BCSCTL1&=~XT2OFF;? ? ? ? ? ? ? ? //打開XT2振蕩器

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

? do{

? ? IFG1&=~OFIFG;? ? ? ? ? ? ? ? ? //清楚振蕩器錯(cuò)誤標(biāo)志

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

? ? ? _NOP();

? }

? while((IFG1&OFIFG)!=0);? ? ? ? ? //如果標(biāo)志位1,則繼續(xù)循環(huán)等待

? IFG1&=~OFIFG;

}

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

//? ? ? ? ? ? ? MSP430內(nèi)部看門狗初始化

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

void WDT_Init()

{

? WDTCTL = WDTPW + WDTHOLD;? ? ? //關(guān)閉看門狗

}

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

// 關(guān)閉數(shù)碼管

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

void Close_LED()

{

? DATASEL? = 0x00;? ? ? ? ? ? ? ? ? ? ? //設(shè)置IO口為普通I/O模式,此句可省

? DATADIR? = 0xFF;? ? ? ? ? ? ? ? ? ? ? //設(shè)置IO口方向?yàn)檩敵?/p>

? DATAPORT = 0xFF;? ? ? ? ? ? ? ? ? ? ? //P4口初始設(shè)置為FF


? CTRSEL? =? 0x00;? ? ? ? ? ? ? ? ? ? ? //設(shè)置IO口為普通I/O模式,此句可省

? CTRDIR |=? BIT3 + BIT4;? ? ? ? ? ? ? //設(shè)置IO口方向?yàn)檩敵?控制口在P63,P64

? CTRPORT =? 0xFF;? ? ? ? ? ? ? ? ? ? ? //P6口初始設(shè)置為FF?


? DCTR1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //關(guān)掉數(shù)碼管,以免顯示亂碼? ? ? ? ? ? ? ? ?

? WCTR1;? ? ? ? ? ? ? ? ? ?

? DATAPORT=0xFF;? ? ? ? ? ? ? ? ? ? ? ? //關(guān)數(shù)碼管? ? ? ? ? ?

? WCTR0;

}


五、實(shí)驗(yàn)效果

效果圖如下



發(fā)送1 設(shè)置p2.0為輸出高電平 燈亮

發(fā)送2 設(shè)置p2.1為輸出高電平 燈亮

發(fā)送3 設(shè)置p2.0 p2.1為輸出低電平 燈滅

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容