#include "reg51.h"
#include "ADC0832.h"
#include "DHT11.h"
#include "lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
sbit REN_P = P1^0; // 人體
sbit beep=P1^5;//蜂鳴器
sbit shuibeng=P1^7;//shuibeng
sbit fengshan=P2^0;//fengshan
sbit Led_P = P1^6; // LED燈
sbit k1=P2^1;//按鈕
sbit k2=P2^2;
sbit k3=P2^3;
sbit k4=P2^4;
sbit k5=P3^7;
uchar time=0,sec=0;//系統定時
uchar YAN=0;//煙霧
uchar guangzhao=0; // 保存光照
uchar down[]={1,15,30};//下限
uchar up[]={20,40,80};//上限
uchar disp1[]="00 ";
uchar disp2[]="00% ";
uchar mode=0;//模式
//主函數
uchar gCount=0; // 全局計數變量
uchar gIndex; // 亮度變量,0是最暗,9是最亮,一共10檔
uint gTime=0; // 計時變量,用于計時多久沒檢測到有人
unsigned char Tx_Buf[24];
unsigned char Tx_RENTI_Buf[12];
unsigned char Tx_YANWU_Buf[7];
unsigned char Tx_WENDU_Buf[7];
unsigned char Rx_buf[1];
unsigned char cmd, tx_flag = 0, cnt = 0;
/*********************************************************/
// 定時器初始化
/*********************************************************/
void TimerInit()
{
TMOD = 0x21;
SCON = 0x50;
TL0 = 0xb0;
TH0 = 0x3c; //賦初值50ms
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
ET0 = 1; //打開定時器0中斷允許開關
TR0 = 1; //打開定時器0定時開關
}
/**********************************************************************************************************
**函數名稱 :uart1_send(unsigned char buf)
**函數描述 :uart發送函數
**輸 入 :buf
**輸 出 :None
**********************************************************************************************************/
void uartx_send(unsigned char buf[])
{
unsigned char i=0;
while( buf[i] != '\0')
{
SBUF = buf[i];
delay1ms(10);
TI = 0;
i++;
}
}
void number(void)
{
Tx_Buf[0] = 'Y'; //幀頭
Tx_Buf[1] = 'W'; //將庫存數據送往發送數組,送給藍牙模塊讓手機APP顯示
Tx_Buf[2] = ':'; //
Tx_Buf[3] = YAN / 10 + 0x30; //
Tx_Buf[4] = YAN%10 + 0x30;
Tx_Buf[5] = '%';
Tx_Buf[6] = 'G'; //幀頭
Tx_Buf[7] = 'Z'; //將庫存數據送往發送數組,送給藍牙模塊讓手機APP顯示
Tx_Buf[8] = ':'; //
Tx_Buf[9] = guangzhao / 10 + 0x30; //
Tx_Buf[10] = guangzhao%10 + 0x30;
Tx_Buf[11] = '%';
Tx_Buf[12] = 'W'; //幀頭
Tx_Buf[13] = 'D'; //將庫存數據送往發送數組,送給藍牙模塊讓手機APP顯示
Tx_Buf[14] = ':'; //
Tx_Buf[15] = dht11_dat[2]/10 + 0x30; //
Tx_Buf[16] = dht11_dat[2]%10 + 0x30;
Tx_Buf[17] = 'C';
Tx_Buf[18] = 'S'; //幀頭
Tx_Buf[19] = 'D'; //將庫存數據送往發送數組,送給藍牙模塊讓手機APP顯示
Tx_Buf[20] = ':'; //
Tx_Buf[21] = dht11_dat[0] / 10 + 0x30; //
Tx_Buf[22] = dht11_dat[0]%10 + 0x30;
Tx_Buf[23] = '%';
}
void number2(void)
{
Tx_RENTI_Buf[0] ='Y';
Tx_RENTI_Buf[1] ='O';
Tx_RENTI_Buf[2] ='U';
Tx_RENTI_Buf[3] ='R';
Tx_RENTI_Buf[4] ='E';
Tx_RENTI_Buf[5] ='N';
Tx_RENTI_Buf[6] ='J';
Tx_RENTI_Buf[7] ='I';
Tx_RENTI_Buf[8] ='N';
Tx_RENTI_Buf[9] ='R';
Tx_RENTI_Buf[10] ='U';
Tx_RENTI_Buf[11] ='!';
}
void number3(void)
{
Tx_YANWU_Buf[0] ='Y';
Tx_YANWU_Buf[1] ='A';
Tx_YANWU_Buf[2] ='N';
Tx_YANWU_Buf[3] ='W';
Tx_YANWU_Buf[4] ='U';
Tx_YANWU_Buf[5] ='!';
Tx_YANWU_Buf[6] ='!';
Tx_YANWU_Buf[7] ='!';
}
void number4(void)
{
Tx_WENDU_Buf[0] ='W';
Tx_WENDU_Buf[1] ='E';
Tx_WENDU_Buf[2] ='N';
Tx_WENDU_Buf[3] ='D';
Tx_WENDU_Buf[4] ='U';
Tx_WENDU_Buf[5] ='!';
Tx_WENDU_Buf[6] ='!';
Tx_WENDU_Buf[7] ='!';
}
/*********************************************************/
// 是否需要報警判斷
/*********************************************************/
void AlarmJudge(void)
{
//判斷
if(YAN>up[0])//煙霧
{
tx_flag = 1;
number3();
uartx_send(Tx_YANWU_Buf);
fengshan=0;
}
else
{
tx_flag = 0;
fengshan=1;
}
if(dht11_dat[2]>up[1])//溫度
{
tx_flag = 1;
number4();
uartx_send(Tx_WENDU_Buf);
shuibeng=0;
}
else
{
tx_flag = 0;
shuibeng=1;
}
//報警
if((YAN<down[0])||(YAN>up[0]))
sec=10;
if((dht11_dat[2]<down[1])||(dht11_dat[2]>up[1]))
sec=10;
if((dht11_dat[0]<down[2])||(dht11_dat[0]>up[2]))
sec=10;
}
/*********************************************************/
// 按鍵掃描,用于設置報警范圍
/*********************************************************/
void keyscan()
{
if(!k1) //設置
{
if(mode<3)
mode++;
else
mode=0;
while(!k1);
}
if(mode>0)//上下限設置
{
if(!k2)
{
if(up[mode-1]<99)
up[mode-1]++;
while(!k2);
}
if(!k3)
{
if(up[mode-1]>0)
up[mode-1]--;
while(!k3);
}
if(!k4)
{
if(down[mode-1]<99)
down[mode-1]++;
while(!k4);
}
if(!k5)
{
if(down[mode-1]>0)
down[mode-1]--;
while(!k5);
}
}
}
/*********************************************************/
// 自動控制
/*********************************************************/
void AutoControl(uchar num)
{
if(num<54) // 最亮
Led_P=0;
else if((num>55)&&(num<65)) // 第三亮
gIndex=3;
else if((num>70)&&(num<75))
gIndex=5;
else if((num>80)&&(num<85))
gIndex=7;
else if((num>90)&&(num<95))
gIndex=9;
else if(num>100) // 最暗
Led_P=1;
}
/*********************************************************/
// 主函數
/*********************************************************/
void main()
{
unsigned char i;
disp1[2]=0xdf;
init_1602();
TimerInit();
while(1)
{
for(i=0;i<20;i++)
{
number();
keyscan();
AlarmJudge();
AutoControl(guangzhao); // 進行自動控制
if(REN_P==0)
{
beep=0;
tx_flag = 1;
number2();
uartx_send(Tx_RENTI_Buf);
}
else
{
tx_flag = 0;
beep=1;
}
}
if(tx_flag == 1)
{
tx_flag = 0;
uartx_send(Tx_Buf);
}
}
}
//定時器中斷
void Timer0() interrupt 1
{
uint i,j;
if(sec>0) //蜂鳴器驅動
{
sec--;
beep=0;
}
else
beep=1;
gCount++; // 每1毫秒,gCount變量加1
if(gCount>=10) // 如果gCount加到10了
{
gCount=0; // 則將gCount清零,進入新一輪的計數
if(gIndex!=0) // 如果說臺燈不是最暗的(熄滅)
{
Led_P=0; // 則把臺燈點亮
}
}
if(gCount==gIndex) // 如果gCount計數到和gIndex一樣了
{
if(gIndex!=9) // 如果說臺燈不是最亮的
{
Led_P=1; // 則把臺燈熄滅
}
}
if(time<19)//0.5s
time++;
else
{
time=0;
YAN=ADC(2);//測量煙霧
i=YAN;
YAN=i*99/127;
guangzhao=ADC(1);//測量煙霧
j=guangzhao;
guangzhao=j*99/127;
dht11_recive();//測量溫濕度
//顯示
if(mode==0)
{
write_string(1,0,"YAN:");//煙霧
disp2[0]=YAN/10+0x30;
disp2[1]=YAN%10+0x30;
write_string(1,4,disp2);
write_string(1,8,"GUA:");//光照
disp2[0]=guangzhao/10+0x30;
disp2[1]=guangzhao%10+0x30;
write_string(1,12,disp2);
write_string(2,0,"tem:");//溫度
disp1[0]=dht11_dat[2]/10+0x30;
disp1[1]=dht11_dat[2]%10+0x30;
write_string(2,4,disp1);
write_string(2,8,"hum:");//濕度
disp2[0]=dht11_dat[0]/10+0x30;
disp2[1]=dht11_dat[0]%10+0x30;
write_string(2,12,disp2);
}
if(mode==1)//煙霧
{
write_string(1,0,"YAN: ");
write_string(2,0," H:");
write_string(1,8," ");//光照
disp2[0]=up[0]/10+0x30;
disp2[1]=up[0]%10+0x30;
write_string(2,4,disp2);
write_string(2,8," L:");
disp2[0]=down[0]/10+0x30;
disp2[1]=down[0]%10+0x30;
write_string(2,12,disp2);
}
if(mode==2)//溫度
{
write_string(1,0,"temp: ");
write_string(2,0," H:");
disp1[0]=up[1]/10+0x30;
disp1[1]=up[1]%10+0x30;
write_string(2,4,disp1);
write_string(2,8," L:");
disp1[0]=down[1]/10+0x30;
disp1[1]=down[1]%10+0x30;
write_string(2,12,disp1);
}
if(mode==3)//濕度
{
write_string(1,0,"humi: ");
write_string(2,0," H:");
disp2[0]=up[2]/10+0x30;
disp2[1]=up[2]%10+0x30;
write_string(2,4,disp2);
write_string(2,8," L:");
disp2[0]=down[2]/10+0x30;
disp2[1]=down[2]%10+0x30;
write_string(2,12,disp2);
}
}
TH0=0X3C;
TL0=0XB0;
}
void UART1_irq() interrupt 4 //處理接收的串口數據
{
static unsigned char tmp;
ES=0;
if(RI) //接收到字節
{
tmp = SBUF;
if(tmp == 0x01)
{
tx_flag = 1;
}
RI = 0; //手動清零接收中斷標志位
}
ES=1;
}
|