×
单片机 > 单片机程序设计 > 详情

51单片机蓝牙空气质量PM2.5检测设计

发布时间:2020-06-05 发布时间:
|

享一个很好的蓝牙+PM2.5空气质量+DHT11温湿度上下限报警的设计,主控芯片是51单片机.

实物图:
 

仿真原理图如下
 

元件列表:

Comment

Designator

LibRef

Quantity

蜂鸣器

BUUZER

BUZZER

1

电解电容

C1

10uF

1

电解电容

C2

220uF

1

瓷片电容

C3, C4

18pF

2

电解电容

C5

470uF

1

瓷片电容

C6

104

1

排针

DC 5V

Header 2

2P

触点开关

JIA, JIAN,RESET

SW-PB

3

液晶

LCD1602

LCD1602

1

发光二极管

LED1, POWER

SI3317-H

2

灰尘传感器

PM1

GP2Y1010AU

1

温湿度传感器

U3

dht11

1

三极管

Q1

S8550

1

排阻

R1

4.7K

1

电阻

R2, R4, R5, R6

2K

5

电阻

R10

150

1

电阻

R3

10K

1

自锁开关

SW1

SW-SPDT

1

单片机座

U1

DIP-40

1

单片机

U1

STC89C52

1

A/D模数转换芯片

U2

ADC0832

1

晶振

Y1

11.0592M

1



Altium Designer画的空气质量+dht11检测系统原理图和PCB图如下:(51hei附件中可下载工程文件)

单片机源程序如下:

#include"LCD1602.h"  //添加LCD1602头文件

#include"dht11.h"          //添加DHT11头文件

#include"adc0832.h"

#include

sbit BUZZER = P1^3;         //蜂鸣器驱动端口==P1^3

sbit Reduc  = P3^2;         //按键键输入端口==P1^7

sbit Add = P3^3;         //按键加输入端口==P3^1

sbit Mode = P3^4;         //按键加输入端口==P3^1

sbit LED1=P2^0;

sbit LED2=P2^1;

uchar Rx_buf[4],Rxnum=0;

uchar T1L=15,T1H=35,R1L=30,R1H=80;

void InitUART(void)                         //这是串口的基本配置,配置他的波特率是9600.这些参数都是标准的。

{

    TMOD = 0x20;

    SCON = 0x50;

    TH1 = 0xFD;

    TL1 = TH1;

    PCON = 0x00;

    EA = 1;

    ES = 1;

    TR1 = 1;

}


/*

* UART 发送一字节

*/

void UART_send_byte(char dat)

{

        SBUF = dat;

        while (TI == 0);

        TI = 0;

}


/*

* UART 发送字符串

*/

void UART_send_string(unsigned char *buf)

{

        while (*buf != '')

        {

                UART_send_byte(*buf++);

        }

}

/************************************************

** 函数名称 : void main(void)

** 函数功能 : 主函数

** 输    入 : 无

** 输    出 : 无

** 说    明 :

************************************************/

void main(void)

{

        double PM,pm1,pm2;

        int PMVAL=0,HPM=200,PM_count=0,pm1_count=0;

        uchar T1_data=0,R1_data=0,T2_data=0,R2_data=0;//温度、湿度变量

        uchar shezhi_flag=1,Mode_flag=1,n=1;//设置变量

        uchar bueezr_flag=0,count=0,buzzer_time=9;//蜂鸣器报警变量

        uint Mode_count=0; 

        uchar disp[16]  ={"PM2.5:0000ug/m3 "};

        uchar disp1[16]= {"T :00C    RH:00%"}; 

        uchar Tx_Buf[15];

         InitUART();                        //初始化串口                                          

        LCD_Init();

    WriteChar(1,0,16,disp); //在第一行显示‘内容’

        WriteChar(2,0,16,disp1); //在第二行显示‘内容’

        while(1)

        {

                

                T1_data=Read_TRH(0,0);//温度

                disp1[3]=T1_data/10+0x30;//十位

                disp1[4]=T1_data%10+0x30;//个位


                R1_data=Read_TRH(1,0);//湿度

                disp1[13]=R1_data/10+0x30;//十位

                disp1[14]=R1_data%10+0x30;//个位

                                                                          

                pm1+=read_data(1);

                if(++PM_count>=20)

                {

                          PM_count=0;

                           pm1=pm1/20;

                        pm2+=pm1;

                        pm1=0;

                        if(++pm1_count>=5)

                        {

                                pm1_count=0;

                                PM=pm2/5;

                                PM=PM*50/255;

                                PM-=4;

                            PM/=5;

                                PM*=1000;

                                PMVAL=PM;

                                PMVAL+=235;        PMVAL=PMVAL/9;

                                if(PMVAL>=9999)PMVAL=9999;

                                WriteCOMDATA(0x86,0);

                                if(PMVAL<0)//PMVAL=0;

                                {WriteCOMDATA(0+0x30,1);PMVAL=abs(PMVAL);}

                                else WriteCOMDATA(PMVAL/1000+0x30,1);

                                WriteCOMDATA(PMVAL/100%10+0x30,1);

                                WriteCOMDATA(PMVAL/10%10+0x30,1);

                                WriteCOMDATA(PMVAL%10+0x30,1);

                                PM=pm1=pm2=0;

                        }

                }


                /*调用报警函数,温湿度是否在设定范围内*/

                //温度值与报警值比较

                if(T1_data

                {

                        bueezr_flag=1;//报警标志位置1

                }

                else if(T1_data>T1H)

                {

                        bueezr_flag=1;//报警标志位置1

                } 

                //湿度值与报警值比较

                if(R1_data

                {

                        bueezr_flag=1;//报警标志位置1

                }

                else if(R1_data>R1H)

                {

                        bueezr_flag=1;//报警标志位置1

                }

                //PM值与报警值比较

                if(PMVAL>HPM)

                {        

                        bueezr_flag=1;

                } 

                if(T1_data>T1L&&T1_dataR1L&&R1_data

                {


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多