找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 863|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

溫濕度藍(lán)牙煙霧光照

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:918728 發(fā)表于 2024-4-2 17:03 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
#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;//系統(tǒng)定時(shí)
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;//模式
//主函數(shù)
uchar gCount=0;                                                                // 全局計(jì)數(shù)變量
uchar gIndex;                                                                        // 亮度變量,0是最暗,9是最亮,一共10檔
uint  gTime=0;                                                                // 計(jì)時(shí)變量,用于計(jì)時(shí)多久沒(méi)檢測(cè)到有人
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;
/*********************************************************/
// 定時(shí)器初始化
/*********************************************************/
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;                                //打開(kāi)定時(shí)器0中斷允許開(kāi)關(guān)
    TR0 = 1;                                //打開(kāi)定時(shí)器0定時(shí)開(kāi)關(guān)
}
/**********************************************************************************************************
**函數(shù)名稱 :uart1_send(unsigned char buf)
**函數(shù)描述 :uart發(fā)送函數(shù)
**輸    入 :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';                                                //將庫(kù)存數(shù)據(jù)送往發(fā)送數(shù)組,送給藍(lán)牙模塊讓手機(jī)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';                                                //將庫(kù)存數(shù)據(jù)送往發(fā)送數(shù)組,送給藍(lán)牙模塊讓手機(jī)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';                                                //將庫(kù)存數(shù)據(jù)送往發(fā)送數(shù)組,送給藍(lán)牙模塊讓手機(jī)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';                                                //將庫(kù)存數(shù)據(jù)送往發(fā)送數(shù)組,送給藍(lán)牙模塊讓手機(jī)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] ='!';               
}
/*********************************************************/
// 是否需要報(bào)警判斷
/*********************************************************/
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;       
                }
                //報(bào)警
                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;       
}
/*********************************************************/
// 按鍵掃描,用于設(shè)置報(bào)警范圍
/*********************************************************/
void keyscan()
{
        if(!k1)                 //設(shè)置
                {
                        if(mode<3)
                                mode++;
                        else
                                mode=0;
                        while(!k1);
                }
                if(mode>0)//上下限設(shè)置
                {
                        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);
                        }
                }
}
/*********************************************************/
// 自動(dòng)控制
/*********************************************************/
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;
}
/*********************************************************/
// 主函數(shù)
/*********************************************************/
void main()
{
        unsigned char i;
        disp1[2]=0xdf;
        init_1602();       
  TimerInit();
        while(1)
        {
                for(i=0;i<20;i++)
                {
                        number();
                        keyscan();
                        AlarmJudge();
                        AutoControl(guangzhao);                        // 進(jìn)行自動(dòng)控制       
                        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);
                }               
        }
}
//定時(shí)器中斷
void Timer0() interrupt 1
{       
        uint i,j;
        if(sec>0)  //蜂鳴器驅(qū)動(dòng)
        {
                sec--;
                beep=0;
        }
        else
                beep=1;
       
        gCount++;                                                        // 每1毫秒,gCount變量加1
        if(gCount>=10)                                // 如果gCount加到10了
        {
                gCount=0;                                                // 則將gCount清零,進(jìn)入新一輪的計(jì)數(shù)
                if(gIndex!=0)                                // 如果說(shuō)臺(tái)燈不是最暗的(熄滅)
                {
                        Led_P=0;                                                // 則把臺(tái)燈點(diǎn)亮
                }
        }
        if(gCount==gIndex)                // 如果gCount計(jì)數(shù)到和gIndex一樣了
        {
                if(gIndex!=9)                                // 如果說(shuō)臺(tái)燈不是最亮的
                {
                        Led_P=1;                                                // 則把臺(tái)燈熄滅
                }
        }       
       
        if(time<19)//0.5s
                time++;
        else
        {
                time=0;
                YAN=ADC(2);//測(cè)量煙霧
                i=YAN;
                YAN=i*99/127;
                guangzhao=ADC(1);//測(cè)量煙霧
                j=guangzhao;
                guangzhao=j*99/127;               
                dht11_recive();//測(cè)量溫濕度
                //顯示
                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 //處理接收的串口數(shù)據(jù)
{
   static unsigned char tmp;
    ES=0;  
    if(RI)                                      //接收到字節(jié)
    {
        tmp = SBUF;

        if(tmp == 0x01)
        {
            tx_flag = 1;
        }
        RI = 0;                                 //手動(dòng)清零接收中斷標(biāo)志位
    }
       
    ES=1;         
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表