串口通信
串口通信
常用通信接口
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;
}
}*/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」