蓝桥杯嵌入式_STM32学习_第六届省赛题

个人做题记录,仅供参考
main.c

#include "stm32f10x.h"
#include "stdio.h"
#include "string.h"
#include "key.h"
#include "lcd.h"
#include "rtc.h"
#include "adc.h"
#include "led.h"
#include "usart.h"

uint8_t Lcd_flag =0;
uint8_t Sent_OK =0;
uint8_t Led_status = 0;
uint8_t hour = 0;
uint8_t min = 0;
uint8_t sec = 0;
uint8_t Time_200ms = 0;
uint8_t Lcd_light = 0;
char Rx_Buf[10] = {0};
int SetTime_Buf[3] = {0,0,0};
unsigned char Buf[20] = {0};
float ADC_Val = 0;
float k = 0.1;
uint8_t RXOVER = 0;
u32 TimingDelay = 0;


void Delay_Ms(u32 nTime);
void Key_Proc(int *p);
void Lcd_Proc(void);
void RTC_Proc(void);
void Led_Proc(void);
void USART2_Proc(void);
void highlight(uint8_t *str,uint8_t pos);


int main(){
	
	SysTick_Config(SystemCoreClock/1000);

	Delay_Ms(200);
	
	STM3210B_LCD_Init();
	KEY_Init();
	rtc_init();Time_Adjust(23,59,55);
	ADC1_Init();
	LED_Init();
	USART2_Init(9600);
	
	
	LCD_Clear(Blue);
	LCD_SetBackColor(Blue);
	LCD_SetTextColor(White);
	
	while(1){
		ADC_Val = (float)(ADC1_Conv() * 3.3 / 4096);
		Key_Proc(SetTime_Buf);
		Led_Proc();
		Lcd_Proc();
		Time_Refresh();
		USART2_Proc();
		
	}
	
}

/*******************************************************************************
* 函数名	:Key_Proc
* 输入值	:整型指针变量p
* 返回值	:无
* 作者	:Moqim Flourite.
* 时间	:2022年3月30日
* 功能描述:按键设置
* 备注	:“B1”按键设定为“功能”按键,打开/关闭指示灯闪烁报警功能,默认为打开状态; 
          “B2”按键设定为“设置”按键,设置设备自动上报电压时间,
           按下B2后,LCD显示界面如图2所示,
           此时通过按键B3切换选择时、分、秒,通过按键B4进行调整,
           完成调整后,按下B2按键,更新自动上报时间,并返回图1所示的LCD显示界面。
*******************************************************************************/

void Key_Proc(int *p){
	static uint8_t Key_Val,Key_Down,Key_Old;
	static uint8_t i = 0;
	Key_Val = KEY_Scan();
	Key_Down = Key_Val & (Key_Val ^ Key_Old);
	Key_Old = Key_Val;
	switch(Key_Down){
		case 1:
			Led_status = !Led_status;break;
		case 2:
			if(Lcd_flag == 0){
				i = 0;
			}
		  Lcd_flag = !Lcd_flag;
			break;
		case 3:
			if(Lcd_flag == 1){
				if(++ i == 3)i = 0;
				
			}break;
		case 4:
			if(Lcd_flag == 1){
				p[i]++;
			}break;
		default:break;
	}
	Lcd_light = i;
}


/*******************************************************************************
* 函数名	:Lcd_Proc
* 输入值	:无
* 返回值	:无
* 作者	:Moqim Flourite.
* 时间	:2022年4月2日
* 功能描述:按键设置
* 备注	:功能页面:显示电位器输出电压V1(保留小数点后两位有效数字)、k值、
                      指示灯闪烁报警功能状态和系统时间;
            显示页面:显示“Setting”与上报时间的时分秒;设置时间时高亮设置部分;
*******************************************************************************/

void Lcd_Proc(void){
	if(Lcd_flag == 0){//显示模式
		sprintf((char*)Buf,"  V1:%.2fV          ",ADC_Val);
		LCD_DisplayStringLine(Line1,Buf);
		memset(Buf,0,(20 * sizeof(unsigned char)));
		
		sprintf((char*)Buf,"  k:%.1f          ",k);
		LCD_DisplayStringLine(Line3,Buf);
		memset(Buf,0,(20 * sizeof(unsigned char)));
		
		if(Led_status == 0)LCD_DisplayStringLine(Line5,"  LED:ON          ");
		else LCD_DisplayStringLine(Line5,"  LED:OFF          ");
		
		sprintf((char*)Buf,"  T:%02d-%02d-%02d         ",hour,min,sec);
		LCD_DisplayStringLine(Line7,Buf);
		memset(Buf,0,(20*sizeof(unsigned char)));
		
		LCD_DisplayStringLine(Line9,"                   1");
	}
	else{
		LCD_DisplayStringLine(Line1,"       Setting      ");
		
		sprintf((char*)Buf,"      %02d-%02d-%02d           ",SetTime_Buf[0],SetTime_Buf[1],SetTime_Buf[2]);
		switch(Lcd_light){
			case 0:highlight(Buf,6);break;
			case 1:highlight(Buf,9);break;
			case 2:highlight(Buf,12);break;
		}
		LCD_SetTextColor(White);	
		memset(Buf,0,(20 * sizeof(unsigned char)));
		
		LCD_DisplayStringLine(Line9,"                   2");
		
		LCD_ClearLine(Line5);
		LCD_ClearLine(Line7);
	}
}

/*******************************************************************************
* 函数名	:Led_Proc
* 输入值	:无
* 返回值	:无
* 作者	:Moqim Flourite.
* 时间	:2022年4月2日
* 功能描述:LED显示
* 备注	:当V1>VDD*k时,指示灯LD1以0.2秒为间隔闪烁,闪烁功能可以通过按键关闭,但上电默认开启;
*******************************************************************************/
void Led_Proc(void){
	static uint8_t led = 0;
	if(Led_status == 0){
		if(ADC_Val > (k * 3.3)){
			if(Time_200ms == 1){
				Time_200ms = 0;
				led = 0x01;
			}
			else led = 0;
		}
		else led = 0;
	}
	else{
		led = 0;
	}
	LED_Disp(led);
}


/*******************************************************************************
* 函数名	:USART2_IRQHandler
* 输入值	:无
* 返回值	:无
* 作者	:Moqim Flourite.
* 时间	:2022年4月2日
* 功能描述:串口2中断服务函数
* 备注	:接收数据,当接收到换行符‘\n’时,停止接收,并开启检测标志位;
*******************************************************************************/
void USART2_IRQHandler(void){
	static char temp;
	
  static int i = 0;
	if(USART_GetITStatus(USART2,USART_IT_RXNE)){
		USART_ClearITPendingBit(USART2,USART_IT_RXNE);
		temp = USART_ReceiveData(USART2);
		if(temp == 0x0a){
			i = 0;
			RXOVER = 1;
			USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);//关闭中断
		}
		else{
			Rx_Buf[i] = temp;
			i++;
		}	
	}
}


/*******************************************************************************
* 函数名	:USART2_Proc
* 输入值	:无
* 返回值	:无
* 作者	:Moqim Flourite.
* 时间	:2022年4月2日
* 功能描述:串口2发送函数
* 备注	:1:检测是否接收到正确字符串,是就发送"OK";
          2:当时间到达设置发送时间时,按模版上报电压值;          
         这个检测的写的有点low,但是能用就行hhhh.
*******************************************************************************/
void USART2_Proc(void){
	static uint8_t Sent_Buf[20] = {0};
	if(RXOVER == 1){
		RXOVER = 0;
		if(Rx_Buf[0] == 'k'){
			 if(Rx_Buf[1] == '0'){
				if(Rx_Buf[2] == '.'){
					if((Rx_Buf[3] > 0x30) && (Rx_Buf[3] < 0x3a) ){
						Sent_OK = 1;
						k = (float)(Rx_Buf[3] - 48) / 10;
					}
				}
			}
		}
		memset(Rx_Buf,0,(10 * sizeof(char)));
		USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
	}
	if(Sent_OK == 1){
		Sent_OK = 0;
		USART_SendString(USART2, "ok\n");
	}
	if(SetTime_Buf[0] == hour && SetTime_Buf[1] == min && SetTime_Buf[2] == sec){
		sprintf((char*)Sent_Buf,"%.2f+%.1f+%02d%02d%02d\n",ADC_Val,k,hour,min,sec);
		USART_SendString(USART2,Sent_Buf);
		Delay_Ms(1000);
		memset(Sent_Buf,0,(20 * sizeof(uint8_t)));
	}
}

/*******************************************************************************
* 函数名	:highlight
* 输入值	:uint8_t *str,uint8_t pos
* 返回值	:无
* 作者	:Moqim Flourite.
* 时间	:2022年4月3日
* 功能描述:lcd高亮函数
* 备注	:使得pos位与pos+1位的字符高亮(变字体颜色);
*******************************************************************************/
void highlight(uint8_t *str,uint8_t pos)
{
	int i = 0;
	for(i = 0; i <= 19; i++)
	{
		if(i != pos && i != (pos + 1))
			LCD_DisplayChar(Line3,(320 - (16 * i)),str[i]);
	}
	LCD_SetTextColor(Red);
	LCD_DisplayChar(Line3,(320 - (16 * pos)),str[pos]);
	LCD_DisplayChar(Line3,(320 - (16 * (pos + 1))),str[pos+1]);
//	LCD_SetTextColor(White);	
}

void Delay_Ms(u32 nTime)
{
	TimingDelay = nTime;
	while(TimingDelay != 0);	
}

//stm32f10x_it.c

extern u32 TimingDelay;
extern uint8_t Time_200ms;
void SysTick_Handler(void)
{
	static int i = 0;
	TimingDelay --;
	if(++ i == 200){
		i = 0;
		Time_200ms = 1;
	}
}
void RTC_IRQHandler(void)
{
  if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
  {
    if(RTC_GetCounter()==86400)//24 * 3600
		{
			RTC_SetCounter(0x0);
		}

    /* Clear Interrupt pending bit */
    RTC_ClearITPendingBit(RTC_FLAG_SEC);
  }
}

问题:

1、if一定要配套个else,不然会保持上一次的动作。
2、注意参数影响值的个数(如highlight函数里if的条件语句)。
3、sprintf和memset不熟练,要多记几遍。
4、串口检测太low了,要去学别人的方法。

参考博客:
@FILWY_MS——TM32 - 蓝桥杯嵌入式 LCD 字符颜色、高亮显示

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 蓝桥杯是全国性的计算机大赛,旨在提高大学生的计算机技术水平和创新能力。嵌入式STM32G431是一款嵌入式芯片,具有高性能和低功耗的特点。第十二届第一场省赛停车计费系统是蓝桥杯的一道工程目,要求参赛选手设计一个停车场计费系统。 停车计费系统是指通过嵌入式技术实现对车辆进入和离开停车场的自动检测、计时和计费的系统。对于这个目,参赛选手可以根据目要求,使用STM32G431芯片设计一个具有以下功能的系统: 1. 车辆进入检测:使用车辆传感器检测车辆的进入,触发计时。 2. 车辆离开检测:使用车辆传感器检测车辆的离开,停止计时。 3. 计时功能:使用内部时钟模块获取进入和离开的时间,并计算停车时间。 4. 计费功能:根据停车时间,按照一定的计费规则进行计费。 5. 显示功能:使用液晶显示屏显示当前的停车信息,如车牌号、停车时间、费用等。 6. 数据存储功能:使用闪存等储存介质将停车数据进行存储,以便后续的数据分析和查询。 设计一个停车计费系统涉及到硬件设计和软件编程两个方面。硬件方面,参赛选手需要选择合适的传感器、显示屏、存储介质等,以及设计电路和接口进行连接。软件方面,需要使用C语言或者汇编语言编写程序,对芯片进行编程,实现各项功能。 通过此次比赛,选手们可以锻炼嵌入式系统的设计能力和编程能力,了解实际应用中嵌入式系统的工作原理和应用场景。同时,也能提升对STM32G431芯片的理解和运用能力。这对于培养嵌入式技术人才,推动物联网技术的发展都具有积极意义。 ### 回答2: 蓝桥杯是面向计算机爱好者的智力竞赛,而嵌入式STM32G431是一款嵌入式系统开发板。第十二届第一场省赛的停车计费系统真工程,则是要求参赛选手设计并实现一个能够进行停车计费的系统。 停车计费系统是一种用于自动计费和管理停车场的系统。这个系统可以通过识别车辆的进出以及停车的时间,自动计算并收费。在这个工程中,选手需要使用嵌入式STM32G431开发板以及相关的硬件和软件,来设计一个能够实现停车计费功能的系统。 首先,选手需要使用传感器或摄像头来实现车辆进出的检测。当车辆进入或离开停车场时,传感器会发出信号并通过STM32G431进行检测。接着,选手需要编程实现识别车辆的算法,以便能够识别不同的车辆。当车辆停放时,系统会通过计时器记录停车的时间。 然后,选手需要编写计费算法,根据停车的时间来计算费用。这个算法可以根据停车场的规则来确定费用的计算方式,例如按小时计费或按照不同的时间段采用不同的费率。 最后,选手还需要设计一个界面,使得系统能够与用户进行交互。用户可以通过该界面查询停车费用,并进行付款。同时,选手还需要保证系统的稳定性和安全性,确保数据的准确性和保密性。 总而言之,蓝桥杯嵌入式STM32G431第十二届第一场省赛停车计费系统真工程要求选手使用硬件和软件开发能力,设计并实现一个完整的停车计费系统。这需要选手具备嵌入式系统开发、传感器技术、算法设计和界面设计等多方面的知识和技能。 ### 回答3: 蓝桥杯嵌入式stm32g431——第十二届第一场省赛停车计费系统真工程是一个基于STM32G431开发板的停车计费系统设计目。该系统的主要功能是实现停车场的车辆进入、出场的计费管理。 首先,该系统需要实现一个车辆进入检测的功能。当车辆进入停车场时,系统会通过传感器检测到车辆的到达,并记录下进入的时间。 然后,系统需要实现一个车辆出场的功能。当车辆准备离开停车场时,系统会通过传感器检测到车辆的离开,并记录下离开的时间。 接下来,系统需要计算车辆停留的时间。通过进入时间和离开时间的差值计算得出车辆停留的时长。 最后,系统需要计算停车费用。根据停车场的计费规则,根据车辆停留的时长计算出停车费用,并将费用显示在屏幕上。 在实现上述功能的过程中,需要运用STM32G431开发板的各种功能和模块,包括GPIO口、定时器、中断、串口通信等。通过编写相应的代码,实现按钮的控制、传感器检测、时间的计算以及屏幕的显示等功能。 该项目的设计需要考虑多种情况,比如车辆重复进入出场、车辆进入出场顺序错乱等,要充分考虑这些异常情况并进行相应的处理。在代码编写过程中,还需注意代码的优化和资源的合理利用,以提高系统的性能和效率。 通过完成这个项目的设计与实现,可以加深对STM32G431嵌入式系统的了解和应用,并提升嵌入式系统开发的能力。同时,也能锻炼自己的逻辑思维、问解决能力和团队合作精神。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Moqim Flourite.

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值