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

一、真题

二、模块构建

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

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

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

相关文章

【CMake 教程】常用函数与构建案例解析(三)

一、CMake 常用函数简析 1. 条件判断 if() / elseif() / else() 在 CMake 脚本中&#xff0c;条件判断是控制逻辑的重要工具。if() 支持多种比较语句&#xff0c;包括数值、字符串、布尔值和变量存在性等。在条件满足时执行特定逻辑代码&#xff0c;下面是典型语法&#xff1…

ASP.NET Core 8.0学习笔记(二十七)——数据迁移:Migrations深入与其他迁移命令

一、数据库架构的管理 1.EF Core提供两种方式来保持EF Core的模型与数据库保持同步。 (1)以数据库为准&#xff1a;反向工程&#xff08;Db First&#xff09;&#xff0c;适用于中大型工程 (2)以代码为准&#xff1a;数据迁移&#xff08;Code First&#xff09;&#xff0c;…

Python 基本语法的详细解释

目录 &#xff08;1&#xff09;注释 &#xff08;2&#xff09;缩进 &#xff08;3&#xff09;变量和数据类型 变量定义 数据类型 &#xff08;4&#xff09;输入和输出 输出&#xff1a;print() 函数 输入&#xff1a;input() 函数 &#xff08;1&#xff09;注释 注…

20-R 绘图 - 饼图

R 绘图 - 饼图 R 语言提供来大量的库来实现绘图功能。 饼图&#xff0c;或称饼状图&#xff0c;是一个划分为几个扇形的圆形统计图表&#xff0c;用于描述量、频率或百分比之间的相对关系。 R 语言使用 pie() 函数来实现饼图&#xff0c;语法格式如下&#xff1a; pie(x, l…

Ubuntu 22.04 一键部署MinerU1.1.0

MinerU MinerU是一款将PDF转化为机器可读格式的工具&#xff08;如markdown、json&#xff09;&#xff0c;可以很方便地抽取为任意格式。 MinerU诞生于书生-浦语的预训练过程中&#xff0c;我们将会集中精力解决科技文献中的符号转化问题&#xff0c;希望在大模型时代为科技发…

紫光同创开发板使用教程(二):sbit文件下载

sbit文件相当于zynq里面的bit文件&#xff0c;紫光的fpga工程编译完成后会自动生成sbit文件&#xff0c;因工程编译比较简单&#xff0c;这里不在讲解工程编译&#xff0c;所以我这里直接下载sbit文件。 1.工程编译完成后&#xff0c;可以看到Flow列表里面没有报错&#xff0c…

DeepSeek 部署全指南:常见问题解析与最新技术实践

引言 随着开源大模型DeepSeek的爆火&#xff0c;其部署需求激增&#xff0c;但用户在实际操作中常面临服务器压力、本地部署性能瓶颈、API配置复杂等问题。本文结合2025年最新技术动态&#xff0c;系统梳理DeepSeek部署的核心问题与解决方案&#xff0c;并分享行业实践案例&am…

Vue02

Vue02 绑定class样式 字符串写法&#xff0c;适用于&#xff1a;样式的类名不确定&#xff0c;需要动态指定 数组写法&#xff0c;适用于&#xff1a;要绑定的样式个数不确定&#xff0c;名字也不确定 对象写法&#xff0c;适用于&#xff1a;要绑定的样式个数缺点&#xff…

超导量子计算机的最新进展:走向实用化的量子革命

超导量子计算机的最新进展:走向实用化的量子革命 大家好,我是 Echo_Wish,今天我们来聊聊科技圈最炙手可热的话题之一——超导量子计算机。近年来,量子计算领域可谓是风起云涌,而超导量子计算机作为主流路线之一,已经在学术界和工业界取得了不少突破性进展。 那么,超导…

LangChain构建行业知识库实践:从架构设计到生产部署全指南

文章目录 引言:行业知识库的进化挑战一、系统架构设计1.1 核心组件拓扑1.2 模块化设计原则二、关键技术实现2.1 文档预处理流水线2.2 混合检索增强三、领域适配优化3.1 医学知识图谱融合3.2 检索结果重排序算法四、生产环境部署4.1 性能优化方案4.2 安全防护体系五、评估与调优…

Node.js中如何修改全局变量的几种方式

Node.js中如何修改全局变量。我需要先理解他们的需求。可能他们是在开发过程中遇到了需要跨模块共享数据的情况&#xff0c;或者想要配置一些全局可访问的设置。不过&#xff0c;使用全局变量可能存在一些问题&#xff0c;比如命名冲突、难以维护和测试困难&#xff0c;所以我得…

【Node.js】express框架

目录 1初识express框架 2 初步使用 2.1 安装 2.2 创建基本的Web服务器 2.3 监听方法 2.3.1 监听get请求 2.3.2 监听post请求 2.4 响应客户端 2.5 获取url中的参数(get) 2.5.1 获取查询参数 2.5.2 获取动态参数 2.6 托管静态资源 2.6.1 挂载路径前缀 2.6.2 托管多…

Vulhub靶机 Apache Druid(CVE-2021-25646)(渗透测试详解)

一、开启vulhub环境 docker-compose up -d 启动 docker ps 查看开放的端口 1、漏洞范围 在Druid0.20.0及更低版本中 二、访问靶机IP 8888端口 1、点击Load data进入新界面后&#xff0c;再点击local disk按钮。 2、进入新界面后&#xff0c;在标红框的Base directory栏写上…

【c语言】函数_作业详解

前言&#xff1a; 对应鹏哥专升本c语言&#xff0c;51集 内容&#xff1a; 找出10个数值中的最大值&#xff0c; #include <stdio.h> //求10个整数中的最大值 int main() {//准备10个整数 //int arr[10] {1,2,3,4,13,6,7,8,9,-2};//用于循环10次int i 0;//也可以自…

计算机网络之路由协议(自治系统)

一、自治系统&#xff08;AS&#xff09; 自治系统是由同一个技术管理机构管理、使用统一选路策略的一些路由器的集合。它是网络的基本构成单位&#xff0c;每个自治系统是一个独立运营并自主决定与谁交换流量的实体。自治系统内部运行内部网关协议&#xff08;IGP&#xff09…

【Unity】Unity clone 场景渲染的灯光贴图异位问题

Unity clone 场景渲染的灯光贴图异位问题 问题 需要将一个场景clone 一份保存到本地 当克隆完成后&#xff0c;副本场景的灯光贴图异位了&#xff0c;与原场景存在较大的差别 问题原因 场景被clone 后&#xff0c;场景的灯光渲染数据不能共用&#xff0c;即Lightmapping.li…

Python----数据分析(Numpy一:numpy库简介,与list列表的区别,数组的创建,随机数组的创建)

一、 Numpy库简介 1.1、概念 NumPy(Numerical Python)是一个开源的Python科学计算库&#xff0c;旨在为Python提供 高性能的多维数组对象和一系列工具。NumPy数组是Python数据分析的基础&#xff0c;许多 其他的数据处理库&#xff08;如Pandas、SciPy&#xff09;都依赖于Num…

千峰React:函数组件使用(2)

前面写了三千字没保存&#xff0c;恨&#xff01; 批量渲染 function App() {const list [{id:0,text:aaaa},{id:1,text:bbbb},{id:2,text:cccc}]// for (let i 0; i < list.length; i) {// list[i] <li>{list[i]}</li>// }return (<div><…

Hot100 动态规划

动态规划 动规五部曲&#xff1a; 确定dp数组以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 70. 爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 爬到第一层楼梯有一种方法&#xff0c;爬到二层楼梯有两种方法。 那么第一层楼梯再跨两步就到第三…

Rust语言基础知识详解【一】

1.在windows上安装Rust Windows 上安装 Rust 需要有 C 环境&#xff0c;以下为安装的两种方式&#xff1a; 1. x86_64-pc-windows-msvc&#xff08;官方推荐&#xff09; 先安装 Microsoft C Build Tools&#xff0c;勾选安装 C 环境即可。安装时可自行修改缓存路径与安装路…