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

1.分析原理图

在这里插入图片描述
由上图我们可以看到串口1通过CH340接到了USB口上,通过串口1我们就能跟电脑进行数据交互。
在这里插入图片描述
另外需要注意的是STC15F是有两组高速串口的,而且可以切换端口。

2.配置串口

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

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

3.封装串口收发函数

串口收发函数其实也不需要我们自己现场去写,在STC-ISP烧录软件里面有示例,复制出来稍作修改就行。
在这里插入图片描述
下面是我修改过后的代码

#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()函数往串口发送格式化数据,具体操作如下:

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

然后就能直接使用printf()函数了,示例:按键按下后将获取到的温度数据通过串口发送到电脑
在这里插入图片描述
在这里插入图片描述
需要注意的是如果提示printf函数未定义,请引入头文件stdio.h 如果还是提示没有定义,请自行往stdio.h头文件里面添加如下代码:
在这里插入图片描述

5.完整封装库

#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;
}

相关推荐

  1. 备战 Day6(学习动态规划)

    2024-01-27 07:40:05       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-27 07:40:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-27 07:40:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-27 07:40:05       87 阅读
  4. Python语言-面向对象

    2024-01-27 07:40:05       96 阅读

热门阅读

  1. web前端项目重构的理解

    2024-01-27 07:40:05       52 阅读
  2. ADB的配置和使用 ADB常用命-2

    2024-01-27 07:40:05       48 阅读
  3. 数据库(二)

    2024-01-27 07:40:05       49 阅读
  4. Ceph部署

    2024-01-27 07:40:05       41 阅读
  5. conda管理python安装包与虚拟环境的相关命令汇总

    2024-01-27 07:40:05       53 阅读
  6. nginx处理跨域问题

    2024-01-27 07:40:05       54 阅读
  7. 聊一聊Sentinel背后的原理

    2024-01-27 07:40:05       47 阅读
  8. 解决docker中overlay2爆满,磁盘清理问题

    2024-01-27 07:40:05       54 阅读