串口通信

发布时间 2024-01-12 12:04:27作者: lololopopo

串口通信

常用通信接口

UART:支持“一发多收“,而不能“多收一发”

相关寄存器

波特率与定时器初值计算

SYSclk:时钟频率,11.0592MHZ=11059200HZ

采用方式一:

第一步人为确定波特率为4800bps

第二步计算定时器的溢出率:4800*32/2=76800

第三步根据定时器溢出率计算定时器初值

256-TH1=11059200/12/76800=12

TH1=256-12=244=0xF4

实例一:串口向电脑发送数据

#include <REGX52.H>
#include "DelayMs.h"
#include "UART.h"

unsigned char Sec;

void main()
{
	Uart1_Init();
	
	while(1)
	{
		UART_SendByte(Sec);
		Sec++;
		DelayMs(1000);
	}
}

UART.c

#include <REGX52.H>
/**
  * @brief  串口初始化  4800bps@11.0592MHz
  * @param  无
  * @retval  无
  */
void Uart1_Init(void)
{
	PCON |= 0x80;		//使能波特率倍速位SMOD
	SCON = 0x50;		//8位数据,可变波特率,采用方式一:8位UART
	
	TMOD &= 0x0F;		//设置定时器模式,清空高四位(即定时器1的有关设置)
	TMOD |= 0x20;		//设置定时器模式(设置定时器1为模式2:8位自动重载定时器)
	
	TL1 = 0xF4;			//设置定时初始值
	TH1 = 0xF4;			//设置定时重载值
	ET1 = 0;			//禁止定时器中断
	TR1 = 1;			//定时器1开始计时
}
/**
  * @brief  串口发送一个字节数据
  * @param  Byte要发送的一个字节数据
  * @retval 无
  */
void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;
	while(TI==0);
	TI=0;
}

实例二:电脑通过串口控制LED

#include <REGX52.H>
#include "UART.h"

void main()
{
	Uart1_Init();
	while(1)
	{
		
	}
}

void UART_Routine() interrupt 4
{
	if(RI==1)// 判断是否为接收中断
	{
		P2=SBUF;
		UART_SendByte(SBUF);
		RI=0;
	}
}

UART.c

#include <REGX52.H>
/**
  * @brief  串口初始化  4800bps@11.0592MHz
  * @param  无
  * @retval  无
  */
void Uart1_Init(void)
{
	PCON |= 0x80;		//使能波特率倍速位SMOD
	SCON = 0x50;		//8位数据,可变波特率,采用方式一:8位UART
	
	TMOD &= 0x0F;		//设置定时器模式,清空高四位(即定时器1的有关设置)
	TMOD |= 0x20;		//设置定时器模式(设置定时器1为模式2:8位自动重载定时器)
	
	TL1 = 0xF4;			//设置定时初始值
	TH1 = 0xF4;			//设置定时重载值
	
	ET1 = 0;			//禁止定时器中断
	TR1 = 1;			//定时器1开始计时
	
	EA=1;//打开中断总开关
	ES=1;//打开串口中断
}
/**
  * @brief  串口发送一个字节数据
  * @param  Byte要发送的一个字节数据
  * @retval 无
  */
void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;
	while(TI==0);
	TI=0;
}
/*串口中断函数模版
void UART_Routine() interrupt 4
{
	if(RI==1)// 判断是否为接收中断
	{

		RI=0;
	}
	
}*/