【蓝桥杯串口万能代码模板】教你应对所有蓝桥杯串口问题

【蓝桥杯串口万能代码模板】教你应对所有蓝桥杯串口问题

资料

为了便于诸位获得代码模板,将代码放在文章前面。
链接:https://pan.quark.cn/s/a50306ab6f4b
提取码:Ch3g

背景

​ 蓝桥杯串口是国赛的一个考点,对于大部分第一次参加蓝桥杯的同学有较大难度,总是出现接收、发送乱码的问题。本文旨在从代码角度教会串口,对串口的基本知识不作讲解。

​ 该代码模板是我去年参加蓝桥杯时看了很多文章和博客写出来的,自以为具有较强的万能性和灵活性,仅改变一处即可应对各种不同情况。如代码或逻辑有疏忽,还请诸位不吝赐教。

资料

为了便于诸位获得代码模板,将代码放在文章前面。
链接:https://pan.quark.cn/s/a50306ab6f4b
提取码:Ch3g

前提工作

  1. 串口通信是一种两台设备传递信息的一种方式,对两台设备的通信速率有着极高的要求,即波特率。这里选择波特率为 9600 Baud。
  2. 由于蓝桥杯比赛系统频率大多采用12MHz,后续也以此频率作为演示

波特率的产生

  1. 打开STC-ISP,这里可以自动生成串口波特率代码,按照下图进行配置。
    在这里插入图片描述

  2. 如果芯片采用的是AT89C52,还需要额外对辅助寄存器AUXR进行配置

    sfr AUXR = 0x8e;
    
  3. 如果定时器总使能中断没有在其他地方打开,那么还需要在波特率产生代码末端加上EA = 1;

发送方式

  1. 串口的发送的前提需要用到以下两个函数代码;
void SendByte(float send_data)
{
	
	SBUF = send_data;
	while(TI == 0);
	TI = 0;
}

char putchar(char c)
{
	SendByte(c);
	return c;
}
  1. SendByte()是串口发送数据的重要函数;

  2. putchar()函数是对原本"stdio.h"库里的putchar()函数得到重定义,是搭建万能模板必备的代码块。至于为什么要有这个,就没必要懂了;

  3. 万能发送模板:有了以上两个函数的支持,我们可以直接调用printf()函数进行数据的发送,该函数能够应对所有的发送情况(注意是printf而不是sprintf),以第十四届模拟题II的发送要求为例:

    printf("Voltage:%.2fV",UART_U);
    printf("TEMP:%.1f℃",UART_TEMP);
    

    注:printf()函数是C语言库里的一个函数,常用于打印数据使其可视化,具体用法请自行百度~

  4. 在串口助手界面需要完成以下配置
    在这里插入图片描述

接收方式

  1. 串口的接收是在串口中断里进行的。串口1的中断优先级为4

  2. 以接收到符号A为例,串口中断内的代码按照如下模板来写

    
    void UART() interrupt 4
    {
    	if(RI==1)
    	{
    		RI = 0;
    		PC = SBUF;
    		if(PC =='A') 
    		{
    			//此处写接收到符号A的处理
    		}
    	}
    }
    

测试

​ 将上述所有代码语句组合起来,构成链接里的工程文件。

​ 测试要求:PC端发送字符A,单片机向PC端发送UART_U和UART_TEMP的值(在其他代码中,这两个参数可以作为读取R2的电压值和DS18B20的温度值),UART_U取小数点后两位,UART_TEMP取小数点后1位。

​ 测试结果如下,测试成功。

在这里插入图片描述

注:代码中,UART_U和UART_TEMP均为 float 浮点型变量,若是其他类型变量(如unsigned char),记得修改printf()函数里的变量类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值