姓名:周唯 佑力;學(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年開始推向市場(chǎng)的一種16位超低功耗蚀苛、具有精簡(jiǎn)指令集(RISC)的混合信號(hào)處理器(Mixed Signal Processor)。
MSP430單片機(jī)稱之為混合信號(hào)處理器玷氏,是由于其針對(duì)實(shí)際應(yīng)用需求堵未,將多個(gè)不同功能的模擬電路、數(shù)字電路模塊和微處理器集成在一個(gè)芯片上盏触,以提供“單片機(jī)”解決方案渗蟹。該系列單片機(jī)多應(yīng)用于需要電池供電的便攜式儀器儀表中。
簡(jiǎn)而言之赞辩,單片機(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)牙模塊之間的通信是通過串口進(jìn)行通信复旬,hc06的TXD接單片機(jī)的RXD,hc06的RXD接單片機(jī)的TXD冲泥,而單片機(jī)的串口則根據(jù)不同型號(hào)的msp430芯片而定驹碍,本文中所使用的為f149芯片,故txd和rxd分別問p3.4凡恍,p3.5
圖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ā)送字符串測(cè)試
? _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為輸出低電平 燈滅