標(biāo)題: 單片機(jī)如何實(shí)現(xiàn)12MHZ的藍(lán)牙串口通信? [打印本頁(yè)]

作者: 鋼鐵俠mark-50    時(shí)間: 2020-2-26 10:17
標(biāo)題: 單片機(jī)如何實(shí)現(xiàn)12MHZ的藍(lán)牙串口通信?
目前手里只有12MHZ晶振的51單片機(jī),想做藍(lán)牙串口通信該怎么做?
這里有個(gè)程序可以在單片機(jī)上運(yùn)行正常,是用電腦通過(guò)串口通信控制流水燈:
#include <reg52.h>                   //包含單片機(jī)寄存器的頭文件
#define uchar unsigned char
#define uint unsigned int
#define LED P1
uchar dat,num;
void main()
{        
        TMOD=0x20;                   //用定時(shí)器設(shè)置串口波特率
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        REN=1;          //串口初始化
        SM0=0;
        SM1=1;
        EA=1;           //開啟總中斷
        ES=1;                        //開啟串口中斷
        while(1)
        {        
                if(num==1)
                {
                        switch(dat)    //判斷串口接收的數(shù)據(jù)
                        {
                                case 1:LED=0xfe;break; //點(diǎn)亮第1個(gè)燈
                                case 2:LED=0xfd;break;  //點(diǎn)亮第2個(gè)燈
                                case 3:LED=0xfb;break;  //點(diǎn)亮第3個(gè)燈
                                case 4:LED=0xf7;break;  //點(diǎn)亮第4個(gè)燈
                                case 5:LED=0xef;break;  //點(diǎn)亮第5個(gè)燈
                                case 6:LED=0xdf;break;  //點(diǎn)亮第6個(gè)燈
                                case 7:LED=0xbf;break;  //點(diǎn)亮第7個(gè)燈
                                case 8:LED=0x7f;break;  //點(diǎn)亮第8個(gè)燈
                                case 0:LED=0xff;break;  //清空所有的燈
                        //        default :break;
                        }
                        ES=1;                 //打開串口中斷        
                        num=0;
                }
               
        }        
}
void ser() interrupt 4
{
        RI=0;
        dat=SBUF;                                //接收數(shù)據(jù)SBUF,即將計(jì)算機(jī)的數(shù)據(jù)接收。
        ES=0;                                    //關(guān)閉串口中斷
        num=1;
}


但是這個(gè)程序一旦換成是通過(guò)藍(lán)牙傳輸數(shù)據(jù)就沒(méi)辦法正常運(yùn)行了。
另外,計(jì)算機(jī)與單片機(jī)傳輸數(shù)據(jù)時(shí),在串口調(diào)試助手上顯示的數(shù)據(jù)就很不正常。例如以下代碼的功能是計(jì)算機(jī)給單片機(jī)發(fā)什么字符,單片機(jī)就會(huì)返回什么字符給計(jì)算機(jī),進(jìn)而在計(jì)算機(jī)上顯示出來(lái),但是這個(gè)代碼在這個(gè)12MHZ晶振的單片機(jī)上完全不能運(yùn)行,返回來(lái)的數(shù)據(jù)都是亂碼,改成藍(lán)牙連接也是。
#include <reg52.h>                   //包含單片機(jī)寄存器的頭文件
#define uchar unsigned char
#define uint unsigned int
uchar num,a;

/*
********************************************************************************
** 函數(shù)名稱 : main(void)
** 函數(shù)功能 : 主函數(shù)
********************************************************************************
*/
void main()
{
        TMOD=0x20;                   //用定時(shí)器設(shè)置串口波特率           9600
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        REN=1;          //串口初始化
        SM0=0;
        SM1=1;
        EA=1;           //開啟總中斷
        ES=1;
        while(1)
        {
                if(num==1)    //判斷是否有串口數(shù)據(jù)的傳送
                {
                        ES=0;
                        num=0;
                        SBUF=a;                         //發(fā)送數(shù)據(jù)a到SBUF,即將單片機(jī)的數(shù)據(jù)發(fā)送到計(jì)算機(jī)
                        while(!TI);
                        TI=0;
                        ES=1;
                }
        }        
}
void ser() interrupt 4
{
        RI=0;
        P2=SBUF;                        //接收數(shù)據(jù)SBUF,即將計(jì)算機(jī)的數(shù)據(jù)接收。
        a=SBUF;
        num=1;
}


后來(lái)想到12MHZ的晶振的單片機(jī)的通信的波特率就不是9600,可以通過(guò)修改定時(shí)器1的初值來(lái)適應(yīng)9600的波特率。但是這種方法也失敗了。郭天祥的書上有12MHZ晶振的初值表,根據(jù)初值表,選擇誤差最小的初值和模式,用波特率4800的波特率來(lái)通信,但是計(jì)算機(jī)還是沒(méi)辦法給單片機(jī)傳輸 數(shù)據(jù)。

后來(lái)看到一個(gè)帖子,說(shuō)是可以用定時(shí)器2來(lái)設(shè)置串口通信,這樣就可以零誤差的設(shè)置為9600波特率的通信,但是這個(gè)帖子只給了設(shè)置波特率的代碼,串口通信的代碼卻沒(méi)給。

現(xiàn)在請(qǐng)教各位大神,采用何種方法才能讓實(shí)現(xiàn)藍(lán)牙的串口通信,最好是手機(jī)能通過(guò)藍(lán)牙與單片機(jī)通信52.h>
作者: 鄭漢松    時(shí)間: 2020-2-26 20:18
單片機(jī)與電腦串口能調(diào)通,說(shuō)明串口是沒(méi)問(wèn)題的,串口沒(méi)問(wèn)題,那么藍(lán)牙通訊也沒(méi)問(wèn)題,不過(guò)要檢查一下單片機(jī)TX要連藍(lán)牙RX,單片機(jī)RX連藍(lán)牙TX,還要共同接一條地線。還有檢查一下藍(lán)牙波特率設(shè)置和主從模式有沒(méi)有問(wèn)題。
作者: 281433001    時(shí)間: 2020-2-28 09:57
如樓上所說(shuō),單片機(jī)串口沒(méi)有問(wèn)題,可以使用TTL下載器連接藍(lán)牙模塊,使用串口助手直接與電腦進(jìn)行通信(一般默認(rèn)波特率為9600或者115200),然后使用藍(lán)牙模塊相關(guān)的AT指令查看藍(lán)牙主從模式和修改藍(lán)牙通信波特率
作者: chinayanhui    時(shí)間: 2020-2-28 10:55
12M的晶振使用串口通訊有誤差。建議使用11.0592或22.1184
作者: brew9    時(shí)間: 2020-2-28 14:04
給你看幾張圖就知道為什么12M晶振不適合串口通訊了。
0xfd對(duì)應(yīng)的波特率(0xfd是你程序的設(shè)置)





0xfe對(duì)應(yīng)的波特率


以上兩張圖可以看出,12M晶振沒(méi)法把波特率調(diào)到9600。

用11.0592剛好



作者: 鄒記    時(shí)間: 2020-2-28 19:25
12M晶振使用串口通訊有誤差,不同步交換數(shù)據(jù)。建議使用11.0592M
作者: wulin    時(shí)間: 2020-2-29 04:52
降低波特率到4800并設(shè)置加倍,減少誤差。
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xF3;
    TL1 =  0xF3;
    PCON = 0x80;//比特率加倍
    EA = 1;
    ES = 1;
    TR1 = 1;
}




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1