蓝桥杯备战——6.串口通讯

1.分析原理图

由上图我们可以看到串口1通过CH340接到了USB口上,通过串口1我们就能跟电脑进行数据交互。

另外需要注意的是STC15F是有两组高速串口的,而且可以切换端口。

2.配置串口

由于比赛时间紧,我们最好不要去现场查寄存器手册,去计算波特率。建议直接使用STC-ISP烧录软件里面的小工具去配置就行。例如我这是使用定时器2用作串口1的波特率发生器,波特率9600。需要注意的是如果你想要使能串口1中断,需要加上 ES = 1;EA = 1;

如果你使能了串口中断,下面就是串口中断函数的写法:

c 复制代码
/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4
{
    if(RI) RI = 0;   //清除RI位
    if (TI){
			TI = 0;  		//清除TI位
       busy = 0;  //清忙标志
    }
}

3.封装串口收发函数

串口收发函数其实也不需要我们自己现场去写,在STC-ISP烧录软件里面有示例,复制出来稍作修改就行。

下面是我修改过后的代码

c 复制代码
#include "uart.h"

bit busy;

void UartInit(void)		//9600bps@12.000MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0xE6;			//设置定时初始值
	T2H = 0xFF;			//设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时
	ES = 1;         //使能串口1中断
  EA = 1;
}

/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4
{
    if(RI) RI = 0;   //清除RI位
    if (TI){
			TI = 0;  		//清除TI位
       busy = 0;  //清忙标志
    }
}

/*----------------------------
发送串口数据
----------------------------*/
void SendData(u8 dat)
{
    while (busy);               //等待前面的数据发送完成
    busy = 1;
    SBUF = dat;                 //写数据到UART数据寄存器
}

/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)
{
    while (*s)                  //检测字符串结束标志
    {
			SendData(*s++);         //发送当前字符
    }
}

4.使用printf函数

C51也是可以通过串口重定向,就能直接使用printf()函数往串口发送格式化数据,具体操作如下:

c 复制代码
/*-----------------------------
串口重定向
-------------------------------*/
char putchar(char c)
{
	SendData(c);
	return c;
}

然后就能直接使用printf()函数了,示例:按键按下后将获取到的温度数据通过串口发送到电脑

需要注意的是如果提示printf函数未定义,请引入头文件stdio.h 如果还是提示没有定义,请自行往stdio.h头文件里面添加如下代码:

5.完整封装库

c 复制代码
#include "uart.h"

bit busy;

void UartInit(void)		//9600bps@12.000MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0xE6;			//设置定时初始值
	T2H = 0xFF;			//设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时
	ES = 1;         //使能串口1中断
  	EA = 1;
}

/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4
{
    if(RI) RI = 0;   //清除RI位
    if (TI)
    {
		TI = 0;  	//清除TI位
       	busy = 0;  	//清忙标志
    }
}

/*----------------------------
发送串口数据
----------------------------*/
void SendData(u8 dat)
{
    while (busy); //等待前面的数据发送完成
    busy = 1;
    SBUF = dat;  //写数据到UART数据寄存器
}

/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)
{
    while (*s)  //检测字符串结束标志
    {
		SendData(*s++); //发送当前字符
    }
}

/*-----------------------------
串口重定向
-------------------------------*/
char putchar(char c)
{
	SendData(c);
	return c;
}
相关推荐
youcans_5 小时前
【STM32C5教程】(3)GPIO 按键输入实验
stm32·单片机·嵌入式硬件
北京盛世宏博7 小时前
通信异常深度排查:以太网温湿度设备 TCP 粘包、UDP 丢包根治方案
单片机·网络协议·tcp/ip·udp·以太网·传感器·温湿度
蓝天居士8 小时前
PY32F系列MCU在串口接收时跑飞的根因分析(2)
单片机·嵌入式硬件
wuyk55511 小时前
嵌入式驱动开发:量产级工程化实战(第9篇)——低功耗下的通信可靠性
c语言·驱动开发·stm32·单片机·嵌入式硬件
创界工坊工作室11 小时前
24-基于单片机的仓鼠养殖环境监控系统设计
stm32·单片机·嵌入式硬件·proteus
comyccccc13 小时前
PCB走线设计秘籍:从载流到3D预览全解析学习笔记
单片机·嵌入式硬件
endeavor1213 小时前
can总线(五)
c语言·stm32·单片机·can
深圳市尚想信息技术有限公司13 小时前
TM52F1376海速芯HITENX Flash-8位MCU单片机,多通道ADC + 段码显示一体化主控芯片
单片机·嵌入式硬件·mcu·flask·芯片·控制器
硅基手札14 小时前
【I2C 技术系列 08】I2C 控制器寄存器与 IP 架构
驱动开发·stm32·单片机·嵌入式硬件·mcu·架构·计算机外设
新晨单片机设计14 小时前
S027A-基于STM32单片机模拟电梯控制系统【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus·模拟电梯