標(biāo)題: 求大神解釋一下PM2.5程序 [打印本頁]
作者: 一個(gè)被程序折磨 時(shí)間: 2017-6-5 13:21
標(biāo)題: 求大神解釋一下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主動(dòng)
uint pm_rateH,pm_rateL,pm_particle,pm_density,pm_URV;//低脈沖率高位。低脈沖率低位, 比率,顆粒,濃度 PM_URV pm上限值
uchar accord=0;
void Multiple_Read_BH1750(); //連續(xù)的讀取內(nèi)部寄存器數(shù)據(jù)
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");
作者: 一個(gè)被程序折磨 時(shí)間: 2017-6-5 16:15
快來個(gè)大神幫幫忙啊
作者: imxuheng 時(shí)間: 2017-6-5 16:43
程序似乎不全、、、
作者: cjjcjj1 時(shí)間: 2017-6-5 16:51
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
作者: 一個(gè)被程序折磨 時(shí)間: 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主動(dòng)
uint pm_rateH,pm_rateL,pm_particle,pm_density,pm_URV;//低脈沖率高位。低脈沖率低位, 比率,顆粒,濃度 PM_URV pm上限值
uchar accord=0;
void Multiple_Read_BH1750(); //連續(xù)的讀取內(nèi)部寄存器數(shù)據(jù)
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); //延時(shí)180ms
Multiple_Read_BH1750(); //連續(xù)讀出數(shù)據(jù),存儲(chǔ)在BUF中
dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1];//合成數(shù)據(jù),即光照數(shù)據(jù)
dis_temp=(float)dis_data/1.2;
}
}
void serial () interrupt 4
{
uchar temp_pM;
if(RI==1)
{
RI=0;
UART_Upload[accord]=SBUF; //串口接收一個(gè)數(shù)據(jù)
accord++;
if(UART_Upload[0]!=0xff) //判斷接收到的第一個(gè)數(shù)據(jù)為oxff 數(shù)據(jù)錯(cuò)誤 數(shù)組指針清零
{
accord=0;
}
if(UART_Upload[1]!=0x18)//判斷接收到的第2個(gè)為0x18 數(shù)據(jù)錯(cuò)誤 數(shù)組指針清零
{
accord=0;
}
if(accord>8) //九個(gè)數(shù)據(jù)為一組
{
accord=0; //接收完一組數(shù)據(jù)的標(biāo)志,置0 校驗(yàn)
}
if(accord==0) //接收一組數(shù)據(jù)后進(jìn)行一次校驗(yàn)和
{ //校驗(yàn)7為數(shù)據(jù)位的和取反加一等于校驗(yàn)值
if((UART_Upload[0]==0xff)&&(UART_Upload[1]=0x18)&&(UART_Upload[2]==0x00))//判斷前三位數(shù)據(jù)是否正確 是進(jìn)行校驗(yàn)
{
temp_pM=~(UART_Upload[1]+UART_Upload[2]+UART_Upload[3]+UART_Upload[4]+UART_Upload[5]+UART_Upload[6]+UART_Upload[7])+1; //校驗(yàn)和
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; //濃度數(shù)據(jù)處理 數(shù)據(jù)擴(kuò)大了十倍
/*我們繪出一個(gè)檢驗(yàn)報(bào)告,比如在345ug/m3的情況下,zph01輸出占空比34%。我們理論認(rèn)為在0-34%對應(yīng)的0-345ug/m3。他們是 線性比例關(guān)系*/
}
}
}
}
}
作者: 依然是你 時(shí)間: 2017-6-6 13:13
從程序看 PM2.5是串口的 接受的數(shù)據(jù)按協(xié)議解析就可以
作者: 一個(gè)被程序折磨 時(shí)間: 2017-6-6 19:51
那測量光照的是什么原理 什么中斷啊 求詳解
作者: 依然是你 時(shí)間: 2017-6-7 08:58
光照是集成芯片 有特定的通訊協(xié)議
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |