姓名:周唯 ;学号: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蓝牙模块之间的通信是通过串口进行通信,hc06的TXD接单片机的RXD,hc06的RXD接单片机的TXD,而单片机的串口则根据不同型号的msp430芯片而定,本文中所使用的为f149芯片,故txd和rxd分别问p3.4,p3.5
图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为输出低电平 灯灭