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

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

硬件部分
首先,是STC15F2K08S2单片机的引脚图:
基于STC15F2K08S2单片机和JDY-10蓝牙模块的串行通信_第1张图片
我用的是P3.1作为Tx口,P3.0作为Rx口,当然大家还可以选择这一型号单片机的其他两个串行口进行通信。
接着是蓝牙模块。我是用的是JDY-10蓝牙模块,这一种蓝牙模块成本和功耗都非常低,性能比较稳定,比较适合小规模的使用。接下来是JDY-10的引脚图:
基于STC15F2K08S2单片机和JDY-10蓝牙模块的串行通信_第2张图片
因为需要串行通信,所以我们需要把单片机的Tx脚和蓝牙模块的Rx脚直接相连,把单片机的Rx脚和蓝牙模块的Tx脚直接相连。在连接的时候大家注意不要短路了。在我的项目中,我直接要求工厂开板用PCB连线了。下面是板子的图片:
基于STC15F2K08S2单片机和JDY-10蓝牙模块的串行通信_第3张图片
代码部分
主要是给单片机写代码,也就是配置串口(包括定时器等寄存器).
(用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蓝牙模块,这个的使用非常简单,如果有时间我会专门再写一个关于这一模块使用方法的博客。

你可能感兴趣的:(单片机,单片机,通信,蓝牙,硬件)