[AI8051U入门第三步]串口1使用-printf重定向(乱码解决办法)

前言

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");
        
        
    }
}

总结

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

相关推荐
晶振厂家-晶发电子2 天前
晶振在5G时代的角色:高精度时钟的核心支撑
单片机·嵌入式硬件·5g·晶振·电子元器件·晶振知识
F137298015572 天前
WD5030A 芯片,12V降5V,输出电流12A,电路设计
stm32·单片机·嵌入式硬件·汽车·51单片机
小莞尔2 天前
【51单片机】【protues仿真】基于51单片机的篮球计时计分器系统
c语言·stm32·单片机·嵌入式硬件·51单片机
三佛科技-187366133972 天前
分享机械键盘MCU解决方案
单片机·嵌入式硬件·计算机外设
李永奉2 天前
51单片机-使用IIC通信协议实现EEPROM模块教程
单片机·嵌入式硬件·51单片机
工大一只猿2 天前
51单片机学习
嵌入式硬件·学习·51单片机
小莞尔2 天前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
风_峰2 天前
Ubuntu Linux SD卡分区操作
嵌入式硬件·ubuntu·fpga开发
bing_feilong2 天前
STM32精准控制水流
单片机·嵌入式硬件
Hello_Embed3 天前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件