第十四届单片机嵌入式蓝桥杯

server/2024/10/19 19:42:34/

一、CubeMx配置

(1)LED配置

(1)LED灯里面用到了SN74HC573ADWR锁存器,这个锁存器有一个LE引脚,这个是我们芯片的锁存引脚(使能引脚),由PD2这个端口来控制的

(2)LD1~LD8这八个LED灯由PC8~PC15这八个端口控制,且因为LD左端通过300欧的电阻连到了VDD(电源的正引脚) ,若想要点亮LED灯的话,则需要给PC8~PC15低电平,这样灯才会亮,电流会从VDD顺着LED流到PC8

(2)定时器配置

         根据题目需要配置PA1和PA7的定时器端口

         因为通过PA1引脚输出频率、占空比可调节的脉冲信号,所以预分频器可以不用写,就直接不分频

 

         通过PA7引脚完成脉冲捕获功能

(3)按键配置

(4)设置一个用于中断任务的定时器(1ms的定时器)并且使能其更新中断

 (5)使能中断

(6)ADC配置

         因为题目是通过R37来调节占空比的 ,但是R37是CubeMx中的PB15,所以需要用它来配置ADC

 二、keil5配置

(1)添加lcd文件

        可以看前面的csdn看看怎么要添加文件

(2)添加头文件
#include "lcd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h" //字符串
#include "math.h"   //数据库

 (3)不要忘了开下载的魔术棒

三、做题代码

3.1

(1)按键按下切换界面的代码【一般的】
//*********************这些都是写在int main 函数外面的代码********************************//按键有关的定义uint8_t key_state=0;    //按键的模式:0,1,2,3
int keypresstime[4]={0};//一共有四个按键//按键的函数(底层)char Key_scan(void) //这里的函数要用char 不能用void 因为有返回值
{if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0))keypresstime[0]++;
//如果按键按下,就开始计时(前面有一个!是代表非0)else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)&&keypresstime[0]>20){keypresstime[0]=0;return 1;}
//如果按键松开,而且此时的按键时长>20ms(也相当于是按下的消抖)。那么按键的时间清零且此时回到按键按下前的状态else if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1))keypresstime[1]++;else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)&&keypresstime[1]>20){keypresstime[1]=0;return 2;}else if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2))keypresstime[2]++;else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)&&keypresstime[2]>20){keypresstime[2]=0;return 3;}else if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))keypresstime[3]++;else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)&&keypresstime[3]>20){keypresstime[3]=0;return 4;}else {keypresstime[0]=0;keypresstime[1]=0;keypresstime[2]=0;keypresstime[3]=0;} //如果什么都没发生return 0;
}//**********************************切记:一定要打开定时器********************************
HAL_TIM_Base_Start_IT(&htim6);//***********************************这些是放在while循环里面的函数************************if(Flag_lcd==0)LCD_data();else if (Flag_lcd==1)LCD_para();else if (Flag_lcd==2)LCD_recd();LCD_show();//如果不添加这个的话,就没办法显示界面的内容//上面的是显示界面if(key_state==1){Flag_lcd++;Flag_lcd=Flag_lcd>2?0:Flag_lcd;//如果>2的话,那么就把Flag_lcd变成0//当然这一句也可以变成一个if循环来表达}//这个是按键按下切换界面的代码
(2)按键按下切换界面的代码【最好的】

         其实不太理解这个底层函数的逻辑

//*********************这些都是写在int main 函数外面的代码//按键有关的定义struct keys
{unsigned char judge_sta;bool key_sta;bool single_flag;bool long_flag;unsigned int key_time;
};//定义几个标志位struct keys key[4]={0,0,0};    //有四个按键//按键的底层函数(放在中断回调函数里面)void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM6)//开的中断的定时器{//按键部分key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);for(int i=0;i<4;i++){switch (key[i].judge_sta){case 0:  //消抖{if(key[i].key_sta==0){key[i].judge_sta=1;key[i].key_time=0;}}break;case 1:{if(key[i].key_sta==0)  ///确定按下{key[i].judge_sta=2;}else key[i].judge_sta=0;}break;case 2:{if(key[i].key_sta==1){key[i].judge_sta=0;					if(key[i].key_time<70){key[i].single_flag=1;  //单机}}else {key[i].key_time++;if(key[i].key_time>70)  key[i].long_flag=1;  //长按}}break;}}}}//**********************************切记:一定要打开定时器
HAL_TIM_Base_Start_IT(&htim6);//***********************************这些是放在while循环里面的函数if(Flag_lcd==0)LCD_data();else if (Flag_lcd==1)LCD_para();else if (Flag_lcd==2)LCD_recd();LCD_show();//如果不添加这个的话,就没办法显示界面的内容if(Flag_lcd==0)LCD_data();else if (Flag_lcd==1)LCD_para();else if (Flag_lcd==2)LCD_recd();LCD_show();//如果不添加这个的话,就没办法显示界面的内容

3.2

四、不理解的代码

(1)

五、出现问题的步骤

(1)LCD不显示界面 

         这个问题是因为这个频率最开始设置的是8,应该设置的频率是24

 (2)按键无法执行切换页面的任务

         按键无法执行相应的任务是因为这几个配置我最开始配置成了GPIO_Output


http://www.ppmy.cn/server/133136.html

相关文章

C++ | Leetcode C++题解之第492题构造矩形

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> constructRectangle(int area) {int w sqrt(1.0 * area);while (area % w) {--w;}return {area / w, w};} };

CTF学习——攻防世界

查看网页源代码的方法 第一种&#xff1a;F12 第二种&#xff1a;鼠标右键→查看网页源代码 第三种&#xff1a;ctrlshiftI 第四种&#xff1a;ctrlU 第五种&#xff1a;在url前面加view-source: 第六种&#xff1a;将网页另存为.html文件&#xff0c;然后用文本编辑器打…

LaTeX教程(016)-LaTeX文档结构(16)

LaTeX教程(016)- LaTeX \LaTeX LATE​X文档结构(16) 接上一讲 我们前面知道&#xff0c;\vref是对\ref的升级&#xff0c;而varioref包也提供了一个对\pageref升级的命令\vpageref。它和\vref的原理很相似&#xff0c;内置了一些判断。 \vpageref[same-page][other-page]{ke…

电脑桌面自己变成了英文Desktop,怎么改回中文

目录 前言找到Desktop查看位置查找目标修改文件名为桌面重启电脑 或 重启 Windows 资源管理器CtrlShiftEsc 打开任务管理器找到 Windows 资源管理器重启 Windows 资源管理器 查看修改结果 前言 许多人在使用电脑的时候发现&#xff0c;我们经常使用的桌面&#xff0c;不知道因为…

C语言笔记(数据的存储篇)

目录 1.数据类型的详细介绍 2.整型在内存中的存储&#xff1a;原码、反码、补码 3.大小端字节序介绍及判断 4.浮点型的内存中的存储解析 1.数据类型的详细介绍 下述是内置类型&#xff1a; char // 字符数据类型 short // 短整型 int // 整型 long …

spring底层原理

本文参考黑马程序员的spring底层讲解&#xff0c;想要更详细的可以去看视频。 另外文章会每日更新&#xff0c;大概持续1个月&#xff01;&#xff01;&#xff01;每天更新一讲 这部分比较抽象&#xff0c;要经常复习&#xff01;&#xff01;&#xff01; 一、BeanFactory与A…

自然语言处理 (NLP) 的 5 个步骤

自然语言处理 (NLP) 的 5 个步骤 引言 如今&#xff0c;我们的世界在数字化连接方面达到了前所未有的水平。信息、见解和数据不断争夺我们的注意力&#xff0c;我们不可能全部消化。对于你的企业来说&#xff0c;挑战在于了解客户和潜在客户对你的产品和服务的看法&#xff0c;…

LeetCode-四数相加-Java

一、题目 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&#xff1a;nums1…