找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3625|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)如何實(shí)現(xiàn)12MHZ的藍(lán)牙串口通信?

[復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 50 黑幣 回復(fù)本帖可獲得 5 黑幣獎(jiǎng)勵(lì)! 每人限 1 次
跳轉(zhuǎ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;           //開(kāi)啟總中斷
        ES=1;                        //開(kāi)啟串口中斷
        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;                 //打開(kāi)串口中斷        
                        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;           //開(kāi)啟總中斷
        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>
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:514901 發(fā)表于 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)題。
回復(fù)

使用道具 舉報(bào)

板凳
ID:398075 發(fā)表于 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)牙通信波特率
回復(fù)

使用道具 舉報(bào)

地板
ID:695961 發(fā)表于 2020-2-28 10:55 | 只看該作者
12M的晶振使用串口通訊有誤差。建議使用11.0592或22.1184
回復(fù)

使用道具 舉報(bào)

5#
ID:407089 發(fā)表于 2020-2-28 14:04 | 只看該作者
給你看幾張圖就知道為什么12M晶振不適合串口通訊了。
0xfd對(duì)應(yīng)的波特率(0xfd是你程序的設(shè)置)





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


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

用11.0592剛好


回復(fù)

使用道具 舉報(bào)

6#
ID:607110 發(fā)表于 2020-2-28 19:25 | 只看該作者
12M晶振使用串口通訊有誤差,不同步交換數(shù)據(jù)。建議使用11.0592M
回復(fù)

使用道具 舉報(bào)

7#
ID:213173 發(fā)表于 2020-2-29 04:52 | 只看該作者
降低波特率到4800并設(shè)置加倍,減少誤差。
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xF3;
    TL1 =  0xF3;
    PCON = 0x80;//比特率加倍
    EA = 1;
    ES = 1;
    TR1 = 1;
}
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表