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

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

硬件部分
首先,是STC15F2K08S2单片机的引脚图:
SOP28封装
我用的是P3.1作为Tx口,P3.0作为Rx口,当然大家还可以选择这一型号单片机的其他两个串行口进行通信。
接着是蓝牙模块。我是用的是JDY-10蓝牙模块,这一种蓝牙模块成本和功耗都非常低,性能比较稳定,比较适合小规模的使用。接下来是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蓝牙模块,这个的使用非常简单,如果有时间我会专门再写一个关于这一模块使用方法的博客。
  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,以下是STC8A8K64D4单片机JDY-31蓝牙模块进行通信的基本代码: ```c #include <STC8.H> #include <intrins.h> #define FOSC 24000000L //系统时钟频率 #define BAUD 9600 //串口波特率 #define MD0 P3_0 //定义STC8A8K64D4 P3.0引脚作为蓝牙模块的模式选择引脚 bit busy; //串口忙标志位 unsigned char RcvBuff; //串口接收缓冲区 void InitUART() //初始化串口 { SCON = 0x50; //8位数据,可变波特率 TMOD &= 0x0F; //清除原来的定时器设置 TMOD |= 0x20; //设定定时器1为8位自动重装方式 TH1 = TL1 = -(FOSC/12/32/BAUD);//设定波特率 TR1 = 1; //启动定时器1 ES = 1; //串口中断允许 EA = 1; //总中断允许 } void UART_SendByte(unsigned char dat) //串口发送一个字符 { while(busy); //等待前面的数据发送完成 busy = 1; SBUF = dat; //写数据到UART数据寄存器 } void main() { InitUART(); //初始化串口 while(1) { MD0 = 0; //将P3.0引脚置为低电平,使蓝牙模块进入AT指令模式 UART_SendByte('A'); //向蓝牙模块发送AT指令 MD0 = 1; //将P3.0引脚置为高电平,使蓝牙模块退出AT指令模式 } } void UART_Isr() interrupt 4 using 1 //串口中断服务程序 { if(RI) { RI = 0; RcvBuff = SBUF; } if(TI) { TI = 0; busy = 0; } } ``` 以上代码实现了串口初始化、发送一个字符的函数以及主函数中对蓝牙模块的AT指令操作。其中,P3.0引脚作为蓝牙模块的模式选择引脚,当该引脚为低电平时,蓝牙模块进入AT指令模式;当该引脚为高电平时,蓝牙模块退出AT指令模式。此外,还需要注意将STC8A8K64D4单片机的串口接口连接到JDY-31蓝牙模块的TX和RX引脚上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值