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

一、真题

二、模块构建

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;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/72441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyCharm接入本地部署DeepSeek 实现AI编程!【支持windows与linux】

今天尝试在pycharm上接入了本地部署的deepseek&#xff0c;实现了AI编程&#xff0c;体验还是很棒的。下面详细叙述整个安装过程。 本次搭建的框架组合是 DeepSeek-r1:1.5b/7b Pycharm专业版或者社区版 Proxy AI&#xff08;CodeGPT&#xff09; 首先了解不同版本的deepsee…

CSS 系列之:grid 布局

基本概念 <template><div class"parent"><div class"box">p1-1</div><div class"box">p1-2</div><div class"box">p1-3</div></div><div class"parent"><…

数学软件Matlab下载|支持Win+Mac网盘资源分享

如大家所了解的&#xff0c;Matlab与Maple、Mathematica并称为三大数学软件。Matlab应用广泛&#xff0c;常被用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人&#xff0c;控制系统等领域。 Matlab将数值分析、矩阵计算、科学…

水仙花数(华为OD)

题目描述 所谓水仙花数&#xff0c;是指一个n位的正整数&#xff0c;其各位数字的n次方和等于该数本身。 例如153是水仙花数&#xff0c;153是一个3位数&#xff0c;并且153 13 53 33。 输入描述 第一行输入一个整数n&#xff0c;表示一个n位的正整数。n在3到7之间&#x…

物联网同RFID功能形态 使用场景的替代品

在物联网&#xff08;IoT&#xff09;和自动识别技术领域&#xff0c;除了RFID标签外&#xff0c;还有一些其他技术产品可以在形态和大小上与RFID标签相似&#xff0c;同时提供类似或更强大的功能。以下是几种能够替代RFID标签的产品&#xff1a; 一、NFC标签 NFC&#xff08;…

03.03 QT

1.在注册登录的练习里面&#xff0c;追加一个QListwidget 项目列表 要求:点击注册之后&#xff0c;将账号显示到 1istwidget上面去 以及&#xff0c;在listwidget中双击某个账号的时候&#xff0c;将该账号删除 Widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWi…

c++ cout详解

在 C++ 中,cout 是标准输出流对象,用于向控制台(或标准输出设备)输出数据。它是 iostream 库的核心组件之一,与 << 流插入运算符配合使用。 一、基本用法 1. 头文件和命名空间 #include <iostream> // 必须包含的头文件 using namespace std; // 命名空间(…

深入解析 .NET Core 的应用启动流程

随着 .NET Core 的发展&#xff0c;它逐渐成为构建跨平台、高性能 Web 应用的首选框架。了解 .NET Core 的应用启动流程是开发者成功使用该框架的关键&#xff0c;尤其是在调试、优化和部署时。本文将深入探讨 .NET Core 的应用启动过程&#xff0c;从创建 Web 主机、配置服务、…

(十二)基于 Vue 3 和 Mapbox GL 实现的坐标拾取器组件示例

下面是一个基于 Vue 3 和 Mapbox GL 实现的坐标拾取器组件示例: <template><div class="map-container"><div ref="mapContainer" class="map"></div><div class="coordinates-box"><div v-if=&qu…

LINUX网络基础 - 网络编程套接字,UDP与TCP

目录 前言 一. 端口号的认识 1.1 端口号的作用 二. 初识TCP协议和UDP协议 2.1 TCP协议 TCP的特点 使用场景 2.2 UDP协议 UDP的特点 使用场景 2.3 TCP与UDP的对比 2.4 思考 2.5 总结 三. 网络字节序 3.1 网络字节序的介绍 3.2 网络字节序思考 四. socket接口 …

歌曲分类和流行度预测

1. 项目介绍 本项目从kaggle平台上下载了数据集&#xff0c;该数据集包含了3万多首来自Spotify API 的歌曲&#xff0c;共有23个特征。首先对数据集进行预处理&#xff0c;如重复行、缺失值、标准化处理等。再对预处理后的数据进行探索性分析&#xff0c;观察各变量的分布情况&…

Trae:国内首款AI原生IDE,编程效率大提升

今年一月&#xff0c;在新闻上看到字节跳动面向海外市场推出了一款名为Trae的AI集成开发环境&#xff08;IDE&#xff09;。起初&#xff0c;我并未给予过多关注&#xff0c;因为市面上已有不少IDE集成了AI插件&#xff0c;功能也非常全面&#xff0c;而字节跳动自家的MarsCode…

实训任务1.3 使用eNSP搭建基础网络

目录 1.【实训目标】 2.【实训内容】 1.【实训目标】 1.掌握eNSP仿真软件的基本操作方法。 2.掌握使用eNSP仿真软件搭建简单的端到端网络的方法。 【实训环境】 1.硬件环境&#xff1a;每人一台配置网卡的计算机。 2.软件环境&#xff1a;华为eNSP仿真软件。 2.【实训内…

蓝桥杯备赛Day12 动态规划1基础

动态规划 动态规划基础 动态规划将复杂问题分解成很多重叠的子问题&#xff0c;再通过子问题的解得到整个问题的解 分析步骤: 确定状态:dp[i][j]val,“到第i个为止&#xff0c;xx为j的方案数/最小代价/最大价值” 状态转移方程: 确定最终状态 要求: (1)最优子结构 (2)无后效性…

mac Homebrew安装、更新失败

我这边使用brew安装git-lfs 一直报这个错&#xff1a; curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL更新brew update也是报这个错误。最后使用使用大佬提供的脚本进行操作&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/mast…

简易的微信聊天网页版【项目测试报告】

文章目录 一、项目背景二、项目简介登录功能好友列表页面好友会话页面 三、测试工具和环境四、测试计划测试用例部分人工手动测试截图web自动化测试测试用例代码框架配置内容代码文件&#xff08;Utils.py&#xff09;登录页面代码文件&#xff08;WeChatLogin.py&#xff09;好…

【开源-鸿蒙土拨鼠大理石系统】鸿蒙 HarmonyOS Next App+微信小程序+云平台

✨本人自己开发的开源项目&#xff1a;土拨鼠充电系统 ✨踩坑不易&#xff0c;还希望各位大佬支持一下&#xff0c;在GitHub给我点个 Start ⭐⭐&#x1f44d;&#x1f44d; ✍GitHub开源项目地址&#x1f449;&#xff1a;https://github.com/cheinlu/HarmonyOS-groundhog-mar…

如何停止Oracle expdp/impdp job

一、停止 expdp job举例 1.执行 expdp 命令 $ expdp rui/rui DIRECTORYdmp_dir dumpfilestudyfull_expdp.dmp FULLy logfilestudyfullexpdp.log job_nameexpdp_job2.查看在运行的作业名称 SQL> select job_name,state from dba_datapump_jobs; JOB_NAME …

深入解析SQL Server高级SQL技巧

SQL Server 是一种功能强大的关系型数据库管理系统&#xff0c;广泛应用于各种数据驱动的应用程序中。在开发过程中&#xff0c;掌握一些高级SQL技巧&#xff0c;不仅能提高查询性能&#xff0c;还能优化开发效率。这篇文章将全面深入地探讨SQL Server中的一些高级技巧&#xf…

ES批量查询

在 Elasticsearch 中&#xff0c;multi_search&#xff08;也称为 msearch&#xff09;是一种允许你在单个请求中执行多个搜索操作的 API。它可以显著减少网络开销&#xff0c;尤其是在需要执行多个查询时。multi_search 会将多个查询打包成一个请求发送给 Elasticsearch&#…