51单片机串口通信与蓝牙模块应用指南

一、串口 

1、串口认知

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方 式的扩展接口。串行接口(Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简 单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成 本,特别适用于远距离通信,但传送速度较慢。

异步串行是指UART(Universal Asynchronous Receiver/Transmitter),通用异步接收/发送。 UART包含TTL电平的串口和RS232电平的串口

  • 是设备间接线通信的一种方式
  • 数据一位一位地顺序传送
  • 双向通信,全双工
  • 传送速度相对较慢
  • 2、串口接线

  • 笔记本电脑通过TTL电平与单片机通信,TX发送线(端口)数据输入引脚,数据接受; RX接收线 (端口)数据发送引脚,数据发送
  •         USB转TTL,使用CH340通信

  • 串口接线方式
  • 蓝牙模块(接线与串口一致,都为交叉接线)一般用串口测试完毕,再用蓝牙模块开发
  •  

    二、串口通信

    串口相关寄存器

    SBUF: STC89C52设有2个互相独立的接收、发送缓冲器,可以同时发送和接收数据。发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入,因而两个缓冲器可以共用一个地址码( 99H),都 是两个独立的8 位寄存器。两个缓冲器统称 串行通信特殊功能寄存器SBUF

    代码体现为:   接收数据   char data = SBUF          发送数据    SBUF = data

    波特率:UART是异步串行接口,通信双方使用时钟不同,因为双方硬件配置不同,但是需要约定通信速度,叫做波特率。

    串行通信设有4种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不同应用场合选用。波特率由内部定时器/计数器产生,用软件设置不同的波特率和选择不同的工作方式。主机可通过查询或中断方式对接收/发送进行程序处理,使用十分灵活。

    (校验位和停止位一般都为初始配置,这里就不着重介绍了)

    SCON寄存器:用来控制串行通信的工作方式及反映串行口的工作状态。SCON的地址是98H,可位寻址。如下图所示。

    配置常用SCON寄存器,主要通过对串行通信的工作模式进行控制。

  • SM0、SM1:组合确定串行口的模式,不同的模式下波特率不同,功能也不同。
  • REN:允许/禁止串行接收控制位。 由软件置位REN,即REN=1为允许串行接收状态,可启动串行口接收数据。
  • TI:发送中断请求标志位。主机通过串行口发送数据发送完成后,TI会置1,向串口申请中断,如果TI为1 就表示SUBF的数据已经发送完成了,要手动将TI位清零。(即SBUF=Data)
  • RI:接收中断请求标志位。从机接收到主机通过串行口接收到的数据后,RI会置1,即会串口申请中断,如果RI为1 就表示数据已经通过SBUF读取完成了,要手动将RI位清零。(即Data=SBUF)
  •  具体其他位功能可自行阅读产品手册

    SCON寄存器:电源控制寄存器

    stc-isp工具波特率计算器(方便)

     三、代码实现

    通过串口中断方式进行点灯

    static关键字:

    静态全局变量:在声明它的整个文件都是可见的,而在文件之外是不可见的,即使用extern声明也不能使用。

    静态局部变量:在程序执行到该对象的声明处时只执行一次初始化;

    静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;

    #include <reg52.h>
    #include <intrins.h>
    #include <string.h>
    
    #define SIZE 12
    sfr AUXR=0x8E;
    sbit led1=P3^7;
    char cmd[12];
    
    void UartInit(void)		//9600bps@11.0592MHz
    {
    	AUXR=0x01;
    	SCON=0x50;//8位数据,可变波特率 REN置1
    	TMOD &= 0x0F;//定时器时钟为12T
    	TMOD |= 0x20;//串口1选择定时器1为波特率发生器
    	
    	TH1=0xFD;//设定定时初值
    	TL1=0xFD;//波特率为9600
    	TR1=1;//启动定时器1
    	
    	EA=1;//开启总中断
    	ES=1;//开启串口中断
    	
    }
    
    
    void Delay1000ms()		//@11.0592MHz
    {
    	unsigned char i, j, k;
    
    	_nop_();
    	i = 8;
    	j = 1;
    	k = 243;
    	do
    	{
    		do
    		{
    			while (--k);
    		} while (--j);
    	} while (--i);
    }
    
    void sendByte(char data_msg)//发送字节
    {
    	 SBUF=data_msg;
    	 while(!TI);//TI为发送中断请求位
    	 TI=0;//软件置0
    	
    }
    void sendString(char *str)//发送字符串
    {
    	 while(*str!='\0'){
        sendByte(*str);
    		 str++;
     }
    }
    void main()
    {
    	led1=1;
    	UartInit();//串口初始化
    	while(1){ 
    	    Delay1000ms(); 
           sendString("zhengyanfeng handsome\r\n");   
     }
    }
    
    void Uart_handle() interrupt 4
    {
    	static int i=0;//静态变量,初始化1次
    	if(RI==1){  //中断函数中对接收中断的响应
            RI=0;  //RI为接受中断数据标志位,接收完数据硬件置1,需要软件置0
            cmd[i]=SBUF;
    		i++; //在SBUF里读取发送的数据
            if(i==SIZE){
            i=0;
           }
    				if(strstr(cmd,"en")){   //strstr(str1,str2)判断str1里面是不是有str2
    					led1=0;//点灯
    					i=0;
    					memset(cmd,'\0',SIZE);//memset是将某一块内存中的内容全部设置为指定的值
    				}
    				if(strstr(cmd,"se")){
                        led1=1;//关灯
    					i=0;
    					memset(cmd,'\0',SIZE);
            }
     }
    }

    字符 'a' 是如何从单片机上传到PC

    a 的 ASSII 码是 97 , 16 进制就是 0x61, 二进制是 01010001 ,这个 8 位就是数据位
    串口工作模式 1 ,一帧数据有 10 位,起始位(0)、数据位、停止位(1)
    那么 a 的一帧数据就是 0 10001010 1 起始位, a 的低位到高位,停止位

     

     

    物联沃分享整理
    物联沃-IOTWORD物联网 » 51单片机串口通信与蓝牙模块应用指南

    发表回复