【学习】蓝桥杯嵌入式:第七届预赛试题—液位检测告警系统
前言
个人认为,比赛前做大量的练习,是非常必要的。我只放了一部分主要代码,思路还是挺清晰的。给大家创造的空间。如果想要源码,最下面也有途径。下面上干货。
一、题目重述
功能描述
二、系统设计分析
思路:题目所给任务,进行逐级分析,分块实现。(下手角度因人而异)
首先,我考虑的是先实现功能三,先实现按键控制功能切换。
在按键切换功能完成的基础上,分别按照题目要求,进完善每个功能。我选择的是先从简单的入手。
程序框架如下:
void KEY_Cmd_Judge(void)
{key_cmd_flag = KEY_Read();if(key_cmd_flag == 1) {B1_Cmd_Processing(); //按键1://按键 B1 为设置键,按下后进入阈值设置显示界 面,再次按下时保存设置结果到 EEPROM,并返回液位检测显示界面。}else if(key_cmd_flag == 2){B2_Cmd_Processing(); //按键2}else if(key_cmd_flag == 3){B3_Cmd_Processing(); //按键3}else if(key_cmd_flag == 4){B4_Cmd_Processing(); //按键4}
}
2、按键 B1
实现切换阈值设置显示界面,和将设置阈值存入 EEPROM,并返回液位检测显示界面。
static void B1_Cmd_Processing(void)
{cmd1_flag++;//按键 B1 为设置键,按下后进入阈值设置显示界面,//再次按下时保存设置结果到 EEPROM,并返回液位检测显示界面if(cmd1_flag%2 == 1){//阈值显示设置界面Threshold_Display();}if(cmd1_flag%2 == 0){EEPROM_Write(); //写入数据LED_State(7); //状态显示Liquid_Display();}
}
2、按键 B2
切换键,切换选择 3 个阈值,被选择的阈值突出显示。
static void B2_Cmd_Processing(void)
{//按键 B2 为切换键,切换选择 3 个阈值,被选择的阈值突出显示。//这个在设置阈值的时候,有所体现。cmd2_flag++;LCD_SetTextColor(Blue);Threshold_Display();if(cmd2_flag == 1){LED_State(4);High1 = threshold;}else if(cmd2_flag == 2){LED_State(5);High2 = threshold;}else if(cmd2_flag == 3){LED_State(6);High3 = threshold;}else if(cmd2_flag == 4){cmd2_flag = 0;LED_State(8);}
}
3、按键 B3
阈值加,每按一次,阈值增加 5cm,增加到 95cm 为止。
static void B3_Cmd_Processing(void)
{threshold += 5;if(threshold > 95)threshold = 95;//限定一定小于95if(cmd2_flag == 1){High1 = threshold;}else if(cmd2_flag == 2){High2 = threshold;}else if(cmd2_flag == 3){High3 = threshold;}if(cmd1_flag%2 == 1) Threshold_Display();
}
4、按键 B4
为加键,每按一次,阈值增减 5cm,增加到 5cm 为止。
static void B4_Cmd_Processing(void)
{threshold -= 5;if(threshold < 5)threshold = 5; //限定一定大于5if(cmd2_flag == 1){High1 = threshold;}else if(cmd2_flag == 2){High2 = threshold;}else if(cmd2_flag == 3){High3 = threshold;}if(cmd1_flag%2 == 1) Threshold_Display();
}
5、子函数:一些框架内功能的实现
LED状态显示函数
static void LED_State(uint8_t LED)
{switch(LED){case 1:{LED_Control(LED1,1);LED_Control(LED2|LED3|LED4|LED5|LED6|LED7,0);break;}case 2:{LED_Control(LED2,1);LED_Control(LED1|LED3|LED4|LED5|LED6|LED7,0);break;}case 3:{LED_Control(LED3,1);LED_Control(LED2|LED1|LED4|LED5|LED6|LED7,0);break;}case 4:{LED_Control(LED4,1);LED_Control(LED2|LED1|LED3|LED5|LED6|LED7,0);break;}case 5:{LED_Control(LED5,1);LED_Control(LED2|LED1|LED3|LED4|LED6|LED7,0);break;}case 6:{LED_Control(LED6,1);LED_Control(LED2|LED1|LED3|LED5|LED4|LED7,0);break;}case 7:{LED_Control(LED7,1);LED_Control(LED2|LED1|LED3|LED5|LED6|LED4,0);break;}case 8:{LED_Control(LED2|LED1|LED3|LED5|LED6|LED4|LED7,0);break;}default:{break;}}
}
液面显示、阈值突出显示功能
void Liquid_Display(void)
{//正常显示页面信息LCD_Clear(White);LCD_SetTextColor(Blue);VR_37 = (float)ADCConvertedValue*3.3/4096;High = Get_High(VR_37);Level = Get_Level(High);LCD_DisplayStringLine(Line1," Liquid Level ");sprintf((char*)Txt_Threshold," Height:%dcm ",High);LCD_DisplayStringLine(Line5,Txt_Threshold);sprintf((char*)Txt_Threshold," VR37: %1.2fv ",VR_37);LCD_DisplayStringLine(Line6,Txt_Threshold);sprintf((char*)Txt_Threshold," Level: %d ",Level);LCD_DisplayStringLine(Line7,Txt_Threshold);
}void Threshold_Display(void)
{ //阈值重点显示LCD_Clear(White);if((cmd2_flag == 0)||(cmd2_flag == 4)){LCD_SetTextColor(Blue);LCD_DisplayStringLine(Line1," Threshold Setup ");sprintf((char*)Txt_Threshold," Threshold1: %2dcm ",High1);LCD_DisplayStringLine(Line5,Txt_Threshold);sprintf((char*)Txt_Threshold," Threshold2: %2dcm ",High2);LCD_DisplayStringLine(Line6,Txt_Threshold);sprintf((char*)Txt_Threshold," Threshold3: %2dcm ",High3);LCD_DisplayStringLine(Line7,Txt_Threshold);}else if(cmd2_flag == 1){LCD_SetTextColor(Blue);sprintf((char*)Txt_Threshold," threshold: %2dcm ",threshold);LCD_DisplayStringLine(Line9,Txt_Threshold);LCD_DisplayStringLine(Line1," Threshold Setup ");LCD_SetTextColor(Red);sprintf((char*)Txt_Threshold," Threshold1: %2dcm ",High1);LCD_DisplayStringLine(Line5,Txt_Threshold);LCD_SetTextColor(Blue);sprintf((char*)Txt_Threshold," Threshold2: %2dcm ",High2);LCD_DisplayStringLine(Line6,Txt_Threshold);sprintf((char*)Txt_Threshold," Threshold3: %2dcm ",High3);LCD_DisplayStringLine(Line7,Txt_Threshold);}else if(cmd2_flag == 2){LCD_SetTextColor(Blue);sprintf((char*)Txt_Threshold," threshold: %2dcm ",threshold);LCD_DisplayStringLine(Line9,Txt_Threshold);LCD_DisplayStringLine(Line1," Threshold Setup ");sprintf((char*)Txt_Threshold," Threshold1: %2dcm ",High1);LCD_DisplayStringLine(Line5,Txt_Threshold);LCD_SetTextColor(Red);sprintf((char*)Txt_Threshold," Threshold2: %2dcm ",High2);LCD_DisplayStringLine(Line6,Txt_Threshold);LCD_SetTextColor(Blue);sprintf((char*)Txt_Threshold," Threshold3: %2dcm ",High3);LCD_DisplayStringLine(Line7,Txt_Threshold);}else if(cmd2_flag == 3){LCD_SetTextColor(Blue);sprintf((char*)Txt_Threshold," threshold: %2dcm ",threshold);LCD_DisplayStringLine(Line9,Txt_Threshold);LCD_DisplayStringLine(Line1," Threshold Setup ");sprintf((char*)Txt_Threshold," Threshold1: %2dcm ",High1);LCD_DisplayStringLine(Line5,Txt_Threshold);sprintf((char*)Txt_Threshold," Threshold2: %2dcm ",High2);LCD_DisplayStringLine(Line6,Txt_Threshold);LCD_SetTextColor(Red);sprintf((char*)Txt_Threshold," Threshold3: %2dcm ",High3);LCD_DisplayStringLine(Line7,Txt_Threshold);}
}
液面高度转换,Level判断,EEPROM存储
/* 液压相关 */
float Get_High(float V) //获取页面高度
{return (V/3.3)*100;
}static uint8_t Get_Level(uint16_t H) //获取页面高度
{uint8_t L_temp = 0;if(H<=High1){L_temp = 1;}else if((H > High1) && (H <= High2)){L_temp =2;}else if((H > High2) && (H <= High3)){L_temp =3;}else if(H>High3){L_temp = 4;}return L_temp;
}void EEPROM_Read(void)
{//存储EEPROM数据 选前三个内存地址 存入 easyHigh1 = Byte_Read(0x00);High2 = Byte_Read(0x02); //需要加延时么? 待测High3 = Byte_Read(0x04);
}
void EEPROM_Write(void)
{//存储EEPROM数据 选前三个内存地址 存入 easyByte_Write(0x00,High1);Delay_Soft(0xffff);Byte_Write(0x02,High2); //需要加延时时间 自行调试Delay_Soft(0xffff);Byte_Write(0x04,High3);
}
到此前三个任务已经完成
下面功能4:
串口查询与输出功能:中断实现
void USART2_IRQHandler(void)
{if(USART_GetITStatus(USART_PORT, USART_IT_RXNE) != RESET){Usart_temp = getchar();Usart_flag = 1;if(Usart_temp == 'C'){printf("C:\n High:%d Level:%d\r\n",High,Level);}if(Usart_temp == 'S'){printf("S:\n Threshold1:%d cm\n Threshold2:%d cm\n Threshold3:%d cm\n\r\n\n",High1,High2,High3);}}USART_ClearITPendingBit(USART_PORT,USART_IT_RXNE);
}
功能5
状态显示
void SysTick_Handler(void)
{Time_Handler_Display++;Time_Handler_LED2++;Time_Handler_LED3++;if(Time_Handler_Display == Liquid_Display_Time){Time_Handler_Display = 0;if(cmd1_flag%2 == 0){LED_Toggle(1);Liquid_Display();} }if(Time_Handler_LED2 == LED2_Toggle_Time) //不用每次都判断 0.2s判断一次就够了{Time_Handler_LED2 = 0;if(Level != Level_temp){LED_Toggle(2);Level_temp_i++;Level_Change();}}if(Time_Handler_LED3 == LED3_Toggle_Time) //不用每次都判断 0.2s判断一次就够了{Time_Handler_LED3 = 0;if(Usart_flag == 1){LED_Toggle(3);Usart_i++;if(Usart_i == 10) {Usart_flag = 0;Usart_i = 0;}}}if(TimeDelay_Ms != 0){TimeDelay_Ms--;}
}void USART2_IRQHandler(void)
{if(USART_GetITStatus(USART_PORT, USART_IT_RXNE) != RESET){Usart_temp = getchar();Usart_flag = 1;if(Usart_temp == 'C'){printf("C_cmd:\n High:%d Level:%d\r\n",High,Level);}if(Usart_temp == 'S'){printf("S_cmd:\n Threshold1:%d cm\n Threshold2:%d cm\n Threshold3:%d cm\n\r\n\n",High1,High2,High3);}}USART_ClearITPendingBit(USART_PORT,USART_IT_RXNE);
}
main.c
int main(void)
{ALL_Init();while(1){KEY_Cmd_Judge(); }
}
三、测试
led也是按照预期闪烁
四、总结:
主要用到的模块:ADC、EEPROM、USART、GPIO、Systick、LCD、KEY.
先整体搭建程序框架、逐步完善。关于LCD的显示倒没什么,主要是中间有一些细节,什么时候显示什么界面,需要底层判断,然后判断flag,然后就是ADC和串口的配置,需要熟练掌握。EEPROM注意在写入的时候,加延时,否则会出错。
工程源码:
链接:https://pan.baidu.com/s/13XMY5Wa8uR1CaAP-cZX1dQ
提取码:7a0n
方便的话,可以一键三连鼓励一下哦
【学习】蓝桥杯嵌入式:第七届预赛试题—液位检测告警系统相关推荐
- #蓝桥杯嵌入式#第七届预赛:液位检测告警系统
初始化文件可以参考之前的 首先是最基础的ADC转换,得到ADC的值的函数之前基础模块配置那以及写过 u16 get_ADC() {ADC_SoftwareStartConvCmd(ADC1, ENAB ...
- 蓝桥杯嵌入式第七届省赛——“模拟液位检测告警系统”旧板标准库
一.赛题分析 模拟液位检测告警系统,涉及到KEY.ADC.EEPROM.LED.USART.LCD等模块.本届赛题相对简单,各个模块均可在往期文章中找到配置方法和编写说明.如: 蓝桥杯嵌入式--第六届 ...
- 蓝桥杯嵌入式——第七届省赛-模拟液位检测告警系统
第七届省赛-模拟液位检测告警系统 目录 第七届省赛-模拟液位检测告警系统 一.赛题分析 二.代码 一.赛题分析 这一届和上一届也就是第六届一样,没有涉及到定时器得PWM输出和输入捕获.主要得赛题难度是 ...
- 蓝桥杯嵌入式第七届模拟题 代码
链接:https://pan.baidu.com/s/1fdGC20A51axxPGpoyRL8-w 提取码:by4u
- 突击蓝桥杯嵌入式(七)——第十三届省赛第一场真题
突击蓝桥杯嵌入式(七)--第十三届省赛第一场真题 一.题目概览 二.思路梳理 我们直接在LCD例程的基础上,改需增加的外设如下: LED灯(配置锁存器PD2),串口(波特率9600,带中断),按键4个 ...
- 蓝桥杯单片机第七届省赛-模拟风扇控制系统
九层妖塔 起于垒土 ● 改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改 蓝桥杯单片机第七届省赛-模拟风扇控制系统 Notes1:按键按下后在某些情况下给一定的缓冲时间 Notes2 ...
- 蓝桥杯嵌入式第十届省赛真题
蓝桥杯嵌入式第十届省赛真题 文章目录 蓝桥杯嵌入式第十届省赛真题 1.题目分析 2.项目结构 2.1数组思路 2.2Key_Flag控制对应逻辑 2.3KEY控制操作 1.题目分析 总的来说这题考点特 ...
- 蓝桥杯2016第七届C语言B组省赛习题题解——习题B.生日蜡烛
每日刷题(十一) 蓝桥杯第七届C语言B组省赛习题 习题B:生日蜡烛 我们可以立刻想到等差数列求和,那就是Sn = (n0 + n)* (n - n0 + 1)/ 2 Sn = 236,很明显这里有两个 ...
- 蓝桥杯嵌入式组第九届省赛练习(算是解决了长短按键,解决了高亮显示)
第九届代码实现代码 https://gitee.com/litte_enigner/lqb_emb_9th.git 蓝桥杯开发板的基本模块已经玩的差不多了,接下来就拿第九届题练一下手. 算是解决了长短 ...
最新文章
- 美媒看衰马斯克超级高铁:纽约到华盛顿挖隧道要挖100年
- 五千字详解消息通知!
- 亲手完成四大企业实战项目,挑战Python全栈高薪岗位!
- 单位根反演[loj6485]LJJ 学二项式定理
- IntelliJ IDEA开发环境应用
- 第六计 / Explosive City (2004)
- Java中的ConcurrentHashMap
- JN5169 ZigBee 3.0 协议栈之 ZigBee 网络参数
- 基于二阶矩阵的优化问题(一)线搜索策略(附matlab代码)
- 怎么部署项目解析域名_内部解析服务器部署
- cosx等价无穷小_第一章 函数与极限 第七节 无穷小的比较
- NetSuite 未实现汇兑损益
- WIN7中任务栏,菜单栏和工具栏的基本设置
- 视觉检测系统是怎么检测尺寸的?
- Windows环境下安装RocketMQ,及SpringBoot整合RocketMQ
- 计算机计算公式在哪,计算机的计算器在哪 自己的电脑上的计算器在哪里找
- matlab中xtem,快速傅里叶变换_蝶形运算_按频率抽取基2-fft算法_MATLAB代码
- 数据库设计-航班管理系统
- 《Adobe Flash CS6中文版经典教程》——1.4 了解“时间轴”
- 这款苹果笔记本最适合编程!!包邮送!
热门文章
- 领导都被你镇住的公文金句-写作文稿
- matlab 生成二维或三维空间中满足正态分布的样本点,并绘图
- 致远A8+最新软件下载分享
- lauyi实现表格内显示文件名称,点击实现下载功能。
- 2013年博客的第一次随笔,算加权平均分
- memset函数的操作
- 以己之心,度人之心;将心比心,便是佛心
- mac 更换淘宝镜像 bad response Not Found 404 (http://ruby.taobao.org/specs.4.8.gz)
- 易语言查找文本数组里相同文本源码
- 计算机应用基础文件管理教案,计算机应用基础第五讲:文件管理(教案).doc