空气质量检测仪C程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
空气质量检测仪C程序
空气质量检测仪C程序
程序代码
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define Data P0 //数据端口
/*****1602管脚定义*****/
sbit RS=P2^6;
sbit RW=P2^5;
sbit E=P2^7;
/******AD管脚定义*****/
sbit STA=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;
sbit CLK=P3^3;
/*****按键管脚定义******/
sbit key_U=P2^0;
sbit key_D=P2^1;
sbit key_L=P2^2;
sbit key_R=P2^3;
sbit key_S=P2^4;
/******报警用管脚******/
sbit beep=P3^4;
sbit led1=P3^5;
sbit led2=P3^6;
unsigned char num=0;//记录设定键按下次数
unsigned char k_flag=0;//记录设置键按下次数(用于调用) unsigned char wei=0;//光标位置
unsigned char c_num=0;//记录切换键按下次数
unsigned char c_flag=0;//记录切换键按下次数(用于调用) unsigned char voc_ad;//AD读取数据
unsigned char flag;//DHT11函数用到
/****************************/
sbit DHT=P3^7;
uchar WEN1[]="wen:16.00-28.00"; //温度第一行数据uchar WEN2[]=" 00.00 "; //温度第二行数据uchar SHI1[]="shi:30.00-70.00"; //湿度第一行数据uchar SHI2[]=" 00.00 "; //湿度第二行数据uchar VOC1[]="voc:0.00-2.70 "; //湿度第一行数据
uchar VOC2[]=" 0.00 "; //湿度第二行数据unsigned char shiZ,shiX,wenZ,wenX,check;
unsigned char tr_shiZ,tr_shiX,tr_wenZ,tr_wenX;
/*********延时*******************************/
void delay_1ms(uint x)
{
uchar i;
while(x--)
for(i=0;i<120;i++);
}
void delay_10us()
{
unsigned char i;
i--;
i--;
i--;
i--;
i--;
}
void DelayUs(unsigned char us) //--延时函数
{
unsigned char uscnt;
uscnt=us>>1; /*12MHz频率*/
while(--uscnt);
}
/*******1602显示*******************************************/ /**********写命令**********/
void lcd_write_com(uchar c)
{
delay_1ms(5);//操作前短暂延时,保证信号稳定
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
/**********写数据*************/
void lcd_write_dat(uchar c)
{
delay_1ms(5); //操作前短暂延时,保证信号稳定
E=0;
RS=1;
RW=0;
_nop_();
Data=c;
E=0;
RS=0;
}
/**********LCD初始化********/
void lcd_init()
{
delay_1ms(15);
lcd_write_com(0x38); //display mode
lcd_write_com(0x38); //display mode
lcd_write_com(0x38); //display mode
lcd_write_com(0x06); //显示光标移动位置
lcd_write_com(0x0c); //显示开及光标设置
lcd_write_com(0x01); //显示清屏
}
/*********显示单个字符**********/
void ShowChar(uchar pos,uchar c)
{
unsigned char p;
if (pos>=0x10)
p=pos+0xb0; //是第二行则命令代码高4位为0xc else
p=pos+0x80; //是第二行则命令代码高4位为0x8 lcd_write_com(p);//写命令
lcd_write_dat(c); //写数据
}
/*********显示字符串**********/
void ShowSt
ring (uchar line,char *ptr) {
unsigned char l,*p;
l=line<<4;
while((*p)!='\\0')
{
ShowChar(l++,*(p));
p++;
}
}
/*********温度显示函数***********/
void WENdisp(void)
{
ShowString(0,WEN1);
_nop_();
ShowString(1,WEN2);
}
/*********湿度显示函数***********/
void SHIdisp(void)
{
ShowString(0,SHI1);
_nop_();
ShowString(1,SHI2);
}
/*********VOC调用的显示函数***********/ void VOCdisp(void)
{
ShowString(0,VOC1);
_nop_();
ShowString(1,VOC2);
}
/***********报警用函数************/
void Beep(unsigned char i,j)//i用于确定亮灯方式,j用于确定蜂鸣器是否报警{
unsigned char m;
led1=led2=1;
for(m=0; m<250; m++)
{
switch(i)
{
case 0:break;
case 1:led1=led2=0;break;//低电平点亮
case 2:led1=0;break;
case 3:led2=0;break;
}
beep = j;
delay_1ms(2);
led1=led2=1;
beep = 0;
delay_1ms(2);
}
}
void voc_warning()
{
unsigned char voc_t;
unsigned char voc_h;
voc_t=('0'+VOC2[6])*10+('0'+VOC2[8]);
voc_h=('0'+VOC1[9])*10+('0'+VOC1[11]);
if(voc_t>voc_h)
{
Beep(1,1);
}
else Beep(0,0);
}
void wen_warning()
{
unsigned char wen_t;
unsigned char wen_h;
unsigned char wen_l;
wen_t=('0'+WEN2[6])*10+('0'+WEN2[7]); wen_l=('0'+WEN1[4])*10+('0'+WEN1[5]); wen_h=('0'+WEN1[10])*10+('0'+WEN1[11]); if(wen_t>wen_h||wen_t<wen_l)
{
Beep(2,1);
}
else Beep(0,0);
}
void shi_warning()
{
unsigned char shi_t;
unsigned char shi_h;
unsigned char shi_l;
shi_t=('0'+SHI2[6])*10+('0'+SHI2[7]);
shi_l=('0'+SHI1[4])*10+('0'+SHI1[5]);
shi_h=('0'+SHI1[10])*10+('0'+SHI1[11]);
if(shi_t>shi_h||shi_t<shi_l)
{
Beep(3,1);
}
else Beep(0,0);
}
/*******************按键***************************/ /*************进入设定功能***************/
unsigned char key_set(void)
{
if(key_S==0)
{
delay_1ms(10);
if(key_S==0)
{
while(!key_S);
num++;
k_flag=num%4;
}
else k_flag=num%4;
}
else k_flag=num%4;
return k_flag;
}
/********************调整数据******************/ unsigned char key_adddec(unsigned char dat)
{
if(key_U==0)
{
delay_1ms(10);
if(key_U==0)
{
while(!key_U);
if(dat<'9')
dat++;
else
dat='9';
}
}
if(key_D==0)
{
delay_1ms(10);
if(key_D==0)
{
while(!key_D);
if(dat>'0')
dat--;
else
dat='0';
}
}
return dat;
}
/*
**************左右移位*******************/ unsigned char key_LR()
{
if(key_L==0)
{
delay_1ms(10);
if(key_L==0)
{
while(!key_L);
if(wei==0)
wei=3;
else wei--;
}
}
if(key_R==0)
{
delay_1ms(10);
if(key_R==0)
{
while(!key_R);
if(wei==3)
wei=0;
else wei++;
}
}
return wei;
}
/*********主函数调用的按键函数*********/ void set_updn_dat(void)
{
while(key_set())
{
unsigned j=key_LR();
if(key_set()==1)
{
switch(j>0)
{
case 1:j=2;break;
case 0:j=0;break;
}
VOCdisp();
VOC1[j+9]=key_adddec(VOC1[j+9]);
lcd_write_com(0x80+j+9);
lcd_write_dat(VOC1[j+9]);
}
else
if(key_set()==2)
{
switch(j)
{
case 2:j=6;break;
case 3:j=7;break;
}
WENdisp();
WEN1[j+4]=key_adddec(WEN1[j+4]); lcd_write_com(0x80+j+4);
lcd_write_dat(WEN1[j+4]);
}
else
if(key_set()==3)
{
switch(j)
{
case 2:j=6;break;
case 3:j=7;break;
}
SHIdisp();
SHI1[j+4]=key_adddec(SHI1[j+4]); lcd_write_com(0x80+j+4);
lcd_write_dat(SHI1[j+4]);
}
}
}
/*************手动自动切换功能**************/ unsigned char key_change(void)
{
if(key_U==0)
{
delay_1ms(10);
if(key_U==0)
{
while(!key_U);
c_num++;
c_flag=c_num%4;
}
else c_flag=c_num%4;
}
else c_flag=c_num%4;
return c_flag;
}
/*************************传感器函数************************/ /**************DHT测试**************/
/******温湿度读取函数*******/
char DHTread_data()
{
unsigned char i,num,temp;
num=0;
for(i=0;i<8;i++)
{
flag=2;
while((!DHT)&&flag++);
delay_10us();
delay_10us();
delay_10us();
if(DHT==1)
{
temp=1;
flag=2;
while(DHT&&flag++);
}
else
temp=0;
num<<=1;
num|=temp;
}
return(num);
}
/********初始化及采集程序*********/
void DHTread_init()
{
DHT=0; //主机使DHT11低电平并延时至少18ms
delay_1ms(21);
DHT=1; //主机置DHT11高电平20~40us,并等待从机相应delay_10us();
delay_10us();
delay_10us();
DHT=1;
if(!DHT) //从机发出相应信号
{
flag=2;
while((!DHT)&&flag++);
flag=2;
while(DHT&&flag++); //开始采集数据tr_shiZ=DHTread_data();//采集湿度整数部分
tr_shiX=DHTread_data();//采集湿度小数部分
tr_wenZ=DHTread_data();//采集温度整数部分
tr_wenX=DHTread_data();//采集温度小数部分check=DHTread_data(); //采集校验位
DHT=1;
}
}
/*********显示测试结果*********/
void DHT11()
{
unsigned char temp;
{
DHTread_init();
temp=tr_shiZ+tr_shiX+tr_wenZ+tr_wenX;
if(check==temp)
{
shiZ=tr_shiZ;
shiX=tr_shiX;
wenZ=tr_wenZ;
wenX=tr_wenX;
}
WEN2[6]='0'+wenZ/10;
WEN2[7]='0'+wenZ%10;
WEN2[9]='0'+wenX/10;
WEN2[10]='0'+wenX%10;
SHI2[6]='0'+shiZ/10;
SHI2[7]='0'+shiZ%10;
SHI2[9]='0'+shiX/10;
SHI2[10]='0'+shiX%10;
}
}
/****************气体浓度检测************/ /*********系统初始化***********/
void init()
{
TMOD = 0x01; //设定定时器T0工作方式
TH0=(65536-2)%256;
TL0=(65536-2)/256;
ET0=1; //允许T0中断
EA=1; //开总中断
TR0=1; //启动定时器T0
}
/**********T0中断服务程序***********/ void t0(void) interrupt 1 //using 1
{
TH0=(65536-2)%256;
TL0=(65536-2)/256;
CLK=~CLK;
}
/**********AD转换函数**********/
void AD()
{
STA=0;
OE=0;
STA=1; //启动AD转换
_nop_();
STA=0;
while(EOC==1);
OE=1;
voc_ad=P1;
}
/*******数据处理********/
void VOC()
{
AD();
VOC2[6]='0'+voc_ad/51;
VOC2[8]='0'+voc_ad%51*10/51;
VOC2[9]='0'+voc_ad%51*10%51*10/51; } /************切换程序*************/
void change(void)
{
while(!key_set() && key_change())
{
unsigned k=key_change();
switch(k)
{
case 1:
VOC();
VOCdisp();
voc_warning();
break;
case 2:
DHT11();
WENdisp();
wen_warning();
break;
case 3:
DHT11();
SHIdisp();
shi_warning();
break;
}
}
}
/**********************主函数**************************/ void main()
{
lcd_init();
delay_1ms(50);
init();
num=0;
while(1)
{
DHT11();
VOC();
VOCdisp();
voc_warning();
WENdisp();
wen_warning();
SHIdisp();
shi_warning();
set_updn_dat();//调整范围值
change();//手自动切换
}
}。