标题: 求大神解释一下PM2.5程序 [打印本页]

作者: 一个被程序折磨    时间: 2017-6-5 13:21
标题: 求大神解释一下PM2.5程序
#include <REGX52.H>         
#include "LCD1602.h"
#include "dht11.c"
#include "BH1750.c"  

float dis_temp;
uint dis_temp1;
uchar ms=0;
bit s0=0;

uchar UART_Upload[9];  // Upload上传  accord主动
uint pm_rateH,pm_rateL,pm_particle,pm_density,pm_URV;//低脉冲率高位。低脉冲率低位, 比率,颗粒,浓度  PM_URV  pm上限值
uchar  accord=0;
void  Multiple_Read_BH1750();      //连续的读取内部寄存器数据

void display()
{

   LCD1602_write(0,0x80);
   LCD1602_writebyte("PM2.5:");
   LCD1602_write(1,0x30+pm_density/1000%10);   
   LCD1602_write(1,0x30+pm_density/100%10);   
   LCD1602_write(1,0x30+pm_density/10%10);
    LCD1602_writebyte(".");      
   LCD1602_write(1,0x30+pm_density%10);   
   LCD1602_writebyte("ug/m3");   






   LCD1602_write(0,0xC0);  
   dis_temp1=(uint)(dis_temp);                 
   if(dis_temp1>9999)
   LCD1602_write(1,0x30+dis_temp1/10000);
   else LCD1602_write(1,' ');
   if(dis_temp1>999) LCD1602_write(1,0x30+dis_temp1%10000/1000);
   else LCD1602_write(1,' ');
   if(dis_temp1>99)   LCD1602_write(1,0x30+dis_temp1%1000/100);
   else LCD1602_write(1,' ');
   if(dis_temp1>9)   LCD1602_write(1,0x30+dis_temp1%100/10);
   else LCD1602_write(1,' ');   
   LCD1602_write(1,0x30+dis_temp1%10);
   LCD1602_writebyte("Lx ");         


   LCD1602_write(1,0x30+U8RH_data_H/10%10);   
   LCD1602_write(1,0x30+U8RH_data_H%10);  
   LCD1602_writebyte("% ");         

   LCD1602_write(1,0x30+U8T_data_H/10%10);   
   LCD1602_write(1,0x30+U8T_data_H%10);  
   LCD1602_write(1,0xdf);     
   LCD1602_writebyte("C");   


作者: 一个被程序折磨    时间: 2017-6-5 16:15
快来个大神帮帮忙啊
作者: imxuheng    时间: 2017-6-5 16:43
程序似乎不全、、、
作者: cjjcjj1    时间: 2017-6-5 16:51
提示: 作者被禁止或删除 内容自动屏蔽
作者: 一个被程序折磨    时间: 2017-6-5 18:31
cjjcjj1 发表于 2017-6-5 16:51
你好!你的程序里面没有 PM2.5 的代码,从头文件来看,这个程序是温湿度和光照度显示的

#include <REGX52.H>         
#include "LCD1602.h"
#include "dht11.c"
#include "BH1750.c"  

float dis_temp;
uint dis_temp1;
uchar ms=0;
bit s0=0;

uchar UART_Upload[9];  // Upload上传  accord主动
uint pm_rateH,pm_rateL,pm_particle,pm_density,pm_URV;//低脉冲率高位。低脉冲率低位, 比率,颗粒,浓度  PM_URV  pm上限值
uchar  accord=0;
void  Multiple_Read_BH1750();      //连续的读取内部寄存器数据

void display()
{
        
   LCD1602_write(0,0x80);
   LCD1602_writebyte("PM2.5:");
   LCD1602_write(1,0x30+pm_density/1000%10);   
   LCD1602_write(1,0x30+pm_density/100%10);   
   LCD1602_write(1,0x30+pm_density/10%10);
    LCD1602_writebyte(".");      
   LCD1602_write(1,0x30+pm_density%10);   
   LCD1602_writebyte("ug/m3");   
                                                               
   



                  
   LCD1602_write(0,0xC0);  
   dis_temp1=(uint)(dis_temp);                 
   if(dis_temp1>9999)
   LCD1602_write(1,0x30+dis_temp1/10000);
   else LCD1602_write(1,' ');
   if(dis_temp1>999) LCD1602_write(1,0x30+dis_temp1%10000/1000);
   else LCD1602_write(1,' ');
   if(dis_temp1>99)   LCD1602_write(1,0x30+dis_temp1%1000/100);
   else LCD1602_write(1,' ');
   if(dis_temp1>9)   LCD1602_write(1,0x30+dis_temp1%100/10);
   else LCD1602_write(1,' ');   
   LCD1602_write(1,0x30+dis_temp1%10);
   LCD1602_writebyte("Lx ");         
   
   
   LCD1602_write(1,0x30+U8RH_data_H/10%10);   
   LCD1602_write(1,0x30+U8RH_data_H%10);  
   LCD1602_writebyte("% ");          
     
   LCD1602_write(1,0x30+U8T_data_H/10%10);   
   LCD1602_write(1,0x30+U8T_data_H%10);  
   LCD1602_write(1,0xdf);     
   LCD1602_writebyte("C");   
   
   
                                
}

void UART_Init(void)
{
T2CON = 0x34;
RCAP2H = 0xFF;
RCAP2L = 0xDC;
TH2 = 0xFF;
TL2 = 0xDC;
TR2 = 1;      
SCON = 0x50;
ES = 1;  
}

void main()
{
    UART_Init();
        Init_BH1750();      //初始化BH1750     
        TMOD=0x01;
        TH0=0x3C;
        TL0=0xb0;
        ET0=1;
        TR0=1;
        EA=1;
          
    LCD1602_cls();
   while(1)
    {
           RH();  
           display();
                  
        }
}







void time0() interrupt 1
{
   TH0=0x3C;
   TL0=0xb0;
   ms++;
   if(ms>=20)
            {
        ms=0;
              Single_Write_BH1750(0x01);   // power on
                Single_Write_BH1750(0x10);   // H- resolution mode
                delay_nms(80);               //延时180ms
                 Multiple_Read_BH1750();      //连续读出数据,存储在BUF中
                dis_data=BUF[0];
                dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据
                dis_temp=(float)dis_data/1.2;                           

         }
      
     
}


void serial () interrupt 4
{
        uchar temp_pM;
        if(RI==1)
        {
                RI=0;
                UART_Upload[accord]=SBUF; //串口接收一个数据
                accord++;
                if(UART_Upload[0]!=0xff)  //判断接收到的第一个数据为oxff  数据错误 数组指针清零
                {
                        accord=0;
                }
                if(UART_Upload[1]!=0x18)//判断接收到的第2个为0x18  数据错误 数组指针清零
                {
                        accord=0;
                }
                if(accord>8)                 //九个数据为一组
                {
                        accord=0; //接收完一组数据的标志,置0 校验         
                }               
                if(accord==0)                //接收一组数据后进行一次校验和
                {                                         //校验7为数据位的和取反加一等于校验值
                        if((UART_Upload[0]==0xff)&&(UART_Upload[1]=0x18)&&(UART_Upload[2]==0x00))//判断前三位数据是否正确 是进行校验
                        {       
                                temp_pM=~(UART_Upload[1]+UART_Upload[2]+UART_Upload[3]+UART_Upload[4]+UART_Upload[5]+UART_Upload[6]+UART_Upload[7])+1;        //校验和
                                  if(temp_pM=UART_Upload[8])
                                {
                                        pm_rateH=UART_Upload[3];
                                        pm_rateL=UART_Upload[4];
                                        pm_density=(UART_Upload[3]*100+UART_Upload[4])*1.014705; //浓度数据处理          数据扩大了十倍
                                        /*我们绘出一个检验报告,比如在345ug/m3的情况下,zph01输出占空比34%。我们理论认为在0-34%对应的0-345ug/m3。他们是 线性比例关系*/                       
                                }
                        }
       
                }

        }
}
作者: 依然是你    时间: 2017-6-6 13:13
从程序看 PM2.5是串口的 接受的数据按协议解析就可以
作者: 一个被程序折磨    时间: 2017-6-6 19:51
依然是你 发表于 2017-6-6 13:13
从程序看 PM2.5是串口的 接受的数据按协议解析就可以

那测量光照的是什么原理  什么中断啊 求详解
作者: 依然是你    时间: 2017-6-7 08:58
一个被程序折磨 发表于 2017-6-6 19:51
那测量光照的是什么原理  什么中断啊 求详解

光照是集成芯片 有特定的通讯协议




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1