找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 218|回复: 0
打印 上一主题 下一主题
收起左侧

温湿度蓝牙烟雾光照

[复制链接]
跳转到指定楼层
楼主
ID:918728 发表于 2024-4-2 17:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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;         
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表