蓝桥杯嵌入式第七届省赛——“模拟液位检测告警系统”旧板标准库
一、赛题分析
模拟液位检测告警系统,涉及到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
有不对的地方,请多指教...
蓝桥杯嵌入式第七届省赛——“模拟液位检测告警系统”旧板标准库相关推荐
- 蓝桥杯嵌入式——第七届省赛-模拟液位检测告警系统
第七届省赛-模拟液位检测告警系统 目录 第七届省赛-模拟液位检测告警系统 一.赛题分析 二.代码 一.赛题分析 这一届和上一届也就是第六届一样,没有涉及到定时器得PWM输出和输入捕获.主要得赛题难度是 ...
- 蓝桥杯单片机第七届省赛-模拟风扇控制系统
九层妖塔 起于垒土 ● 改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改 蓝桥杯单片机第七届省赛-模拟风扇控制系统 Notes1:按键按下后在某些情况下给一定的缓冲时间 Notes2 ...
- 蓝桥杯嵌入式第十届省赛真题
蓝桥杯嵌入式第十届省赛真题 文章目录 蓝桥杯嵌入式第十届省赛真题 1.题目分析 2.项目结构 2.1数组思路 2.2Key_Flag控制对应逻辑 2.3KEY控制操作 1.题目分析 总的来说这题考点特 ...
- 【STM32G4】备战蓝桥杯嵌入式---实战---第七届嵌入式省赛—“模拟液位检测告警系统”
文章目录 前言 一.题目 二.模块初始化以及功能分析 1.模块的初始化 2.模块功能分析 三.函数实现 1.void Display(void); 2.void EEPROM_Read(void);v ...
- 蓝桥杯嵌入式组第九届省赛练习(算是解决了长短按键,解决了高亮显示)
第九届代码实现代码 https://gitee.com/litte_enigner/lqb_emb_9th.git 蓝桥杯开发板的基本模块已经玩的差不多了,接下来就拿第九届题练一下手. 算是解决了长短 ...
- 蓝桥杯嵌入式STM32G431——第九届省赛真题电子定时器
第九届省赛真题电子定时器 第九届省赛真题 主函数代码(不包含各模块初始化代码) 按键模块与LCD模块的逻辑图(仅供参考) 第九届省赛真题 主函数代码(不包含各模块初始化代码) #include &qu ...
- 蓝桥杯单片机第七届省赛题详细讲解(模拟风扇控制系统)
看之前强烈建议先自己做一遍!!! 演示视频 题目讲解 完整程序 main.c onewire.h onewire.c 工程文件 演示视频 题目讲解 首先还是从整个赛题的程序框图开始看起,如图. 做题之 ...
- 蓝桥杯嵌入式第七届模拟题 代码
链接:https://pan.baidu.com/s/1fdGC20A51axxPGpoyRL8-w 提取码:by4u
- #蓝桥杯嵌入式#第七届预赛:液位检测告警系统
初始化文件可以参考之前的 首先是最基础的ADC转换,得到ADC的值的函数之前基础模块配置那以及写过 u16 get_ADC() {ADC_SoftwareStartConvCmd(ADC1, ENAB ...
最新文章
- cookie、localStorage和sessionStorage区别
- PHP从入门到跑路(二),基础语法,数据库操作
- enterText与typeText
- sql和泛型方法返回泛型_基于泛型编程的序列化实现方法
- 进程有一个全局变量 i,还有有两个线程。i++ 在两个线程里边分别执行 100 次,能得到的最大值和最小值分别是多少?
- wxWidgets:wxNavigationEnabled< W >类模板的用法
- (最新合集)计算机网络谢希仁第七版 第一章课后答案
- SAP CRM responsibility的维护
- Linux单用户模式(修改密码、运行级别)方法详解
- sd-card on android 5.0,Android5.0以上SDCard文件删除问题
- zookeeper编程入门系列之zookeeper实现分布式进程监控和分布式共享锁(图文详解)...
- Memcached(七)Memcached的并发实例
- 用友修改服务器名称,用友修改服务器地址
- 荐一个不错的UI设计网站: uimaker
- 激荡十年:云计算的过去、现在和未来
- 苹果电脑教程之退出ID账号
- WINVNC分析(一)——源码执行流程
- 「实战篇」开源项目docker化运维部署-前端java部署(八)
- 梅科尔工作室-梁嘉莹-鸿蒙笔记4
- JavaScript中的alert
热门文章
- 竞争激烈的互联网环境中,成为一名企业急需的技术人才,需要学习哪些技能呢?
- Android Material Design之Toolbar与Palette实践
- hrm系统源码php,HRM SAAS v2.6.0 – PHP人力资源管理系统SaaS平台版
- wincc连接mysql数据库案例_WINCC读写SQL数据库的例子-工业支持中心-西门子中国
- 2011最具技术影响力评选——图书篇(引进):2011年整个行业都在百花齐放,
- 生成MATLAB快捷方式-Linux环境下
- 参与360私有化的公司股价暴涨 多家借壳公司却遭遇政策难题
- 液晶面板价格开始大跌,中国两大面板企业的好日子结束了
- React Native 入门实战视频教程(37 个视频)
- label文字 与input 不在一条直线上解决方案