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

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

一、真题

二、模块构建

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

void Cls_Peripheral(void);

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

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记得加' '
  • 判断是否有 .,是用j+1位判断

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. 返回按键所对应的数字
  4. 没有按键按下时返回0

5.编写ADC代码

unsigned char PCF8591_ADC(unsigned char dat);

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

 6.编写频率代码

通过TMODE 配置将定时器0配置为计数器,实现频率读取

7.编写定时器代码

  1. 将定时器1用作定时器,定时器0作为计数器供NE555使用
  2. 定时器1为1毫秒定时器,用stc-isp生成,加上ET1=1!!!;
  3. 定时器0的使用需要对TMOD寄存器进行配置

三、主函数代码

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

2.编写数码管函数

  1. 数码管的数组和数字位置定义 12 8 0
  2. 时间为200ms
  3. 判断显示模式
  4. 数码管转换函数

3.编写定时器中断函数

  1. 所有计时变量自增
  2. 每2ms数码管显示
  3. 每1s读取一次频率并清零
  4. 将signal和P34引脚短接

4.周期界面

  1. 周期为频率的倒数 

  2. 因为题目要求周期单位为微秒,所以要乘以10的6次方后再除以频率

  3. 频率和周期都定义为unsigned int型

5.编写按键代码

  1. 时间为20ms
  2. 定义两个按键用于消抖
  3. 调用读取按键函数并赋值给变量Key_Val
  4. 判断Key_Val和Key_Val_Old是否相等,相等返回
  5. Switch语句判断哪个按键按下
  6. 再将Key_Val的值赋值给 Key_Val_Old
  7. 按下4按键,将Disp_Mode自加对3取模,因为有三个界面
  8. 当s6,s7按键按下时,定义一个新变量用于数据缓存,直接将原来的值赋值给现在的变量
  9. 对于s7是否长按的处理,将ulms的值赋值给S7_Down,然后在case 0时判断ulms - S7_Down > 1000,如果是,则直接则执行长按相关命令

6.电压界面

  1. 定义两个变量分别为光敏电阻和滑动变阻器的电压值
  2.  定义ADC_Mode用于切换两个界面

7.编写ADC函数

  1. 时间为200ms
  2. 在同时读取两路ADC时会出现反转的现象

    因此在要求同时采集两路时,将两个写入的数据调换位置

8.所有编写的函数,一定不要忘记放到主循环里

四、主函数代码

#include "init.h"
#include "seg.h"
#include "led.h"
#include "key.h"
#include "iic.h"
#include "stdio.h"
#include "tim.h"
//seg
unsigned char pucSeg_Buf[12],pucSeg_Code[8],ucSeg_Pos=0;
//led
unsigned char ucLed=0;
//key
unsigned char Key_Val=0,Key_Val_Old=0;
//ADC
unsigned char ucADC_Res=0,ucADC_Photo=0;
unsigned char ucADC_Res_Buf=255;
//Timer
unsigned long ulms=0;
unsigned long S7_Down=0;
unsigned int uiSeg_Dly=0;
unsigned int uiKey_Dly=0;
unsigned int uiADC_Dly=0;
unsigned int uiLed_Dly=0;
//freq
unsigned int uiFreq=0;
unsigned int uiTime=0;
unsigned int uiFreq_Buf=65535;
//function
void Seg_Proc(void);
void Key_Proc(void);
void ADC_Proc(void);
void Led_Proc(void);
//mode
unsigned char Disp_Mode=0;
unsigned char ADC_Mode=1;
unsigned char Led_Mode = 1;
void main(void)
{Cls_Peripheral();Timer0Init();Timer1Init();EA=1;while(1){Seg_Proc();Key_Proc();ADC_Proc();Led_Proc();}
}
void Led_Proc(void)
{if(uiLed_Dly<200)return;uiLed_Dly=0;if(Led_Mode == 0){ucLed = 0x00;}else{if(ucADC_Res>ucADC_Res_Buf){ucLed|=0x01;}else{ucLed&=~0x01;}if(uiFreq > uiFreq_Buf){ucLed |= 0x02;}else{ucLed &= ~0x02;}if(Disp_Mode == 0){ucLed |= 0x04;ucLed &= ~0x18;}else if(Disp_Mode == 1){ucLed |= 0x08;ucLed &= ~0x14;}else{ucLed |= 0x10;ucLed &= ~0x0C;}Led_Disp(ucLed);}
}
void Seg_Proc(void)
{if(uiSeg_Dly<200)return;uiSeg_Dly=0;if(Disp_Mode==0){sprintf(pucSeg_Buf,"F%7u",uiFreq);}else if(Disp_Mode==1){sprintf(pucSeg_Buf,"N%7u",uiTime);}else {if(ADC_Mode==1){sprintf(pucSeg_Buf,"U-1  %4.2f",ucADC_Photo/51.0);}else{sprintf(pucSeg_Buf,"U-3  %4.2f",ucADC_Res/51.0);}}Seg_Tran(pucSeg_Buf,pucSeg_Code);
}
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 0:if(Key_Val_Old==7){if(ulms-S7_Down>1000)			{Led_Mode=(Led_Mode+1)%2;}else{uiFreq_Buf = uiFreq;}}case 4:Disp_Mode=(Disp_Mode+1)%3;if(Disp_Mode==2){ADC_Mode=1;}break;case 5:if(Disp_Mode==2){if(ADC_Mode==1)ADC_Mode=3;elseADC_Mode=1;}break;case 6:ucADC_Res_Buf=ucADC_Res;break;case 7:S7_Down=ulms;uiFreq_Buf=uiFreq;break;}Key_Val_Old=Key_Val;
}
void ADC_Proc(void)
{if(uiADC_Dly<200)return;uiADC_Dly=0;ucADC_Res=PCF8591_ADC(0x41);ucADC_Photo=PCF8591_ADC(0x43);
}
void Time_1(void) interrupt 3
{ulms++;uiSeg_Dly++;uiKey_Dly++;uiADC_Dly++;uiLed_Dly++;if(ulms%2==0){ucSeg_Pos=(ucSeg_Pos+1)%8;Seg_Disp(pucSeg_Code,ucSeg_Pos);}if(ulms%1000==0){uiFreq=((TH0<<8)|TL0);uiTime=1000000/uiFreq;//以微秒为单位TH0=0;TL0=0;}
}

相关文章:

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

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

剑指 Offer II 047. 二叉树剪枝

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20047.%20%E4%BA%8C%E5%8F%89%E6%A0%91%E5%89%AA%E6%9E%9D/README.md 剑指 Offer II 047. 二叉树剪枝 题目描述 给定一个二叉树 根节点 root &#xff0c;树的每…...

【自学笔记】OpenStack基础知识点总览-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 OpenStack基础知识点总览一、OpenStack概述1.1 OpenStack起源1.2 OpenStack的目标与优势1.3 OpenStack的常见核心项目 二、OpenStack的节点类型2.1 控制节点2.2 网络…...

第5章:vuex

第5章&#xff1a;vuex 1 求和案例 纯vue版2 vuex工作原理图3 vuex案例3.1 搭建vuex环境错误写法正确写法 3.2 求和案例vuex版细节分析源代码 4 getters配置项4.1 细节4.2 源代码 5 mapState与mapGetters5.1 总结5.2 细节分析5.3 源代码 6 mapActions与mapMutations6.1 总结6.2…...

视觉在协作机器人上的场景应用

看了UR、ABB等协作机器人公司的一些视觉方面的应用&#xff0c;总结大概有下面几个方面。 1.工业制造领域 3C 产品生产 外观检测&#xff1a;可精确检测电子元件的划痕、污渍、凹陷等外观缺陷&#xff0c;如手机屏幕的微小划痕、芯片表面的瑕疵等&#xff0c;确保产品高质量&a…...

C#数据类型及相互转换

C#数据类型及相互转换 一、C#常用的基础数值类型二、C#常用的引用类型三、数据类型转换之拆箱装箱四、常量变量定义及使用规范五、C#运算符六、字符串拼接及格式化方法六、数值类型1. 自动转换2. 强制转换3. 字符串与数值类型的相互转换七、Nuget安装及西门子PLC通信1. Nuget安…...

Vue进阶之Vue3源码解析(二)

Vue3源码解析 运行runtime-coresrc/createApp.tssrc/vnode.ts.tssrc/renderer.ts runtime-domsrc/index.ts 总结 运行 runtime-core src/createApp.ts vue的创建入口 import { createVNode } from "./vnode";export function createAppAPI(render) {return funct…...

MyBatis-Plus开发流程:Spring Boot + MyBatis-Plus 实现对 book_tab 表的增删改查及Redis缓存

前言 MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;旨在简化开发、减少工作量。本文将介绍如何使用 Spring Boot 集成 MyBatis-Plus 来操作数据库&#xff0c;并结合 Redis 实现数据的缓存功能。 1项目搭建 1.1 创建 Spring Boot 项目 可以通过 Spring Initializr 快…...

mpi 和nccl 之间是什么关系 (来自deepseek)

MPI&#xff08;Message Passing Interface&#xff09;和 NCCL&#xff08;NVIDIA Collective Communications Library&#xff09;都是用于并行计算和分布式计算的通信库&#xff0c;但它们的应用场景和设计目标有所不同。 MPI 设计目标&#xff1a;MPI 是一个通用的消息传递…...

从开源大模型工具Ollama存在安全隐患思考企业级大模型应用如何严守安全红线

近日&#xff0c;国家网络安全通报中心通报大模型工具Ollama默认配置存在未授权访问与模型窃取等安全隐患&#xff0c;引发了广泛关注。Ollama作为一款开源的大模型管理工具&#xff0c;在为用户提供便捷的同时&#xff0c;却因缺乏有效的安全管控机制&#xff0c;存在数据泄露…...

通过Docker搭个游戏——疯狂大陆(Pkland)

最近在研究我的服务器&#xff0c;在服务器上搭了很多docker的项目&#xff0c;然后找着找着发现一个能用Docker配置环境的游戏叫Pkland。 项目地址&#xff1a;GitHub - popkarthb/pkland: 疯狂大陆是一款多人在线的战略游戏。 游戏操作简捷,您仅需要使用浏览器就可以在任何时…...

hive之LEAD 函数详解

1. 函数概述 LEAD 是 Hive 中的窗口函数&#xff0c;用于获取当前行之后指定偏移量处的行的值。常用于分析时间序列数据、计算相邻记录的差异或预测趋势。 2. 语法 LEAD(column, offset, default) OVER ([PARTITION BY partition_column] [ORDER BY order_column [ASC|DESC]…...

springboot429-基于springboot的教务管理系统(源码+数据库+纯前后端分离+部署讲解等)

&#x1f495;&#x1f495;作者&#xff1a; 爱笑学姐 &#x1f495;&#x1f495;个人简介&#xff1a;十年Java&#xff0c;Python美女程序员一枚&#xff0c;精通计算机专业前后端各类框架。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xf…...

深入理解指针与回调函数:从基础到实践

引言 在C语言中&#xff0c;指针和回调函数是两个非常重要的概念。指针为我们提供了直接操作内存的能力&#xff0c;而回调函数则为我们提供了一种灵活的编程方式&#xff0c;使得我们可以将函数作为参数传递给其他函数&#xff0c;从而实现更加模块化和可复用的代码。本文将深…...

linux磁盘非lvm分区

linux磁盘非lvm分区 类似于windows划分C盘、D盘&#xff0c;并且不需要多个磁盘空间合一 图形化直接分区 通过gparted 这个提供直观的图形化分区&#xff0c;类似windows的磁盘管理工具 下载方式&#xff1a; 乌班图/debian系列&#xff1a; sudo apt install gparted红帽…...

Linux:文件描述符与重定向

目录 一、文件描述符 1.文件内核对象 2.文件描述符分配原则 二、文件重定向 1.重定向的现象 输出重定向 输入重定向 dup2 2.重定向的使用 三、标准输出和标准错误 继上篇文章中&#xff0c;我们了解了fd打印的值为文件描述符&#xff0c;那么它还有什么作用呢&…...

【原创】C# HttpClient 读取流数据的问题

默认情况下HttpClient中有缓存&#xff0c;在读取流数据的时候&#xff0c;往往要等一小会儿&#xff0c;然后读出一大堆。 我们在请求OpenAI类的大模型的时候&#xff0c;往往要一边读取一边显示&#xff08;输出&#xff09;&#xff0c;这时候需要禁止HttpClient 中内置的缓…...

C# 开发工具Visual Studio下载和安装

开发环境与工具 C#的主要开发环境是Visual Studio&#xff0c;这是一个功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;集成了代码编辑、调试、项目管理、版本控制等功能。此外&#xff0c;Visual Studio Code也是一个轻量级的跨平台代码编辑器&#xff0c;支…...

3-7 WPS JS宏 工作表移动复制实例-2(多工作簿的多工作表合并)学习笔记

************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...

Python在机器学习与数据分析领域的深度应用:从基础到实战

在当今数字化时代&#xff0c;数据如同宝贵的矿产资源&#xff0c;蕴含着无尽的价值等待挖掘。Python作为一门强大而灵活的编程语言&#xff0c;凭借其丰富的库和工具&#xff0c;在机器学习和数据分析领域扮演着举足轻重的角色。它不仅为数据科学家和开发者提供了高效处理和分…...

网络安全ctf试题 ctf网络安全大赛真题

MISC 1 签到 难度 签到 复制给出的flag输入即可 2 range_download 难度 中等 flag{6095B134-5437-4B21-BE52-EDC46A276297} 0x01 分析dns流量&#xff0c;发现dns && ip.addr1.1.1.1存在dns隧道数据&#xff0c;整理后得到base64: cGFzc3dvcmQ6IG5zc195eWRzIQ 解…...

分布式和微服务的理解

分布式系统和微服务是现代化软件架构中两个关键概念&#xff0c;它们共同支撑了高可用、高扩展的互联网应用&#xff0c;但侧重点和解决的问题有所不同。以下是它们的核心理解&#xff1a; ​一、分布式系统&#xff08;Distributed System&#xff09;​ 定义&#xff1a; 分…...

Embedding技术:DeepWalkNode2vec

引言 在推荐系统中&#xff0c;Graph Embedding技术已经成为一种强大的工具&#xff0c;用于捕捉用户和物品之间的复杂关系。本文将介绍Graph Embedding的基本概念、原理及其在推荐系统中的应用。 什么是Graph Embedding&#xff1f; Graph Embedding是一种将图中的节点映射…...

基于IMM算法的目标跟踪,四模型IMM|三维环境|4个模型分别是:CV、左转CT、右转CT、CA(基于EKF,订阅专栏后可获得完整源代码)

这段MATLAB代码实现了基于交互多模型(IMM)算法的目标跟踪,结合了四种运动模型(匀速直线、左转圆周、右转圆周和匀加速直线)。通过定义状态方程、生成带噪声的测量数据,以及执行IMM迭代,该代码有效地实现了多模型的状态估计和融合。最终,用户可以通过可视化结果观察目标…...

大模型工程师日记(十三):检索增强生成(RAG)

Document loaders和Text splitters Document loaders(文档加载器) Document loaders(文档加载器) 这些类加载文档对象。LangChain与各种数据源有数百个集成&#xff0c;可以从中加载数据&#xff1a;Slack、Notion、Google Drive等。 每个文档加载器都有自己特定的参数&#…...

HOW - React 如何在在浏览器绘制之前同步执行 - useLayoutEffect

目录 useEffect vs useLayoutEffectuseEffectuseLayoutEffect主要区别总结选择建议注意事项 useLayoutEffect 使用示例测量 DOM 元素的尺寸和位置示例&#xff1a;自适应弹出框定位 同步更新样式以避免闪烁示例&#xff1a;根据内容动态调整容器高度 图像或 Canvas 绘制前的准备…...

前端开发10大框架深度解析

摘要 在现代前端开发中&#xff0c;框架的选择对项目的成功至关重要。本文旨在为开发者提供一份全面的前端框架指南&#xff0c;涵盖 React、Vue.js、Angular、Svelte、Ember.js、Preact、Backbone.js、Next.js、Nuxt.js 和 Gatsby。我们将从 简介、优缺点、适用场景 以及 实际…...

图像形成与计算机视觉基础

1. 图像形成的基本原理 图像形成是物理世界与传感器&#xff08;如胶片、CCD/CMOS&#xff09;交互的过程&#xff0c;核心是光线的传播与记录。 1.1 直接放置胶片模型 物理原理&#xff1a;物体表面反射的光线直接照射到胶片上&#xff0c;但无任何遮挡或聚焦机制。 问题&a…...

【显示】3.1 Android 从Activity到Display链路概括

目录 一,Activity上屏Flow总结 二,链路拆解 2.1 Activity 的创建和 UI 初始化 2.2 Window 和 DecorView 的创建 2.3 Surface 的创建 2.4 View 的绘制流程 2.5 Surface 的提交和合成 2.6 上屏显示 三,多个Activity的处理方式 一,Activity上屏Flow总结 Activity → s…...

【leetcode hot 100 240】搜索二维矩阵Ⅱ

解法一&#xff1a;直接查找 class Solution {public boolean searchMatrix(int[][] matrix, int target) {for(int i0; i<matrix.length; i){for(int j0; j<matrix[0].length; j){if(matrix[i][j]>target){break;}if(matrix[i][j]target){return true;}}}return fal…...