前言
说到入门一款单片机,如果有显示屏调试就更好了,如果没有显示屏使用串口就尤为关键了,所以我们这一节来看一下串口的相关内容。
寄存器说明
P_SW2像STM32一样,STC32的引脚可以复用映射到不同的引脚上哈,此寄存器是配置串口所用IO口的,我们使用P30和P31,因此将S1_S配置位00即可。
SCON:这边我们使用串口调试就使用一下串口的发送作用,我们将串口配置位模式1,即将这个寄存器的SM0和SM1位配置为0和1即可,还用以及B0位TI我们使用到发送发送完记得要软件手动清零
PCON:PCON寄存器可以加倍波特率这边我们用不到就先不配置了哈
AUXR:这边看到老朋友了,我们这边采用定时器1作为串口的波特率发生器,这个寄存器要配置两个位一是确保定时器开启的是1T模式即我们要对B7位进行修改,另一块,要让B0置0作为波特率发生器
TMOD:说到使用定时器1或0,这边我们就免不了使用这个寄存器,当然这里我们不需要什么配置,我们设置为16位自动重装模式为定时器的模式0,这边默认就是16为重装模式,因此我们可以不对其进行配置哈
TH1&&TL1:我们这边使用的是16为自动重装模式,高八位放TH1中,低八位放TL1中
串口波特率的计算
这边我们查阅官方的手册可以看到这个来计算哈。
代码
(1)初始化代码
大家可看一些寄存器的配置来结合思考哈
#include "USART1.h"
#include "stdio.h"
#define Baudrate 115200UL //定义所需的波特率
#define TM (65536 -(24000000/Baudrate/4))//计算时间
void USART1_Init(void)
{
P_SW1 = (P_SW1 & 0x3f) | 0x00; //&逻辑清空低六位,|逻辑配置高二位为P31和P30为串口通信
SCON = (SCON & 0x3f) | 0x40; //&逻辑清空低六位,|逻辑配置高二位串口工作模式1可变波特8位数据方式
AUXR|=0x40; //定时器1时钟1T模式
AUXR&=0xFE; //串口1选择定时器1为波特率发生器
TL1 = TM;
TH1 = TM>>8;
TR1 = 1; //启动定时器1
}
void USART1_SendByte(uint8_t Byte)
{
SBUF = Byte;
while(TI==0);//等待发送标志位置位,才算成功发送
TI = 0;//清0标志位
}
(2)串口调试实现代码
这边我去查了一下官方的例程使用printf但是却不知怎么的没有效果,于是我自己写了个PrintString的函数来支持printf函数的效果
void PrintString1(uint8_t *str)
{
for(;*str!= 0;str++)
{
USART1_SendByte(*str);
}
}
void main()
{
char Text[30];
uint8_t count=0;
while(1)
{
PrintString1("Hello World!\r\n");
sprintf(Text,"Count:%d\r\n",count);//使用sprintf将float型和int型转换为字符串
PrintString1(Text);
count++;
Delay_ms(1000);
}
}
运行效果
最后也通过上位机来和串口成功实现通信