#include<reg52.h>
#include <intrins.h>
#include "ds18b20.h"
#define uchar unsigned char
#define uint unsigned int
#define dat P2
#define nop() _nop_()
#define _Nop() _nop_()
sbit qiehuan= P3^2;
sbit zengzhi= P3^3;
sbit jianzhi= P3^4;
sbit led= P3^6;
sbit bell= P3^7;
uchar tem0 , tem1,t,num,SET=1,setend=1;
uchar temp0 ,temp1, displayEN=1, transhijian;
uint f=0; //正常转换显示开关
uchar humidity=55,alarm=1;
uchar displayshiduH_EN,displayshiduL_EN,displaywenduH_EN,displaywenduL_EN,HRH=90,HRL=0,WDH=90,WDL=0;
//0, 1, 2, 3, 4, 5, 6, 7, 8, 9, L C H R
uchar code shuzi[14]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc7,0XC6,0x89,0X88};//共阳数码管
uchar code weixuan[6]={0x01,0x02,0x04,0x08}; //数码管位选
/****************************************************************************
* 名称 timer0()
* 功能 定时器1每50000us中断一次。
* 入口参数
****************************************************************************/
void tran()
{
f = tem1;
f = ( f<<8 ) | tem0;
f = f * 20; //这里f的值是最终读到的频率不同频率对于不同相对湿度。
if(( 5623 <= f) && ( f<= 6852) ) //相对湿度在有效范围内0100%
{
if(( 6734 < f) && ( f <= 6852) )
{ temp0 = 0; temp1 =(6852 - f)*10/118; }
if( (6618 < f) && ( f <= 6734) )
{ temp0 = 1; temp1 =(6734 - f)*10/116; }
if( (6503 < f) && ( f <= 6618 ) )
{ temp0 = 2; temp1 =(6618 - f)*10/115; }
if( (6388 < f) && ( f <= 6503 ) )
{ temp0 = 3; temp1 =(6503 - f)*10/115; }
if( (6271 < f) && ( f <= 6388 ) )
{ temp0 = 4; temp1 =(6388 - f)*10/117; }
if( (6152 < f) && ( f <= 6271 ) )
{ temp0 = 5; temp1 =(6271 - f)*10/119; }
if( (6029 < f) && ( f <= 6152 ) )
{ temp0 = 6; temp1 =(6152 - f)*10/123; }
if( (5901 < f) && ( f <= 6029 ) )
{ temp0 = 7;temp1 =(6029 - f)*10/128; }
if( (5766 < f) && ( f <= 5901 ))
{ temp0 = 8; temp1 =(5901 - f)*10/135; }
if( (5623 < f) && (f <= 5766))
{ temp0 = 9; temp1 =(5766 - f)*10/143; }
}
else
{
temp0 = 0;
temp1 = 0;
}
}
void timer0() interrupt 1
{
EA =0;
TR0=0;
TR1=0;
tran(); //湿度转换
temp0 &= 0x0F;
temp1 &= 0x0F;
temp0 = temp0 <<4;
if(!(transhijian%20))
{
set_alarm_tem(WDH,WDL);
Read_Temperature();
Temperature_Convert();
humidity=temp0 | temp1;
}
transhijian++;
if(transhijian==40)
transhijian=0;
TL0=-50000%256; //定时器0初值 定时50000us
TH0=-50000/256;
tem0 = TL1; //读数
tem1 = TH1;
TL1=0x00; //定时器1清零
TH1=0x00;
f=1; //作标注位
TR0=1;
TR1=1;
EA=1;
}
/****************************************************************************
* 名称 timer1()
* 功能 计数器用于计数将555输出的频率以计数相对湿度。
* 入口参数
****************************************************************************/
void timer1() interrupt 3 //T1中断表示计数的频率溢出超出了可测量的频率范围显然在这里不可能。所以重新启动。
{
EA =0;
TR0=0;
TR1=0;
TL0=-50000%256; //重装值 定时50000us TH0=0x4C;
TH0=-50000/256;
TL1=0x00; //定时器1清零
TH1=0x00;
TR0=1;
TR1=1;
EA=1;
}
void Init_timer()
{
TMOD=0x51;//0101 0001 定时器0在模式1下工作16位定时器,定时方式 定时器1在模式1下工作16位计数器T1负跳变加1
TL0=-50000%256; //定时器0初值 定时50000us
TH0=-50000/256;
TL1=0x00; //定时器1清零
TH1=0x00;
ET0=1; //使能定时器0中断
ET1=1; //使能定时器1中断
EA=1; //使能总中断
TR0=1; //开始计时
TR1=1;
}
void delay1ms(uchar x) //x毫秒延时
{
uchar b;
while(x--)
for(b=350;b>0;b--);
}
void displayshidu(uchar HR,uchar t)
{
dat=shuzi[HR/10];
P0=weixuan[0];
delay1ms(t);
dat=shuzi[HR%10];
P0=weixuan[1];
delay1ms(t);
dat=shuzi[13]; //R
P0=weixuan[2];
delay1ms(t);
dat=shuzi[12];//H
P0=weixuan[3];
delay1ms(t);
}
void displaywendu(uchar wendu,uchar t)
{
dat=shuzi[wendu/10];
P0=weixuan[0];
delay1ms(t);
dat=shuzi[wendu%10];
P0=weixuan[1];
delay1ms(t);
dat=0x9c;
P0=weixuan[2];
delay1ms(t);
dat=shuzi[11];
P0=weixuan[3];
delay1ms(t);
}
void setHRHdisplay(uchar HR,uchar t)
{
dat=shuzi[13]; //R
P0=weixuan[0];
delay1ms(t);
dat=shuzi[12];//H
P0=weixuan[1];
delay1ms(t);
dat=shuzi[HR/10];
P0=weixuan[2];
delay1ms(t);
dat=shuzi[HR%10];
P0=weixuan[3];
delay1ms(t);
}
void setHRLdisplay(uchar HR,uchar t)
{
dat=shuzi[13]; //R
P0=weixuan[0];
delay1ms(t);
dat=shuzi[10];//L
P0=weixuan[1];
delay1ms(t);
dat=shuzi[HR/10];
P0=weixuan[2];
delay1ms(t);
dat=shuzi[HR%10];
P0=weixuan[3];
delay1ms(t);
}
void setCLdisplay(uchar CC,uchar t)
{
dat=shuzi[11]; //C
P0=weixuan[0];
delay1ms(t);
dat=shuzi[10];//L
P0=weixuan[1];
delay1ms(t);
dat=shuzi[CC/10];
P0=weixuan[2];
delay1ms(t);
dat=shuzi[CC%10];
P0=weixuan[3];
delay1ms(t);
}
void setCHdisplay(uchar CC,uchar t)
{
dat=shuzi[11]; //C
P0=weixuan[0];
delay1ms(t);
dat=shuzi[12]; //H
P0=weixuan[1];
delay1ms(t);
dat=shuzi[CC/10];
P0=weixuan[2];
delay1ms(t);
dat=shuzi[CC%10];
P0=weixuan[3];
delay1ms(t);
}
void keyscan()
{
uchar zz=0,jz=0;
if(qiehuan==0)//有按键按下
{
delay1ms(10);
if(qiehuan==0)
{
EA=0;
displayEN=0;
while(qiehuan==0);
num++;
num%=5;
}
switch(num)
{
case 0: displayEN=1;displaywenduL_EN=0;EA=1;setend=1;break; //正常显示
case 1: displayEN=0;displayshiduH_EN=1;setend=0;break;//湿度 上限调节
case 2:displayshiduH_EN=0; displayshiduL_EN=1;setend=0;break; //湿度 下限调节
case 3: displayshiduL_EN=0;displaywenduH_EN=1;setend=0;break; //温度 上限调节
case 4: displaywenduH_EN=0;displaywenduL_EN=1;setend=0;break; //温度 下限调节
}
}
if(zengzhi==0)
{
delay1ms(10);
if(zengzhi==0)
{
while(zengzhi==0);
zz=1;
}
}
if(jianzhi==0)
{
delay1ms(10);
if(jianzhi==0)
{
while(jianzhi==0);
jz=1;
}
}
if((num==1)&&(zz==1))
{
HRH++;
if(HRH>=100)
HRH=100;
}
if((num==1)&&(jz==1))
{
HRH--;
if(HRH<=HRL)
HRH=HRL;
}
if((num==2)&&(zz==1))
{
HRL++;
if(HRL>=HRH)
HRL=HRH;
}
if((num==2)&&(jz==1))
{
HRL--;
if(HRL==0XFF)
HRL=0;
}
if((num==3)&&(zz==1))
{
WDH++;
if(WDH>=50)
WDH=50;
set_alarm_tem(WDH,WDL);
}
if((num==3)&&(jz==1))
{
WDH--;
if(WDH<=WDL)
WDH=WDL;
set_alarm_tem(WDH,WDL);
}
if((num==4)&&(zz==1))
{
WDL++;
if(WDL>=WDH)
WDL=WDH;
set_alarm_tem(WDH,WDL);
}
if((num==4)&&(jz==1))
{
WDL--;
if(WDL==0xff)
WDL=0;
set_alarm_tem(WDH,WDL);
}
}
void BELLon()
{
bell= 0;
}
void LEDon()
{
led=0;
}
void BELLoff()
{
bell= 1;
}
void LEDoff()
{
led=1;
}
void main()
{
Init_timer();
while(1)
{
keyscan();
if((displayEN)&&(alarm))
{
if((transhijian<=20)&&(transhijian>=0))
displayshidu(humidity,1);
else displaywendu(CurrentT,1);
}
if(displayshiduH_EN)
setHRHdisplay(HRH,1);//高湿度设置显示
if(displayshiduL_EN)