找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2987|回复: 6
打印 上一主题 下一主题
收起左侧

单片机如何实现12MHZ的蓝牙串口通信?

[复制链接]
回帖奖励 50 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
目前手里只有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>
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:514901 发表于 2020-2-26 20:18 | 只看该作者
单片机与电脑串口能调通,说明串口是没问题的,串口没问题,那么蓝牙通讯也没问题,不过要检查一下单片机TX要连蓝牙RX,单片机RX连蓝牙TX,还要共同接一条地线。还有检查一下蓝牙波特率设置和主从模式有没有问题。
回复

使用道具 举报

板凳
ID:398075 发表于 2020-2-28 09:57 | 只看该作者
如楼上所说,单片机串口没有问题,可以使用TTL下载器连接蓝牙模块,使用串口助手直接与电脑进行通信(一般默认波特率为9600或者115200),然后使用蓝牙模块相关的AT指令查看蓝牙主从模式和修改蓝牙通信波特率
回复

使用道具 举报

地板
ID:695961 发表于 2020-2-28 10:55 | 只看该作者
12M的晶振使用串口通讯有误差。建议使用11.0592或22.1184
回复

使用道具 举报

5#
ID:407089 发表于 2020-2-28 14:04 | 只看该作者
给你看几张图就知道为什么12M晶振不适合串口通讯了。
0xfd对应的波特率(0xfd是你程序的设置)





0xfe对应的波特率


以上两张图可以看出,12M晶振没法把波特率调到9600。

用11.0592刚好


回复

使用道具 举报

6#
ID:607110 发表于 2020-2-28 19:25 | 只看该作者
12M晶振使用串口通讯有误差,不同步交换数据。建议使用11.0592M
回复

使用道具 举报

7#
ID:213173 发表于 2020-2-29 04:52 | 只看该作者
降低波特率到4800并设置加倍,减少误差。
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xF3;
    TL1 =  0xF3;
    PCON = 0x80;//比特率加倍
    EA = 1;
    ES = 1;
    TR1 = 1;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表