当前位置: 首页 > news >正文

【蓝桥杯单片机第八届国赛真题】

【蓝桥杯单片机第八届国赛真题】

文章目录

  • 【蓝桥杯单片机第八届国赛真题】
  • 前言
  • 一、真题
  • 二、源码


前言

在这里插入图片描述

有幸进入国赛,为自己大学最后一个比赛画上完满的句号^@^

下面为蓝桥杯单片机第八届国赛程序部分,功能差不多都实现了,可能存在小bug,望大佬指正,总体来说这届难度并不是很大,有需完整工程的小伙伴可自行下载。

在这里插入图片描述

工程链接

链接: https://pan.baidu.com/s/15ertnZFP9RKCB_-hdL5VQA?pwd=fkw2 提取码: fkw2 复制这段内容后打开百度网盘手机App,操作更方便哦 
--来自百度网盘超级会员v5的分享

注意点

这届难度并不是很大,值得注意的是在进行EEPROM存储10次测距时,可以用更好的方式,下面为我使用的存储形式。


void Save_AT24C02_Data(void)
{static uchar i = 0;if(Read_AT24C02(0x00) == 0xee)  //上电不是第一次{set_dis = Read_AT24C02(0x88);Delay10ms();//读取10次存储的数据for(i = 0;i<10;i++){dis_info[i] = (Read_AT24C02(i) << 8) |Read_AT24C02(i+10);Delay10ms();}}else{Write_AT24C02(0x00,0xee);for(i = 0;i <10;i++)             //第一次上电时都是0{Write_AT24C02(i,0);Delay10ms();Write_AT24C02(i+10,0);Delay10ms();}}
}

Save_AT24C02_Data这个函数的功能是进行初始化时,进行存储EEPROM中数据的读取,Read_AT24C02(0x00) == 0xee这句判断是为了非第一次上电进行之前内容的读取,else 里面的内容相当于进行第一次上电的初始化,因为数组是存储测距的数据所以在第一次上电时全部设置了0。
Write_AT24C02(i,0);
Delay10ms();
Write_AT24C02(i+10,0);
Delay10ms();
这里进行加10是为了进行存储地址区分,因为EEPROM这里只能读取一个字节,如果所测的距离在一个字节范围内当然可以直接进行该地址内容的读取和写入,防止所测距离大于一个字节的范围这里每次所测 的数据都放在了两个地址中,见data_task函数中进行EEPROM数据的写入,其中number为数组下标索引。
Write_AT24C02(number,dis_info[number] >> 8); //写高位
Delay10ms();
Write_AT24C02(number+10,dis_info[number] & 0xff); //写低位
Delay10ms();

一、真题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

二、源码

在main.c中主要分为5部分功能,smg_task数码管显示任务、data_task数据处理任务、logical_task逻辑处理任务、key_task按键任务以及中断任务。
/*=======================================第八届国赛==================================
@Author:小殷同学
@Date:2023.6.2
===================================================================================*/
#include <STC15F2K60S2.H>
#include "public.h"
#include "iic.h"
/*====================================下面为变量相关定义============================*/
//数码管段码(0~9、shut-off、"-")
code uchar smg_data[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0x8e};
//初始化,使所有数码管熄灭(必须是9个元素)
xdata uchar smg_bit[11] = {10,10,10,10,10,10,10,10,10};
uchar L[9];
xdata uchar  dis_info[10] = {0},info_index = 0;        //数组存储10组数据 下标索引
uchar number = 0;                                      //索引号
bit start_dis = 0;                                     //开始测距
bit dis_mode = 0;                                      //模式
bit finish_flag = 0,l1_flash = 0;                      //完成标志 和l1闪烁
uchar adc = 0;                                         //dac
uchar interface = 1;                          		   //界面
bit s5_flag = 0;                              		   //s5标志
uint dis = 0,sum_dis = 0,old_dis = 0,temp_dis =0,set_dis = 0;          //超声波距离 上次和本次和  上一次值
uchar dis_feq = 0;                             //超声波测距频率
uchar key_feq = 0;                             //按键扫描频率
/*===================================下面为函数相关声明================================*/
void smg_task(void);                            //数码管显示任务
void data_task(void);                           //数据处理任务
void logical_task(void);                        //逻辑处理任务
void key_task(void);                            //按键任务
void Save_AT24C02_Data(void);                   //存储读取数据AT24C02
/*==================================下面为函数相关实现==================================*/
void smg_task(void)
{//测距界面if(interface == 1){smg_bit[1] = dis_mode;smg_bit[2] = 10;smg_bit[3] = 10;if(dis_mode == 0){smg_bit[4] = old_dis/10;smg_bit[5] = old_dis%10;}else {smg_bit[4] = sum_dis/10;smg_bit[5] = sum_dis%10;}smg_bit[6] = dis/100;smg_bit[7] = dis/10%10;smg_bit[8] = dis%10;}//回显界面else if(interface == 2){smg_bit[1] = (number+1)/10; //加1 为了让显示索引从1-10 数组下标为0-9smg_bit[2] = (number+1)%10;smg_bit[3] = 10;smg_bit[4] = 10;smg_bit[5] = 10;smg_bit[6] = dis_info[number]/100;smg_bit[7] = dis_info[number]/10%10;smg_bit[8] = dis_info[number]%10;}//参数界面else if(interface == 3){smg_bit[1] = 12;   //F 0111 0001 0x8esmg_bit[2] = 10;     smg_bit[3] = 10;smg_bit[4] = 10;smg_bit[5] = 10;smg_bit[6] = 10;smg_bit[7] = set_dis/10;smg_bit[8] = set_dis%10;}
}
void data_task(void)
{if(T2H < 0xd9){if(start_dis){if(dis_feq >120){dis_feq = 1;temp_dis = dis;              //保存一次 在测距之前先保存之前的数据dis = get_distance();number++;                    //编号加加dis_info[number] = dis;      //数据存储start_dis = 0;finish_flag = 1;              //测距完成Write_AT24C02(number,dis_info[number] >> 8);  //写高位Delay10ms();Write_AT24C02(number+10,dis_info[number] & 0xff); //写低位Delay10ms();}}}
}void logical_task(void)
{uchar i = 0;if(dis_mode == 0){if(dis != temp_dis)         //判断距离是否发送改变{ old_dis = temp_dis;}}else if(dis_mode == 1){sum_dis = (dis + old_dis);}if(number > 10){number = 0;          //只测量10次}//DAC处理if(dis <= set_dis){adc = 0;write_dac(0);  //0v}else{adc = (dis - set_dis)*0.02; write_dac(adc * 51);}if(adc > 5){write_dac(255);  //5v}//led控制if(finish_flag){L[1] = (l1_flash == 1)?(1):(0);}L[7] = (interface == 3)?(1):(0);L[8] = (interface == 2)?(1):(0);}void key_task(void)
{uchar key_value = 0;static bit s5_flag = 0,s6_flag = 0;if(key_feq > 20){key_feq = 1;key_value = Read_key();}switch(key_value){case 4:start_dis = 1;interface = 1;break;case 5:if(s5_flag == 0){s5_flag = 1;interface = 2;}else if(s5_flag == 1){s5_flag = 0;interface = 1;}break;case 6:if(s6_flag == 0){s6_flag = 1;interface = 3;}else if(s6_flag == 1){s6_flag = 0;interface = 1;}break;case 7:if(interface == 1){if(dis_mode == 0){dis_mode = 1;}else if(dis_mode == 1){dis_mode = 0;}}else if(interface == 2){if(++number > 9){number = 0;            //翻页索引}}//参数设置if(interface == 3){//0-90if(set_dis < 90){set_dis += 10;}else{set_dis = 0;}Write_AT24C02(0x88,set_dis);Delay10ms();}break;default:break;}
}void Save_AT24C02_Data(void)
{static uchar i = 0;if(Read_AT24C02(0x00) == 0xee)  //上电不是第一次{set_dis = Read_AT24C02(0x88);Delay10ms();//读取10次存储的数据for(i = 0;i<10;i++){dis_info[i] = (Read_AT24C02(i) << 8) |Read_AT24C02(i+10);Delay10ms();}}else{Write_AT24C02(0x00,0xee);for(i = 0;i <10;i++)             //第一次上电时都是0{Write_AT24C02(i,0);Delay10ms();Write_AT24C02(i+10,0);Delay10ms();}}}void Init_System(void)
{Control_IO(0x80,0xff);         //关闭LEDControl_IO(0xa0,0x00);         //关闭继电器和蜂鸣器Control_IO(0xc0,0x00);         //关闭数码管Timer2Init();                  //定时器2初始化Save_AT24C02_Data();           //EEPROM数据读取
}void main(void)
{Init_System();                 //系统初始化while(1){smg_task();data_task();logical_task();key_task();}
}/*=============================下面为中断相关处理=========================*/
void Timer2_Server() interrupt 12
{static uchar dsp_smg = 1,count = 0;static uint t = 0;//LED控制Control_IO(0x80,~(L[1] << 0 | L[2] << 1|L[7] << 6| L[8] << 7));//数码管控制Control_IO(0xc0,0x00);Control_IO(0xe0,smg_data[smg_bit[dsp_smg]]);Control_IO(0xc0,1 << (dsp_smg -1));if(++dsp_smg > 8){dsp_smg = 1;}if(finish_flag){if(t++ == 200){t = 0;l1_flash = ~l1_flash;count++;if(count == 20){count = 0;finish_flag = 0;L[1] = 0;       //防止第10次的时候L[1] 还处于亮灯状态}}}dis_feq++;key_feq++;
}

相关文章:

【蓝桥杯单片机第八届国赛真题】

【蓝桥杯单片机第八届国赛真题】 文章目录 【蓝桥杯单片机第八届国赛真题】前言一、真题二、源码 前言 有幸进入国赛&#xff0c;为自己大学最后一个比赛画上完满的句号^^ 下面为蓝桥杯单片机第八届国赛程序部分&#xff0c;功能差不多都实现了&#xff0c;可能存在小bug&#…...

一种简单的Android骨架屏实现方案----0侵入0成本

对骨架屏的理解 什么是骨架屏 所谓骨架屏&#xff0c;就是在页面进行耗时加载时&#xff0c;先展示的等待 UI, 以告知用户程序目前正在运行&#xff0c;稍等即可。 等待的UI大部分是 loading 转圈的弹窗&#xff0c;有的是自己风格的小动画。其实大同小异。而骨架屏无非也是一…...

【Kubernetes 架构】了解 Kubernetes 网络模型

Kubernetes 网络使您能够在 k8s 网络内配置通信。它基于扁平网络结构&#xff0c;无需在主机和容器之间映射端口。 Kubernetes 网络支持容器化组件之间的通信。这种网络模型的主要优点是不需要在主机和容器之间映射端口。然而&#xff0c;配置 Kubernetes 网络模型并不是一件容…...

shell

一、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查一次磁盘剩余空间。 二、判断web服务是否运行 三、使用curl命令访问第二题的web服务&#xff0c;看能否正常访问&#xff0c;如果能正常访问&#xff0c;…...

springboot+ssm+java校园二手物品交易系统vxkyj

样需要经过市场调研&#xff0c;需求分析&#xff0c;概要设计&#xff0c;详细设计&#xff0c;编码&#xff0c;测试这些步骤&#xff0c;基于Java语言、Jsp技术设计并实现了校园二手物品交易系统。系统主要包括个人中心、商家管理、用户管理、商品分类管理、商品信息管理、商…...

Android系统内置应用

Android系统内置应用 背景 客户提供APK&#xff0c;需要集成进系统&#xff0c;并且不可卸载 Android原生是怎么做的&#xff1f; 已Launcher3为例&#xff0c;apk是位于/system/priv-app/Launcher3目录下 AOSP系统内置app步骤 1.在package/apps/目录下创建相应的文件夹如&…...

CMMI实施需要准备什么:

1. 人力资源 实施中会涉及到EPG过程改进小组、QA、试点项目团队等人力资源&#xff1a; 1) 专职人员&#xff1a;1-2名 即在CMMI实施推广期内&#xff0c;基本上100%的时间投入。 2) 质量人员&#xff1a;1-更多名 组建质量管理部门&#xff0c;实施体系执行的监控&#x…...

【ARM AMBA AXI 入门 1 - AXI 握手协议】

文章目录 1.1 AXI 双向握手机制简介1.1.1 信号列表1.1.2 双向握手目的1.1.3 握手过程 1.2 数据通路的握手要求1.2.1 读数据通路1.2.2 读地址通路1.2.3 写数据通路1.2.4 写地址通路1.2.5 写回复通路1.2.6 全信号 1.3 不同数据通路间的约束关系1.3.1 读操作约束关系1.3.2 写操作约…...

详解uni-app应用生命周期函数

详解uni-app应用生命周期函数 详解uni-app应用生命周期函数 文章目录 详解uni-app应用生命周期函数前言一、应用生命周期函数二、页面生命周期函数总结 前言 UNI-APP学习系列之详解uni-app应用生命周期函数 一、应用生命周期函数 函数名说明onLaunch当uni-app 初始化完成时触…...

【WebFlux】List指定bean引用对象更新后同步到List

Java 8的流式API实现 如果你想在WebFlux中更新List中指定bean的引用对象并将其同步到List中&#xff0c;你可以使用Java 8的流式API来完成这个任务。 以下是一个例子&#xff1a; List<MyBean> myBeanList new ArrayList<>(); MyBean myBean1 new MyBean(); My…...

【JavaSE】Java基础语法(二十六):Collection集合

文章目录 1. 数组和集合的区别2. 集合类体系结构3. Collection 集合概述和使用【应用】4. Collection集合的遍历【应用】5. 增强for循环【应用】 1. 数组和集合的区别 相同点 都是容器,可以存储多个数据不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型…...

jmeter做接口压力测试_jmeter接口性能测试

jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简单。因为jmeter是java开发的&#xff0c;所以运行的时候必须先要安装jdk才可以。jmeter是免…...

网络编程 lesson5 IO多路复用

select 当需要在一个或多个文件描述符上等待事件发生时&#xff0c;可以使用select函数。 select函数是一个阻塞调用&#xff0c;它会一直等待&#xff0c;直到指定的文件描述符上有事件发生或超时。 select函数详解 int select(int nfds, fd_set *readfds, fd_set *writefd…...

码出高效_第一章 | 有意思的二进制表示及运算

目录 0与1的世界1.如何理解32位机器能够同时处理处理32位电路信号&#xff1f;2.如何理解负数的加减法运算3.溢出在运算中如何理解4.计算机种常用的存储单位及转换5.位移运算规则6.有趣的 && 和 & 浮点数1.定点小数&#xff08;为什么会出现浮点数表示&#xff1f;…...

测试类型(单元、集成、系统或手动测试)

测试类型(单元、集成、系统或手动测试) 单元测试 单元是系统的单个组件&#xff0c;例如类或单个方法。孤立地测试单元称为单元测试。 优点&#xff1a;速度快/易控/易写 缺点&#xff1a;缺乏现实性/无法捕获所有错误&#xff08;例如与其他组件或服务的交互&#xff09; 单元…...

【笔试强训编程题】Day3.(字符串中找出连续最长的数字串 69385)和(数组中出现次数超过一半的数字 23271)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训编程题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;! 文章目录…...

学懂缓存雪崩,缓存击穿,缓存穿透仅需一篇,基于Redis讲解

在了解缓存雪崩、击穿、穿透这三个问题前&#xff0c;我们需要知道为什么我们需要缓存。在了解这三个问题后&#xff0c;我们也必须知道使用Redis时&#xff0c;如何解决这些问题。 所以我将按照"为什么我们需要缓存"、"什么是缓存雪崩、击穿、穿透"、&qu…...

Android 12.0SystemUI 状态栏下拉和通知栏始终居中

1.概述 在12.0的产品定制化开发中,在系统原生的SystemUI 状态栏下拉和通知栏,默认是根据手势的x 坐标的位置居中显示,但是如果太靠两边感觉不太好,下拉太靠边不太好看所以产品提出不管手势在哪里下滑 都要去下拉和通知栏居中显示 会比较好看些 下面就来实现这个需求 2.Sy…...

面向过程编程和面向对象编程的区别

目录 一、面向过程编程 举个栗子&#xff1a; 二、面向对象编程 继续举个栗子&#xff1a; 三、区别 面向过程编程和面向对象编程是两种不同的编程范式&#xff0c;它们在代码的组织和结构上有所不同。 一、面向过程编程 面向过程编程&#xff08;Procedural Programmin…...

2023年数学与人工智能国际会议——火热征稿中~

会议简介 Brief Introduction 2023年数学与人工智能国际会议(CFMAI 2023) 会议时间&#xff1a;2023年9月22 -24日 召开地点&#xff1a;中国杭州 大会官网&#xff1a;www.cfmai.org 2023年数学与人工智能国际会议(CFMAI 2023)由中山大学主办&#xff0c;CoreShare科享学术交流…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...