前言
c
学习目标:
1、学习UART使用
2、printf重定向
一、串口介绍?
AI8051U 微控制器在传统8051串口(UART)基础上进行了多项增强,提供了更灵活的串行通信能力。以下是AI8051U串口的主要特点和功能:
基本串口资源
AI8051U通常包含以下串口资源:
2个增强型全双工UART(UART0和UART1)
支持硬件流控制(部分型号)
可配置的波特率发生器
主要特性
兼容性:
完全兼容标准8051的UART功能
保留传统的SBUF、SCON等寄存器
增强功能:
更高的最大波特率(可达系统时钟的1/4)
独立的波特率发生器,不依赖定时器
更灵活的中断配置
工作模式:
模式0:同步移位寄存器模式(半双工)
模式1:8位UART,可变波特率
模式2:9位UART,固定波特率
模式3:9位UART,可变波特率
高级特性
波特率配置:
16位波特率发生器,精度更高
支持非常低的波特率(适用于低速应用)
支持高速通信(最高可达1Mbps以上)
中断系统:
独立的发送和接收中断
可配置的优先级
帧错误检测中断
硬件流控制:
支持RTS/CTS硬件流控制(部分型号)
减少软件开销,提高可靠性
多缓冲技术:
部分型号支持接收FIFO缓冲
降低数据丢失风险
寄存器概述
主要控制寄存器:
SCON:串口控制寄存器
SBUF:串口数据缓冲器
PCON:电源控制寄存器(包含波特率加倍位SMOD)
AUXR:辅助寄存器(增强功能配置)
SADDR和SADEN:从机地址寄存器(多机通信用)
二、寄存器介绍

首先是SCOM寄存器,这里我们将SM0/FE实则成模式1在将TB8置'1'
其他不动
c
/**********************************
*功能:串口一初始化
*形参:unsigned long bar 波特率 (推荐设置成115200)
*时间:2025/7/14
*作者:单片有机机
**********************************/
void Uart1_Init(unsigned long bar){
//计算波特率
unsigned long Uart1_TM =0;
Uart1_TM =(65536 -(Sysclk/bar+2)/4);
// #if HTTP_DBUG //当HTTP_DBUG为1时则用串口一,并打开服务器的printf
S1_S1=0;
S1_S0=0; //使用P3.0,P3.1
// #else
// S1_S1=0;
// S1_S0=1; //使用P3.6,P3.7
// #endif
SCON=0x50;
REN=1; //开启串口1的接收
S1BRT =1;
T2L = Uart1_TM; //波特率
T2H = Uart1_TM>>8;
//AUXR |= 0x14; //定时器2时钟1T模式,开始计时
T2x12 =1; //使用定时器2
T2R =1;
UAR1.rx1_len =0;
UAR1.busy =0;//清空忙碌标志位
ES=1; //开启串口1中断
EA=1;
}
三、串口乱码设置
1、先确定波特率是否正确
2、在确定转换的晶振频率是否正确,如果还是乱码则进行一下操作
STEP1:先点击魔术棒在点击'target'在按照下面进行设置
四、串口代码展示
uart.c
c
#include "uart.h"
#include "system.h"
struct UART1 UAR1;//调用结构体
/**********************************
*功能:串口一初始化
*形参:unsigned long bar 波特率 (推荐设置成115200)
*时间:2025/7/14
*作者:单片有机机
**********************************/
void Uart1_Init(unsigned long bar){
//计算波特率
unsigned long Uart1_TM =0;
Uart1_TM =(65536 -(Sysclk/bar+2)/4);
// #if HTTP_DBUG //当HTTP_DBUG为1时则用串口一,并打开服务器的printf
S1_S1=0;
S1_S0=0; //使用P3.0,P3.1
// #else
// S1_S1=0;
// S1_S0=1; //使用P3.6,P3.7
// #endif
SCON=0x50;
REN=1;
S1BRT =1;
T2L = Uart1_TM;
T2H = Uart1_TM>>8;
//AUXR |= 0x14; //定时器2时钟1T模式,开始计时
T2x12 =1;
T2R =1;
UAR1.rx1_len =0;
UAR1.busy =0;//清空忙碌标志位
ES=1;
EA=1;
}
/**********************************
*功能:串口一发送1byte数据
*形参:无
*时间:2025/7/14
*作者:单片有机机
**********************************/
void Uart1_Putc(unsigned char dat)
{
while(UAR1.busy);
UAR1.busy=1;
SBUF=dat;
}
/**********************************
*功能:串口一发送多字节数据
*形参:无
*时间:2025/7/14
*作者:单片有机机
**********************************/
void Uart1_Putc_Num(unsigned char dat[],unsigned short Send_Num)
{
int Send_Number1 =0;
for(Send_Number1=0;Send_Number1<Send_Num;Send_Number1++){
Uart1_Putc(dat[Send_Number1]);
}
}
/**********************************
*功能:串口一中断回调函数
*形参:无
*时间:2025/7/14
*作者:单片有机机
**********************************/
void USART1_BackCall_IRQ(void) interrupt 4
{
if(RI){ //串口一接收中断
RI=0;
if(UAR1.rx1_len <255){
UAR1.buff1[UAR1.rx1_len++]=SBUF;
//UAR1.rx1_len =0;
//UAR1.rx1_flag =1; //接收完成标志位
}
UAR1.timeOut =20;
}
if(TI){//串口一发送中断
TI=0;
UAR1.busy =0;
}
}
/**********************************
*功能:串口一重定向
*形参:无
*时间:2025/7/14
*作者:单片有机机
**********************************/
char putchar(char c)//串口重定向
{
Uart1_Putc(c);
return c;
}
uart.h
c
#ifndef __uart_H
#define __uart_H
#include <AI8051U.H>
struct UART1{
unsigned char buff1[64];
unsigned char rx1_flag;
unsigned char rx1_len;
unsigned char busy;
unsigned char timeOut;
};
extern struct UART1 UAR1;
void Uart1_Init(unsigned long bar);
void Uart1_Putc(unsigned char dat);
void Uart1_Putc_Num(unsigned char dat[],unsigned short Send_Num);
char putchar(char c);//串口重定向;
#endif
main.c
c
/********************************** (C) COPYRIGHT *******************************
* File Name : Main.c
* Author : 单片有机机
* Version : V1.0
* Date : 2025/07/14
* Description : 串口打印数据
* Hardware : RX P30
TX P31
* Frequency : 33.1776Mhz
*******************************************************************************/
#include <AI8051U.H>
#include "system.h"
#include "uart.h"
void main(void){
GPIO_Init();
Uart1_Init(115200);
delay_ms(100);
printf("hello,单片有机机\r\n");
while(1){
delay_ms(500);
printf("hello\r\n");
}
}

总结
完整代码请在我的资源里面进行下载