21-3-基于STM32的流量计智能流速流量监测、水泵报警系统(上位机输出、泵启动、阈值设置、LCD1602、超阈值报警、proteus)

21-3-基于STM32的流量计智能流速流量监测、水泵报警系统(上位机输出、泵启动、阈值设置、LCD1602、超阈值报警、proteus)

功能描述:

基于STM32F103C8单片机实现的智能流速、流量,流量计设计。实现的功能是通过信号发生器模拟齿轮传感器,检测流量的大小,同时计算流过液体的总容量。可以设置最大流过的总容量,当超过设定值后通过蜂鸣器与LED灯指示。当没有超过则启动水泵控制电路带动液体流动。数据将通过上位机虚拟串口传输出来,可以模拟出无线传输的功能,如Wi-Fi、蓝牙等或RS232、RS485的功能。

1、流速检测
2、流量统计
3、阈值显示与设置(通过按键实现阈值的调节或清零)
4、水泵启动
5、超阈值报警
6、上位机数据传输,模拟无线或有线传输的功能

有哪些资料:

1、仿真工程文件
2、PCB工程文件
3、原理图工程文件
4、源代码
5、虚拟串口软件
6、串口助手(上位机软件)
7、软件安装使用教程

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

void motor_cl(void)
{
		//启动按键按下后执行  QT=1
		if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==0)
			QT=1;
		
		//停止按键按下后执行  QT=0 
		if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)==0)
			QT=0;
		
		//正转按键按下后执行  MODE=0
		if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)==0)
			MODE=0;	
		
		//反转按键按下后执行  MODE=1
		if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)==0)
			MODE=1;	

			//加速按键按下后执行
		if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4)==0)
		{
			//等待加速按键放开,然后执行
			while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4)==0);
				//时间缩短 速度加快
			if(T>=10)
				T=T-2;

		}			
			//减速按键按下后执行
		if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==0)
		{
			//等待/减速按键放开,然后执行
			while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==0);
				//时间加长 速度减慢
			if(T<60)
			T=T+3;
		}	
		//判断QT=1执行
		if(QT)
				{
					//mode=0正转模式
						if(MODE==0)
						{
							//正转表值+
							I++;
							if(I>7)I=0;
						}		
						//mode=1反转模式
						else if(MODE==1)
						{
							//反转表值-
							I--;
							if(I<0)I=7;
						}		
						//PA口写表值控制电机						
						GPIO_Write(GPIOA,turn[I]);
						//延时时间 调整T值可以控制电机转速
						delay_ms(T);		
				}
}

int main(void)
{
	// 使用HSI,SYSCLK = 4M * RCC_PLLMul_x, x:[2,3,...16],最高是64MH
    HSI_SetSysClock(RCC_PLLMul_2); //使用内部8MHz晶振,并设置PLL输出为8MHz

	NVIC_Configuration();
	UART_Init(9600);		  //串口初始化为9600
	TIM3_Int_Init(20000-1, 8-1); // 20ms

	LED_Init(); //初始化与LED连接的硬件接口
	KEY_Init();
	EXTIX_Init(); //外部中断初始化
	

	

	LCD_GPIO_Init();
	LCD_Init();
    LCD_Clear();
	LCD_DispStr(4,0,"Welcome!");
	DelayMs(200);
	DelayMs(200);
	DelayMs(200);
	DelayMs(200);
	while (1)
	{
		
			MOTOR();
	KEY();
		CheckKey();		  //按键处理
		if (disFlag == 1) //显示
		{
			disFlag = 0;

			dealLiuliang++;		   //处理数据
			if (dealLiuliang >= 5) //计数500ms
			{
				dealLiuliang = 0;							//定时发送数据清空
				shunShiVal = (float)plu * 2 * 1000 / 330;		//计算瞬时流量 500ms一次 *2表示1s的量 330个脉冲为1L
				leiJiVal = leiJiVal + shunShiVal; //累计计算累计流量
				plu = 0;									//清空周期计数
			}

			sprintf(dis0, "S:%3.1fL/m L:%4.1fL", shunShiVal*60/1000, leiJiVal/1000);  //打印瞬时流量L/min和累计流量L
			LCD_DispStr(0, 0, dis0); //显示

			sendDelay++;
			if (sendDelay > 50) //5s
			{
				sendDelay = 0;
				sprintf(dis0, "S:%3.1fL/m L:%4.1fL\r\n", shunShiVal*60/1000, leiJiVal/1000);  //打印瞬时流量L/min和累计流量L
				UART_SendStr(USART1, dis0, 18); //串口发送
			}

			sprintf(dis0, "LJ MAX:%4.1fL", leiJiValMax/1000); //打印累计水流量阈值
			LCD_DispStr(0, 1, dis0); //显示

			if (relayFlag2 == 1) //蓝牙控制继电器启动标志
			{
				if (leiJiVal > leiJiValMax) //累计流量超过最大值
				{
					relayFlag1 = 0;
					BUZZER = ON; //蜂鸣器打开
				}
				else
				{
					relayFlag1 = 1;
					BUZZER = OFF; //蜂鸣器关闭
				}
			
				if (relayFlag1 == 1)
				{
					RELAY = ON; //进水控制继电器启动
				}
				else
				{
					RELAY = OFF; //进水控制继电器关闭
				}
			}
			else
			{
				RELAY = OFF; //进水控制继电器关闭
                BUZZER = OFF; //蜂鸣器关闭
			}
			
		}
	}
}
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我Eric

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值