#include<reg52.h>
#include"mytype.h"
#include"led.h"
#include"ds18b20.h"
#include"key.h"
/*****繼電器端口***********/
sbit cold=P1^4;
sbit heat=P1^5;
sbit buzzer=P1^6; //蜂鳴器
uint tvalue;
uint dig3,dig2,dig1,dig0; //digx數碼管要顯示的數據,在led.h中聲明的外部變量
uint dig3_u,dig2_u,dig1_u,dig0_u; //保存設置上限 up
uint dig3_d,dig2_d,dig1_d,dig0_d; //保存設置下限 down
uchar key; //key是key的返回值,在key.h中聲明的外部變量
uchar kflag,kshift=1,kmode=0;//按鍵設置標志、閃爍led的移位按鍵、按鍵模式(上下限溫度)
uint temp; //緩存溫度
void KeyCtrl();//按鍵控制
void main(void)
{
TMOD=0x01; //方式1的定時計數50ms,設置定時器每一段時間采集溫度值
TH0=0x3c;
TL0=0xb0;
EA=1;
TR0=1;
ET0=1;
dig2_u=5; //初始化上限50.0度
dig1_u=0;
dig0_u=0;
dig2_d=3; //初始化下限30.0度
dig1_d=0;
dig0_d=0;
while(1)
{
if(KeyScan())KeyCtrl();//掃描到按鍵執行按鍵控制,否則跳過
if(kflag) //如果按鍵設置標志為1,進入閃爍顯示
{
LedFlick(kshift); //數碼管閃爍顯示
}
else
{
temp=tvalue; //tvalue是外部變量,在定時器執行中斷采集溫度時ReadTemp();改變溫度值
dig3=0;
dig2=temp/100%10;
dig1=temp/10%10 ;
dig0=temp%10;
LedScan();//數碼管顯示采集溫度
if( temp>(dig2_u*100+dig1_u*10+dig0_u) )//大于上限值報警并制冷
{
buzzer=1;
heat=0;
cold=1;
}
else if(temp<(dig2_d*100+dig1_d*10+dig0_d) )//小于下限值報警并制熱
{
buzzer=1;
heat=1;
cold=0;
}
else //不報警停止制冷制熱
{
buzzer=0;
heat=0; //高電平有效,此處關閉制熱
cold=0; //高電平有效,此處關閉制冷
}
}
}
}
/***********按鍵控制函數,模式、加減、確認***********/
void KeyCtrl()
{
if(key) //key是外部變量,在掃描的時候改變,在退出這個函數前清零,否則會一直保持控制,閃啊閃的
{
switch(key) //判斷掃描到的按鍵是什么,作出相應的操作
{
case 1: kflag=1; //模式切換按鍵
kmode++;
if(kmode==1)//把保存的上限溫度值顯示出來
{
dig0=dig0_u;
dig1=dig1_u;
dig2=dig2_u;
dig3=11;//'H'
}
else if(kmode==2) //把保存的下限溫度值顯示出來
{
dig0=dig0_d;
dig1=dig1_d;
dig2=dig2_d;
dig3=12;//'L'
}
else if(kmode==3) //恢復溫度采集顯示
{
kmode=0;
kflag=0;
dig3=0;
}
break;
case 2: kshift++; //閃爍位左移按鍵
if(kshift==4)kshift=1;
break;
case 3: if(kflag) //加1按鍵
switch(kshift)
{
case 1: dig0++;
if(dig0==10)dig0=0; //之所以這樣,是避免dig0加到10以上會顯示數組段碼的后面的字符
break;
case 2: dig1++;
if(dig1==10)dig1=0;
break;
case 3: dig2++;
if(dig2==10)dig2=0;
break;
}
break;
case 4: if(kflag) //減1按鍵
switch(kshift)
{
case 1: dig0--;
if(dig0==-1)dig0=9;
break;
case 2: dig1--;
if(dig1==-1)dig1=9;
break;
case 3: dig2--;
if(dig2==-1)dig2=9;
break;
}
break;
default:break;
}
}
if(kmode==1) //把顯示的溫度值上限保存一下
{
dig0_u=dig0;
dig1_u=dig1;
dig2_u=dig2;
dig3_u=dig3;
}
else if(kmode==2) //把顯示的溫度值下限保存一下
{
dig0_d=dig0;
dig1_d=dig1;
dig2_d=dig2;
dig3_d=dig3;
}
key=0;
}
/**********定時中斷每隔一段時間采集一次當前溫度******/
void time0() interrupt 1
{
uchar cnt;
TH0=0x3c; //重賦初值
TL0=0xb0;
if(!cnt)
{
ReadTemp();
}
cnt++;
if(cnt==4)cnt=0; //50ms*4=1/5s采集一次溫度值
}
|