#include<reg51.h> //包含单片机寄存器的头文件
#include "LCDDriver.h"
#include "8255.h"
#include "KeyScan.h"
#include "DS12887.h"
#include "DS18B200.h"
#include "DS18B201.h"
#include "DS18B202.h"
/*--------------------------------------------------------------*/
//定时器0中断服务函数
void isr_t0(void) interrupt 1
{
TH0=0xD8; //重载数据
TL0=0xF0;
ReadTemp0(); //开启温度采集程序
tem0=temp_value0; //获取T1当前温度(热水箱的温度)
ReadTemp1(); //开启温度采集程序
tem1=temp_value1; //获取T2当前温度(循环水管中的温度)
ReadTemp2(); //开启温度采集程序
tem2=temp_value2; //获取T3当前温度(集热器中的温度)
}
/*--------------------------------------------------------------*/
//定时器1中断服务函数
void isr_t1(void) interrupt 3
{
TH1=0xB1; //重载数据
TL1=0xE0;
level=PB; //获取当前水位
//if(level<=0x07) //水位低于第3段
//PC=0xF2; //打开冷水阀增高水位
//if(level>=0x7F) //水位高于第7段
//PC=0xF0; //阀门全部关闭,不加热
}
/*--------------------------------------------------------------*/
//温度控制
void temperature_control(void)
{
if((flag>=0x04)&&(flag<0x07)) //早晨水温控制
{
while(!(level>=0x7F)) //水位高于第7段,跳出循环
{
//if(level<=0x07) //水位低于第3段
PC=0xF2; //打开冷水阀增高水位
P1=0xF0;
}
PC=0xF0; //阀门全部关闭,不加热
while(!(tem0>=0x30))
{
//if(tem1<0x30) //水温低于30度
PC=0xF8; //打开电热器
P1=0xF0;
}
PC=0xF0; //阀门全部关闭,不加热
}
if((flag>=0x07)&&(flag<=0x16)) //温水循环集热过程
{
while(!(flag==0x16))
{
P1=0xF0;
if((tem2>tem)&&(tem1>tem)) //T3>N,T2>N
PC=0xF4; //打开热水阀门F3
else PC=0xF1; //打开循环水阀门F2
}
}
if((flag>=0x16)&&(flag<=0x23)) //水箱加热控制
{
while(!(flag==0x23))
{
P1=0xF0;
if(level<=0x07) //水位低于第3段
PC=0xFA; //打开冷水阀增高水位,加热
if(level>=0x7F) //水位高于第7段
PC=0xF8; //阀门全部关闭,加热
if(tem0<tem) //水箱温度小于设定温度
PC=0xF8; //加热
else PC=0xF0; //阀门全部关闭,不加热
}
}
}
/*--------------------------------------------------------------*/
//主程序
void main(void)
{
Init_8255(); //系统初始化
LCD_Init();
Init_DS18B200();
Init_DS18B201();
Init_DS18B202();
DS12887_Init();
LCD_DispStringShift(0,0,"Hello , may you have a good day!");
delay(30);
LCD_Clear(); //清屏
EA=1,EX0=1,EX1=1,ET0=1,ET1=1; //开总中断,外部中断0、1,定时器中断0、1
TMOD=0x11; //定时器0、1都工作在方式1(16位定时器)下
TH0=0xD8,TL0=0xF0; //定时10ms(12M晶振)
TH1=0xB1,TL1=0xE0; //定时20ms(12M晶振)
TR0=1,TR1=1; //启动定时器0、1
temp1=0x34,temp2=0x30;
tem=((temp1&0x0f)<<4)|(temp2&0x0f); //设定的初始N值
while(1)
{
P1=0xF0; // 发全0行扫描码
show_time();
if(signal==0)
temperature_control();
while(signal)
{
P1=0xF0;
if(level<=0x07) //水位低于第3段
PC=0xFA; //打开冷水阀增高水位,加热
if(level>=0x7F) //水位高于第7段
PC=0xF8; //阀门全部关闭,加热
if(tem0<tem) //水箱温度小于设定温度
PC=0xF8; //加热
else PC=0xF0; //阀门全部关闭,不加热
}
}
}
/*--------------------------------------------------------------*/
评论0