一、蓝牙模块与串口调试
1.准备一个蓝牙模块HC-06和一个TTL转usb下载器,如下图。
2.在进行蓝牙模块调试时我用的是STC-ISP工具,打开之后里面有串口调试工具,设置波特率一般是9600,接受和发送模式为HEX模式。将蓝牙模块和下载器模块电源和地分别连接好RXD和TXD交叉连接,即蓝牙模块的TXD连接下载器的RXD,蓝牙模块的RXD连接下载器的TXD。
3、手机行下载蓝牙串口调试工具,便可以进行数据的发送和接受了。
调试过后发现一些未能解决的问题,希望大牛可以帮忙看看:
发送缓冲区传送文字0的时候接收缓冲区显示80,单片机接收数字为0x00
手机蓝牙串口助手发送0接收缓冲区显示30.,单片机接受数字为0x70
4、在调试完成后自己写了一个用lcd1602显示手机蓝牙串口发送0-9数字显示的程序供参考。(在测试的过程中发现一些小问题,不同的晶振蓝牙串口发送相同的数据,单片机接收到的数据是不同的,因此在做之前最好自己测试一下,可将SBUF送到P0口,用led显示接收到的数字。)
#include <reg51.h> //此文件中定义了单片机的一些特殊功能寄存器
#define uint unsigned int //对数据类型进行声明定义
#define uchar unsigned char
# define LCD1602_DATAPINS P0
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
sbit LCD1602_E=P2^7;
void UsartInit();
void LcdInit();
void Delay1ms(uint c) ;
void LcdWriteCom(uchar com) ;
void LcdWriteData(uchar dat);
uchar receiveData;
uchar keys[]={'0','1','2','3','4','5','6','7','8','9'};
/*******************************************************************************
* 函数功能 : 主函数
*******************************************************************************/
void main()
{
UsartInit(); // 串口初始化
LcdInit();
while(1);
}
/*******************************************************************************
* 函数功能 :串口初始化
*******************************************************************************/
void UsartInit()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XFA; //当TL1溢出是自动将TH1的值装入TL1中
TL1=0XFA; //计数器初始值设置,注意波特率是9600的
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
/*******************************************************************************
LCD初始化
*******************************************************************************/
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //开显示
LcdWriteCom(0x0e); //开显示显示光标
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //设置数据指针起点
}
/*******************************************************************************
延时c ms
*******************************************************************************/
void Delay1ms(uint c) //误差 0us
{
uint a,b;
for(a=c;a>0;a--)
for(b=112;b>0;b--);
}
/*******************************************************************************
LCD写入命令
*******************************************************************************/
void LcdWriteCom(uchar com) //写入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //选择发送命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com; //放入命令
Delay1ms(1); //等待数据稳定
LCD1602_E = 1; //写入时序
Delay1ms(5); //保持时间
LCD1602_E = 0;
}
/*******************************************************************************
LCD写入数据
*******************************************************************************/
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择输入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //写入数据
Delay1ms(1);
LCD1602_E = 1; //写入时序
Delay1ms(5); //保持时间
LCD1602_E = 0;
}
/*******************************************************************************
* 函数功能 : 串口通信中断函数,美接受或者发送数据的时候进入
*******************************************************************************/
void Usart() interrupt 4
{
receiveData=SBUF; //出去接收到的数据
RI = 0; //清除接收中断标志位
SBUF=receiveData; //将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
if(receiveData==0x70)
LcdWriteData(keys[0]);
else if(receiveData==0x71)
LcdWriteData(keys[1]);
else if(receiveData==0x72)
LcdWriteData(keys[2]);
else if(receiveData==0x73)
LcdWriteData(keys[3]);
else if(receiveData==0x74)
LcdWriteData(keys[4]);
else if(receiveData==0x75)
LcdWriteData(keys[5]);
else if(receiveData==0x76)
LcdWriteData(keys[6]);
else if(receiveData==0x77)
LcdWriteData(keys[7]);
else if(receiveData==0x78)
LcdWriteData(keys[8]);
else
LcdWriteData(keys[9]);
//P0= receiveData; //这里用来测试SBUF数字究竟是几用的
Delay1ms(100);
}