功能介绍:
0.本系统采用STC89C52作为单片机
1.LCD1602液晶实时显示当前温度和设定温度
2.当温度到达100℃时,蜂鸣器报警提醒水烧开了
3.按键可更改预设温度值,当温度低于设定温度5℃时,
启动加热,直至加热到设定值,停止加热,启动保温的作用
原理图:
PCB:
主程序:
#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include <stdio.h>
#include "18b20.h"
#include "lcd1602.h"
#include "delay.h"
sbit KEY_SET = P3^3; //引脚定义
sbit KEY_SUB = P3^6;
sbit KEY_ADD = P3^4;
sbit KEY_SWITCH = P3^5;
sbit RELAY_WATER = P2^0;
sbit RELAY_HEAT = P2^1;
sbit BUZZER = P2^2;
sbit WATER_CHECK = P1^1;
#define ON 0
#define OFF 1
int waterTime = 0; //加水时间
int tempBuf = 0; //读取温度值
float temperature; //实际温度值
float setTemp = 100.0; //预设温度
bit refreshFlag = 0; //定义读温度标志
bit heatSwitch = OFF; //加热开关
char dis0[16]; //定义显示区域临时存储数组
void CheckKey(void);
void Timer0_Init(void); //定时器初始化
void main(void)
{
bit ack = 0;
Timer0_Init();
LCD_Init(); //初始化液晶
DelayMs(200); //延时有助于稳定
LCD_Clear(); //清屏
while (1) //主循环
{
if (refreshFlag == 1) //1s刷新一次数据
{
refreshFlag = 0;
//TR0 = 0;
if (WATER_CHECK == 0) //检测到没有水
{
DelayMs(20); //防抖
if (WATER_CHECK == 0) //确定没有水了
{
waterTime = 60; //加水60s
heatSwitch = OFF; //关闭加热开关
}
}
if (waterTime != 0)
{
waterTime--;
RELAY_WATER = ON; //加水
}
else
{
RELAY_WATER = OFF;
}
DS18B20_Start();
ack = DS18B20_GetTemp(&tempBuf); //检测温度
if (ack == 1)
{
temperature = (float)tempBuf * 0.0625; //温度值转换
}
else
{
temperature = 0;
}
if (heatSwitch == ON) //加热开关打开
{
if (temperature < setTemp - 5) //低于设定温度5℃,启动加热
{
RELAY_HEAT = ON;
}
else if (temperature >= setTemp) //直接大于等于设定温度,停止加热
{
RELAY_HEAT = OFF;
}
if (temperature >= 100) //温度达到100℃,蜂鸣器报警
{
BUZZER = ON;
}
else
{
BUZZER = OFF;
}
}
else //加热开关关闭
{
RELAY_HEAT = OFF;
BUZZER = OFF;
}
sprintf(dis0, "Set Temp:%5.1f", setTemp); //打印温度值
LCD_DispStr(0, 0, dis0); //显示
LCD_DispOneChar(14, 0, 0xdf); //写入温度右上角点
LCD_DispOneChar(15, 0, 'C'); //写入温度C
sprintf(dis0, "Temp:%5.1f", temperature); //打印温度值
LCD_DispStr(0, 1, dis0); //显示
LCD_DispOneChar(10, 1, 0xdf); //写入温度右上角点
LCD_DispOneChar(11, 1, 'C'); //写入温度C
if (heatSwitch == ON) //显示加热开关
{
sprintf(dis0, " ON", temperature); //打印温度值
LCD_DispStr(12, 1, dis0); //显示
}
else
{
sprintf(dis0, " OFF", temperature); //打印温度值
LCD_DispStr(12, 1, dis0); //显示
}
//TR0 = 1;
}
CheckKey(); //检测按键
}
}
void CheckKey(void)
{
if (KEY_SWITCH == 0) //检测到按键按下
{
DelayMs(10); //小抖动
if (KEY_SWITCH == 0) //开关按键
{
heatSwitch = ~heatSwitch; //加热开关控制
}
while (KEY_SWITCH == 0);
}
if (KEY_SUB == 0) //减值键
{
DelayMs(200);
if (KEY_SUB == 0) //减值键
{
setTemp--;
if (setTemp < 20)
{
setTemp = 100;
}
sprintf(dis0, "Set Temp:%5.1f", setTemp); //打印温度值
LCD_DispStr(0, 0, dis0); //显示
}
}
if (KEY_ADD == 0) //加值键
{
DelayMs(200);
if (KEY_ADD == 0) //减值键
{
setTemp++;
if (setTemp > 100)
{
setTemp = 20;
}
sprintf(dis0, "Set Temp:%5.1f", setTemp); //打印温度值
LCD_DispStr(0, 0, dis0); //显示
}
}
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Timer0_Init(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0 = (65536 - 18432) / 256; //重新赋值 20ms
TL0 = (65536 - 18432) % 256;
EA = 1; //总中断打开
ET0 = 1; //定时器中断打开
TR0 = 1; //定时器开关打开
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_Interrupt(void) interrupt 1
{
static unsigned char time20ms = 0;
TH0 = (65536 - 18432) / 256; //重新赋值 20ms
TL0 = (65536 - 18432) % 256;
time20ms++;
if (time20ms > 50)
{
time20ms = 0;
refreshFlag = 1; //读标志位置1
}
}