欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 第十四届单片机嵌入式蓝桥杯

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

2024/10/23 23:32:42 来源:https://blog.csdn.net/2301_81764359/article/details/142863562  浏览:    关键词:第十四届单片机嵌入式蓝桥杯

一、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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com