标题: 求大神解释一下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
#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-7 08:58
光照是集成芯片 有特定的通讯协议
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |