当前位置: 首页 > article >正文

蓝桥杯(电子类)嵌入式第十一届设计与开发科目模拟试题

一、功能概览

二、分模块实现

1、按键

新建interrupt.h和interrupt.c写中断的代码(写法学习来自定时器-按键单击_哔哩哔哩_bilibili)

#ifndef __INTERRUPT_H
#define __INTERRUPT_H

#include "main.h"
#include "stdbool.h"

struct keys
{
	uchar judge_sta;
	bool key_sta;
	bool single_flag;
	bool long_flag;
	uint key_time;
};

#endif

extern bool LED1_flag;
struct keys key[4]={0,0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM4)
	{
		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<100)
							key[i].single_flag = 1;
					}
					else
					{
						key[i].key_time++;
						if(key[i].key_time>100)
							key[i].long_flag = 1;
					}
				}
				break;
			}
		}
	}
	if(htim->Instance == TIM2)//定时器二控制LED1闪烁
	{
		LED1_flag = !LED1_flag;
	}
}

2、LED

解决LED和LCD最简单粗暴的方法就是控制某一LED灯的时候,对所有LED都操作一次,需要控制灯闪烁的需要使用状态标志位(我这里是LED1_flag),在定时器中断里通过改变标志位实现闪烁。

void led_proc(void)
{
	if(view == 0)
	{
		if(LED1_flag == 1)
		{
			LED_show(1,1);
		}
		else
		{
			LED_show(1,0);
		}
	}
	else
	{
		HAL_TIM_Base_Stop_IT(&htim2);
		LED1_flag = 0;
		LED_show(1,0);
	}
	
	if(view == 1)
	{
		LED_show(2,1);
	}
	else
	{
		LED_show(2,0);
	}
	if(view == 2)
	{
		LED_show(3,1);
	}
	else
	{
		LED_show(3,0);
	}
	LED_show(4,0);
	LED_show(5,0);
	LED_show(6,0);
	LED_show(7,0);
	LED_show(8,0);
}

3、串口

调试器的 USB 转串口功能默认与 STM32G431RBT6微控制器 USART1 连接,而题目要求使用的是USART2,所以要用USB转TTL串口模块

使能中断

 对应端口接线

 题目只需要发送时钟或报警设置完成时输出设置信息,所以不需要写接收中断,发送信息用HAL_UART_Transmit函数。

4、EEPROM

比赛使用的是软件I2C,CubeMX中把端口设置为output模式即可。

把官方给的驱动代码添加到工程,并添加读写函数:

uchar eeprom_read(uchar addr)
{
	uchar dat;
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(addr);
	I2CWaitAck();
	I2CStop();
	
	I2CStart();
	I2CSendByte(0xa1);
	I2CWaitAck();
	dat = I2CReceiveByte();
	I2CSendNotAck();
	I2CStop();
	return dat;
}
void eeprom_write(uchar addr,uchar dat)
{
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(addr);
	I2CWaitAck();
	I2CSendByte(dat);
	I2CWaitAck();
	I2CStop();
}

 不要忘了在main里面添加I2C初始化I2CInit()!!!

5、RTC

 

RTC部分我参考的是这篇博客:蓝桥杯嵌入式(G4系列):RTC时钟_蓝桥杯嵌入式修改rtc闹钟时间-CSDN博客

 但是我的时钟输入选的不是博客里的HSE_RTC,选的是默认的LSI,要不然秒钟加的奇快,我也不知道咋回事。

特别注意!!!👇👇👇

设置闹钟关键代码

				//设置闹钟的代码来自MX_GPIO_Init()
				SetAlarm.AlarmTime.Hours=setalarm[0];
				SetAlarm.AlarmTime.Minutes=setalarm[1];
				SetAlarm.AlarmTime.Seconds=setalarm[2];
				SetAlarm.AlarmTime.SubSeconds = 0x0;
				SetAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY;
				SetAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
				SetAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
				SetAlarm.AlarmDateWeekDay = 0x1;
				SetAlarm.Alarm = RTC_ALARM_A;
				HAL_RTC_SetAlarm_IT(&hrtc, &SetAlarm, RTC_FORMAT_BIN);
				//新的报警时间写入EEPROM
				eeprom_write(1,SetAlarm.AlarmTime.Hours);
				HAL_Delay(10);
				eeprom_write(2,SetAlarm.AlarmTime.Minutes);
				HAL_Delay(10);
				eeprom_write(3,SetAlarm.AlarmTime.Seconds);
				HAL_Delay(10);
				aSetTimes++;
				eeprom_write(4,aSetTimes);

6、LCD显示

(这个我都是最先写的)

时钟设置参数要高亮显示,我就把要显示的内容以一个一个字符的形式单独用红色显示,使用的是LCD_DisplayChar这个函数

uchar tSelset=-1; //time 0:h 1:m 2:s
uchar aSelset=-1; //alarm 0:h 1:m 2:s
u8 timechar[10]={'0','1','2','3','4','5','6','7','8','9'};
vu16 setcolor[3]={White,White,White};
vu16 alarmcolor[3]={White,White,White};
uchar settime[3];
uchar setalarm[3];
void disp_proc(void)
{
	if(view == 0)
	{
		char text[30];
		sprintf(text,"         MAIN     ");
		LCD_DisplayStringLine(Line2,(u8 *)text);
		
		sprintf(text,"     RTC:%02d:%02d:%02d",sTime.Hours,sTime.Minutes,sTime.Seconds);
		LCD_DisplayStringLine(Line4,(u8 *)text);
	}
	if(view == 1)
	{
		char text[30];
		sprintf(text,"     RTC_SETTING     ");
		LCD_DisplayStringLine(Line2,(u8 *)text);
		
		sprintf(text,"    RTC:%02d:%02d:%02d",settime[0],settime[1],settime[2]);
		LCD_DisplayStringLine(Line4, (uint8_t *)text);
		LCD_SetTextColor(setcolor[0]);
		LCD_DisplayChar(Line4,(320 - (16 * 8)),timechar[settime[0]/10]);
		LCD_DisplayChar(Line4,(320 - (16 * 9)),timechar[settime[0]%10]);
		LCD_SetTextColor(setcolor[1]);
		LCD_DisplayChar(Line4,(320 - (16 * 11)),timechar[settime[1]/10]);
		LCD_DisplayChar(Line4,(320 - (16 * 12)),timechar[settime[1]%10]);
		LCD_SetTextColor(setcolor[2]);
		LCD_DisplayChar(Line4,(320 - (16 * 14)),timechar[settime[2]/10]);
		LCD_DisplayChar(Line4,(320 - (16 * 15)),timechar[settime[2]%10]);
		LCD_SetTextColor(White);
	}
	if(view == 2)
	{
		char text[30];
		sprintf(text,"    ALARM_SETTING     ");
		LCD_DisplayStringLine(Line2,(u8 *)text);
		
		sprintf(text,"   Alarm:%02d:%02d:%02d",setalarm[0],setalarm[1],setalarm[2]);
		LCD_DisplayStringLine(Line4, (uint8_t *)text);
		LCD_SetTextColor(alarmcolor[0]);
	  LCD_DisplayChar(Line4,(320 - (16 * 9)),timechar[setalarm[0]/10]);
		LCD_DisplayChar(Line4,(320 - (16 * 10)),timechar[setalarm[0]%10]);
		LCD_SetTextColor(alarmcolor[1]);
	  LCD_DisplayChar(Line4,(320 - (16 * 12)),timechar[setalarm[1]/10]);
		LCD_DisplayChar(Line4,(320 - (16 * 13)),timechar[setalarm[1]%10]);
		LCD_SetTextColor(alarmcolor[2]);
	  LCD_DisplayChar(Line4,(320 - (16 * 15)),timechar[setalarm[2]/10]);
		LCD_DisplayChar(Line4,(320 - (16 * 16)),timechar[setalarm[2]%10]);
		LCD_SetTextColor(White);
	}
	
}

三、总结

自认为是完全实现了的,发现有错误还请指出!我速速改正(*^_^*)


http://www.kler.cn/a/611994.html

相关文章:

  • AI辅助下基于ArcGIS Pro的SWAT模型全流程高效建模实践与深度进阶应用
  • 面试题:RocketMQ 如何保证消息的顺序性
  • 04 单目标定实战示例
  • HarmonyOS之深入解析如何根据url下载pdf文件并且在本地显示和预览
  • ubuntu24 部署vnc server 使用VNC Viewer连接
  • Scala基础语法和简介
  • Cent OS7+Docker+Dify
  • SpringBoot实战——详解JdbcTemplate操作存储过程
  • 第十六届蓝桥杯模拟二(串口通信)
  • 数据结构每日一题day3(顺序表)★★★★★
  • 国际机构Gartner发布2025年网络安全趋势
  • 微软KBLaM:当语言模型学会“查字典”的下一代AI革命
  • 信息系统安全保护等级详解
  • 一文读懂Python之json模块(33)
  • Axure RP设计软件中的各种函数:包括数字、数学、字符串、时间及中继器函数,详细解释了各函数的用途、参数及其应用场景。
  • SpringMVC请求与响应深度解析:从核心原理到高级实践
  • 吴恩达机器学习笔记复盘(十一)逻辑回归的代价和损失函数
  • 扭蛋机小程序开发,潮玩娱乐消费风口下的机遇
  • 右击没有Word、PPT、Excel功能
  • 蓝桥与力扣刷题(蓝桥 蓝桥骑士)