您的位置:首页 > 其它

基于STC15F2K08S2单片机和JDY-10蓝牙模块的串行通信

2017-10-05 22:49 337 查看
最近自己在做一个项目,用到了STC15F2K08S2这一型号的单片机和JDY-10蓝牙模块,并用它们进行了串行通信,今天就在这里向大家介绍一下串行通信方法。


硬件部分

首先,是STC15F2K08S2单片机的引脚图:



4000

我用的是P3.1作为Tx口,P3.0作为Rx口,当然大家还可以选择这一型号单片机的其他两个串行口进行通信。

接着是蓝牙模块。我是用的是JDY-10蓝牙模块,这一种蓝牙模块成本和功耗都非常低,性能比较稳定,比较适合小规模的使用。接下来是JDY-10的引脚图:



因为需要串行通信,所以我们需要把单片机的Tx脚和蓝牙模块的Rx脚直接相连,把单片机的Rx脚和蓝牙模块的Tx脚直接相连。在连接的时候大家注意不要短路了。在我的项目中,我直接要求工厂开板用PCB连线了。下面是板子的图片:



代码部分

主要是给单片机写代码,也就是配置串口(包括定时器等寄存器).

(用Keil-μVision5编译)

先贴上代码:

#include "reg52.h"
#include "intrins.h"
unsigned char timer0h,timer0l,time;
typedef unsigned int u16;
typedef unsigned char u8;
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define FOSC 11059200L
#define BAUD 115200

#define NONE_PARITY     0
#define ODD_PARITY      1
#define EVEN_PARITY     2
#define MARK_PARITY     3
#define SPACE_PARITY    4

#define PARITYBIT NONE_PARITY
sbit led=P2^6;
sbit speaker=P2^7;
sbit speaker1=P2^5;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;

sfr AUXR  = 0x8e;

sfr P_SW1   = 0xA2;

#define S1_S0 0x40
#define S1_S1 0x80
BYTE  flag;
sbit P22 = P2^2;
bit busy;
void InitUart();
void SendData(BYTE dat);
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
InitUart();
while(1)
{
;
}
}
void InitUart()
{
ACC = P_SW1;
ACC &= ~(S1_S0 | S1_S1);
P_SW1 = ACC;

#if (PARITYBIT == NONE_PARITY)
SCON = 0x50;
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
SCON = 0xda;
#elif (PARITYBIT == SPACE_PARITY)
SCON = 0xd2;
#endif

AUXR = 0x40;
TMOD = 0x00;
TL1 = (65536 - (FOSC/4/BAUD));
TH1 = (65536 - (FOSC/4/BAUD))>>8;
TR1 = 1;
PT0=1;
ES = 1;
EA = 1;
ET0=1;
TR0=0;

}
void Uart() interrupt 4 using 1
{
u16 sb;
if (RI)
{
RI = 0;
sb=SBUF;
SendData(sb) ;
}
}
void SendData(BYTE dat)
{
SBUF = dat;
while (!TI);
TI = 0;
}


代码解析

初始化串口:(使用了定时器1)

void InitUart()
{
ACC = P_SW1;
ACC &= ~(S1_S0 | S1_S1);
P_SW1 = ACC;

#if (PARITYBIT == NONE_PARITY)
SCON = 0x50;
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
SCON = 0xda;
#elif (PARITYBIT == SPACE_PARITY)
SCON = 0xd2;
#endif

AUXR = 0x40;
TMOD = 0x00;
TL1 = (65536 - (FOSC/4/BAUD));
TH1 = (65536 - (FOSC/4/BAUD))>>8;
TR1 = 1;
PT0=1;
ES = 1;
EA = 1;
ET0=1;
TR0=0;

}


串行中断(中断4)

void Uart() interrupt 4 using 1
{
u16 sb;
if (RI)
{
RI = 0;
sb=SBUF;
SendData(sb) ;
}
}


发送数据的函数(这里需要注意,SBUF是51单片机可以储存串行数据的寄存器)

void SendData(BYTE dat)
{
SBUF = dat;
while (!TI);
TI = 0;
}


这就是STC15F2K08S2单片机串行通信的所有步骤,至于JDY-10蓝牙模块,这个的使用非常简单,如果有时间我会专门再写一个关于这一模块使用方法的博客。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息