#include <reg52.h>
#include "DS18B20.H"
#include "LCD_1602.h"///徐梦平2003106045
#include <stdio.h>
sbit LED_gongzuo=P1^4;//设置工作灯
sbit LED_shezhi=P1^1;//设置设温状态灯
sbit s2=P3^2;//加温键
sbit s3=P3^3;//降温键
sbit s4=P3^4;//设温键
sbit s5=P3^5;//取消报警键
sbit FMQ=P3^7;//蜂鸣器
sbit LED_jinbao=P1^5;//报警灯
unsigned char Disp_Buffer[4];//定义一个字符串用来储存实时温度值
unsigned char Disp_SheDingZhi[4];//定义一个字符串用来储存设定的温度值
float shezhi=30.0;
float wendu=0.0;//全局变量方便设置温度及读取温度
int i=0;//用于定时器中计数
/////////////////////////////////////////////延时函数
void delay(unsigned int i)
{
unsigned int k;
for (k=0;k<i;k++);//徐梦平2003106045
}
////延时函数
///////////////////////////////////定义设置温度函数
void shewen()
{
if(s4==0)//如果设温键按下,则设温指示灯亮起
{
delay(1000);
while(s4==0);
LED_shezhi=0;
}
if(LED_shezhi==0)//如果设温指示灯亮起,则进入设温状态
{
while(LED_shezhi==0)//徐梦平2003106045
{
LED_gongzuo=1;
TR0=0;//设温时使定时器停止工作
if(s2==0)//升温键
{
delay(8000);
if(s2==0)
{
shezhi=shezhi+0.1;//每次增加0.1°c
sprintf(Disp_SheDingZhi,"%4.1f",shezhi);//转换成字符串
LcdShowStr(10,1,Disp_SheDingZhi);//显示于屏幕
}
}
if(s3==0)//降温键
{
delay(8000);
if(s3==0)
{
shezhi=shezhi-0.1;
sprintf(Disp_SheDingZhi,"%4.1f",shezhi);
LcdShowStr(10,1,Disp_SheDingZhi);
}
}
if(s4==0)//只有当设温键再次按下时才会使设温指示灯熄灭,while循环就会不满足条件而跳出循环
{
while(s4==0);
TR0=1; //跳出循环前先让定时器继续工作
LED_shezhi=1;
}
}
}
}
////////定义设置温度函数
//定时器
void shuaxin1()
{
TMOD=0x01;
TH0=0xB8;
TL0=0x00;
TR0=0;
EA=1;
ET0=1;
}
////////////////////////////////徐梦平2003106045
///主函数
void main()
{
shuaxin1();//定时器初始化
InitLcd1602();//屏幕初始化
LcdShowStr(0,0,"wenduzhi: 00.0\xDF\x43");
LcdShowStr(0,1,"sheding : 00.0\xDF\x43");//屏幕显示初始内容
TR0=1;//定时器开始工作
while(1)//进入死循环每隔一秒检测并显示温度
{
FMQ=1;
LED_jinbao=1;//开始时让蜂鸣器和报警灯都不工作
while(LED_gongzuo==0)//在中断中达到时间后会让工作灯亮起,随后进入此循环,
{
TR0=0;//使定时器开始工作
sendChangeCmd();//获取温度
wendu=getTmpValue();//获取温度值并赋值给“wendu”变量
sprintf(Disp_Buffer,"%4.1f",wendu);//将温度值转换为字符串并储存在Disp_Buffer中
LcdShowStr(10,0,Disp_Buffer);//在屏幕上显示温度值对应的字符串
sprintf(Disp_SheDingZhi,"%4.1f",shezhi);
LcdShowStr(10,1,Disp_SheDingZhi);
TR0=1;//完成一次温度刷新后再次打开定时器
LED_gongzuo=1;//使工作灯熄灭以跳出循环
}
LED_shezhi=1;//开始时确保温度设置指示灯熄灭
shewen();//开始进入设温函数(函数内部具有判断是否通过按键进入设置状态,若没有进入则直接执行后面的程序)
while(wendu>shezhi)//当温度值大于设定值的时候开始进行报警
{
TR0=0;//报警时定时器与工作灯都停止工作,防止出错
LED_gongzuo=1;
LED_jinbao=0;//开启报警灯
FMQ=0;//开启蜂鸣器
if(s5==0)//判断停止报警键是否按下,只有按下后才会停止报警
{
while(s5==0);
TR0=1;
shezhi=wendu;
}
}
}
}
/////////////////////////////////////////徐梦平2003106045
void shuaxin2() interrupt 1////中断需要执行的程序,每隔1秒让工作灯亮起
{
TH0=0xB8;
TL0=0x00;
i++;
if(i>=50)
{
LED_gongzuo=0;
i=0;
}
}