电脑通过串口控制51单片机的LED

一、功能介绍

  1. 在电脑端的串口助手通过串口对51单片机发送一个字节的16进制数控制LED的亮灭
  2. 单片机通过串口将接收到的数据发送回电脑

二、串口通信的相关知识

1、51单片机的串口

  • 51单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信
  • STC89C52有1个UART,有四种通信模式:模式0:同步移位寄存器、 模式1:8位UART,波特率可变(常用)、模式2:9位UART,波特率固定、 模式3:9位UART,波特率可变
  • HEX模式/十六进制模式/二进制模式:以原始数据的形式显示
  • 文本模式/字符模式:以原始数据编码后的形式显示
  • SBUF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器
  • STC89C52的串口模式(简化版)
  • 串行口数据缓存寄存器SBUF
  • 2、相关术语

  • 全双工:通信双方可以在同一时刻互相传输数据
  • 半双工:通信双方可以互相传输数据,但必须分时复用一根数据线
  • 单工:通信只能有一方发送到另一方,不能反向传输
  • 异步:通信双方各自约定通信速率
  • 同步:通信双方靠一根时钟线来约定通信速率
  • 总线:连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,使住户可以相互交流)
  • 3、相关参数

  • 波特率:串口通信的速率(发送和接收各数据位的间隔时间)
  • 检验位:用于数据验证
  • 停止位:用于数据帧间隔
  •  

    三、程序设计 

    1、UART初始化函数

    1.1、实现功能

    串口初始化,使定时器1工作在8位自动重装模式,允许串行接收状态,配置中断系统开启

    1.2、设计原理

    串行口控制寄存器SCON和PCON

     

     配置SM0=0,SM1=1使定时器1工作在8位串行接收方式,REN = 1,使其允许串行接收状态

    	SCON = 0x50;		//8位数据,可变波特率
    	PCON |= 0x80;		//使能波特率倍速位SMOD

    接下来配置定时器工作模式TMOD

     

     配置高四位M1 = 1, M0 = 0,第四位为0000,使定时器1工作在8位自动重装模式

    	TMOD = TMOD & 0x0F;    //高四位置零,低四位不变,清除定时器1模式位
    	TMOD = TMOD | 0x20;    //设定定时器1为8位自动重装方式
    

     STC89C52的晶振频率为11.0592MHz,配置的PCON寄存器SMOD = 0, SMOD0 = 1,

    波特率=  11.0592MHZ * 1/16/12/12us = 4800  

    计算出波特率为4800,通过串口助手生成定时器计数的初始值

    	TL1 = 0xF4;		
    	TH1 = 0xF4;		//设定定时器重装值

    配置定时器控制寄存器,令TR1 = 1,允许计数;配置中断允许寄存器IE,令ET1 = 0禁止定时器1溢出中断,令EA = 1, ES = 1,允许串口中断 

    	ET1 = 0;		//禁止定时器1中断
    	TR1 = 1;		//启动定时器1
    	EA = 1;			//配置中断开启
    	ES = 1;

    1.3、代码实现

    /**
      * @brief 串口初始化,4800bps@11.0592MHz
      * @param  无
      * @retval  无  
      *         定时器1为8位自动重装模式,接收开启,配置中断系统开启
      */
    UART_Init()				
    {
    	SCON = 0x50;		//8位数据,可变波特率
    	PCON |= 0x80;		//使能波特率倍速位SMOD
    	TMOD = TMOD & 0x0F;    //高四位置零,低四位不变,清除定时器1模式位
    	TMOD = TMOD | 0x20;    //设定定时器1为8位自动重装方式
    	TL1 = 0xF4;		
    	TH1 = 0xF4;		//设定定时器重装值
    	ET1 = 0;		//禁止定时器1中断
    	TR1 = 1;		//启动定时器1
    	EA = 1;			//配置中断开启
    	ES = 1;
    }

    2、UART_SendByte函数

    2.1、实现功能

    串口向电脑发送一个字节数据

    2.2、设计原理

    将发送的数据读入缓存寄存器,判断发送完后立即将允许中断标志位复位

    	SBUF = Byte;
    	while(TI == 0);   //检测请求中断标志位为1时程序才继续
    	TI = 0;			  //发送完毕后立即将标志位清0

    2.3、代码实现

    /**
      * @brief 串口向电脑发送一个字节数据
      * @param  发送的一字节数据 Byte 
      * @retval 无
      */
    
    void UART_SendByte(unsigned char Byte)
    {
    	SBUF = Byte;
    	while(TI == 0);   //检测请求中断标志位为1时程序才继续
    	TI = 0;			  //发送完毕后立即将标志位清0
    }

    3、串口中断函数

    3.1、实现功能

    串口接收电脑发送的数据控制LED

    3.2、设计原理

     检测到接收完毕的中断请求后执行从缓存区读取数据到P2,控制LED的亮灭,并立即将接收允许中断标志位复位

    	if(RI == 1)       		//只检测到接收中断的时候执行
    	{
    		P2 = SBUF;    		//从缓存区读取数据
    		UART_SendByte(P2);  //将接收到的数据从串口发送回电脑
    		RI = 0; 			//接收完毕立即给接收标志位复位
    	}

    3.3、代码实现

    void UART_Routine()   interrupt 4
    {
    	if(RI == 1)       		//只检测到接收中断的时候执行
    	{
    		P2 = SBUF;    		//从缓存区读取数据
    		UART_SendByte(P2);  //将接收到的数据从串口发送回电脑
    		RI = 0; 			//接收完毕立即给接收标志位复位
    	}
    }

    4、主函数设计

    4.1、实现功能

    调用串口初始化,让程序一直执行不停止

    4.2、代码实现

    #include <REGX52.H>
    #include"UART.h"
    
    void main()
    {
    	UART_Init();		
    	while(1)
    	{
    		
    	}
    }

    四、结果展示

    发送数据和串口返回结果

     

    LED亮灭情况

     

     对应0110 0110

    物联沃分享整理
    物联沃-IOTWORD物联网 » 电脑通过串口控制51单片机的LED

    发表评论