通信《51单片机学习入门(三):深入浅出串口通信》

1.串口是什么?

串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信。

51单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信。

STC89C52的UART有四种工作模式:

  • 模式0:同步移位寄存器;
  • 模式1:8位UART,波特率可变(常用)
  • 模式2:9位UART,波特率固定;
  • 模式3:9位UART,波特率可变;
  • 51单片机有两个通信接口TXD——P3^0;RXD——P3^1;

    2.串口模式1的配置

    (1)串口模式1是用寄存器SCON配置串口模式1:

      SM0 SM1 为1 0 //选择方式2;REN为1;//即REN=1为允许串行接收状态

     

      综上所述:

    SCON = 0x50; //8位数据,可变波特率

    (2)波特率可变设置寄存器PCON的SMOD=1,

    PCON=0X80;//波特率加倍 

     (3)由图可见,串口的波特率是由定时器T1来产生的,所以我们要先打开定时器T1

    打开定时器T1用到TCON寄存器的TR1位:

     

    TCON的低四位用于控制外部的中断。TCON的高4位用于控制定时/计数计时器的启动和申请中断。

    TR1=1;//定时器1开始计时

    (4)查stc52手册可知定时器要采用方式2(8位自动重装模式)

    TMOD &= 0x0F; //清除定时器1模式位

    TMOD |= 0x20; //设定定时器1为8位自动重装方式

    (5)同时我们还要禁止定时器1中断

    ET1 = 0;//禁止定时器中断

    (6)然后定时器要设置高低八位寄存器TH1/TL1的初值,来控制波特率的速率:可查表

    或者直接用STC-ISP软件生成初值 :如下面软件的配置,初值为

    TH1=0XFD;TL1=0XFD;//设置定时初始值

    综上所述,串口的初始化配置总结如下:

    void UartInit(void)		//9600bps@11.0592MHz
    {
    	PCON |= 0x80;		//使能波特率倍速位SMOD
    	SCON = 0x50;		//8位数据,可变波特率
    
    	TMOD &= 0x0F;		//设置定时器模式
    	TMOD |= 0x20;		//设置定时器模式
    
    	TL1 = 0xFA;		//设置定时初始值
    	TH1 = 0xFA;		//设置定时重载值
    
    	ET1 = 0;		//禁止定时器%d中断
    	TR1 = 1;		//定时器1开始计时
    }
    

     也可以直接用stc-dsp软件进行配置,把AUXR的两行代码去掉即可;

    3.串口的使用

    SBUF寄存器

    单片机的内部硬件自带发送和接收数据的功能,它是通过SBUF寄存器实现的。
    SBUF地址都为99H,物理结构上,这是俩个完全独立的寄存器,

    一个是发送寄存器,另一个是接收寄存器。

    a=SBUF,代表单片机从计算机接收到了数据

    //串口发送一个字节数据
    void UART_SendByte(unsigned char Byte){
    	SBUF=Byte;
    	//检测是否完成
    	while(TI==0);
    	TI=0;//TI复位
    }
    

    SBUF=a,代表单片机要给计算机发送a数据

    //串口发送一个字节数据
    void UART_SendByte(unsigned char Byte){
    	SBUF=Byte;
    	//检测是否完成
    	while(TI==0);
    	TI=0;//TI复位
    }
    

    (1)单片机向PC发送数据

    IT是发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,
    即TI=1,向主机请求中断,响应中断后必须用软件复位,即TI=0。在其他方式中,则
    在停止位开始发送时由内部硬件置位,必须用软件复位。

    #include <REGX52.H>
    #include "UART.H"
    #include "DELAY.H"
    void USART_Sendbit(unsigned char Byte)
    {
    	SBUF=Byte;//发送的字节先存在SBUF寄存器后发出
     while(TI==0);
    	 TI=0;
    }
    void  main()
    {
    
    	UartInit();//串口初始化函数
    	while(1){
    	USART_Sendbit(0x66);//向电脑发送0x66
    		Delay(1000);//延时1s,使串口发送不会太快
    	}
    }
    

    结果如图:

     

    (2)单片机接收PC的数据

    RI: 接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位RI=1, 向主机请求中断,响应中断后必须用软件复位,即RI=0。在其他方式中,串行接收到 停止位的中间时刻由内部硬件置位,即RI=1(例外情况见SM2说明),必须由软件复 位,即RI=0.

    单片机接收电脑的数据存到SBUF寄存器

    接收要重新增加中断的配置:

    #include <REGX52.H>
    void UART_Init(void)		//9600bps@11.0592MHz
    {
    	PCON |= 0x80;		
    	SCON = 0x50;		
    
    	TMOD &= 0x0F;		
    	TMOD |= 0x20;		
    	
    	TL1 = 0xFA;		
    	TH1 = 0xFA;		
    	
    	ET1 = 0;	
    	TR1 = 1;
    		
    	EA=1;//开启总中断
    	ES=1;//开启串口中断
    }
    #include <REGX52.H>
    #include "UART.H"
    void  main()
    {
    	UART_Init();
    	while(1){
    	  
    	}
    }
    void UART_Routine(void) interrupt 4
    {
      if(RI==0)
    	{
    	 USART_Sendbit(SBUF);
       P2=SBUF;
       RI=0;
    	}
    }
    

    这里的"UART.H"是封装了串口的初始化UART_Init()与串口发送USART_Sendbit(SBUF)函数,模块化编程,可以使代码更加简洁。

     

    物联沃分享整理
    物联沃-IOTWORD物联网 » 通信《51单片机学习入门(三):深入浅出串口通信》

    发表评论