目前手里只有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> |