1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 基于51单片机的水温水流量检测/智能水龙头控制系统proteus仿真原理图PCB

基于51单片机的水温水流量检测/智能水龙头控制系统proteus仿真原理图PCB

时间:2018-11-04 13:00:20

相关推荐

基于51单片机的水温水流量检测/智能水龙头控制系统proteus仿真原理图PCB

功能:

0.本系统采用STC89C52作为单片机

1.液晶实时显示当前的设定温度/实际温度/水龙头状态和水流量

2.按键可开关水龙头,当温度低于设定温度时,启动加热控制继电器,给水加热, 当加热到(设定温度+1)时,停止加热,使水温在一定范围

3.当水温超过55摄氏度时,蜂鸣器报警

4.按键可设定水温,设定范围20℃~50℃

5.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:

PCB :

主程序:

#include "main.h"/*******************变量定义*********************/int tempBuf;float temperature; //温度int setTemp = 40; //设定温度float flow = 0; //水流量char dis[16];bit dispFlag = 0; //显示标志bit openFlag = 0; //水龙头开启标志int pulseCnt;/********************************************************函数名称:void mian()函数作用:主函数参数说明:********************************************************/void main(){LCD_Init(); //初始化液晶DelayMs(200); //延时有助于稳定LCD_DispStr(4, 0, "Welcome!");DelayS(1);LCD_Clear(); //清屏Timer0_Init(); //初始化定时器0Ext0_Init();while (1) //死循环{if (dispFlag == 1) //200ms刷新一次{EX0 = 0; //关闭外部中断0dispFlag = 0;flow = (float)pulseCnt*5/43; //推算每秒计数,计算水流量L/min f = (43*Q) Q=L/minDispNormal();pulseCnt = 0; //清零EX0 = 1; //打开外部中断0}if (openFlag == 1) //水龙头打开{RELAY_WATER = ON;if (temperature < setTemp){RELAY_HEAT = ON;}else if (temperature > setTemp + 1) //大于设定温度1度后,停止加热,以使温度在设定范围附近{RELAY_HEAT = OFF;}if (temperature > 55) //大于55度蜂鸣器报警{BUZZER = ON;}else{BUZZER = OFF;}}else //水龙头关闭{RELAY_WATER = OFF;RELAY_HEAT = OFF;BUZZER = OFF;}KeyProcess();} }/************************* 正常显示模式 *************************/void DispNormal(void){bit ack;DS18B20_Start();ack = DS18B20_GetTemp(&tempBuf);if (ack == 1){temperature = (float)tempBuf * 0.0625; //温度值转换}else {temperature = 0;}sprintf(dis, "Set:%3d", setTemp); //打印温度值LCD_DispStr(0, 0, dis); //显示第一行LCD_DispOneChar(7, 0, 0xdf); //写入温度右上角点LCD_DispOneChar(8, 0, 'C'); //写入温度右上角点if (openFlag == 1){LCD_DispStr(10, 0, "Open ");}else{LCD_DispStr(10, 0, "Close");}sprintf(dis, "%5.1f", temperature); //打印温度值LCD_DispStr(0, 1, dis); //显示第二行LCD_DispOneChar(5, 1, 0xdf); //写入温度右上角点LCD_DispOneChar(6, 1, 'C'); //写入温度右上角点sprintf(dis, " %3.1fL/min", flow); //打印当前流量LCD_DispStr(7, 1, dis); //显示第二行}/************************* 定时器0初始化 *************************/void Timer0_Init(void){TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TH0 = (65536 - 9216) / 256; //重新赋值 10msTL0 = (65536 - 9216) % 256;EA = 1; //总中断打开ET0 = 1; //定时器中断打开TR0 = 1; //定时器开关打开}/************************* 定时器0中断 *************************/void Timer0_Interrupt(void) interrupt 1{static unsigned char time10ms = 0;TH0 = (65536 - 9216) / 256; //重新赋值 10msTL0 = (65536 - 9216) % 256;time10ms++;if (time10ms > 20){dispFlag = 1; //显示标志time10ms = 0;}}/************************* 外部中断0初始化 *************************/void Ext0_Init(void){IT0 = 1; //下降沿触发EX0 = 1; //使能外部中断0EA = 1; //打开总中断}/************************* 外部中断0 *************************/void EXT0_Interrupt() interrupt 0{pulseCnt++;}

仿真演示视频:

/video/BV1254y1d7fP/

实物演示视频:

/video/BV1654y1d7Jm/

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。