目录
一、引言
在单片机开发中,串口调试(UART)是一种常用的通信方式,用于实现单片机与PC或其他设备之间的数据交换。STC8增强型单片机作为一款功能强大的微控制器,其内置的UART模块为开发者提供了便捷的串口通信功能。本文将详细介绍STC8增强型单片机UART模块的使用方法,并通过代码示例展示如何实现串口调试。
二、UART基础知识
UART(Universal Asynchronous Receiver/Transmitter)即通用异步收发传输器,是一种异步串行通信协议。UART通信包括两个主要部分:发送(TX)和接收(RX)。在UART通信中,数据以字节为单位进行传输,每个字节包括起始位、数据位、可选的校验位和停止位。
三、STC8 UART配置
STC8增强型单片机的UART模块可以通过配置相关寄存器来实现不同的通信参数设置,如波特率、数据位、停止位和校验位等。以下是一个典型的UART配置步骤:
- 设置波特率:通过配置波特率生成器相关寄存器,设置UART通信的波特率。
- 设置数据格式:配置数据位、停止位和校验位等参数。
- 启用UART发送和接收功能:设置相关控制位,使能UART模块的发送和接收功能。
四、代码示例
以下是一个基于STC8增强型单片机的UART通信示例代码,用于实现串口调试功能:
#include "STC8G_H_GPIO.h"
#include "STC8G_H_UART.h"
#include "STC8G_H_Switch.h"
#include "STC8G_H_NVIC.h"
#include "STC8G_H_Delay.h"
// 指定P3端口下的0号引脚和1号引脚为准双向模式 p3.0 和 p3.1默认是准双向模式,可以不配置
void GPIO_config(void) {
GPIO_InitTypeDef init; //结构定义
init.Pin = GPIO_Pin_0 | GPIO_Pin_1; //指定要初始化的IO,
init.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P3, &init);//初始化 参数一:端口,参数二:结构体地址
init.Pin = GPIO_Pin_3; //指定要初始化的IO,
init.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P5, &init);//初始化 参数一:端口,参数二:结构体地址
}
// 串口调试环境
void UART_config() {
COMx_InitDefine init; // 结构定义
init.UART_Mode = UART_8bit_BRTx; //模式, UART_8bit_BRTx 8位数据,可变波特率 UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
init.UART_BRT_Use = BRT_Timer1; //使用波特率, BRT_Timer1 = 1,BRT_Timer2,BRT_Timer3,BRT_Timer4
init.UART_BaudRate = 115200ul; //波特率, 一般 110 ~ 115200
// init.Morecommunicate; //一般不使用,多机通讯允许, ENABLE 允许,DISABLE 不允许
init.UART_RxEnable = ENABLE; //允许接收, ENABLE 允许,DISABLE
init.BaudRateDouble = DISABLE; //波特率加倍, ENABLE,DISABLE 不允许
UART_Configuration(UART1, &init); // UART_Configuration(参数1:初始化串口,参数2:结构体地址)
// 引脚选择
UART1_SW(UART1_SW_P30_P31); // 指定UART1串口的引脚为p30,p32
// 中断
NVIC_UART1_Init(ENABLE,Priority_1); // 参数一:允许中断,参数二: 中断等级
}
// 解析数据
void no_receive_msg() {
int i; // 初始化下标
for(i = 0; i < COM1.RX_Cnt; i++) {
TX1_write2buff(RX1_Buffer[i]); // 该数组中的每个数据都是u8类型的数据
// 判断发送过来的数据是1,还是0
if(RX1_Buffer[i] == 0x01) {
P53 = 1; // 开灯
} else if(RX1_Buffer[i] == 0x00) {
P53 = 0; // 熄灯
}
}
}
int main() {
EA = 1; // 开启系统总中断
// 1. 初始化IO口的工作模式
GPIO_config();
// 2. 配置UART工作的参数
UART_config();
// 3. 发数据
TX1_write2buff(0x24); // 串口1 发送数据 发送的是16进制数据
PrintString1("hello");// 发送的是字符串的数据
printf("你好 \n"); // 发送的是字符串的数据 在STC8G_H_UART.h库文件中#define PRINTF_SELECT UART2 改成#define PRINTF_SELECT UART1
// 4. 收数据
while(1) {
/*
1. UART1接收数据时会把数据存储到RX1_Buffer 数组缓冲区中;
2. 接收的数据长度是:RX_Cnt;
【注意】: RX_TimeOut:当发送数据(8位)过来时,会将RX_TimeOut设置为一个大于0的数。
如果还有数据,下一个8位数据过来后,还会将RX_TimeOut设置为一个大于0的数,
如果没有数据了,就不会再修改RX_TimeOut的数值了。
*/
// 4.1 确认是否发完数据了?RX_TimeOut被减为0时,数据就发完了
if(COM1.RX_TimeOut > 0) { // 来数据了
if((--COM1.RX_TimeOut) == 0) {
// 数据发完了,开始解析数据
// 4.2 判断发送过来的数据长度是否大于0
if(COM1.RX_Cnt > 0) {
// 4.3 如果大于0 接收数据
// printf("receive!\n");
no_receive_msg(); // 解析数据
COM1.RX_Cnt = 0;
}
}
}
delay_ms(10);
}
}
上列代码中所需的库函数文件:
引入库函数的流程:
在STC8增强型单片机开发 【GPIO的理解⭐⭐】https://blog.csdn.net/weixin_68429349/article/details/138625351这篇文章中我提到了如何下载库函数,所以就不重复了,现在就当已经拥有了库函数文件。
这是我下载的库函数文件部分截图,根据自己所需复制到自己的项目中:
复制完毕:
进入编辑器:
【注意】: 我在上方代码中注释掉了一个printf(xxx)的代码,如果想用printf()进行输出可进入STC8G_H_UART.h这个文件中修改配置即可使用。
原本的样子:
修改之后:
此处因为我使用的串口是UART1,所以我改为UART1,根据自己的情况进行修改。
五、总结
本文详细介绍了STC8增强型单片机UART模块的使用方法和串口调试功能的实现。通过配置UART相关寄存器并编写相应的发送和接收函数,我们可以实现单片机与PC或其他设备之间的数据交换。在实际开发中,我们可以利用串口调试功能来监控单片机的运行状态和调试程序中的错误。