【蓝桥杯单片机】第十一届省赛
一、真题




二、创建工程
1.在C盘以外的盘新建文件夹,并在文件夹里面创建两个文件夹Driver 和Project
2.打开keil软件,在新建工程并选择刚刚建好的project文件夹,以准考证号命名

3.选择对应的芯片型号


4.选择否,即不创建启动文件

5.勾上生成hex文件的功能

6.添加头文件路径

三、模块构建
1.编写初始化函数(init.c)
void Cls_Peripheral(void);
- 关闭led led对应的锁存器由Y4C控制
- 关闭蜂鸣器和继电器 由Y5C控制
2.编写LED函数(led.c)
void Led_Disp(unsigned char ucLed);
-
将ucLed取反的值赋给P0
-
开启锁存器 y4
-
关闭锁存器 y4
3.编写数码管函数(seg.c)
void Seg_Tran(unsigned char *pucSeg_Buf,unsigned char *pucSeg_Code);
(1)段码转换函数
- 定义两个变量i,j
- for循环加Switch语句进行段码转换,在资源数据包查找段码表,并根据题目要求进行段码转换
- 注意添加空格代表都不显示
- 注意8+4是C 不是A
void Seg_Disp(unsigned char *pucSeg_Code,unsigned char ucSeg_Pos);
(2)数码管显示函数
- 要对数码管进行消隐y7
- 显示的位置 y6
- 显示的内容y7
4. 编写矩阵键盘代码(key.c)
unsigned char Key_Read_KBD(void);
- 有返回值
- 16个按键,要用十六位数据类型 unsigned int
- 依次将每一列设置为低电平,读取P3的低四位(&0x0f)存储到变量Key_New里,不要忘记每个都左移4位,然后记得|
- 用Switch语句将按键按下后的值进行判断(Key_New取反 便于理解)
- 返回对应按键的值
- 不要忘记default 返回都没有按下的值 设为0
5.编写ADC代码
unsigned char PCF8591_ADC(void);
- 定义SCL,SDA
- 有返回值类型
- 添加"intrins.h"头文件,接触nop错误
- 定义变量用于存储采集的电压
- 写入流程:开始--发送写入地址--等待应答--发送电位器地址--等待应答
- 读取流程:开始--发送读取地址--等待应答--变量接收数据--发送应答1--终止
- 读取地址为0x91 写入地址为0x90
- 电位器地址为0x43
- 不要忘记把temp返回
6.编写AT24C02代码
void EEPROM_Read(unsigned char *pucBuf,unsigned char addr,unsigned char num);
- 读取流程:开始--发送写入地址--等待应答--发送写入位置-等待应答--开始--发送读取地址--等待应答--while(num--)来逐个存储读取的数据--if判断num是否为0--终止
void EEPROM_Write(unsigned char *pucBuf,unsigned char addr,unsigned char num)
-
开始--发送写入地址--等待应答--发送写入位置--等待应答-- while(num--)来逐个将数据写入(加入延时保证稳定性)--终止
7.定时器函数编写
void Timer0Init(void);
- 在sti-isp软件中生成定时长度为1ms的c代码,直接复制
- 不要忘记打开定时器0的开关和定时器总开关
四、主函数代码
1.添加好所有头文件在主函数和工程文件夹中
2.外设初始化,定时器初始化,打开中断总开关
3.数码管函数编写
- 定义数组和变量,数组分别为12为和8位,不加* 变量赋初值为0
- 编写Seg_Proc();函数
- 添加时间变量在定时器0中断进行自加
- 200ms
- 动态显示添加到中断里
- 判断模式
- 数码管转换函数不要忘
4.ADC函数编写
- 时间200
- 将读取的值赋值给变量,实际的值需要除以51.0是真实电压值
5.按键函数编写
-
不用NE555时,不要短接,否则按键会失效
6.led函数编写
- 200ms
- 最后不要忘记调用led显示函数
五、难点解析
1.关于EEPROM 的断电保存
2.触发条件
3.指示灯 用到了ulms
4.无效按键的触发
六、主函数代码
#include <stdio.h>
#include "seg.h"
#include "led.h"
#include "init.h"
#include "key.h"
#include "iic.h"
#include "tim.h"
//Seg
unsigned char pucSeg_Buf[12],pucSeg_Code[8],ucSeg_Pos=0;
//ADC
unsigned char ucADC=0;
float ADC_Pram=0;
unsigned int uicount=0;
unsigned char ucADC_Old=0;
//led
unsigned char ucLed=0;
//key
unsigned char Key_Val=0,Key_Val_Old=0;
unsigned int uiError=0;
//EEPROM
unsigned char EEPROM_Buf[2];
//timer
unsigned long ulms=0;
unsigned long ulled=0;
unsigned int uiSeg_Dly=0;
unsigned int uiADC_Dly=0;
unsigned int uiKey_Dly=0;
unsigned int uiLed_Dly=0;//function
void Seg_Proc(void);
void ADC_Proc(void);
void Key_Proc(void);
void Led_Proc(void);//mode
unsigned char Disp_Mode=0;void main(void)
{Cls_Peripheral();EEPROM_Read(EEPROM_Buf,0x00,1);ADC_Pram=EEPROM_Buf[0]/10.0;Timer0Init();EA=1;while(1){Seg_Proc();ADC_Proc();Key_Proc();Led_Proc();}
}
void Led_Proc(void)
{if(uiLed_Dly<200)return;uiLed_Dly=0;if(((ucADC/51.0)<ADC_Pram)&&(ulms-ulled>5000)){ucLed|=0x01;}else{ucLed&=~0x01;}if(uicount%2==0){ucLed&=~0x02;}else{ucLed|=0x02;}if(uiError>=3){ucLed|=0x04;}else{ucLed&=~0x04;}Led_Disp(ucLed);
}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==1){sprintf(pucSeg_Buf,"P %4.2f",ADC_Pram);}else{sprintf(pucSeg_Buf,"N%7u",uicount);}Seg_Tran(pucSeg_Buf,pucSeg_Code);
}
void ADC_Proc(void)
{if(uiADC_Dly<500)return;uiADC_Dly=0;ucADC=PCF8591_ADC();if(((ucADC_Old/51.0)>ADC_Pram)&&((ucADC/51.0)<=ADC_Pram)){uicount++;ulled=ulms;}if(((ucADC_Old/51.0)<ADC_Pram)&&((ucADC/51.0)>=ADC_Pram)){ulled=ulms;}ucADC_Old=ucADC;
}
void Key_Proc(void)
{if(uiKey_Dly<20)return;uiKey_Dly=0;Key_Val=Key_Read_KBD();if(Key_Val==Key_Val_Old)return;switch (Key_Val){case 12:uiError=0;Disp_Mode=(Disp_Mode+1)%3;if(Disp_Mode==2){EEPROM_Buf[0]=(unsigned char)(ADC_Pram*10);EEPROM_Write(EEPROM_Buf,0x00,1);}break;case 13:if(Disp_Mode==2){uiError=0;uicount=0;}else{uiError++;}case 16:if(Disp_Mode==1){uiError=0;if(ADC_Pram>=5){ADC_Pram=0;}else{ADC_Pram+=0.5;}}else{uiError++;}break;case 17:if(Disp_Mode==1){uiError=0;if(ADC_Pram<=0.0){ADC_Pram=5.0;}else{ADC_Pram-=0.5;}}else{uiError++;}break;}Key_Val_Old=Key_Val;
}
void Time_0(void) interrupt 1
{ulms++;uiSeg_Dly++;uiADC_Dly++;uiKey_Dly++;uiLed_Dly++;if(ulms%2==0){ucSeg_Pos=(ucSeg_Pos+1)%8;Seg_Disp(pucSeg_Code,ucSeg_Pos);}
}
相关文章:
【蓝桥杯单片机】第十一届省赛
一、真题 二、创建工程 1.在C盘以外的盘新建文件夹,并在文件夹里面创建两个文件夹Driver 和Project 2.打开keil软件,在新建工程并选择刚刚建好的project文件夹,以准考证号命名 3.选择对应的芯片型号 4.选择否,即不创建启动文件 …...
【存储中间件】Neo4J图数据库超详细教程(一):相关介绍、特点及优势、数据模型、软件安装
文章目录 Neo4J超详细教程一、Neo4J相关介绍1.为什么需要图数据库方案1:Google方案2:Facebook 2.特点和优势3.什么是Neo4j4.Neo4j数据模型图论基础属性图模型Neo4j的构建元素 5.软件安装 个人主页:道友老李 欢迎加入社区:道友老李…...
xxl-job部署在docker-destop,实现定时发送预警信息给指定邮箱
XXL-JOB XXL-JOB是一个分布式任务调度平台(XXL是作者徐雪里姓名拼音的首字母),其核心设计目标是开发迅速、学习简单、轻量级、易扩展。 源码仓库地址:https://github.com/xuxueli/xxl-job 源码结构: 系统架构 在xxl-j…...
【QT】QScrollBar设置样式:圆角、隐藏箭头、上边距等
目录 0.简介 1.原理 2.具体代码 0.简介 环境:Ubuntu22.04、qtDesigner绘制UI 项目需要,按照UI修改滚动条样式,滚动条我使用的是QScrollBar,默认样式和修改之后的样式如下: 1.原理 2.具体代码 我是用qtDesigner绘制…...
trae中文版AI搭建完整可用的项目框架
Trae 是由字节跳动推出的 AI 原生集成开发环境(AI IDE),号称可以搭建完整项目,个人试用后体验确实比Cursor或cline更便捷,因为他多个文件关联准确率更高。 正式版的trae不支持大陆使用,不过目前已经推出了…...
多数元素——面试经典150题(力扣)
题目 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums [3,2,3] 输出:3 …...
cfi网络安全 网络安全hcip
目录 RIP (路由信息协议) 算法 开销 版本 开销值的计算方式 RIPV1和RIPV2的区别 RIP的数据包 Request(请求)包 Reponse(应答)包 RIP的特征 周期更新 RIP的计时器 1,周期更新计时器 2,失效计时器 3,垃圾回收计时器 RIP的核心思…...
Banana Pi 与瑞萨电子携手共同推动开源创新:BPI-AI2N
2025年3月11日, Banana Pi 开源硬件平台很高兴宣布,与全球知名半导体解决方案供应商瑞萨电子(Renesas Electronics)正式达成技术合作关系。此次合作标志着双方将在开源技术、嵌入式系统和物联网等领域展开深度合作,为全…...
linux 命令 ls
ls 是 Linux 系统中用于列出目录内容的核心命令,几乎所有日常操作都会用到。以下是其详细用法和常见场景说明 1. 基础语法 ls [选项] [目录/文件] 不指定目录时,默认列出当前目录的内容。 可以指定文件或目录路径,支持通配符(如…...
论数组去重之高效方法
论数组去重之高效方法 数组去重的高效方法主要有 利用 Set 数据结构、利用对象/Map哈希表、排序后遍历去重 三种核心方案。其中 Set 是ES6最简单高效的方式,时间复杂度为 O(n);若需兼容性优化或处理特殊数据类型,可结合哈希表或排序实现。 分点论述: 1. 使用 Set 数据结构…...
C#-扩展方法-Linq
密封类 sealed,无法被继承 var 可以定义匿名对象 static void test1() {var t 1;t "jack";//报错,类型已经确定好了var s new{id 1,name "tom"};Console.WriteLine(s.id s.name); } 扩展方法 对现有类型做方法的扩展&am…...
【C++ STL】 容器详解:pair 学习
在 C STL(标准模板库)中,pair 是一个 简单的键值对数据结构,用于存储 两个相关联的值,将两个值组合成一个单元,可以是相同或不同类型。它常用于 返回多个值、存储映射关系、排序 等场景。 1. pair 的基本特…...
Go红队开发—web网络编程
文章目录 web网络编程Req快速请求 调试DevModeDebugLogTraceInfo瓶颈分析 控制请求与响应控制请求的字段内容控制调试打印的内容分开dump请求与响应部分请求体设置 作用范围级别设置参数查询URL 路径参数表单请求设置请求头设置 判断响应状态码解析数据SetSuccessResultgjson响…...
libwebsockets实现异步websocket客户端,服务端异常断开可重连
libwebsockets websocket客户端基本流程网上都有,我只额外优化了重连机制。 在服务器异常断开时不触发LWS_CALLBACK_CLOSED或LWS_CALLBACK_CLIENT_CONNECTION_ERROR,导致无法自动重连 通过定时检查链接是否可写入判断链接是否有效 // 判断wsi是否可用if …...
轻量级模块化前端框架:快速构建强大的Web界面
轻量级模块化前端框架:快速构建强大的Web界面 在当今快节奏的Web开发环境中,选择一个高效且灵活的前端框架至关重要。UIkit 是一个轻量级的模块化前端框架,旨在帮助开发者快速构建功能强大且响应迅速的Web界面。 UIkit提供了丰富的组件和工…...
qt+opengl 播放yuv视频
一、实现效果 二、pro文件 Qt widgets opengl 三、主要代码 #include "glwidget.h"GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent) {connect(&m_timer, &QTimer::timeout, this,[&](){this->update();});m_timer.start(1000/33); }v…...
UI自动化:poium测试库
以下是关于 poium 测试库 的详细介绍,涵盖其核心功能、使用方法及与原生 Selenium 的对比,帮助快速掌握这一工具: 1. poium 简介 定位:基于 Selenium 的 Page Object 模式增强库,专注于简化元素定位和页面操作。 核心…...
树莓集团落子海南,如何重构数字产业生态体系
树莓集团在海南的布局,是其整体商业战略中的关键一环。这背后,是对政策机遇、产业协同、以及区域优势的深度考量。 政策机遇 海南自贸港建设带来前所未有的政策红利,包括贸易、投资、资金等方面的自由便利。树莓集团紧抓这一机遇࿰…...
5G基本概念
作者:私语茶馆 1. 5G应用场景概述 1.1.5G应用场景 ITU域2015年定义了三大应用场景:eMBB(增强型移动宽带)、uRLLC(低时延高可靠通信)、mMTC(海量物联网通信); emBB:Enhanced Mobile Broadband ,移动互联网应用,是4G MBB(移动宽带)的升级,主要侧重于网络速率、带…...
PH热榜 | 2025-03-12
1. Fluently 标语:开始说英语,就像说你的母语一样流利。 介绍:想象一下,有一个像人类一样的英语教练,全天候在线、价格却便宜15倍。这就是 Fluently 🚀 纠正你的错误,提升你的词汇量、发音和语…...
Python Web项目的服务器部署
一.部署运行 1.虚拟环境的安装:(一行一行运行) wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh bash miniconda.sh -b -p /opt/miniconda3 echo export PATH"/opt/miniconda3/bin:$PAT…...
[项目]基于FreeRTOS的STM32四轴飞行器: 八.遥控器摇杆
基于FreeRTOS的STM32四轴飞行器: 八.遥控器摇杆 一.摇杆数据的扫描二.处理摇杆数据三.微调按键处理 一.摇杆数据的扫描 下面摇杆初始化时,启动了ADC-DMA进行了采集,已经开始转换直接将数据通过DMA存入buff数组中: static uint16_t buff[4] …...
附下载 | 2024 OWASP Top 10 基础设施安全风险.pdf
《2024 OWASP Top 10 基础设施安全风险》报告,由OWASP(开放网络应用安全项目)发布,旨在提升企业和组织对基础设施安全风险、威胁与漏洞的意识,并提供高质量的信息和最佳实践建议。报告列出了2024年最重要的10大基础设施…...
Pytorch的一小步,昇腾芯片的一大步
Pytorch的一小步,昇腾芯片的一大步 相信在AI圈的人多多少少都看到了最近的信息:PyTorch最新2.1版本宣布支持华为昇腾芯片! 1、 发生了什么事儿? 在2023年10月4日PyTorch 2.1版本的发布博客上,PyTorch介绍的beta版本…...
C语言操作MySQL从入门到精通
大家好,我是 V 哥。今天给大家整理的内容是关于使用 C 语言操作 MySQL 数据库的详细介绍,从入门到精通,并配有案例代码和注释,帮助小白快速上手。 基本操作 1. 环境准备 在开始之前,你需要安装 MySQL 数据库和 MySQ…...
【从零开始学习计算机科学】编译原理(五)语法制导翻译
【从零开始学习计算机科学】编译原理(五)语法制导翻译 语法制导翻译语法制导定义SDDSDD的求值顺序两类重要的SDD语法制导的翻译方案SDTSDT的实现L属性定义的SDT左递归翻译方案语法制导翻译 语法表述的是语言的形式,或者说是语言的样子和结构。而程序设计语言中另一方面,是…...
uniapp uview 1.0 跨域h5配置多个代理、如何请求接口
参考文章:uniapp uView1.0跨域h5配置多个代理 官方手册:http 请求 项目中使用: 参考其他博主的文章是在manifest.json中配置代理,但在官方的手册中是直接在script请求的,我尝试请求了下没问题,上线后也不…...
化工厂防爆气象站:为石油化工、天然气等领域提供安全保障
【TH-FB02】在石油化工、天然气等高危行业中,安全生产是至关重要的。这些行业常常面临着易燃易爆、有毒有害等潜在风险,因此,对气象条件的监测和预警显得尤为重要。化工厂防爆气象站作为一种专门设计用于这些特殊环境的气象监测设备ÿ…...
Android Glide 缓存模块源码深度解析
一、引言 在 Android 开发领域,图片加载是一个极为常见且关键的功能。Glide 作为一款被广泛使用的图片加载库,其缓存模块是提升图片加载效率和性能的核心组件。合理的缓存机制能够显著减少网络请求,降低流量消耗,同时加快图片显示…...
Mac安装Neo4j图数据库
通过Homebrew 安装(推荐) 打开mac终端: 1. 安装 Homebrew(如果尚未安装) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"2. 安装 Neo4j brew insta…...
