空气质量检测仪C程序

上传人:s****a 文档编号:167770270 上传时间:2022-11-05 格式:DOCX 页数:12 大小:26.78KB
返回 下载 相关 举报
空气质量检测仪C程序_第1页
第1页 / 共12页
空气质量检测仪C程序_第2页
第2页 / 共12页
空气质量检测仪C程序_第3页
第3页 / 共12页
点击查看更多>>
资源描述
空气质量检测仪 C 程序程序代码#include<reg52.h>#include<intrins.h>#define uchar unsigned char #define uint unsigned int#define Data P0/数据端口/*1602管脚定义*/sbit RS=P2A6;sbit RW=P2A5;sbit E=P2A7;/*AD 管脚定义*/sbit STA=P3A0;sbit OE=P3A1; sbit EOC=P3A2;sbit CLK=P3A3;/*按键管脚定义*/sbit key_U=P2A0; sbit key_D=P2A1; sbit key_L=P2A2; sbit key_R=P2A3;sbit key_S=P2A4;/*报警用管脚*/sbit beep=P3A4; sbit led1=P3A5;sbit led2=P3A6;unsigned char num=O;记录设定键按下次数unsigned char k_flag=O;记录设置键按下次数(用于调用)unsigned char wei=O; 光标位置unsigned char c_num=O;记录切换键按下次数unsigned char c_flag=O;记录切换键按下次数(用于调用)unsigned char voc_ad;/AD 读取数据unsigned char flag;/DHT11 函数用到sbit DHT=P3A7;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;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_();E=1;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 位为 0x8Icd_write_com(p); 写命令 lcd_write_dat(c);/写数据 void ShowSt/*显示字符串*/ring (uchar Iine,char *ptr) unsigned char I,*p;p=ptr;I=Iine&It;&It;4;whiIe(*p)!='0') ShowChar(I+,*(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=O;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'+VOC26)*10+('0'+VOC28); voc_h=('0'+VOC19)*10+('0'+VOC111); 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'+WEN26)*10+('0'+WEN27); wen_l=('0'+WEN14)*10+('0'+WEN15); wen_h=('0'+WEN110)*10+('0'+WEN111);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'+SHI26)*10+('0'+SHI27); shi_l=('0'+SHI14)*10+('0'+SHI15); shi_h=('0'+SHI110)*10+('0'+SHI111);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();VOC1j+9=key_adddec(VOC1j+9);lcd_write_com(0x80+j+9);lcd_write_dat(VOC1j+9);elseif(key_set()=2)switch(j)case 2:j=6;break;case 3:j=7;break;WENdisp();WEN1j+4=key_adddec(WEN1j+4);lcd_write_com(0x80+j+4);lcd_write_dat(WEN1j+4);else if(key_set()=3)switch(j)case 2:j=6;break;case 3:j=7;break;SHIdisp();SHI1j+4=key_adddec(SHI1j+4);lcd_write_com(0x80+j+4); lcd_write_dat(SHI1j+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高电平2040us,并等待从机相应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;WEN26='0'+wenZ/10;WEN27='0'+wenZ%10;WEN29='0'+wenX/10;WEN210='0'+wenX%10;SHI26='0'+shiZ/10;SHI27='0'+shiZ%10;SHI29='0'+shiX/10;SHI210='0'+shiX%10;/*气体浓度检测*/*系统初始化*/void init()TMOD = 0x01; /设定定时器TO工作方式TH0=(65536-2)%256;TL0=(65536-2)/256;ET0=1; 允许TO中断EA=1; /开总中断TR0=1; /启动定时器 T0/*T0 中断服务程序*/void t0(void) interrupt 1 /using 1TH0=(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();VOC26='0'+voc_ad/51;VOC28='0'+voc_ad%51*10/51;VOC29='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();手自动切换
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!