求大神指点修改程序,原功能:
2、采用LCD1602液晶显示温度信息,测温采用防水型DS18B20实现,还具有蜂鸣器提示功能;
3、定时功能:可以设置系统工作开启时间,在开启时间没有达到之前系统只进行测温不会进行控制,当开启时间到达后系统会进行测温并根据实测温度进行控制。实现更加智能节能的效果;
4、同时可以通过按键设置水温的上、下限值,并显示于液晶上。当实测温度低于下限值时继电器吸合开启加热,当实测温度高于上限值时继电器断开关闭加热同时蜂鸣器鸣叫提示加热完成(继电器工作具有指示灯)
5、整个系统参数可以通过红外遥控器无线或者按键进行设置;
设置”键:按下后进入设置模式,依次按可设置定时开广
限值,下限值;
“加值”键:在设置模式下,按下对应的设置参数加1;
“减值”键:在设置模式下,按下对应的设置参数减1;
确定”键:在设置时按下退出并保存以设置好的参数。
修改后:在原功能上添加功能“不在设置模式下,按下加值健切换上限值为40,50,60.按下减值健切换下限值为20,25,30.并可以通过红外切换”
#include<reg52.h> //头文件
#include<DS18B20.h>
#include<HW.h>
#include<LCD1602.h>
#include<INTERRUPT.h>
#include<EEPROM.h>
/***********************引脚定义*************************/
sbit key_set = P1^0; //设置键定义
sbit key_jia = P1^1; //加值键
sbit key_jian = P1^2; //减值键
sbit key_ok = P1^3; //退出键
sbit buzz = P2^4; //蜂鸣器
sbit relay = P3^6; //继电器
/*********************变量定义***************************/
uchar Temperature_up,Temperature_down;//存储温度上、下限值
uchar set_f=0; //设置选择标记,=0非设置,=1设置定时时间,=2设置温度上限,=3设置温度下限
uint num=99; //计数变量
/********************************************************
函数名称:void didi()
函数作用:蜂鸣器滴滴声
参数说明:
********************************************************/
void didi()
{
buzz=0; //开启蜂鸣器
delayms(5); //延时
buzz=1; //关闭蜂鸣器
}
/********************************************************
函数名称:void display()
函数作用:正常显示
参数说明:
********************************************************/
void display()
{
if(presence==0) //判断温度是否采集正确
{
lcd1602_write_character(0,1,temp_t);//显示温度数值
LCD_disp_char(8,1,0); //显示自定义字符‘°’
LCD_disp_char(9,1,'C'); //显示‘C’
if(fen==0) //定时时间到,进入控制加热
{
if(wendu<Temperature_down) //实测温度低于下限值
{
relay=0; //开启继电器加热
buzz=1; //关闭蜂鸣器提示
}
else
if(wendu>=Temperature_up)//实测温度高于上限值
{
relay=1; //断开继电器关闭加热
buzz=0; //蜂鸣器鸣叫提示
}
else //处于限值之间
buzz=1; //关闭蜂鸣器鸣叫
}
}
else //温度采集失败
{
buzz=1; //关闭蜂鸣器鸣叫
relay=1; //断开继电器关闭加热
lcd1602_write_character(0,1," NOT ");
}
lcd1602_write_character(11,1,"T:"); //显示定时时间
LCD_disp_char(13,1,ASCII[fen/100]);
LCD_disp_char(14,1,ASCII[fen%100/10]);
LCD_disp_char(15,1,ASCII[fen%10]);
lcd1602_write_character(0,2,"Up:"); //显示温度上限值
LCD_disp_char(3,2,ASCII[Temperature_up/100]);
LCD_disp_char(4,2,ASCII[Temperature_up%100/10]);
LCD_disp_char(5,2,ASCII[Temperature_up%10]);
lcd1602_write_character(8,2,"Down:");//显示温度下限值
LCD_disp_char(13,2,ASCII[Temperature_down/100]);
LCD_disp_char(14,2,ASCII[Temperature_down%100/10]);
LCD_disp_char(15,2,ASCII[Temperature_down%10]);
}
/********************************************************
函数名称:void display2()
函数作用:显示设置参数
参数说明:
********************************************************/
void display2()
{
num++;
EX0=0; //关闭红外遥控检测
DS18B20_Read_Temperature(); //DS18B20读取温度数据
DS18B20_Temperature(); //DS18B20温度转换
EX0=1; //开启红外遥控检测
if(presence==0)
{
lcd1602_write_character(0,1,temp_t);//显示温度数值
LCD_disp_char(8,1,0); //显示自定义字符‘°’
LCD_disp_char(9,1,'C'); //显示’C‘
}
else
lcd1602_write_character(0,1," NOT ");
lcd1602_write_character(11,1,"T:"); //固定显示内容
lcd1602_write_character(0,2,"Up:");
lcd1602_write_character(8,2,"Down:");
if(num%2==0) //偶数次显示,奇数次不显示。这样就会有闪烁效果,可以清楚看到当前设置的是哪个值
{
LCD_disp_char(13,1,ASCII[fen/100]); //显示定时时间-百位
LCD_disp_char(14,1,ASCII[fen%100/10]); //显示定时时间-十位
LCD_disp_char(15,1,ASCII[fen%10]); //显示定时时间-个位
LCD_disp_char(3,2,ASCII[Temperature_up/100]); //显示温度上限值-百位
LCD_disp_char(4,2,ASCII[Temperature_up%100/10]); //显示温度上限值-十位
LCD_disp_char(5,2,ASCII[Temperature_up%10]); //显示温度上限值-个位
LCD_disp_char(13,2,ASCII[Temperature_down/100]); //显示温度下限值-百位
LCD_disp_char(14,2,ASCII[Temperature_down%100/10]);//显示温度下限值-十位
LCD_disp_char(15,2,ASCII[Temperature_down%10]); //显示温度下限值-个位
}
else //奇数次不显示
{
switch(set_f)//根据当前设置的内容,对应位置闪烁
{
case 1: lcd1602_write_character(13,1," "); break;
case 2: lcd1602_write_character(3,2," "); break;
case 3: lcd1602_write_character(13,2," "); break;
default: break;
}
}
}
/*****************************************************