基于STM32F103RB的模拟液位检测告警系统(已实现)

2023-11-15

这次先看一下老朋友STM32,有关Zigbee的内容(Z-stack协议栈和基于Zigbee的环境温湿度+烟雾传感器的环境监测系统),等有时间再更。基于STM32的模拟液位检测告警系统,记得好像是某一届蓝桥杯省赛题~~

基于STM32告警系统介绍

“模拟液位检测告警系统”通过采集模拟电压信号计算液位高度,并根据用户设定的液位阈值执行报警动作,在液位等级发生变化时,通过串行通讯接口将液位信息发送到PC机。系统框图如下图所示:
在这里插入图片描述

任务要求

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面是我的代码,我都标了注释。

/****************功能*************************
* 文 件 名: 省赛题
* 作    者: 小舟%
* 描    述: 基于STM32的模拟液位检测告警系统
*********************************************/

/**********************************************
1.//USE_STDPERIPH_DRIVER,STM32F10X_MD
2.//解决了LCD与LED之间的冲突
3.//锁存器,与LED之间的关系更加清晰。 即 |开D2| reset |关D2|
4.//把LED的GPIO放入数组[]当中(方便流水,也方便操作)
5.//IIC初始化后要延时 5ms
  //IIC读写操作要先 延时 后 读/写
6.  sprintf([],"%.0")//取整数
     sprintf([],"%.2")//取小数点后两位
*********************************************/

#include "stm32f10x.h"//从这往下都去掉
#include <stdio.h>//从这往下都去掉
#include "lcd.h"
#include "i2c.h"

#define k1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define k2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)
#define k3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)
#define k4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)

/*****************串口*******************************/
  #define USARTz                   USART2
  #define USARTz_GPIO              GPIOA
  #define USARTz_CLK               RCC_APB1Periph_USART2
  #define USARTz_GPIO_CLK          RCC_APB2Periph_GPIOA
  #define USARTz_RxPin             GPIO_Pin_3
  #define USARTz_TxPin             GPIO_Pin_2
  #define USARTz_IRQn              USART2_IRQn
  #define USARTz_IRQHandler        USART2_IRQHandler

//****************************************************************************//

                //0--全部
uint16_t led[]={GPIO_Pin_All,GPIO_Pin_8,GPIO_Pin_9,GPIO_Pin_10,GPIO_Pin_11,\
                GPIO_Pin_12,GPIO_Pin_13,GPIO_Pin_14,GPIO_Pin_15};
//****************************************************************************//
			
float adc_value;								
u8 adc_volt[20];///必须20///
u8 adc_heigh[20];	
u8 adc_flag=0;	
//-----										
u8 dengji_num=0;//液面等级
u8 dengji_flag_now0=0;//当前液面等级 夹层
u8 dengji_flag_now1=0;
u8 deangji_change_flag=0;u8 dengji_increase=0;u8 dengji_down=0;u8	deangji_change_flag_chuankou[20];						
u8 dengji[20];										
//-----							
u8 Threshold_mid[20];
u8 Threshold_heigh[20];
u8 Threshold_low[20];								
//****************************************************************************//

u16 miao=0;				
u16 led2time=0;								
u32 TimingDelay = 0;
void Delay_Ms(u32 nTime);
//****************************************************************************//		

u8 low=0;
u8 heigh=0;
u8  mid=0;
//****************************************************************************//													

u8 keyB1flag=0;	// 0---界面1
               //  1---界面2
u8 LCD2_choise=0;//界面2的标红选择(1,2,3)
//****************************************************************************//	

u8 yewei=0;    //C
u8 fazhi=0;		//S
float chuankou_heigh=0;
u8 chuankou_s[20];//串口打印sprintf
u8 chuankou_c[20];
//****************************************************************************//	

u8 LED1_shanshuo_flag=0;
u8 LED2_shanshuo_flag=0;u8 LED2_shanshuo_time_flag=0;u8 chuankou_to_led2=0;//串口给的闪烁的信号
u8 led2_five=0;
u8 LED3_shanshuo_flag=0;u8 chuankou_chaxun_to_led3_flag=0;u8 i=0;
//****************************************************************************//		
								
void Delay_Ms(u32 nTime);
void lcdinit(void);
void ledinit(void);
void keyinit(void);
void keyscan(void);
void adc_init(void);
void adc_read(void);
void usart_init(void);
void USART2_IRQHandler(void);
void usart_string(u8 *str);		
u8 IICread(u8 addd);
void IICwrite(u8 addd,u8 data);
void dengji_panduan(void);
void LCDone(void);//第一个LCD界面
void LCDtwo(void);//第二个LCD界面
void LED1_shanshuo(void);
void LED3_shanshuo(void);//闪烁5次
void LED2_shanshuo(void);//闪烁5次


int main(void)
{
SysTick_Config(SystemCoreClock/1000);
	
	lcdinit();
	ledinit();
	keyinit();
	adc_init();
	usart_init();
	
	/*----------------------------------------------------------------------------*/
	i2c_init();Delay_Ms(5);
	
	if(IICread(0x10)!=99)
	{
	Delay_Ms(5);IICwrite(0x01,30);
	Delay_Ms(5);IICwrite(0x02,50);
	Delay_Ms(5);IICwrite(0x03,70);
	
	Delay_Ms(5);IICwrite(0x10,99);	
	}
	
	Delay_Ms(5);low=IICread(0x01);
	Delay_Ms(5);mid=IICread(0x02);
	Delay_Ms(5);heigh=IICread(0x03);
	/*-------------------------------------------------------------------------------*/
	
	
	
while(1)
{
	keyscan();
	
	/*1秒采集ADC----第yi个时间线间隔1s*/
	if(adc_flag==1)
	{
	  adc_flag=0;
		
		if(keyB1flag==0)
		{LCDone();}
		
		LED1_shanshuo();//LED1交替
	}
	
	/*LED2闪烁 ----第二个时间线间隔0.2s*/
if(LED2_shanshuo_time_flag==1)
{
	LED2_shanshuo_time_flag=0;

	//#LED3
	if(chuankou_chaxun_to_led3_flag>0)
		{
		  chuankou_chaxun_to_led3_flag=chuankou_chaxun_to_led3_flag-1;
			LED3_shanshuo();
		}
		
	//#LED2
	if(chuankou_to_led2>0)
	{
	 chuankou_to_led2=chuankou_to_led2-1;
	 LED2_shanshuo();
	}
		
}
	
/*等级变化串口输出*/
if(deangji_change_flag==1)
{ 
deangji_change_flag=0;

	if(dengji_increase==1)
	{dengji_increase=0;sprintf((char*)deangji_change_flag_chuankou,"%s%.2f%s%d%s","A:H",chuankou_heigh,"+L",dengji_num,"+U\r\n");}
	if(dengji_down==1)
	{dengji_down=0;sprintf((char*)deangji_change_flag_chuankou,"%s%.2f%s%d%s","A:H",chuankou_heigh,"+L",dengji_num,"+D\r\n");}

chuankou_to_led2=10;//串口给的闪烁的信号	
usart_string(deangji_change_flag_chuankou);
}
	
	/*串口测试*/
	if(fazhi==1)//S
	{
	  fazhi=0;
		chuankou_chaxun_to_led3_flag=10;
		sprintf((char*)chuankou_c,"%s%d%s%d%s%d%s","S:TL",low,"+TM",mid,"+TH",heigh,"\r\n");
		usart_string(chuankou_c);//OK
	}
	
		/*串口测试*/
	if(yewei==1)//C
	{
	  yewei=0;
		chuankou_chaxun_to_led3_flag=10;
		//C:H55+L2\r\n
		sprintf((char*)chuankou_s,"%s%.2f%s%d%s","C:H",chuankou_heigh,"+L",dengji_num,"\r\n");
		usart_string(chuankou_s);//OK
	}
	
}
}
void LED1_shanshuo()
{
GPIO_SetBits(GPIOD,GPIO_Pin_2);//gao
if(LED1_shanshuo_flag==0)	
{
GPIO_ResetBits(GPIOC,led[1]);//低电平--点亮
LED1_shanshuo_flag=1;
}
else if(LED1_shanshuo_flag==1)
{
GPIO_SetBits(GPIOC,led[1]);//低电平--点亮
LED1_shanshuo_flag=0;
}
GPIO_ResetBits(GPIOD,GPIO_Pin_2);//di
}	

void LED2_shanshuo()
{
GPIO_SetBits(GPIOD,GPIO_Pin_2);//gao
if(LED2_shanshuo_flag==0)	
{
GPIO_ResetBits(GPIOC,led[2]);//低电平--点亮
LED2_shanshuo_flag=1;
}
else if(LED2_shanshuo_flag==1)
{
GPIO_SetBits(GPIOC,led[2]);//低电平--点亮
LED2_shanshuo_flag=0;
}
GPIO_ResetBits(GPIOD,GPIO_Pin_2);//di
}

void LED3_shanshuo()
{
GPIO_SetBits(GPIOD,GPIO_Pin_2);//gao
if(LED3_shanshuo_flag==0)	
{
GPIO_ResetBits(GPIOC,led[3]);//低电平--点亮
LED3_shanshuo_flag=1;
}
else if(LED3_shanshuo_flag==1)
{
GPIO_SetBits(GPIOC,led[3]);//低电平--点亮
LED3_shanshuo_flag=0;
}
GPIO_ResetBits(GPIOD,GPIO_Pin_2);//di
}

u8 IICread(u8 addd)
{
u8 value;
	
I2CStart();
I2CSendByte(0xa0);
I2CSendAck();
I2CSendByte(addd);
I2CSendAck();

I2CStart();
I2CSendByte(0xa1);
I2CSendAck();
value=I2CReceiveByte();
I2CSendAck();
I2CStop();
	
return value;
}

void IICwrite(u8 addd,u8 data)
{
  I2CStart();
	
	I2CSendByte(0xa0);
	I2CSendAck();
	
	I2CSendByte(addd);
	I2CSendAck();
	
	I2CSendByte(data);
	I2CSendAck();
	
	I2CStop();
}

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

void lcdinit()
{
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetTextColor(Black);
LCD_SetBackColor(Green);
LCD_DisplayStringLine(Line0,(unsigned char *)"                    ");	
LCD_DisplayStringLine(Line1,(unsigned char *)"    Liquid Level/   ");	
LCD_DisplayStringLine(Line2,(unsigned char *)"                    ");
LCD_DisplayStringLine(Line3,(unsigned char *)" Height:            ");
LCD_DisplayStringLine(Line4,(unsigned char *)"                    ");			
LCD_DisplayStringLine(Line5,(unsigned char *)" ADC:               ");
LCD_DisplayStringLine(Line6,(unsigned char *)"                    ");	
LCD_DisplayStringLine(Line7,(unsigned char *)" Level:             ");	
LCD_DisplayStringLine(Line8,(unsigned char *)"                    ");	
LCD_DisplayStringLine(Line9,(unsigned char *)"                    ");	
}

void LCDone()
{
LCD_SetTextColor(Black);
LCD_SetBackColor(Green);
	
adc_read();//ADC
LCD_DisplayStringLine(Line0,(unsigned char *)"                    ");	
LCD_DisplayStringLine(Line1,(unsigned char *)"    Liquid Level/   ");	
LCD_DisplayStringLine(Line2,(unsigned char *)"                    ");
//LCD_DisplayStringLine(Line3,(unsigned char *)" Height:            ");//取消后有间隔1s闪烁的效果
LCD_DisplayStringLine(Line4,(unsigned char *)"                    ");			
//LCD_DisplayStringLine(Line5,(unsigned char *)" ADC:               ");
LCD_DisplayStringLine(Line6,(unsigned char *)"                    ");	
//LCD_DisplayStringLine(Line7,(unsigned char *)" Level:             ");	
LCD_DisplayStringLine(Line8,(unsigned char *)"                    ");	
LCD_DisplayStringLine(Line9,(unsigned char *)"                    ");	
}

void LCDtwo()
{	
LCD_SetTextColor(Black);
LCD_SetBackColor(Green);
	
		LCD_DisplayStringLine(Line0,(unsigned char *)"                    ");	
		LCD_DisplayStringLine(Line1,(unsigned char *)"   Parameter Setup/ ");	
		LCD_DisplayStringLine(Line2,(unsigned char *)"                    ");
sprintf ((char*)Threshold_low,"%s%dcm%s"," Threshold 1: ",low,"          ");
		LCD_DisplayStringLine(Line3,Threshold_low);
		LCD_DisplayStringLine(Line4,(unsigned char *)"                    ");	
sprintf ((char*)Threshold_mid,"%s%dcm%s"," Threshold 2: ",mid,"          ");	
		LCD_DisplayStringLine(Line5,Threshold_mid);
		LCD_DisplayStringLine(Line6,(unsigned char *)"                    ");	
sprintf ((char*)Threshold_heigh,"%s%dcm%s"," Threshold 3: ",heigh,"      ");		
		LCD_DisplayStringLine(Line7,Threshold_heigh);	
		LCD_DisplayStringLine(Line8,(unsigned char *)"                    ");	
		LCD_DisplayStringLine(Line9,(unsigned char *)"                    ");
	
 if(LCD2_choise==1)
	{
    LCD_SetTextColor(Blue);
    LCD_SetBackColor(Red);
		
    sprintf ((char*)Threshold_low,"%s%dcm%s"," Threshold 1: ",low,"          ");//不带上只带下面的LCD函数 屏幕会出 BUG
		LCD_DisplayStringLine(Line3,Threshold_low);
	}
	
	else if(LCD2_choise==2)
	{
		 LCD_SetTextColor(Blue);
     LCD_SetBackColor(Red);
		
		sprintf ((char*)Threshold_mid,"%s%dcm%s"," Threshold 2: ",mid,"          ");	
		LCD_DisplayStringLine(Line5,Threshold_mid);
	}
	
		else if(LCD2_choise==3)
	{
		   LCD_SetTextColor(Blue);
    LCD_SetBackColor(Red);
		
	sprintf ((char*)Threshold_heigh,"%s%dcm%s"," Threshold 3: ",heigh,"      ");		
		LCD_DisplayStringLine(Line7,Threshold_heigh);	
	}
}

void ledinit()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
	
	    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//记
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//记
    GPIO_Init(GPIOD, &GPIO_InitStructure);
	                                      
    GPIO_InitStructure.GPIO_Pin =led[0];//GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12| GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	//高电平打开锁存器
		GPIO_SetBits(GPIOD,GPIO_Pin_2);//gao
	  GPIO_SetBits(GPIOC,led[0]);//低电平--点亮
    GPIO_ResetBits(GPIOD,GPIO_Pin_2);//di
}

void keyinit()
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//记
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//记
GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//记
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//记
GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void keyscan()
{
if(k1==0)
{
Delay_Ms(10);//10ms
	if(k1==0)
	{
		/**/
  		if(keyB1flag==0)
		{
		keyB1flag=1;
    LCDtwo();
		}
		
		else if(keyB1flag==1)
		{
			keyB1flag=0;
		  LCDone();
		}
	}
	while(!k1);
}

if(k2==0)
{
Delay_Ms(10);//10ms
	if(k2==0)
	{
				if(keyB1flag==1)//界面2
		{
		  LCD2_choise=LCD2_choise+1;
			if(LCD2_choise==4)
			{LCD2_choise=1;}
			LCDtwo();
		}
		
	}
	while(!k2);
}

if(k3==0)
{
Delay_Ms(10);//10ms
	if(k3==0)
	{
	 if(keyB1flag==1)//界面2
		{
			if(LCD2_choise==1)
			{
			 low=low+5;
				 if(low>95) {low=95;}
			}
			
			else if(LCD2_choise==2)
			{
			 mid=mid+5;
				 if(mid>95) {mid=95;}
			}
			
		  else if(LCD2_choise==3)
			{
			 heigh =heigh+5; 
				if(heigh>95) {heigh=95;}
			}
			/**/
			LCDtwo();
	Delay_Ms(5);IICwrite(0x01,low);
	Delay_Ms(5);IICwrite(0x02,mid);
	Delay_Ms(5);IICwrite(0x03,heigh);
		}
		
	}
	while(!k3);
}

if(k4==0)
{
Delay_Ms(10);//10ms
	if(k4==0)
	{
	
		if(keyB1flag==1)//界面2
		{
			if(LCD2_choise==1)
			{
			 low=low-5;
				 if(low<5) {low=5;}
			}
			
			else if(LCD2_choise==2)
			{
			 mid=mid-5;
				 if(mid<5) {mid=5;}
			}
			
		  else if(LCD2_choise==3)
			{
			 heigh =heigh-5; 
				if(heigh<5) {heigh=5;}
			}
			
	LCDtwo();
	Delay_Ms(5);IICwrite(0x01,low);
	Delay_Ms(5);IICwrite(0x02,mid);
	Delay_Ms(5);IICwrite(0x03,heigh);
		}
		
	}
	while(!k4);
}

}

void adc_init()
{
		GPIO_InitTypeDef GPIO_InitStructure;
		ADC_InitTypeDef  ADC_InitStructure;
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);/时钟//
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
	
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 1;
  ADC_Init(ADC1, &ADC_InitStructure);

  /* ADC1 regular channel14 configuration */ 
  ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_13Cycles5);


  /* Enable AWD interrupt */
  ADC_ITConfig(ADC1, ADC_IT_AWD, ENABLE);

  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);

  /* Enable ADC1 reset calibration register */   
  ADC_ResetCalibration(ADC1);
  /* Check the end of ADC1 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC1));

  /* Start ADC1 calibration */
  ADC_StartCalibration(ADC1);
  /* Check the end of ADC1 calibration */
  while(ADC_GetCalibrationStatus(ADC1));

}

void dengji_panduan()
{
				if(adc_value<low)
				{
					dengji_num=0;
					sprintf((char*)dengji,"%s%d%s"," Level: ",dengji_num,"               ");
				
				}
				
				else if((adc_value>low)&&(adc_value<=mid))
				{
					dengji_num=1;
					sprintf((char*)dengji,"%s%d%s"," Level: ",dengji_num,"               ");
				}
				
					else if((adc_value>mid)&&(adc_value<=heigh))
				{
					dengji_num=2;
					sprintf((char*)dengji,"%s%d%s"," Level: ",dengji_num,"               ");
				}
				
						else if(adc_value>heigh)
				{
					dengji_num=3;
					sprintf((char*)dengji,"%s%d%s"," Level: ",dengji_num,"               ");
				}
}

void adc_read()
{  
  /* Start ADC1 Software Conversion */ 
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);
	
	adc_value=ADC_GetConversionValue(ADC1)*3.30/0xfff;
	sprintf((char*)adc_volt ,"%s%.2fV%s"," ADC: ",adc_value,"           ");
	LCD_DisplayStringLine(Line5,adc_volt);
	
	adc_value=adc_value*30.303;
	chuankou_heigh=adc_value;
	sprintf((char*)adc_heigh ,"%s%.2fcm%s"," Height: ",adc_value,"           ");
	LCD_DisplayStringLine(Line3,adc_heigh);
	

dengji_flag_now0=dengji_num;
dengji_panduan();//等级判断函数
dengji_flag_now1=dengji_num;
if(dengji_flag_now0!=dengji_flag_now1)
{
deangji_change_flag=1;//
if(dengji_flag_now1>dengji_flag_now0)
{dengji_increase=1;}
else if(dengji_flag_now1<dengji_flag_now0)
{dengji_down=1;}
}
  
		LCD_DisplayStringLine(Line7,dengji);
}

void usart_init()
{
	  GPIO_InitTypeDef GPIO_InitStructure;
	  NVIC_InitTypeDef NVIC_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	
 RCC_APB1PeriphClockCmd(USARTz_CLK, ENABLE);  
	RCC_APB2PeriphClockCmd(USARTz_GPIO_CLK , ENABLE);
	

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Pin = USARTz_RxPin;
  GPIO_Init(USARTz_GPIO, &GPIO_InitStructure);  
  

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Pin = USARTz_TxPin;
  GPIO_Init(USARTz_GPIO, &GPIO_InitStructure);  
	
	  USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	
  /* Configure USARTz */
  USART_Init(USARTz, &USART_InitStructure);

  /* Enable USARTz Receive and Transmit interrupts */
  USART_ITConfig(USARTz, USART_IT_RXNE, ENABLE);

  /* Enable the USARTz */
  USART_Cmd(USARTz, ENABLE);
	
	
/* Configure the NVIC Preemption Priority Bits */  
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/* Enable the USARTz Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USARTz_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
	
}

void USART2_IRQHandler()
{
	u8 temp;
  if(USART_GetITStatus(USART2, USART_IT_RXNE) != 0)
  {
		//USART_ClearITPendingBit(USART2, USART_IT_RXNE);	
    temp= USART_ReceiveData(USART2);
		if(temp=='C')
		{
			yewei=1;
		}
		else if(temp=='S')
		{
			fazhi=1;
		}
	}
}

void usart_string(u8 *str)
{
while(*str)
{
     while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==0); //判断是否可以发送
     USART_SendData(USART2,*str);
     while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==0); //判断是否发送完成
                                                                                  //成只发送最后一个字符(覆盖)
     str++;         
}
}



ok,上面是我在main.c文件里的全部代码,蓝桥的板子下载没用FLYMCU或是ARM仿真器,有专门的CooCox下载,下面看一下实验现象~
1.液位检测
在这里插入图片描述
2.液位阈值设定
在这里插入图片描述
3.液位阈值设定

在这里插入图片描述
4、串口查询与输出功能
在这里插入图片描述
在这里插入图片描述

5.状态指示
在这里插入图片描述
emmm…有时间的我会更新和补充其他届的省赛赛题,希望能对大家有所帮助~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于STM32F103RB的模拟液位检测告警系统(已实现) 的相关文章

  • Camtasia2024中文绿色版本下载安装详细步骤教程

    Camtasia2024是一款功能强大的屏幕录制和视频编辑软件 它可以帮助用户轻松地记录电脑屏幕上的任何操作 并可以将录制的视频进行编辑和制作成高质量的视频教程 演示文稿 培训课程等 Camtasia具有直观的界面和易于使用的工具 包括添加
  • 研发实验室设计

    在科技日新月异的今天 研发实验室已经成为创新的重要载体 一个高效 人性化的实验室环境不仅能提升研发效率 更能激发科研人员的创新活力 SICOLAB喜格 将探讨研发实验室设计的核心理念和实践策略 以期为读者提供有益的参考 一 以人为本的设计理
  • 你知道几个电子相册制作方法?让我来给你分享

    你知道什么是电子相册吗 其实电子相册就是我们把照片编辑成视频的另一个说法 这样的视频一般都带有神奇的转场特效 可以自定义的贴纸和背景 很多小伙伴的爸爸妈妈都很喜欢用这样的方式来制作他们的相册 展示他们拍摄的图片 那这样的电子相册在线制作的方
  • 研发实验室建设

    研发实验室是科技创新的核心场所 对于企业的技术研发和产品创新具有重要意义 为了提高研发实验室的效率和质量 建设一个符合要求的实验室是至关重要的 SICOLAB喜格 将介绍研发实验室建设的关键要素和注意事项 一 实验室规划与布局 1 空间规划
  • 手写转文字扫描软件有哪些?方便又好用的工具谁不喜欢?

    大家有没有仔细数过 你们在从小到大的学习生涯中使用了多少笔记本 反正我是经常被我妈催着把以前的笔记本丢掉 但是它们承载的可都是我学生时代的记忆 就连当时觉得复杂难懂的内容 其实也挺有意思的 所以 我一直在思考 到底有什么方法可以让我在不占用
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • 机器配音在线工具有哪些? 让你的语音合成更自然

    你是不是也想成为一名大博主 随着现在的互联网时代蓬勃发展 出现了一批又一批的网红 在家里带带货 拍拍视频就能赚大钱 越来越多的人朝向网络世界进击 那么这些大博主制作一个爆款视频 必不可少的就是配音啦 但是其实很多博主用的并不是真人配音 而是
  • CCF模拟题 202309-2 坐标变换(其二)

    问题描述 试题编号 202309 2 试题名称 坐标变换 其二 时间限制 1 0s 内存限制 512 0MB 问题描述 对于平面直角坐标系上的坐标 x y 小 P 定义了如下两种操作 1 拉伸 k 倍 横坐标 x 变为 kx 纵坐标 y 变
  • 考HCIE要多久 | HCIE学员经验分享

    大家好 我是讯方 智汇云校的学员林同学 来自深圳信息职业技术学院的一名22届的通信专业的学生 通过近半年在云校的学习 我在年底成功考取了云服务方向的HCIE证书 想把我的一些考证心得分享给正在备考的小伙伴们 刚开始了解到ICT行业是在学校的
  • 带头双向循环链表基础

    带头双向循环链表基础 销毁 销毁 void ListDestory ListNode phead void ListDestory ListNode phead assert phead ListNode cur phead gt next
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • 电脑操作系统的发展史:从初级到高级的演变

    自电脑诞生以来 操作系统作为其重要组成部分 不断推动着电脑技术的进步与发展 本文将带您回顾电脑操作系统的发展历程 探究其在不同阶段的特点与影响 一 早期操作系统 真空管与批处理 在电脑诞生初期 真空管技术占主导地位 此时的操作系统尚未形成完
  • 图片编辑软件有哪些好用的?这几款快收藏吧

    你有没有过这样的经历 精心拍摄了一组照片 却发现有些角度不对 光线不够好 或者想要给图片加上一些特别的滤镜效果来达到心目中的样子 这时 你就需要一款合适的图片编辑软件了 但是 市面上的图片编辑软件琳琅满目 哪一款才是适合自己的呢 别担心 今
  • 语音翻译软件app哪家好?帮你和外国人无碍交流的软件分享

    在和外国人交流的时候发现听不懂怎么办 还能怎么办 谁让我们的英语没学好呢 这种时候还是得寻求其他人的帮助 不过万一要是在只有你一个人的情况下又怎么办呢 俗话说 求人不如求己 那还是得在自己手机里时刻准备好能够翻译英语的工具呀 今天就给大家分
  • 2024最新MathType7.4.10中文版下载安装激活教程

    MathType 是一款专业的数学公式编辑工具 提供交互式编辑器 让你在编辑数学试卷 书籍 报刊 论文 幻灯演示等文档轻松输入各种复杂的数学公式和符号 1 本次讲解mathtype 7版本的安装步骤 MathType2024 Win 安装包
  • 如何打赢稳定性之战?

    文章目录 前言 为什么总会出现问题呢 如何证明你的稳定性做的有效果 既是持久战 也是防御战 1 提前建筑好防御工事 2 以攻为守 3 找外部支援和配合 前言 随着23年年末期间 各大厂争先恐后的出现的各种线上
  • 用栈实现队列(OJ中报错的处理)

    用栈实现队列 ERROR AddressSanitizer myQueueFree函数中栈的释放处现了问题 没有调用StackDestory而是直接free了 这个是栈初始化时 capacity与malloc申请的空间大小没有匹配 请你仅使
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re

随机推荐

  • DS二叉排序树之创建和插入

    题目描述 给出一个数据序列 建立二叉排序树 并实现插入功能 对二叉排序树进行中序遍历 可以得到有序的数据序列 输入 第一行输入t 表示有t个数据序列 第二行输入n 表示首个序列包含n个数据 第三行输入n个数据 都是自然数且互不相同 数据之间
  • 在Unity中 改变地形(Terrain),并加上水面、树、草地、材质(地板上色)

    在Unity中 如何使用地形 Terrain 并加上水面 树 草地 材质 地板上色 目录 在Unity中 如何使用地形 Terrain 并加上水面 树 草地 材质 地板上色 一 水面素材包 导入 二 地形 Terrain 地貌设置 地形上升
  • 对音频进行vad及降噪处理

    感觉有必要写一篇博客了 这几天在小组比赛中负责对语音进行处理 处理有两个 一个是用vad对音频进行端点确定 即把静音部分去掉 第二个是对音频进行降噪处理 之前在网上找了许多资料 才找到谷歌之前开发过一个叫webrtc的轮子 里面集成了许多有
  • LaTeX总结8(矩阵排版)

    1 首先矩阵排版要引入一个新的宏包 usepackage amsmath 2 首先就是格式的问题了 begin matrix 只是普通的矩阵 0 1 1 2 end matrix begin pmatrix 加括号的矩阵 0 1 1 2 e
  • 深度残差网络(Deep residual network, ResNet)

    文章目录 一 前言 二 深度网络的退化问题 三 残差学习 3 1 残差网络原理 3 2 ResNet结构为什么可以解决深度网络退化问题 3 3 残差单元 3 4 ResNet的网络结构 四 实验结果 ResNet 50 完整代码 参考资料
  • STM32F4——DAC

    DAC简介 DAC Digital to analog converter 即数字模拟转换器 它可以将数字信号转换为模拟信号 它的功能与ADC相反 在常见的数字信号系统中 大部分传感器信号被转化成电压信号 而 ADC 把电压模拟信号转换成易
  • 【内核驱动】Linux概述

    00 目录 文章目录 00 目录 01 Unix简介 02 Linux简介 03 Linux发展史 04 单内核与微内核区别 05 Linux内核 06 Linux内核组成 07 Linux官方网站 08 附录 01 Unix简介 UNIX
  • 【神经网络】(5) 卷积神经网络(ResNet50),案例:艺术画作10分类,附数据集

    各位同学好 今天和大家分享一下TensorFlow2 0中如何构建卷积神经网络ResNet 50 案例内容 现在收集了10位艺术大师的画作 采用卷积神经网络判断某一幅画是哪位大师画的 数据集 百度网盘 请输入提取码 提取码 2h5x 1 数
  • Banknote Dataset(钞票数据集)介绍

    Banknote Dataset 钞票数据集 这是从纸币鉴别过程中的图像里提取的数据 用来预测钞票的真伪的数据集 该数据集中含有1372个样本 每个样本由5个数值型变量构成 4个输入变量和1个输出变量 小波变换工具用于从图像中提取特征 这是
  • 【华为OD机试真题2023B卷 JS】MELON的难题

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 MELON的难题 知识点DFS搜索 时间限制 2s 空间限制 32MB 限定语言 不限 题目描述 MELON有一堆精美的雨花石 数量为n 重量各异 准备送给S和W MELON希望送给俩
  • 初识最大熵原理

    一 概述 在日常生活中或者科学试验中 很多的事情发生都具有一定的随机性 即最终产生的结果是随机发生的 我们不清楚这些结果是否服从什么规律 我们所拥有的只有一些实验样本 在这种情况下 我们如何根据现拥有的东西对结果产生一个合理的推断呢 最大熵
  • R语言实用案例分析-1

    在日常生活和实际应用当中 我们经常会用到统计方面的知识 比如求最大值 求平均值等等 R语言是一门统计学语言 他可以方便的完成统计相关的计算 下面我们就来看一个相关案例 1 背景 最近西安交大大数据专业二班 开设了Java和大数据技术课程 班
  • matlab 未定义与‘XXX‘类型的输入参数相对应的函数‘princomp‘

    今天某同学让我帮他看看matlab代码出了什么问题 首先运行代码 出现了第一个问题 这个GetSal函数是一个文件外的自定义函数 一看运行的当前目录和这个函数所在的目录不在同一个目录下 在代码里加入addpath 自定义函数所在目录 即可
  • 网络精通-组播

    400 组播 一次发送一组人接收 组播的应用场景 广播电视 音频会议 电视直播 401 PIM 组播路由协议 运行在中间路由器上 帮助路由器选择最短路径到达终端 402 IGPM 运行在最后一跳路由器和终端上面 用来通知路由器下面是否有终端
  • 微信小程序npm项目构建和使用(按照步奏操作)

    1 微信开发者工具里面新建目录miniprogram目录 文件目录名和红色框名一致 然后在miniprogram目录下新建node modules目录 2 WIN R打开运行输入CMD运行黑窗口 cd到你的项目miniprogram目录 错
  • drop table if exists 多张表_mysql实验--DROP 大表时的注意事项

    概述 我们很多时候都会去drop一些大表 特别是生产环境做操作时 这里主要提一些注意事项 仅供参考 01 相关语法 1 删表 DROP TABLE SyntaxDROP TEMPORARY TABLE IF EXISTS tbl name
  • Prometheus + Grafana 监控Docker

    Prometheus Grafana 监控Docker cAdvisor Container Advisor 用于收集正在运行的容器资源使用和性能信息 k8s中kubelet自带cadvisor监控所有节点 参考 https github
  • SQL注入(一)—— sql手动注入实操

    SQL SQL注入 sql 注入的核心 SQL 手注的一般流程 判断注入点 第一步 判断字段数 第二步 判断回显点 第三步 查询相关内容 第四步 判断库名 判断表名 判断列名 查询具体信息 总结 SQL注入 SQL注入攻击是目前web应用网
  • 【语义】如何使用PointNet训练点云数据和点云分割(初探)

    大家好 今天给大家介绍下cvpr2017 一篇文章Pointnet 语义分割 该网络基于tensorflow 写的 非常轻巧方便 但是文章和代码有一定出入 在训练过程中出现过拟合现象 大概训练了10个小时多 1 需要准备的东东 1 Ubun
  • 基于STM32F103RB的模拟液位检测告警系统(已实现)

    这次先看一下老朋友STM32 有关Zigbee的内容 Z stack协议栈和基于Zigbee的环境温湿度 烟雾传感器的环境监测系统 等有时间再更 基于STM32的模拟液位检测告警系统 记得好像是某一届蓝桥杯省赛题 基于STM32告警系统介绍