我本意是想做一个手机蓝牙控制的智能小车的,按照一个同学给我的视频教程一步一步做的,重复做了几次,全都是遇到手机端发送消息没法控制单片机的情况。现在我已经把能省的步骤全部都省了。
手机端用的是:蓝牙串口通信助手。
电脑用:串口调试助手。(XCOM)
单片机用的是51的板子。芯片为89c52RC。晶振为11.0592。P0^0~P0^7是八个流水灯(低电平有效)。
蓝牙模块用的是:SPP-CA替代HC-06。只有VCC.GND.TXD.RXD四个引脚。与单片机连接RX-TX.TX-RX。
现在给自己的任务是用手机上的蓝牙串口通信助手发送数据来控制单片机上的P0^0和P0^1两个流水灯的亮灭。但是失败了。
调试的时候发现了这样几个问题。希望高手帮我分析一下。
1.程序下载到板子后,不接蓝牙模块的情况下,我直接通过PC端的串口调试助手给板子发送数据的时候可以控制板子上的流水灯的亮灭。
2.单片机RX.TX短接,通过PC端串口调试助手可以接收到发送的数据。蓝牙模块RX.TX短接,通过手机蓝牙串口调试助手也可以接收到发送的数据。
3.PC端的串口调试助手勾选了发送新行,相应的手机蓝牙串口通信助手选择的是命令行模式,结束符为char\r\n)保证手机和电脑发送的数据是一样的。
4.在我把电脑通过串口线连上单片机,单片机连上蓝牙模块,蓝牙模块和手机蓝牙连接时,我用手机通过蓝牙串口通信助手发送的数据可以在电脑上的串口调试助手上接收到。我把PC的串口调试助手发送显示和接收显示的形式都调为16进制的形式显示。确认了我通过手机发送的数据和我之前通过PC端串口调试助手能够控制流水灯亮灭的数据一致。
5.我觉得问题就在这个地方。我的单片机上面的电源灯上面还有两个LED灯,TX和RX指示灯,当我通过PC端向板子发送数据的时候(可以控制流水灯的亮灭),我每发送一次数据,随着流水灯的亮灭,RX指示灯就闪一次。但是我从手机端发送同样的数据时,我每发送一次,闪的却是TX指示灯。所以我觉得此时单片机不是处于接收蓝牙数据的状态,而是处于发送数据的状态。
下面我贴出我的程序。
[mw_shl_code=c,true]#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit R1=P0^0;
sbit R2=P0^1;
uchar a=0;
void init()
{
TMOD=0x20; //设置定时器T1为工作方式2
TH1=0xfd ; //T1装初值,高低复位
TL1=0xfd ; //T1装初值,高低复位
TR1=1; //启动定时器T1
REN=1; //允许串口接收
SM0=0; //
SM1=1; //设置串口工作方式1
EA=1; //开总中断
ES=1; //开串口中断
}
void main()
{
init();
while(1)
{
switch(a)
{
case 65: R1=!R1; break;
case 66: R2=!R2; break;
}
}
}
void chuan() interrupt 4
{
RI=0; //将接收中断标志位清0
a=SBUF; //读取单片机串口接收的蓝牙模块发送的数据
}
[/mw_shl_code]
|