一、赛题分析

模拟液位检测告警系统,涉及到KEY、ADC、EEPROM、LED、USART、LCD等模块。本届赛题相对简单,各个模块均可在往期文章中找到配置方法和编写说明。如:

蓝桥杯嵌入式——第六届省赛“电压测量监控设备”旧版标准库_对愁眠后霜满天的博客-CSDN博客

本届赛题主要难点在于对液位上升和下降趋势的判断,并通过串口发送至电脑。以及串口查询,和存储液面阀值。

二、程序设计

本届赛题所用到的模块均在往届赛题有所涉及,具体可查看往期文章或在文章最后下载本届赛题的项目工程。

1、对液面等级变化趋势的判断

对于此处,博主的思想是:在while(1)之前要读取一次ADC采样值,判断level等级,并标记此时的液面等级。再在while(1)中level改变之前标记和改变之后的值进行对比,可得出液面变化趋势。

2、串口发送查询部分

对于此处,题目中要求对接收一个字符数据的判断。所以可以先接收数据再判断是否满足条件,若不满足查询条件直接清除,若满足则发送查询数据,再清除接收数据。如果不清除接收数据,则多次串口发送后可能会出错。

void USART2_IRQHandler(void)
{if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET){USART_ClearITPendingBit(USART2,USART_IT_RXNE);       USART_RXBUF[RXCUNT++] = USART_ReceiveData(USART2);if(USART_RXBUF[0] != '\0'){USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);RXOVER = 1; }}
}
/*  此为部分,整体可在主函数中体现if(RXOVER == 1){RXOVER = 0;RXCUNT = 0;if(USART_RXBUF[0] == 'C'){memset(string,0,sizeof(string));sprintf((char*)string,"C:H%d+L%d\\r\\n\r\n",Height,leve);  USART_SendString(USART2,string);    led3_flag = 1;}if(USART_RXBUF[0] == 'S'){memset(string,0,sizeof(string));sprintf((char*)string,"S:TL%d+TM%d+TH%d\\r\\n\r\n",TH.th_1,TH.th_2,TH.th_3);  USART_SendString(USART2,string);    led3_flag = 1;}        memset(USART_RXBUF,0,sizeof(USART_RXBUF));}
*/

3、main.c

写I2C之后一定要延时5ms左右10ms比较保险,不然可能出错。

#include "stm32f10x.h"
#include "lcd.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "adc.h"
#include "timer.h"
#include "usart.h"
#include "i2c.h"
#include "stdio.h"
#include "string.h"struct Level{u8 th_1,th_2,th_3;}TH={30,50,70};
enum show_stat{Level,Setting};u8 Height = 0,leve = 0,leve_flag = 0,select_flag = 0;
u8 ADC_Flag,led_flag = 0,key_flag = 0,show_flag = Level;
u8 led2_flag = 0,ld2 = 0,led3_flag = 0,ld3 = 0;
u8 string[20];
float adc_temp;void key_in(void);
void show_lcd(void);
void highlight_char(u8 Line, u8 *ptr);
void height_leve(void);
void Leve_init(void);
void judgement_usart(void);
void led_state(void);//Main Body
int main(void)
{STM3210B_LCD_Init();      LCD_Clear(Black);          LCD_SetBackColor(Black);  LCD_SetTextColor(White); SysTick_Config(SystemCoreClock/1000);TIM4_Init();USART2_Init(9600);LED_Init();KEY_Init();ADC_INIT();i2c_init();TH.th_1 = i2c_read(0x32);if(TH.th_1 > 95&&TH.th_1%5 != 0)TH.th_1 = 30;TH.th_2 = i2c_read(0x33);if(TH.th_2 > 95&&TH.th_2%5 != 0)TH.th_2 = 50;    TH.th_3 = i2c_read(0x34);if(TH.th_3 > 95&&TH.th_3%5 != 0)TH.th_3 = 70;    Leve_init();while(1){key_in();show_lcd();led_state();}
}void Leve_init(void)
{adc_temp = Read_ADC();Height = adc_temp * 100 / 3.3;height_leve();leve_flag = leve;
}void key_in(void)
{key_flag = key_scan();if(key_flag == 1){show_flag =! show_flag;LCD_Clear(Black);}if(key_flag == 2&&show_flag == Setting){select_flag = (select_flag + 1) % 3;}if(key_flag == 3&&show_flag == Setting){if(select_flag == 0&&TH.th_1<95)TH.th_1 = TH.th_1 + 5;if(select_flag == 1&&TH.th_2<95)TH.th_2 = TH.th_2 + 5;if(select_flag == 2&&TH.th_3<95)TH.th_3 = TH.th_3 + 5;i2c_write(0x32,TH.th_1);Delay_Ms(10);i2c_write(0x33,TH.th_2);Delay_Ms(10);i2c_write(0x34,TH.th_3);Delay_Ms(10);}if(key_flag == 4&&show_flag == Setting){if(select_flag == 0&&TH.th_1>5)TH.th_1 = TH.th_1 - 5;if(select_flag == 1&&TH.th_2>5)TH.th_2 = TH.th_2 - 5;if(select_flag == 2&&TH.th_3>5)TH.th_3 = TH.th_3 - 5;i2c_write(0x32,TH.th_1);Delay_Ms(10);i2c_write(0x33,TH.th_2);Delay_Ms(10);i2c_write(0x34,TH.th_3);Delay_Ms(10);}
}void show_lcd(void)
{if(ADC_Flag){ADC_Flag = 0;adc_temp = Read_ADC();}if(show_flag == Level){LCD_DisplayStringLine(Line1,(u8*)"    Liquid Level    ");Height = adc_temp * 100 / 3.3;memset(string,0,sizeof(string));sprintf((char*)string,"  Height:%dcm  ",Height);LCD_DisplayStringLine(Line3,string);memset(string,0,sizeof(string));sprintf((char*)string,"     ADC:%.2fV  ",adc_temp);LCD_DisplayStringLine(Line5,string);judgement_usart();memset(string,0,sizeof(string));sprintf((char*)string,"   Level:%d  ",leve);LCD_DisplayStringLine(Line7,string);  }else if(show_flag == Setting){LCD_DisplayStringLine(Line1,(u8*)"   Parameter Setup   ");memset(string,0,sizeof(string));sprintf((char*)string," Threshold1:%dcm  ",TH.th_1);if(select_flag == 0)highlight_char(Line3,string);      else LCD_DisplayStringLine(Line3,string);       memset(string,0,sizeof(string));sprintf((char*)string," Threshold2:%dcm  ",TH.th_2);if(select_flag == 1)highlight_char(Line5,string);else LCD_DisplayStringLine(Line5,string);  memset(string,0,sizeof(string));sprintf((char*)string," Threshold3:%dcm  ",TH.th_3);if(select_flag == 2)highlight_char(Line7,string);else LCD_DisplayStringLine(Line7,string);  }
}void highlight_char(u8 Line, u8 *ptr)
{u32 i = 0;u16 refcolumn = 319;while ((*ptr != 0) && (i < 20))     {LCD_SetTextColor(Yellow);LCD_DisplayChar(Line, refcolumn, *ptr);LCD_SetTextColor(White);refcolumn -= 16;ptr++;i++;}
}void judgement_usart(void)
{leve_flag = leve;height_leve();if(leve_flag>leve){memset(string,0,sizeof(string));sprintf((char*)string,"A:H%d+L%d+D\\r\\n\r\n",Height,leve);  USART_SendString(USART2,string);led2_flag = 1;}if(leve_flag<leve){memset(string,0,sizeof(string));sprintf((char*)string,"A:H%d+L%d+U\\r\\n\r\n",Height,leve);   USART_SendString(USART2,string);led2_flag = 1;}leve_flag = leve;if(RXOVER == 1){RXOVER = 0;RXCUNT = 0;if(USART_RXBUF[0] == 'C'){memset(string,0,sizeof(string));sprintf((char*)string,"C:H%d+L%d\\r\\n\r\n",Height,leve);  USART_SendString(USART2,string);    led3_flag = 1;}if(USART_RXBUF[0] == 'S'){memset(string,0,sizeof(string));sprintf((char*)string,"S:TL%d+TM%d+TH%d\\r\\n\r\n",TH.th_1,TH.th_2,TH.th_3);  USART_SendString(USART2,string);    led3_flag = 1;}        memset(USART_RXBUF,0,sizeof(USART_RXBUF));}
}void height_leve(void)
{if(Height<=TH.th_1)leve = 0;else if(Height>TH.th_1&&Height<=TH.th_2)leve = 1;else if(Height>TH.th_2&&Height<=TH.th_3)leve = 2;else leve = 3;
}void led_state(void)
{LED_Control(LED1,led_flag);LED_Control(LED2,ld2);LED_Control(LED3,ld3);
}void TIM4_IRQHandler(void)
{static u16 led_cnt = 0,led2_cnt = 0,led3_cnt = 0;if (TIM_GetITStatus(TIM4,TIM_IT_Update) != RESET){TIM_ClearITPendingBit(TIM4, TIM_IT_Update);if(++led_cnt>=1000){led_cnt = 0;led_flag =! led_flag;}if(led2_flag == 1){if(++led2_cnt%200 == 0)ld2 =! ld2;if(led2_cnt>=2000){led2_cnt = 0;led2_flag = 0;ld2=0;}}if(led3_flag == 1){if(++led3_cnt%200 == 0)ld3 =! ld3;if(led3_cnt>=2000){led3_cnt = 0;led3_flag = 0;ld3=0;}}}
}

三、工程附上

链接:https://pan.baidu.com/s/1mD5Mwb8kkYdkKlSh0Y9uhg 
提取码:foao

有不对的地方,请多指教...

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

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

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

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

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

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

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

  4. 【STM32G4】备战蓝桥杯嵌入式---实战---第七届嵌入式省赛—“模拟液位检测告警系统”

    文章目录 前言 一.题目 二.模块初始化以及功能分析 1.模块的初始化 2.模块功能分析 三.函数实现 1.void Display(void); 2.void EEPROM_Read(void);v ...

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

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

  6. 蓝桥杯嵌入式STM32G431——第九届省赛真题电子定时器

    第九届省赛真题电子定时器 第九届省赛真题 主函数代码(不包含各模块初始化代码) 按键模块与LCD模块的逻辑图(仅供参考) 第九届省赛真题 主函数代码(不包含各模块初始化代码) #include &qu ...

  7. 蓝桥杯单片机第七届省赛题详细讲解(模拟风扇控制系统)

    看之前强烈建议先自己做一遍!!! 演示视频 题目讲解 完整程序 main.c onewire.h onewire.c 工程文件 演示视频 题目讲解 首先还是从整个赛题的程序框图开始看起,如图. 做题之 ...

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

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

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

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

最新文章

  1. cookie、localStorage和sessionStorage区别
  2. PHP从入门到跑路(二),基础语法,数据库操作
  3. enterText与typeText
  4. sql和泛型方法返回泛型_基于泛型编程的序列化实现方法
  5. 进程有一个全局变量 i,还有有两个线程。i++ 在两个线程里边分别执行 100 次,能得到的最大值和最小值分别是多少?
  6. wxWidgets:wxNavigationEnabled< W >类模板的用法
  7. (最新合集)计算机网络谢希仁第七版 第一章课后答案
  8. SAP CRM responsibility的维护
  9. Linux单用户模式(修改密码、运行级别)方法详解
  10. sd-card on android 5.0,Android5.0以上SDCard文件删除问题
  11. zookeeper编程入门系列之zookeeper实现分布式进程监控和分布式共享锁(图文详解)...
  12. Memcached(七)Memcached的并发实例
  13. 用友修改服务器名称,用友修改服务器地址
  14. 荐一个不错的UI设计网站: uimaker
  15. 激荡十年:云计算的过去、现在和未来
  16. 苹果电脑教程之退出ID账号
  17. WINVNC分析(一)——源码执行流程
  18. 「实战篇」开源项目docker化运维部署-前端java部署(八)
  19. 梅科尔工作室-梁嘉莹-鸿蒙笔记4
  20. JavaScript中的alert

热门文章

  1. 竞争激烈的互联网环境中,成为一名企业急需的技术人才,需要学习哪些技能呢?
  2. Android Material Design之Toolbar与Palette实践
  3. hrm系统源码php,HRM SAAS v2.6.0 – PHP人力资源管理系统SaaS平台版
  4. wincc连接mysql数据库案例_WINCC读写SQL数据库的例子-工业支持中心-西门子中国
  5. 2011最具技术影响力评选——图书篇(引进):2011年整个行业都在百花齐放,
  6. 生成MATLAB快捷方式-Linux环境下
  7. 参与360私有化的公司股价暴涨 多家借壳公司却遭遇政策难题
  8. 液晶面板价格开始大跌,中国两大面板企业的好日子结束了
  9. React Native 入门实战视频教程(37 个视频)
  10. label文字 与input 不在一条直线上解决方案