找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求大神解释一下PM2.5程序

[复制链接]
跳转到指定楼层
楼主
ID:207993 发表于 2017-6-5 13:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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");   

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

使用道具 举报

沙发
ID:207993 发表于 2017-6-5 16:15 | 只看该作者
快来个大神帮帮忙啊
回复

使用道具 举报

板凳
ID:151348 发表于 2017-6-5 16:43 | 只看该作者
程序似乎不全、、、
回复

使用道具 举报

地板
ID:82765 发表于 2017-6-5 16:51 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

5#
ID:207993 发表于 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。他们是 线性比例关系*/                       
                                }
                        }
       
                }

        }
}
回复

使用道具 举报

6#
ID:170270 发表于 2017-6-6 13:13 | 只看该作者
从程序看 PM2.5是串口的 接受的数据按协议解析就可以
回复

使用道具 举报

7#
ID:207993 发表于 2017-6-6 19:51 | 只看该作者
依然是你 发表于 2017-6-6 13:13
从程序看 PM2.5是串口的 接受的数据按协议解析就可以

那测量光照的是什么原理  什么中断啊 求详解
回复

使用道具 举报

8#
ID:170270 发表于 2017-6-7 08:58 | 只看该作者
一个被程序折磨 发表于 2017-6-6 19:51
那测量光照的是什么原理  什么中断啊 求详解

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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