#include "temp.h"
typedef unsigned int uint;
typedef unsigned char uchar;
sbit HtKEY=P3^2; //加热按键
sbit YeLED=P0^2; //加水指示灯
sbit RedLED=P0^0; //烧水提示灯
sbit GeLED=P0^1; //保温提示灯
sbit HOT=P1^3; //加热
sbit addwater=P1^2; //加水
sbit Wldete=P0^5; //水位检测
sbit Hbdete=P0^4; //人体检测
sbit Buzz=P1^4; //蜂鸣器
uint pass = 0; //传递数据位
int y=1; //水开标志位
uint number=0; //计算时间,超过一定时间进入单片机空闲模式
uchar set_templ=30,set_temph=32; //99以下加热,100保温
void HB();
void Waterdete();
void manage1 (int x );
void manage (int x);
void open();
void off();
void delay(unsigned int y)
{
unsigned int x;
for(y;y>0;y--)
for(x=1000;x>0;x--);
}
void Int0Init()//设置 INT0
{
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//打开 INT0 的中断允许。
EA=1;//打开总中断
}
void UART_init() //设置串行通信 本晶振为11.0592MHZ
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd; //波特率9600
SM0 = 0;
SM1 = 1; // 串口工作方式1 10位异步
REN = 1; //串口允许接收
TR1 = 1;
EA = 1;
ES =1 ; //串口中断
}
int main()
{
int n;
UART_init(); //波特率9600
Int0Init();
while(1)
{
HB();
Waterdete();
n = Ds18b20ReadTemp();
manage1 (n);
switch (pass)
{
case 0x31:open();break;
case 0x32:off();break;
default:P2 = 0xff;break;
}
manage (number);
}
}
void Int0() interrupt 0 //外部中断 0 的中断函数
{
if(HtKEY==0)
{
delay(1); //延时消抖
if(HtKEY==0)
{
number = 0; //关闭空闲模式
}
while(!HtKEY); //检测按键是否松开
}
}
void UART_INTERRUPT() interrupt 4
{
pass = SBUF;
RI = 0;
SBUF = pass; //手机和蓝牙模块通讯时,我们可以打开电脑串口调试工具查看我们的发送值)
while(!TI);
TI = 0;
}
void HB() //人体检测函数
{
if(Hbdete==0) //检测是否有人
{
delay(1); //消除抖动 一般大约10ms
if(Hbdete==0) //再次检测是否有人
{
Buzz=~Buzz; //Buzz状态取反
delay(100); //消除抖动 一般大约1s
Buzz=~Buzz; //Buzz状态取反
}
while(!Hbdete); //检测按键是否松开
}
}
void Waterdete()
{
if(Wldete==0) //检测是否有水
{
delay(1); //消除抖动 一般大约10ms
if(Wldete==0) //再次检测是否有人
{
YeLED = 0; //开启加水指示灯
RedLED=1; //加热灯亮
GeLED=1;
HOT=1; //停止加热
addwater = 0 ; //检测到没水,开启加水
Buzz=1;
}
while(!Wldete); //检测按键是否松开
}
}
void manage1 (int x ) //处理当前温度状态
{
if(x <= set_templ) //当小于最小温度下限值,则自动加热,或者当加热键按下时,加热。
{
HOT=0; //加热
RedLED=0; //加热灯亮
GeLED=1;
Buzz=1;
YeLED = 1; //开启加水指示灯
addwater = 1 ; //检测到没水,开启加水
if(!y)
y++;
}
else if(x >= set_temph) //当大于最大温度上限值,则自动停止加热。
{
if(y)
{
Buzz=0;
delay(100);
Buzz=1;
y--;
number++;
}
YeLED = 1; //开启加水指示灯
addwater = 1 ; //检测到没水,开启加水
HOT=1; //停止加热
RedLED=1; //加热灯灭
GeLED=0; //保温灯亮
Buzz=1;
}
}
void manage (int x) //空闲状态处理
{
if(x == 2) //到达时间进入空闲模式
{
YeLED = 1;
RedLED=1;
GeLED=1;
HOT=1;
addwater = 1 ;
Buzz=1;
}
}
void open()
{
number = 0;
}
void off()
{
number = 2;
}