基于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蓝牙模块,这个的使用非常简单,如果有时间我会专门再写一个关于这一模块使用方法的博客。
相关文章推荐
- 基于STC15F2K08S2单片机和JDY-10蓝牙模块的串行通信
- 基于STC15F2K08S2单片机和JDY-10蓝牙模块的串行通信
- 基于STC15F2K08S2单片机和JDY-10蓝牙模块的串行通信
- 基于STC15F2K08S2单片机和JDY-10蓝牙模块的串行通信
- 基于STC15F2K08S2单片机和JDY-10蓝牙模块的串行通信
- 基于STC15F2K08S2单片机和JDY-10蓝牙模块的串行通信
- 基于STC15F2K08S2单片机和JDY-10蓝牙模块的串行通信
- 基于单片机蓝牙通信的安卓上位机应用
- android开发之手机与单片机蓝牙模块通信
- Android Service和Activity基于串口蓝牙模块的双向通信
- Android Service和Activity基于串口蓝牙模块的双向通信
- android手机通过串口蓝牙透传模块与AVR单片机通信实例。。。蓝牙服务程序案例
- Android单片机与蓝牙模块通信实例代码
- 【Android开发 蓝牙通信】手机蓝牙与下位机HC-05蓝牙模块通信系统
- 用C#开发.NET CF 蓝牙通信模块(2)
- 使用C#来开发.NET CF 蓝牙通信模块
- 用C#开发.NETCF蓝牙通信模块
- 基于STM8的ADC0832采集及蓝牙通信系统
- 安卓手机与蓝牙串口模块的通信
- 使用C#来开发.NET CF 蓝牙通信模块(转载)