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



二、模块构建
1.编写初始化函数(init.c)
void Cls_Peripheral(void);
- 关闭led led对应的锁存器由Y4C控制
- 关闭蜂鸣器和继电器 由Y5C控制
2.编写LED函数(led.c)
void Led_Disp(unsigned char ucLed);
-
将ucLed取反的值赋给P0
-
开启锁存器
-
关闭锁存器
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)
- 有返回值函数(unsigned char)
- if语句判断按键是否按下
- 返回按键所对应的数字
- 没有按键按下时返回0
5.编写ADC代码
unsigned char PCF8591_ADC(unsigned char dat);
- 定义SCL,SDA
- 添加"intrins.h"头文件
- 定义变量用于存储采集的电压
- 函数定义写入地址dat,来判断读取哪一路
- 写入流程:开始--发送写入地址--等待应答--发送dat地址--等待应答
- 读取流程:开始--发送读取地址--等待应答--变量接收数据--发送应答--终止
- 读取地址为0x91 写入地址为0x90
- 电位器地址为0x43 光敏电阻地址为0x41
6.编写频率代码
通过TMODE 配置将定时器0配置为计数器,实现频率读取
7.编写定时器代码
- 将定时器1用作定时器,定时器0作为计数器供NE555使用
- 定时器1为1毫秒定时器,用stc-isp生成,加上ET1=1!!!;
- 定时器0的使用需要对TMOD寄存器进行配置
三、主函数代码
1.初始化,定时器0,定时器1,中断总开关,stdio.h
2.编写数码管函数
- 数码管的数组和数字位置定义 12 8 0
- 时间为200ms
- 判断显示模式
- 数码管转换函数
3.编写定时器中断函数
- 所有计时变量自增
- 每2ms数码管显示
- 每1s读取一次频率并清零
- 将signal和P34引脚短接
4.周期界面
-
周期为频率的倒数
-
因为题目要求周期单位为微秒,所以要乘以10的6次方后再除以频率
-
频率和周期都定义为unsigned int型
5.编写按键代码
- 时间为20ms
- 定义两个按键用于消抖
- 调用读取按键函数并赋值给变量Key_Val
- 判断Key_Val和Key_Val_Old是否相等,相等返回
- Switch语句判断哪个按键按下
- 再将Key_Val的值赋值给 Key_Val_Old
- 按下4按键,将Disp_Mode自加对3取模,因为有三个界面
- 当s6,s7按键按下时,定义一个新变量用于数据缓存,直接将原来的值赋值给现在的变量
- 对于s7是否长按的处理,将ulms的值赋值给S7_Down,然后在case 0时判断ulms - S7_Down > 1000,如果是,则直接则执行长按相关命令
6.电压界面
- 定义两个变量分别为光敏电阻和滑动变阻器的电压值
- 定义ADC_Mode用于切换两个界面
7.编写ADC函数
- 时间为200ms
-
在同时读取两路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函数(led.c) void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器…...

开源嵌入式实时操作系统NuttX介绍
一、NuttX RTOS的发展历程:从个人项目到Apache顶级开源项目 NuttX 是一款轻量级、可扩展的实时操作系统(RTOS),其发展历程堪称开源社区的经典案例。 起源与初创(2003-2007) NuttX 由 Gregory Nutt 于2003…...

阿里云服务器部署项目笔记 实操 centos7.9
阿里云服务器部署项目笔记 实操 centos7.9 springboot vue elementUImysqlredis 相关的redis,mysql,nginx镜像,jdk 通过网盘分享的文件:docker镜像 链接: https://pan.baidu.com/s/15VwcWBP4Jy07xADuvylgQw?pwdm2g9 提取码: m2g9 配置环境 连接云服务器 安装…...

Java-实现PDF合同模板填写内容并导出PDF文件
可用于公司用户合同导出pdf文件 效果图 一、导入所需要jar包 <!--生成PDF--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><dependency&…...

Docker安装Grafana数据可视化平台
介绍 Grafana是一个开源的监控和数据可视化平台,主要用于展示和分析时间序列数据。提供功能强大且灵活的数据可视化和监控工具,适用于多种场景,它广泛应用于DevOps、IT运维、物联网(IoT)和业务分析等领域。 Grafana的主…...
MyBatis-Plus 自动填充功能
MyBatis-Plus(MP) 提供了一个非常强大的功能——自动填充功能。该功能可以在执行插入或更新操作时,自动为某些字段赋值,免去手动设置这些字段的麻烦。常见的应用场景包括 创建时间 和 更新时间 字段的自动填充,帮助开发…...

解决redis lettuce连接池经常出现连接拒绝(Connection refused)问题
一.软件环境 windows10、11系统、springboot2.x、redis 6 7 linux(centos)系统没有出现这问题,如果你是linux系统碰到的,本文也有一定大参考价值。 根本思路就是:tcp/ip连接的保活(keepalive)。 二.问题描述 在spr…...

武汉大学生命科学学院与谱度众合(武汉)生命科技有限公司举行校企联培座谈会
2025年2月21日下午,武汉大学生命科学学院与谱度众合(武汉)生命科技有限公司(以下简称“谱度众合”)在学院学术厅举行校企联培专业学位研究生合作交流会。武汉大学生命科学学院副院长刘星教授、生命科学学院周宇教授、产…...
4.网络技术与应用
一、计算机网络基础 1. 网络基本原理 通信模型: OSI七层模型: 物理层(传输比特流,如网线、光纤)数据链路层(MAC地址,交换机)网络层(IP地址,路由器࿰…...
Kafka 主题 retention.ms 配置修改及深度问题排查指南
文章目录 Kafka 主题 retention.ms 配置修改及深度问题排查指南版本背景查看 Kafka 主题当前状态修改 retention.ms 配置的正确方式为什么不能使用 kafka-topics.sh?使用 kafka-configs.sh 动态更新配置 深入解析 retention 配置retention.ms 与 retention.bytes 的…...

React实现无缝滚动轮播图
实现效果: 由于是演示代码,我是直接写在了App.tsx里面在 文件位置如下: App.tsx代码如下: import { useState, useEffect, useCallback, useRef } from "react"; import { ImageContainer } from "./view/ImageC…...

deepseek+mermaid【自动生成流程图】
成果: 第一步打开deepseek官网(或百度版(更快一点)): 百度AI搜索 - 办公学习一站解决 第二步,生成对应的Mermaid流程图: 丢给deepseek代码,或题目要求 生成mermaid代码 第三步将代码复制到me…...

分布式锁的简单实现
1. 什么是分布式锁? 在分布式系统中,也会涉及到多个节点访问同一个公共资源的情况,和 Java 中多线程的锁不一样,由于分布式系统中涉及到多个进程多个主机,所以说 Java 中 synchronized 就不合适了。 2. 分布式锁的简…...

C语言(19)----------->函数(2)
本文介绍了C语言的return语句及其它在C语言函数中的作用,以及介绍了二维数组和一维数组传参时的一些注意事项和使用数组传参时的方法。 若没有学习过C语言的一维数组和二维数组,建议参考如下文章: C语言(15)--------…...

动态扩缩容引发的JVM堆内存震荡:从原理到实践的GC调优指南
目录 一、典型案例:系统发布后的GC雪崩事件 (一)故障现象 1. 刚刚启动时 GC 次数较多 2. 堆内存锯齿状波动 3. GC日志特征:Allocation Failure (二)问题定位 二、原理深度解析:JVM内存弹…...
为何在用户注销时使用 location.href 而非 Vue Router 的 router.push
在开发 Web 应用时,用户注销功能的设计看似简单,但背后隐藏着对状态管理、安全性和用户体验的深层考量。以下将详细探讨为何许多项目在注销跳转时选择 location.href(强制刷新页面)而非 Vue Router 的 router.push(单页…...

开源工具推荐:Uptime Kuma监控
1. 概述 Github:louislam/uptime-kuma: A fancy self-hosted monitoring tool Uptime Kuma is an easy-to-use self-hosted monitoring tool. Uptime Kuma 是一款开源的监控工具,可以帮助你实时监测网站或服务的状态,并在发生故障时及时通…...

《基于Selenium的论坛系统自动化测试实战报告》
一、项目背景与技术选型 项目简介 目标系统:论坛系统 核心功能:用户注册/登录、会话框发送信息、好友列表、信息发送 技术栈:html Springboot MySQL数据库 为什么选择Selenium 支持多浏览器兼容性测试(Chrome/Firefox/Edge&…...
深入解析SQL Server高级SQL技巧
SQL Server 是一种功能强大的关系型数据库管理系统,广泛应用于各种数据驱动的应用程序中。在开发过程中,掌握一些高级SQL技巧,不仅能提高查询性能,还能优化开发效率。这篇文章将全面深入地探讨SQL Server中的一些高级技巧…...
分布式中间件:环境准备
在当今数字化的时代,分布式系统已经成为了开发领域的主流。分布式中间件在其中扮演着至关重要的角色,它能够帮助我们更好地处理高并发、高可用等复杂的业务场景。在这个系列的博客中,我将带大家深入学习分布式中间件的相关知识,主…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...