功能:
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/