目前手里只有12MHZ晶振的51单片机,想做蓝牙串口通信该怎么做?
这里有个程序可以在单片机上运行正常,是用电脑通过串口通信控制流水灯:
#include <reg52.h> //包含单片机寄存器的头文件
#define uchar unsigned char
#define uint unsigned int
#define LED P1
uchar dat,num;
void main()
{
TMOD=0x20; //用定时器设置串口波特率
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1; //串口初始化
SM0=0;
SM1=1;
EA=1; //开启总中断
ES=1; //开启串口中断
while(1)
{
if(num==1)
{
switch(dat) //判断串口接收的数据
{
case 1:LED=0xfe;break; //点亮第1个灯
case 2:LED=0xfd;break; //点亮第2个灯
case 3:LED=0xfb;break; //点亮第3个灯
case 4:LED=0xf7;break; //点亮第4个灯
case 5:LED=0xef;break; //点亮第5个灯
case 6:LED=0xdf;break; //点亮第6个灯
case 7:LED=0xbf;break; //点亮第7个灯
case 8:LED=0x7f;break; //点亮第8个灯
case 0:LED=0xff;break; //清空所有的灯
// default :break;
}
ES=1; //打开串口中断
num=0;
}
}
}
void ser() interrupt 4
{
RI=0;
dat=SBUF; //接收数据SBUF,即将计算机的数据接收。
ES=0; //关闭串口中断
num=1;
}
但是这个程序一旦换成是通过蓝牙传输数据就没办法正常运行了。
另外,计算机与单片机传输数据时,在串口调试助手上显示的数据就很不正常。例如以下代码的功能是计算机给单片机发什么字符,单片机就会返回什么字符给计算机,进而在计算机上显示出来,但是这个代码在这个12MHZ晶振的单片机上完全不能运行,返回来的数据都是乱码,改成蓝牙连接也是。
#include <reg52.h> //包含单片机寄存器的头文件
#define uchar unsigned char
#define uint unsigned int
uchar num,a;
/*
********************************************************************************
** 函数名称 : main(void)
** 函数功能 : 主函数
********************************************************************************
*/
void main()
{
TMOD=0x20; //用定时器设置串口波特率 9600
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1; //串口初始化
SM0=0;
SM1=1;
EA=1; //开启总中断
ES=1;
while(1)
{
if(num==1) //判断是否有串口数据的传送
{
ES=0;
num=0;
SBUF=a; //发送数据a到SBUF,即将单片机的数据发送到计算机
while(!TI);
TI=0;
ES=1;
}
}
}
void ser() interrupt 4
{
RI=0;
P2=SBUF; //接收数据SBUF,即将计算机的数据接收。
a=SBUF;
num=1;
}
后来想到12MHZ的晶振的单片机的通信的波特率就不是9600,可以通过修改定时器1的初值来适应9600的波特率。但是这种方法也失败了。郭天祥的书上有12MHZ晶振的初值表,根据初值表,选择误差最小的初值和模式,用波特率4800的波特率来通信,但是计算机还是没办法给单片机传输 数据。
后来看到一个帖子,说是可以用定时器2来设置串口通信,这样就可以零误差的设置为9600波特率的通信,但是这个帖子只给了设置波特率的代码,串口通信的代码却没给。
现在请教各位大神,采用何种方法才能让实现蓝牙的串口通信,最好是手机能通过蓝牙与单片机通信52.h> |