前言
个人认为,比赛前做大量的练习,是非常必要的。我只放了一部分主要代码,思路还是挺清晰的。给大家创造的空间。如果想要源码,最下面也有途径。下面上干货。

一、题目重述


功能描述

二、系统设计分析

思路:题目所给任务,进行逐级分析,分块实现。(下手角度因人而异)

首先,我考虑的是先实现功能三,先实现按键控制功能切换。
在按键切换功能完成的基础上,分别按照题目要求,进完善每个功能。我选择的是先从简单的入手。

程序框架如下:

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

方便的话,可以一键三连鼓励一下哦

【学习】蓝桥杯嵌入式:第七届预赛试题—液位检测告警系统相关推荐

  1. #蓝桥杯嵌入式#第七届预赛:液位检测告警系统

    初始化文件可以参考之前的 首先是最基础的ADC转换,得到ADC的值的函数之前基础模块配置那以及写过 u16 get_ADC() {ADC_SoftwareStartConvCmd(ADC1, ENAB ...

  2. 蓝桥杯嵌入式第七届省赛——“模拟液位检测告警系统”旧板标准库

    一.赛题分析 模拟液位检测告警系统,涉及到KEY.ADC.EEPROM.LED.USART.LCD等模块.本届赛题相对简单,各个模块均可在往期文章中找到配置方法和编写说明.如: 蓝桥杯嵌入式--第六届 ...

  3. 蓝桥杯嵌入式——第七届省赛-模拟液位检测告警系统

    第七届省赛-模拟液位检测告警系统 目录 第七届省赛-模拟液位检测告警系统 一.赛题分析 二.代码 一.赛题分析 这一届和上一届也就是第六届一样,没有涉及到定时器得PWM输出和输入捕获.主要得赛题难度是 ...

  4. 蓝桥杯嵌入式第七届模拟题 代码

    链接:https://pan.baidu.com/s/1fdGC20A51axxPGpoyRL8-w 提取码:by4u

  5. 突击蓝桥杯嵌入式(七)——第十三届省赛第一场真题

    突击蓝桥杯嵌入式(七)--第十三届省赛第一场真题 一.题目概览 二.思路梳理 我们直接在LCD例程的基础上,改需增加的外设如下: LED灯(配置锁存器PD2),串口(波特率9600,带中断),按键4个 ...

  6. 蓝桥杯单片机第七届省赛-模拟风扇控制系统

    九层妖塔 起于垒土 ● 改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改 蓝桥杯单片机第七届省赛-模拟风扇控制系统 Notes1:按键按下后在某些情况下给一定的缓冲时间 Notes2 ...

  7. 蓝桥杯嵌入式第十届省赛真题

    蓝桥杯嵌入式第十届省赛真题 文章目录 蓝桥杯嵌入式第十届省赛真题 1.题目分析 2.项目结构 2.1数组思路 2.2Key_Flag控制对应逻辑 2.3KEY控制操作 1.题目分析 总的来说这题考点特 ...

  8. 蓝桥杯2016第七届C语言B组省赛习题题解——习题B.生日蜡烛

    每日刷题(十一) 蓝桥杯第七届C语言B组省赛习题 习题B:生日蜡烛 我们可以立刻想到等差数列求和,那就是Sn = (n0 + n)* (n - n0 + 1)/ 2 Sn = 236,很明显这里有两个 ...

  9. 蓝桥杯嵌入式组第九届省赛练习(算是解决了长短按键,解决了高亮显示)

    第九届代码实现代码 https://gitee.com/litte_enigner/lqb_emb_9th.git 蓝桥杯开发板的基本模块已经玩的差不多了,接下来就拿第九届题练一下手. 算是解决了长短 ...

最新文章

  1. 美媒看衰马斯克超级高铁:纽约到华盛顿挖隧道要挖100年
  2. 五千字详解消息通知!
  3. 亲手完成四大企业实战项目,挑战Python全栈高薪岗位!
  4. 单位根反演[loj6485]LJJ 学二项式定理
  5. IntelliJ IDEA开发环境应用
  6. 第六计 / Explosive City (2004)
  7. Java中的ConcurrentHashMap
  8. JN5169 ZigBee 3.0 协议栈之 ZigBee 网络参数
  9. 基于二阶矩阵的优化问题(一)线搜索策略(附matlab代码)
  10. 怎么部署项目解析域名_内部解析服务器部署
  11. cosx等价无穷小_第一章 函数与极限 第七节 无穷小的比较
  12. NetSuite 未实现汇兑损益
  13. WIN7中任务栏,菜单栏和工具栏的基本设置
  14. 视觉检测系统是怎么检测尺寸的?
  15. Windows环境下安装RocketMQ,及SpringBoot整合RocketMQ
  16. 计算机计算公式在哪,计算机的计算器在哪 自己的电脑上的计算器在哪里找
  17. matlab中xtem,快速傅里叶变换_蝶形运算_按频率抽取基2-fft算法_MATLAB代码
  18. 数据库设计-航班管理系统
  19. 《Adobe Flash CS6中文版经典教程》——1.4 了解“时间轴”
  20. 这款苹果笔记本最适合编程!!包邮送!

热门文章

  1. 领导都被你镇住的公文金句-写作文稿
  2. matlab 生成二维或三维空间中满足正态分布的样本点,并绘图
  3. 致远A8+最新软件下载分享
  4. lauyi实现表格内显示文件名称,点击实现下载功能。
  5. 2013年博客的第一次随笔,算加权平均分
  6. memset函数的操作
  7. 以己之心,度人之心;将心比心,便是佛心
  8. mac 更换淘宝镜像 bad response Not Found 404 (http://ruby.taobao.org/specs.4.8.gz)
  9. 易语言查找文本数组里相同文本源码
  10. 计算机应用基础文件管理教案,计算机应用基础第五讲:文件管理(教案).doc