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

【蓝桥杯单片机】第十三届省赛第二场

一、真题

二、模块构建

1.编写初始化函数(init.c) 

void Cls_Peripheral(void);

  1. 关闭led    led对应的锁存器由Y4C控制
  2. 关闭蜂鸣器和继电器

2.编写LED函数(led.c)

void Led_Disp(unsigned char ucLed);

  1. 将ucLed取反的值赋给P0

  2. 开启锁存器

  3. 关闭锁存器

3.编写数码管函数(seg.c)

void Seg_Tran(unsigned char *pucSeg_Buf,unsigned char *pucSeg_Code);

(1)段码转换函数

  • 定义两个变量i,j
  • for循环加Switch语句进行段码转换,在资源数据包查找段码表,并根据题目要求进行段码转换
  • 注意添加空格代表都不显示
  • case记得加' '
  • 判断是否有 .

void Seg_Disp(unsigned char *pucSeg_Code,unsigned char ucSeg_Pos);

(2)数码管显示函数

  • 要对数码管进行消隐
  • 显示的位置
  • 显示的内容

4.独立按键代码编写

unsigned char Key_Read_BTN(void)

  1. 有返回值函数(unsigned char)
  2. if语句判断按键是否按下
  3. 返回按键所对应的数字

 5.超声波代码编写

unsigned char Wave_Recv(void);

  1. 定义Tx和Rx引脚
  2. 将定时器里的TR0设置为0
  3. 定义变量,初始值为10,发射10个周期的波形
  4. 为了规范,将定时器的初值进行再次赋值
  5. 再令TR0=1,让定时器开始计时
  6. 发送10个周期的信号
  7. 每12us,TF0溢出,将Tx进行异或运算,while循环加分号
  8. TF0清零
  9. 关闭定时器,将定时器初值清零,打开定时器进行正计时
  10. while(RX&&!TF0)如果接收到信号,或TF0溢出,则退出循环
  11. 退出循环后关闭定时器
  12. 如果TF0溢出导致退出循环,返回最大值255,否则返回计时时间
  13. 返回的时间单位是us,需要统一单位,*0.017 进而换算成距离单位为厘米

6.定时器代码编写

void Timer0Init(void);
void Timer1Init(void);    

  1. 定时器0作为超声波定时器,将TR0=0
  2.  设置定时器0供超声波代码使用,时间为12us,12T,12MHz
  3. 定时器1作为主定时器,加上ET1=1

7.编写AD/DA代码

unsigned char PCF8591_ADC(void);

void PCF8591_DAC(unsigned char dat);

  1.  定义SCL,SDA
  2. 添加"intrins.h"头文件
  3. 定义变量用于存储采集的电压
  4. 写入流程:开始--发送写入地址--等待应答--发送电位器地址--等待应答
  5. 读取流程:开始--发送读取地址--等待应答--变量接收数据--发送应答--终止
  6. 读取地址为0x91 写入地址为0x90
  7. 电位器地址为0x43 光敏电阻地址为0x41

三、主函数编写 

1.调用初始化,定时器0,定时器1,打开中断总开关,stdio.h

2.编写数码管函数

  1.  每200ms检测一次
  2. if模式(Disp_Mode)判断
  3. 不要忘记调用数码管转换函数(否则数码管会全部点亮)

3. 中断服务函数

  1. 为各个变量进行自加
  2.  数码管的动态显示

4.模式界面编写

  1.  电压数据为unsigned char类型,要转化成浮点数  %4.2f
  2. 参数界面注意上下限的值
  3. 测距界面注意超声波状态是否开启

5.ADC函数编写

  1.  没有规定时间,任意即可
  2. 将采集来的数据赋值给变量
  3. 对采集的数据进行判断,看是否在上下限里,从而对超声波设置不同的状态

6.key函数编写 

  1.  定义两个变量
  2. 时间为20ms
  3. if判断两个变量是否相等,相等返回
  4. 不相等进入Switch语句,判断哪个按键被按下
  5. 最后不要忘记加上Key_Val_Old=Key_Val
  6. s4按下,Disp_Mode+1对3取模,因为是三个界面进行切换,根据题目要求,判断是否到参数界面,到参数界面,默认选择电压上限
  7. s6按下,参数值加0.5,注意要判断是否在参数界面
  8. s7按下,参数值减0.5,注意要判断是否在参数界面
  9. 注意s4按键按下界面切换的顺序和题目给的顺序不一致
  10. 由于要求对参数的调整在s4按下后才生效,所以需要增加两个参数,同时记得更改其他按键参数变量

7.超声波函数编写

  1. 性能指标未规定时间,任意即可
  2. 在将测距结果赋值给变量前,先判断状态,为0直接返回,不进行测距

8.编写DAC函数

  1. 判断超声波状态,未开启输出0
  2. 若开启,判断超声波测距结果,用if else语句来实现相应功能 
  3. 关于呈线性关系的那部分图像,可以用数学方法计算出y=kx+b中的k和b

 9.编写led函数

  1. 性能要求led响应时间小于0.2s
  2. 判断处于那个界面
  3. 点亮置1,熄灭置0
  4. 点亮用|=,熄灭用&=(置1再取反)切换亮灭状态用^=
  5. 切换亮灭状态,把它放到定时器中断里

 四、难点解析

1.按键切换界面的顺序和题目所给顺序不一致

2.调整参数时,参数值不生效,当按键按下时才生效

3.加,减模式的循环,用到了if判断

4.DAC的数据转换——通过数学方法解出来


易错点 

将不同函数的计时变量复制粘贴时忘记更改

五、主函数代码

#include "led.h"
#include "init.h"
#include "seg.h"
#include "key.h"
#include "tim.h"
#include "ultrasonic.h"
#include "iic.h"
#include "stdio.h"
//seg
unsigned char pucSeg_Buf[12],pucSeg_Code[8],ucSeg_Pos=0;
//time
unsigned long ulms=0;
unsigned int uiSeg_Dly=0;
unsigned int uiADC_Dly=0;
unsigned int uiDAC_Dly=0;
unsigned int uiKey_Dly=0;
unsigned int uiLed_Dly=0;
unsigned int uiUltrasonic_Dly=0;
//led
unsigned char ucLed=0x00;
//ADC
unsigned char ucADC=0;
float ADC_Pram_Max=4.5 ,ADC_Pram_Min= 0.5;
float ADC_Pram_Max_temp=4.5 ,ADC_Pram_Min_temp= 0.5;
//key
unsigned char Key_Val=0,Key_Val_Old=0;
//ultrasonic
unsigned char ucDist=0;
unsigned char Ultrasonic_Status=0;
//function
void Seg_Proc(void);
void Led_Proc(void);
void ADC_Proc(void);
void DAC_Proc(void);
void Key_Proc(void);
void Ultrasonic_Proc(void);
//mode
unsigned char Disp_Mode=0;
unsigned char Pram_Mode=0;//0--max  1--minvoid main(void)
{Cls_Peripheral();Timer0Init();Timer1Init();EA=1;while(1){Seg_Proc();ADC_Proc();DAC_Proc();Key_Proc();Led_Proc();Ultrasonic_Proc();}
}
void Seg_Proc(void)
{if(uiSeg_Dly<200)return;uiSeg_Dly=0;if(Disp_Mode==0){sprintf(pucSeg_Buf,"U    %4.2f",ucADC/51.0);}else if(Disp_Mode==2){sprintf(pucSeg_Buf,"P  %3.1f %3.1f",ADC_Pram_Max_temp,ADC_Pram_Min_temp);}else{if(Ultrasonic_Status==0){sprintf(pucSeg_Buf,"L    AAA");}else {sprintf(pucSeg_Buf,"L    %3u",(unsigned int)ucDist);}}Seg_Tran(pucSeg_Buf,pucSeg_Code);
}
void Led_Proc(void)
{if(uiLed_Dly<100)return;uiLed_Dly=0;if(Disp_Mode==0){ucLed|=0x01;ucLed&=~0x06;}else if(Disp_Mode==1){ucLed|=0x02;ucLed&=~0x05;}else{ucLed|=0x04;ucLed&=~0x03;}if(Ultrasonic_Status==1){ucLed^=0x80;}else{ucLed&=~0x80;}Led_Disp(ucLed);
}
void ADC_Proc(void)
{if(uiADC_Dly<200)return;uiADC_Dly=0;ucADC=PCF8591_ADC();if((ucADC/51.0>ADC_Pram_Min)&&(ucADC/51.0<ADC_Pram_Max)){Ultrasonic_Status=1;}else{Ultrasonic_Status=0;}
}
void Key_Proc(void)
{if(uiKey_Dly<20)return;uiKey_Dly=0;Key_Val=Key_Read_BTN();if(Key_Val==Key_Val_Old)return;switch(Key_Val){case 4:Disp_Mode=(Disp_Mode+1)%3;if(Disp_Mode==2){Pram_Mode=0;ADC_Pram_Max_temp=ADC_Pram_Max;ADC_Pram_Min_temp=ADC_Pram_Min;}else if(Disp_Mode==0){ADC_Pram_Max=ADC_Pram_Max_temp;ADC_Pram_Min=ADC_Pram_Min_temp;}break;case 5:if(Disp_Mode==2){Pram_Mode=(Pram_Mode+1)%2;}break;case 6:if(Disp_Mode==2){if(Pram_Mode==0){if(ADC_Pram_Max_temp==5.0){ADC_Pram_Max_temp=0.5;}else{ADC_Pram_Max_temp+=0.5;}}else{if(ADC_Pram_Min_temp==5.0){ADC_Pram_Min_temp=0.5;}else{ADC_Pram_Min_temp+=0.5;}}}break;case 7:if(Disp_Mode==2){if(Pram_Mode==0){if(ADC_Pram_Max_temp==0.5){ADC_Pram_Max_temp=5.0;}else{ADC_Pram_Max_temp-=0.5;}}else{if(ADC_Pram_Min_temp==0.5){ADC_Pram_Min_temp=5.0;}else{ADC_Pram_Min_temp-=0.5;}}}break;}Key_Val_Old=Key_Val;
}	
void Ultrasonic_Proc(void)
{if(uiUltrasonic_Dly<500)return;uiUltrasonic_Dly=0;if(Ultrasonic_Status==0)return;ucDist=Wave_Recv();
}
void DAC_Proc(void)
{if(uiDAC_Dly<200)return;uiDAC_Dly=0;if(Ultrasonic_Status==0){PCF8591_DAC(0);}else {if(ucDist<=20){PCF8591_DAC(51);}else if(ucDist>=80){PCF8591_DAC(255);}else{PCF8591_DAC(3.4*ucDist-17);}}
}
void Time_1(void) interrupt 3 
{ulms++;uiSeg_Dly++;uiADC_Dly++;uiDAC_Dly++;uiKey_Dly++;uiLed_Dly++;uiUltrasonic_Dly++;if (ulms%2==0){ucSeg_Pos=(ucSeg_Pos+1)%8;Seg_Disp(pucSeg_Code,ucSeg_Pos);}}

相关文章:

【蓝桥杯单片机】第十三届省赛第二场

一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 2.编写LED函数&#xff08;led.c&#xff09; void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器 关闭锁存…...

类与对象(5)

上一章是类与对象&#xff08;4&#xff09;-CSDN博客 深入了构造函数和静态成员&#xff0c;大概讲解了类型转换 最后一章最后一章 友元 在 C 中&#xff0c;友元提供了一种突破类的访问控制&#xff08;封装&#xff09;的方式。通过友元&#xff0c;外部的函数或类可以访…...

AI知识架构之数据采集

数据采集 数据格式: 结构化数据:以固定格式和结构存储,如数据库中的表以及 Excel 表格,易于查询和分析。半结构化数据:有一定结构但不如结构化数据严格,XML 常用于数据交换,JSON 在 Web 应用中广泛用于数据传输和存储。非结构化数据:无预定义结构,文本、图像、音频和视…...

细说STM32F407单片机2个ADC使用DMA同步采集各自的1个输入通道的方法

目录 一、示例说明 二、工程配置 1、RCC、DEBUG、CodeGenerator 2、USART6 3、TIM3 &#xff08;1&#xff09;Mode &#xff08;2&#xff09;参数设置 &#xff08;3&#xff09; TRGO &#xff08;4&#xff09;ADC1_IN0 1&#xff09;ADCs_Common_Settings 2&a…...

C# 将非托管Dll嵌入exe中(一种实现方法)

一、环境准备 电脑系统:Windows 10 专业版 20H2 IDE:Microsoft Visual Studio Professional 2022 (64 位) - Current 版本 17.11.4 其他: 二、测试目的 将基于C++创建DLL库,封装到C#生成的exe中。 一般C++创建的库,在C#中使用,都是采用DllImport导入的,且要求库处…...

完美解决:.vmx 配置文件是由 VMware 产品创建,但该产品与此版 VMware Workstation 不兼容

参考文章&#xff1a;该产品与此版 VMware Workstation 不兼容&#xff0c;因此无法使用 问题描述 当尝试使用 VMware Workstation 打开别人的虚拟机时&#xff0c;可能会遇到以下报错&#xff1a; 此问题常见于以下场景&#xff1a; 从其他 VMware 版本&#xff08;如 ESX…...

使用大语言模型对接OA系统,实现会议室预定功能

随着人工智能技术的不断进步&#xff0c;越来越多的企业开始借助 AI 助手来提高工作效率&#xff0c;尤其是在日常事务的自动化处理中。比如&#xff0c;在许多公司里&#xff0c;会议室的预定是一个常见且频繁的需求&#xff0c;通常需要员工手动检查空闲时间并做出选择。而通…...

Ryu控制器:L2交换功能实现案例

基于 Ryu控制器 在 VM1--OVS--VM2 的简单拓扑中实现流量自动下发&#xff08;流表动态安装&#xff09;的完整案例。通过该案例&#xff0c;当VM1与VM2首次通信时&#xff0c;Ryu控制器会动态学习路径并下发流表&#xff0c;后续流量将直接由交换机转发&#xff0c;无需控制器介…...

动手学深度学习2025.2.23-预备知识之-线性代数

3.线性代数 &#xff08;1&#xff09;向量维数和张量维数的区别&#xff1a; (2)普通矩阵乘法&#xff1a; 要求左矩阵的列数等于右矩阵的行数 import torch ​ # 创建两个矩阵 A torch.tensor([[1, 2], [3, 4]], dtypetorch.float32) B torch.tensor([[5, 6], [7, 8]], d…...

登录-07.JWT令牌-登录后下发令牌

一.思路 我们首先完成令牌生成。 在响应数据这一块 该响应数据是一个标准的Result结构&#xff0c;其中"data"的值就是一个JWT令牌。因此我们只需要将生成的JWT令牌封装在Result当中然后返回给前端即可。 备注是给前端看的&#xff0c;不用管。以后我们做校验时&…...

机器学习实战(7):聚类算法——发现数据中的隐藏模式

第7集&#xff1a;聚类算法——发现数据中的隐藏模式 在机器学习中&#xff0c;聚类&#xff08;Clustering&#xff09; 是一种无监督学习方法&#xff0c;用于发现数据中的隐藏模式或分组。与分类任务不同&#xff0c;聚类不需要标签&#xff0c;而是根据数据的相似性将其划…...

【数据序列化协议】Protocol Buffers

一、为什么需要序列化&#xff1f; 数据跨平台/语言交互&#xff1a; 不同编程语言&#xff08;如 Java、Python、Go&#xff09;的数据结构不兼容&#xff0c;序列化提供统一的数据表示。例如&#xff1a;Java 的 HashMap 和 Python 的 dict 需转换为通用格式&#xff08;如 …...

基于 Python 的电影市场预测分析系统设计与实现(源码 + 文档)

大家好&#xff0c;今天要和大家聊的是一款基于 Python 的“电影市场预测分析”系统的设计与实现。项目源码以及部署相关事宜请联系我&#xff0c;文末附上联系方式。 项目简介 基于 Python 的“电影市场预测分析”系统主要面向以下用户角色&#xff1a;电影制片方、电影发行…...

计算机三级网络技术知识汇总【6】

第六章 交换机及其配置 1. 交换机基础 1.1 基本概念 局域网交换机是一种基于 MAC 地址识别&#xff0c;完成转发数据帧功能的一种网络连接设备。 工作在数据链路层&#xff0c;根据进入端口数据帧中的 MAC 地址进行数据帧的过滤、转发&#xff08;也是交换机的工作原理&…...

2025教育与科研领域实战全解析:DeepSeek赋能细分场景深度指南(附全流程案例与资源)

🚀 2025教育与科研领域实战全解析:DeepSeek赋能细分场景深度指南(附全流程案例与资源)🚀 📚 目录 DeepSeek在教育与科研中的核心价值教学场景应用:从备课到课堂管理的全流程革新科研场景应用:从数据分析到论文写作的智能跃迁师生协同创新:AI赋能的个性化学习与科研…...

Linux 命令大全完整版(10)

4. 压缩与解压缩命令 gzip(gnu zip) 功能说明&#xff1a;压缩文件。语  法&#xff1a;gzip [-acdfhlLnNqrtvV][-S <压缩字尾字符串>][-<压缩效率>][–best/fast][文件…] 或 gzip [-acdfhlLnNqrtvV][-S <压缩字尾字符串>][-<压缩效率>][–best/f…...

彻底卸载kubeadm安装的k8s集群

目录 一、删除资源 二、停止k8s服务 三、重置集群 四、卸载k8s安装包 五、清理残留文件和目录 六、删除k8s相关镜像 七、重启服务器 一、删除资源 # 删除集群中的所有资源&#xff0c;包括 Pod、Deployment、Service&#xff0c;任意节点执行 kubectl delete --all pod…...

vue+element-plus简洁完美实现淘宝网站模板

目录 一、项目介绍 二、项目截图 1.项目结构图 2.首页 3.详情 4.购物车 5.登陆页 三、源码实现 1.路由配置 2.依赖包 四、总结 一、项目介绍 项目在线预览&#xff1a;点击访问 本项目为vue项目&#xff0c;参考淘宝官方样式为主题来设计元素&#xff0c;简洁美观&…...

学习aigc

DALLE2 论文 Hierarchical Text-Conditional Image Generation with CLIP Latents [2204.06125] Hierarchical Text-Conditional Image Generation with CLIP LatentsAbstract page for arXiv paper 2204.06125: Hierarchical Text-Conditional Image Generation with CLIP L…...

深度学习-127-LangGraph之基础知识(四)自定义状态添加额外字段的聊天机器人

文章目录 1 自定义状态2 自定义工具2.1 完善工具human_assistance2.2 浏览器工具baidu_search3 聊天机器人3.1 绑定工具的聊天模型3.2 聊天机器人(带记忆)4 调用图4.1 调用工具时中断4.2 人工提供信息恢复4.3 查询存储的状态4.4 手动更新状态5 参考附录使用LangGraph,在状态中…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...