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; //蜂鸣器关闭
}
}
}
}