两个单片机之间用蓝牙模块通信不成功
时间:10-02
整理:3721RD
点击:
请问各位大佬,我做的两个单片机之间用蓝牙模块进行通信时,在Proteus上仿真(蓝牙我直接用导线代替)时很成功,但是用实物时就一点反应都没有。下面是代码,功能是控制主机的矩阵键盘,在从机上显示矩阵键盘上按下的按键号。
/**************************************************
主机部分
******************************************/
#include<reg52.h>
#define u8 unsigned char
#define u16 unsigned int
u8 res;//存储键盘扫描的结果,用来判断按下的是哪个按键
void Init_master()
{
TMOD=0X20;
TH1=0Xf9;
TL1=0Xf9;
PCON=0X80;
TR1=1;
SCON=0X50;
}
unsigned char scan_key()
{
P2 = 0xf0;
switch (P2)
{
case 0x70:
res = 0;
break;
case 0xb0:
res = 1;
break;
case 0xd0:
res = 2;
break;
case 0xe0:
res = 3;
break;
default:res=16;
}
P2 = 0x0f;
switch(P2)
{
case 0x07:
res = 0 + res;
break;
case 0x0b:
res = 4 + res;
break;
case 0x0d:
res = 8 + res;
break;
case 0x0e:
res = 12 + res;
break;
default:res=16;
}
return res;
}
void main()
{
while(1)
{
u16 i=500,j=500;
Init_master(); //调用串口初始化函数
scan_key();//调用键盘扫描函数
SBUF=res; //将扫描到的键值发送出去
while(!TI); //检测是否发送完成,完成则讲TI清零
TI=0;
}
}
/***********************************************************
从机部分
************************************************************/
#include<reg52.h>
#define u8 unsigned char
#define u16 unsigned int
u8 res;
u8 seg[17]= {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00
};
void Init_slave()
{
TMOD=0X20; //设置定时器1工作在模式2
TH1=0Xf9; // 设定波特率为9600
TL1=0XF9;
PCON=0X80; //smod0=1;
TR1=1; //打开定时器1
SCON=0X50; //设置串口控制寄存器,使之工作在方式1
EA=1; //打开总中断
ES=1; //打开串口中断
}
void main()
{
Init_slave(); //调用串口初始化函数
while(1);
}
void slave()interrupt 4 //中断服务函数
{
RI=0; //将接收中断清零,等待下一次接收
res=SBUF; //将缓存区的值通过p1口输出
P1=seg[res];
}
/**************************************************
主机部分
******************************************/
#include<reg52.h>
#define u8 unsigned char
#define u16 unsigned int
u8 res;//存储键盘扫描的结果,用来判断按下的是哪个按键
void Init_master()
{
TMOD=0X20;
TH1=0Xf9;
TL1=0Xf9;
PCON=0X80;
TR1=1;
SCON=0X50;
}
unsigned char scan_key()
{
P2 = 0xf0;
switch (P2)
{
case 0x70:
res = 0;
break;
case 0xb0:
res = 1;
break;
case 0xd0:
res = 2;
break;
case 0xe0:
res = 3;
break;
default:res=16;
}
P2 = 0x0f;
switch(P2)
{
case 0x07:
res = 0 + res;
break;
case 0x0b:
res = 4 + res;
break;
case 0x0d:
res = 8 + res;
break;
case 0x0e:
res = 12 + res;
break;
default:res=16;
}
return res;
}
void main()
{
while(1)
{
u16 i=500,j=500;
Init_master(); //调用串口初始化函数
scan_key();//调用键盘扫描函数
SBUF=res; //将扫描到的键值发送出去
while(!TI); //检测是否发送完成,完成则讲TI清零
TI=0;
}
}
/***********************************************************
从机部分
************************************************************/
#include<reg52.h>
#define u8 unsigned char
#define u16 unsigned int
u8 res;
u8 seg[17]= {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00
};
void Init_slave()
{
TMOD=0X20; //设置定时器1工作在模式2
TH1=0Xf9; // 设定波特率为9600
TL1=0XF9;
PCON=0X80; //smod0=1;
TR1=1; //打开定时器1
SCON=0X50; //设置串口控制寄存器,使之工作在方式1
EA=1; //打开总中断
ES=1; //打开串口中断
}
void main()
{
Init_slave(); //调用串口初始化函数
while(1);
}
void slave()interrupt 4 //中断服务函数
{
RI=0; //将接收中断清零,等待下一次接收
res=SBUF; //将缓存区的值通过p1口输出
P1=seg[res];
}
蓝牙模块和串口波特率我调的都是9600bit/s
上电后蓝牙能配对,但是我按下主机的按键从机的led就是没任何反应
另外,我还有个疑问。就是我是用蓝牙的rx和tx对应的与单片机的rx和tx连接然后经单片机通过USB线与电脑相连,然后用电脑上的串口调试软件来给蓝牙发送at指令,发送指令之前需要调串口的波特率只有与蓝牙的一致才能发送指令,蓝牙默认是34800,当我在波特率为34800时设置蓝牙波特率为9600后,再次上电后,只有我把串口软件的波特率调成34800才能发送指令,我的疑问就是为啥之前已经修改过了,但是现在还是要选之前的波特率。51小白一只,请大佬带飞,非常感谢!
现在的蓝牙模块很简单的,买来直接连上就是串口使用,不需要任何设置
