[经验分享] 51单片机串口的使用

[复制链接]
194|0
小海师 发表于 2025-10-9 21:49 | 显示全部楼层 |阅读模式
一般在调试上串口使用较多,也作为数据收发使用

串行接口(Serial port),也称串行接口或串行端口,串行通信接口,COM接口,简称串口。主要用于串行式逐位数据传输。常见的有一般电脑应用的RS-232(使用 25 针或 9 针连接器)和工业电脑应用的半双工RS-485与全双工RS-422。



查看芯片手册



这里笔者采用的是P30和P31

使用独立波特率发生器
主函数如下

#include <STC12C5A60S2.H>
#include "public.h"
#include "uart.h"
sbit led1=P1^0;

uchar rx_buffer[100];
uchar tx_buffer[100];


void UartInit(void)                //9600bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x04;                //定时器时钟1T模式
        BRT = 0xDC;                        //设置定时重载值
        AUXR |= 0x01;                //串口1使用独立波特率发射器为波特率发生器
        AUXR |= 0x10;                //启动独立波特率发射器
}


void main()
{
        UartInit();
        EA=1;
        ES=1;
        while(1)
        {
                UART_SendString("hello world\r\n");
                delay(200);
        }
}

void Uart_Isr() interrupt 4
{
        if (RI==1)
        {
                led1=~led1;
                RI=0;
        }
}



其中包含两个头文件

public.h内容为

#ifndef _PUBLIC_H
#define _PUBLIC_H
#include <STC12C5A60S2.H>
#include "intrins.h"
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned int
#endif

void delay(uint c);

#endif



uart.h

#ifndef UART_H
#define UART_H
#include "public.h"
void UART_SendByte(uchar byte);
void UART_SendString(uchar* str);
#endif


与uart.h相关联的uart.c如下

#include "uart.h"

void UART_SendByte(uchar byte)
{
        SBUF=byte;
        while(TI==0);
        TI=0;
}

void UART_SendString(uchar* str)
{
        while(*str)
        {
                UART_SendByte(*str++);
        }
}


使用定时器1作为波特率发生器
main.c如下

#include <STC12C5A60S2.H>
#include "public.h"
#include "uart.h"
sbit led1=P1^0;

uchar rx_buffer[100];
uchar tx_buffer[100];


void UartInit(void)                //9600bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器时钟1T模式
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //设置定时器模式
        TMOD |= 0x20;                //设置定时器模式
        TL1 = 0xDC;                        //设置定时初始值
        TH1 = 0xDC;                        //设置定时重载值
        ET1 = 0;                        //禁止定时器中断
        TR1 = 1;                        //定时器1开始计时
}

void main()
{
        UartInit();
        EA=1;
        ES=1;
        while(1)
        {
                UART_SendString("hello world\r\n");
                delay(200);
        }
}

void Uart_Isr() interrupt 4
{
        if (RI==1)
        {
                led1=~led1;
                RI=0;
        }
}



二者效果均为



如果点击发送,开发板上P10的 电平 将发生翻转

关于串口重定向

#include "uart.h"


void UART_SendByte(uchar byte)
{
        SBUF=byte;
        while(TI==0);
        TI=0;
}

void UART_SendString(uchar* str)
{
        while(*str)
        {
                UART_SendByte(*str++);
        }
}

//void UartInit(void)                //9600bps@11.0592MHz
//{
//        PCON &= 0x7F;                //波特率不倍速
//        SCON = 0x50;                //8位数据,可变波特率
//        AUXR |= 0x04;                //定时器时钟1T模式
//        BRT = 0xDC;                        //设置定时重载值
//        AUXR |= 0x01;                //串口1使用独立波特率发射器为波特率发生器
//        AUXR |= 0x10;                //启动独立波特率发射器
//}
void UartInit(void)                //9600bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器时钟1T模式
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //设置定时器模式
        TMOD |= 0x20;                //设置定时器模式
        TL1 = 0xDC;                        //设置定时初始值
        TH1 = 0xDC;                        //设置定时重载值
        ET1 = 0;                        //禁止定时器中断
        TR1 = 1;                        //定时器1开始计时
}


/////////////////串口重定向代码///////////////
char putchar(char c){
        UART_SendByte(c);
        return c;
}




————————————————
版权声明:本文为CSDN博主「田甲」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_56719449/article/details/129905872

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

89

主题

272

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部