#include "reg51.h"
#include "intrins.h"
#include "DHT11.h"
#include "1602.h"
#define uchar unsigned char
#define uint unsigned int
sbit led1=P2^2;//指示燈
sbit led2=P2^3;
sbit led3=P2^4;
sbit led7=P3^6; //預約
sbit led8=P3^5; //快慢燉切換
sbit led9=P3^7; //保溫
sbit led10=P3^4; //工作指示燈
sbit heat=P2^1;//加熱器
sbit beep=P2^0;//蜂鳴器
sbit shaogan=P3^3;//燒干檢測
sbit CLK= P3^0;//時鐘,初始狀態為0
sbit DI= P3^1;//數據輸入
sbit DO= P3^1;// 數據輸出
sbit CS= P2^5;
uint current=0;//存儲電流
uint time=0;
uchar pwm=0;//輸出功率控制
uchar mode=0;//模式
uchar shi1=0,fen1=1,shi2=0,fen2=1,miao=0;//煮飯時間+預約時間
uint sec=0;
uchar start=0;
uchar key=0,num=0;
uint k_flag;
bit flag;
uchar wendu,shidu;//溫度、濕度值
//延時
void delay(uint i)
{
while(i--);
}
//ms延時
void delay_ms(uint i)
{
while(i--)
delay(110);
}
/*********************************************
讀取ADC
**********************************************/
uchar ADC()//通道ch0
{
uchar temp0,temp1,i;
CS=0;
temp0=0;
temp1=0;
_nop_();
_nop_();
DI=1;//開始位
_nop_();
_nop_();
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
DI=0;
_nop_();
_nop_();
//選擇通道0
DI=1;
_nop_();
CLK=1;//上升沿DI=1
_nop_();
CLK=0;//1個下降沿DI=1
_nop_();
DI=0;
_nop_();
CLK=1;
_nop_();
CLK=0;//第3個上升沿DI=0
_nop_();
DI=1;
///********通道選擇結束開始讀取轉換后的二進制數****
//下降沿讀數,一下進行判斷和處理,共8次
for(i=0;i<8;i++)
{
temp0=temp0<<1;
CLK=1;
if(DO)
temp0++;
_nop_();
CLK=0;
}
for(i=0;i<8;i++)
{
temp1=temp1>>1;
CLK=1;
if(DO)
temp1=temp1 +0x80;
_nop_();
CLK=0;
}
CS=1;
return temp0;
}
//蜂鳴器
void buzzr()
{
beep=0;
delay_ms(500);
beep=1;
delay_ms(500);
beep=0;
delay_ms(500);
beep=1;
delay_ms(500);
beep=0;
delay_ms(500);
beep=1;
delay_ms(500);
beep=0;
delay_ms(500);
beep=1;
}
//按鍵檢測
uchar key_scan()
{
uchar i,j;
i=0;
j=0;
P1=0x0f;
if(P1!=0x0f) //檢測有無按下
{
switch(P1)//檢測行
{
case 0x0e:
i=1;
break;
case 0x0d:
i=5;
break;
case 0x0b:
i=9;
break;
case 0x07:
i=13;
}
P1=0xf0;
switch(P1)//檢測列
{
case 0xe0:
j=0;
break;
case 0xd0:
j=1;
break;
case 0xb0:
j=2;
break;
case 0x70:
j=3;
}
}
if(i+j !=key)
{
key=i+j;
return i+j;
}
else
return 0;
}
//主函數
void main()
{
uchar i;
TMOD|=0X01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
ET0=1;//打開定時器0中斷允許
EA=1;//打開總中斷
TR0=1;//打開定時器
LCD_Initial();
while(1)
{
while(current>110)//過流
{
heat=1;
beep=~beep;
}
if(current<50) //解除報警
{
beep=1;
}
// LCD_SramChar(13,2,current/100%10+0x30); //顯示電流
// LCD_SramChar(14,2,current/10%10+0x30);
// LCD_SramChar(15,2,current%10+0x30);
//點亮指示燈
switch(mode/2)
{
case 5:
led1=0;
led2=0;
led3=1;
break;
case 4:
led1=0;
led2=1;
led3=0;
break;
case 3:
led1=0;
led2=1;
led3=1;
break;
case 2:
led1=1;
led2=0;
led3=0;
break;
case 1:
led1=1;
led2=0;
led3=1;
break;
case 0:
led1=1;
led2=1;
led3=0;
}
//顯示
if(led7==0) //yuyue
{
LCD_WriteString(0,1,"Yu Yue:");
LCD_SramChar(8,1,shi2/10+0x30); //初始設定的時間
LCD_SramChar(9,1,shi2%10+0x30);
LCD_SramChar(10,1,':');
LCD_SramChar(11,1,fen2/10%10+0x30); //初始設定的時間
LCD_SramChar(12,1,fen2%10+0x30);
LCD_SramChar(13,1,':');
LCD_SramChar(14,1,miao/10+0x30); //初始設定的時間
LCD_SramChar(15,1,miao%10+0x30);
}
else
{
if(led10==0)
{
LCD_WriteString(0,1,"ShiJian:");
LCD_SramChar(8,1,shi1/10+0x30); //初始設定的時間
LCD_SramChar(9,1,shi1%10+0x30);
LCD_SramChar(10,1,':');
LCD_SramChar(11,1,fen1/10%10+0x30); //初始設定的時間
LCD_SramChar(12,1,fen1%10+0x30);
LCD_SramChar(13,1,':');
LCD_SramChar(14,1,miao/10+0x30); //初始設定的時間
LCD_SramChar(15,1,miao%10+0x30);
}
else
{
LCD_WriteString(0,1," dianfanguo");
}
}
LCD_WriteString(0,2,"WD:");
LCD_SramChar(3,2,wendu/10+0x30); //顯示溫度
LCD_SramChar(4,2,wendu%10+0x30);
LCD_WriteString(7,2,"SD:");
LCD_SramChar(10,2,shidu/10+0x30); //顯示濕度
LCD_SramChar(11,2,shidu%10+0x30);
i=key_scan();//按鍵檢測
if((i<7)&&(i>0)) //選擇
{
if(led8==1)//慢燉
{
mode=(i-1)*2;
}
else
{
mode=(i-1)*2+1;
}
}
if(i==7)//快燉
{
led8=0;
if(mode%2==0)
mode++;
}
if(i==8)//慢燉
{
led8=1;
if(mode%2==1)
mode--;
}
if(i==9)//保溫
{
led9=!led9;
}
if(i==10)//預約
{
led7=!led7;
}
if(i==11)//啟動
{
start=1;
led10=0;
}
if(i==12)//停止
{
start=0;
led9=1;
led10=1;
shi1=0;
fen1=1;
shi2=0;
fen2=0;
miao=0;
beep=1;
}
if(shaogan==0)//燒干
beep=0;
else
{
beep=1;
}
//設置
if(led7==0)
{
if(i==13)//小時
{
if(shi2<23)
shi2++;
}
if(i==14)
{
if(shi2>0)
shi2--;
}
if(i==15)//分鐘
{
if(fen2<59)
fen2++;
}
if(i==16)
{
if(fen2>0)
fen2--;
}
else
{
if(i==13)//小時
{
if(shi1<23)
shi1++;
}
if(i==14)
{
if(shi1>0)
shi1--;
}
if(i==15)//分鐘
{
if(fen1<59)
fen1++;
}
if(i==16)
{
if(fen1>0)
fen1--;
}
}
}
}
//定時器中斷
void Timer0() interrupt 1
{
if(start)//啟動
{
if(led7)//正常模式
{
if(led9)
{
if(sec<500)//1s
sec++;
else
{
sec=0;
if(miao>0)//倒計時
miao--;
else
{
miao=59;
if(fen1>0)
fen1--;
else
{
fen1=59;
if(shi1>0)
shi1--;
else
{
shi1=0;//結束
fen1=0;
miao=0;
led7=1;
buzzr();
led8=1;
led9=0;
}
}
}
}
}
//輸出控制
if(time<14)
time++;
else
{
time=0;
}
if(time<pwm)//占空比控制功率
heat=0;
else
heat=1;
//輸出值設置
if(!led8)
pwm=1;
else
{
pwm=mode+2;
}
}
else//預約模式
{
heat=1;
if(sec<500)//1s
sec++;
else
{
sec=0;
if(miao>0)//倒計時
miao--;
else
{
miao=59;
if(fen2>=0)
fen2--;
else
{
fen2=59;
if(shi2>0)
shi2--;
else
{
shi2=0;//結束
fen2=0;
miao=0;//啟動
led7=1;
led9=0;
}
}
}
}
}
}
else//停止
{
heat=1;
led10=1;
}
if(num<200) //測溫
num++;
else
{
num=0;
dht11_recive();
wendu=dht11_dat[2];
shidu=dht11_dat[0];
current=ADC();//電流檢測
// current = current*2;//電流修正,電路測試環節可以修改
}
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
}
|