室内空气质量检测仪设计毕业设计论文_第1页
室内空气质量检测仪设计毕业设计论文_第2页
室内空气质量检测仪设计毕业设计论文_第3页
室内空气质量检测仪设计毕业设计论文_第4页
室内空气质量检测仪设计毕业设计论文_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

河南理工大学毕业设计(论文)说明书河南理工大学毕业设计(论文)说明书#致谢为期两个多月的毕业设计终于完成了,对我个人而言,凝聚了许多努力和汗水,也经受住了严峻的考验。和普通的课程设计不同,由于毕业设计的综合性,几乎用到所学的全部知识,而且是我第一次接触传感器的使用,对我来说这是一个全新的任务。由于基础过于薄弱,专业知识有限,浮躁的心理让我一开始举步维艰,满脑子想的就是放弃。在心理最为脆弱的时候,宋老师耐心地开导我,给我鼓励和信心,毕业设计才得以步入正轨。万事开头难,从研究课题,搜集材料,到正式投入设计,我花费了很多时间和精力。对于这次全新的设计,老师给了我很大的自由空间,可以充分发挥自己的创造思维。但是,对于很多新的尝试,我还是有所拘束。可能是性格使然吧,每当遇到问题,设计处于混沌状态时,烦躁焦虑接踵而来,让我迷失了方向。又是宋老师在最繁忙的时候,给我做细致的分析指导,让我茅塞顿开,使设计得以延续直至顺利完成。所以,在这次毕业设计中,我最感谢的是宋老师,他给我们提供一流的设计场所,还提供了许多实用的设计资料,为我们的设计提供了保障在我看来,宋老师不仅是一位态度严谨,学识渊博的优秀教师,也是一位心理调节师,他总是能在设计氛围紧张的时候,给同学们带来欢乐,缓解同学们的压力他那自信乐观的生活态度,也值得我们学习。从宋老师那里,我不仅学到了许多专业知识和实践经验,而且懂得许多做人的道理和生活的真谛,这些都是一辈子受用的财富,让我受益匪浅,终生难忘。最后,再次对宋老师表示真诚的谢意和崇高的敬意。同时也对同组同学的帮助表示衷心的感谢。附录附录硬件电气原理图附录二程序代码#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitLED1=P2人7;//定义单片机Pl口的第1位(即P1.0)为指示端sbitDQ=P2A3;〃定义DS18B20端口DQsbitBEEP=P3A4;〃蜂鸣器驱动线sbitLED2=P3A6;bitpresence,flag;bitcompare_th,compare_tl,alarm_on_off=0,temp_th,temp_tl;sbitLCD_RS=P2A4;sbitLCD_RW=P2A5;sbitLCD_EN=P2A6;unsignedcharvoc_ad;//AD读取数据/******AD管脚定义*****/sbitSTA=P3A0;sbitOE=P3A1;sbitEOC=P3A2;sbitCLK=P3A3;floattemp1;floattemp2;floatx=0,y=0;unsignedlonginta;unsignedlongintb;unsignedlongintabc;unsignedlongintab;ucharcodecdis1[]={"NiNing_Read"};ucharcodecdis2[]={""};ucharcodecdis3[]={"DS18B20ERR0R"};ucharcodecdis4[]={"PLEASECHECK"};ucharcodecdis5[]={"TEMP:"};ucharcodecdis6[]={"voc:ppm"};unsignedchardataunsignedchardataunsignedchardataunsignedchardatatemp_data[2]={0x00,0x00};unsignedchardataunsignedchardataunsignedchardataunsignedchardatatemp_alarm[2]={0x20,0x10};display[5]={0x00,0x00,0x00,0x00,0x00};//温度值显示display1[5]={0x00,0x00,0x00,0x00,0x00};//温度报警值显示unsignedchardataRomCode[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};unsignedcharcodemytab1[8]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};unsignedcharTemp,temp_comp,timecount,count;unsignedcharcrc;voidDisp_Temp_alarm(ucharaddr,ucharnum);voidspk(ucharaddr);voidset_temp_alarm();voidtemp_compare();voidbeep();voidvoc_warning();voiddelay1(intms){unsignedcharz;while(ms--){for(z=0;z<250;z++){_nop_();_nop_();_nop_();_nop_();}}}///*检查LCD忙状态*//*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。*/bitlcd_busy(){bitresult;LCD_RS=0;LCD_RW=1;LCD_EN=1;delayNOP();result=(bit)(P0&0x80);LCD_EN=0;return(result);/*写指令数据到LCD*//*RS=L,RW=L,已=高脉冲,D0-D7=指令码。*/voidlcd_wcmd(ucharcmd){while(lcd_busy());LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();P0=cmd;

delayNOP();LCD_EN=1;delayNOP();LCD_EN=0;/*写显示数据到LCD*//*RS=H,RW=L,已=高脉冲,D0-D7=数据。*/voidlcd_wdat(uchardat){while(lcd_busy());LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;delayNOP();LCD_EN=1;delayNOP();LCD_EN=0;}/*自定义字符写入CGRAM*/voidwritetab(){//写CGRAMunsignedchari;lcd_wcmd(0x40);for(i=0;i<//写CGRAM}/*LCD初始化设定*/voidlcd_init(){delay1(15);lcd_wcmd(0x01);voidlcd_init(){delay1(15);lcd_wcmd(0x01);lcd_wcmd(0x38);delay1(5);lcd_wcmd(0x38);delay1(5);lcd_wcmd(0x38);delay1(5);lcd_wcmd(0x0c);delay1(5);lcd_wcmd(0x06);delay1(5);lcd_wcmd(0x01);//清除LCD的显示内容//16*2显示,5*7点阵,8位数据//显示开,关光标//移动光标//清除LCD的显示内容

//自定义字符写入//自定义字符写入CGRAMwritetab();}/*设定显示位置*/voidlcd_pos(ucharpos){lcd_wcmd(pos|0x80);//数据指针=80+地址变量}/*us级延时函数*/voidDelay(unsignedintnum){while(--num);}TOC\o"1-5"\h\z/*初始化dsl820*/Init_DSl8B20(void){DQ=1;Delay(8);DQ=1;Delay(8);DQ=0;Delay(90);DQ=1;Delay(8);//稍做延时//单片机将DQ拉低//精确延时大于480us//拉高总线presence=DQ;//如果=0则初始化成功=1则初始化失败Delay(100);DQ=1;return(presence);〃返回信号,O=presence,l=nopresence}TOC\o"1-5"\h\z/*读一个字节*/ReadOneChar(void){unsignedchari=0;unsignedchardat=0;for(i=8;i>0;i--){DQ=0;//给脉冲信号dat>>=l;DQ=l;//给脉冲信号if(DQ)dat|=0x80;Delay(4);}

return(dat);}/*写一个字节*/WriteOneChar(unsignedchardat){unsignedchari=0;for(i=8;i>0;i--){DQ=0;DQ=dat&0x01;Delay(5);DQ=1;dat>>=1;}}/*温度报警值写入DS18B20*/Write_Temperature_alarm(void){//跳过读序号列号的操作//将设定的温度报警值写入DS18B20////跳过读序号列号的操作//将设定的温度报警值写入DS18B20//写TH//写TL//12位精确度//跳过读序号列号的操作//把暂存器里的温度报警值拷贝到EEROMWriteOneChar(0xCC);WriteOneChar(0x4e);WriteOneChar(temp_alarm[0]);WriteOneChar(temp_alarm[1]);WriteOneChar(0x7f);Init_DS18B20();WriteOneChar(0xCC);WriteOneChar(0x48);*//*读取64位序列码*/Read_RomCord(void){unsignedcharj;Init_DS18B20();WriteOneChar(0x33);//读序列码的操作for(j=0;j<8;j++){RomCode[j]=ReadOneChar();}}/*DS18B20的CRC8校验程序*/ucharCRC8()uchari,x;ucharcrcbuff;crc=0;for(x=0;x<8;x++){crcbuff=RomCode[x];for(i=0;i<8;i++){if(((crc人crcbuff)&0x01)==0)crc>>=1;else{crcA=0x18;〃CRC=X8+X5+X4+1crc>>=1;crc|=0x80;}crcbuff>>=1;}}returncrc;}/*数据转换与显示*/Disp_RomCode(ucharH_num){ucharj;if(H_num==1)lcd_pos(0x00);if(H_num==2)lcd_pos(0x40);for(j=0;j<8;j++){Temp=RomCode[j];display[0]=((Temp&0xf0)>>4);if(display[0]>9){display[0]=display[0]+0x37;}else{display[0]=display[0]+0x30;}lcd_wdat(display[0]);//高位数显示display[1]=(Temp&0x0f);if(display[1]>9){display[1]=display[1]+0x37;}else{display[1]=display[1]+0x30;}lcd_wdat(display[1]);//低位数显示}}TOC\o"1-5"\h\z/*读取温度*/Read_Temperature(void)uchari;TR0=0;Init_DS18B20();WriteOneChar(0xCC);WriteOneChar(0x44);Init_DS18B20();WriteOneChar(0x55);//关中断,防止读数错误//跳过读序号列号的操作//启动温度转换//匹配ROM命令for(i=0;i<8;i++)WriteOneChar(RomCode[i]);WriteOneChar(0xBE);//读取温度寄存器temp_data[0]=ReadOneChar();//温度低8位temp_data[1]=ReadOneChar();//温度高8位temp_alarm[0]=ReadOneChar();//温度报警THtemp_alarm[1]=ReadOneChar();//温度报警TLtemp_comp=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);〃取温度整数值/**********AD车专换函数**********/STA=0;OE=0;STA=1;〃启动AD转换_nop_();STA=0;while(EOC==1);{OE=1;voc_ad=P1;OE=0;}TR0=1;//开中断/*数据转换与温度显示*/Disp_Temperature(){uchars=0;if(temp_data[1]>127)//温度为负值{temp_data[0]=(~temp_data[0])+1;//取反加一,将补码变成原码if((~temp_data[0])>=0xff)temp_data[1]=(~temp_data[1])+1;elsetemp_data[1]=~temp_data[1];s=1;}display[4]=temp_data[0]&0x0f;display[0]=(display[4]*10/16)+0x30;display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);display[3]=display[4]/100+0x30;display[1]=display[4]%100;display[2]=display[1]/10+0x30;display[1]=display[1]%10+0x30;display[2]=display[1]/10+0x30;display[1]=display[1]%10+0x30;//高位为0,不显示if(display[3]==0x30){display[3]=0x20;if(display[2]==0x30)display[2]=0x20;}if(s)

//次高位为0,不显示display[3]=0x2d;lcd_pos(0x07);lcd_wdat(display[3]);lcd_wdat(display[2]);lcd_wdat(display[1]);lcd_wdat('.');lcd_wdat(display[0]);lcd_wdat(0x00);lcd_wdat('C');temp1=voc_ad;temp1=temp1*(4560/255);a=temp1;//显示负号//百位数显示//十位数显示//个位数显示//小数位数显示//显示自定义字符//显示C//5V参考电压x=a/1000+((a/100)%10)*0.1+((a%100)/10)*0.01+(a%10)*0.001;b=y;display1[4]=b/10000+0x30;display1[3]=(b%10000)/1000+0x30;display1[2]=(b%1000)/100+0x30;display1[1]=(b%100)/10+0x30;display1[0]=b%10+0x30;lcd_pos(0x48);lcd_wdat(display1[4]);lcd_wdat(display1[3]);lcd_wdat(display1[2]);lcd_wdat(display1[1]);lcd_wdat(display1[0]);abc=b;//万位数显//千位数显示//百位数显示//十位数显示//个位数显示/*蜂鸣器响一声*/voidbeep(){unsignedchary;for(y=0;y<100;y++){Delay(70);BEEP=!BEEP;//BEEP取反}BEEP=1;Delay(25000);}/*ROMCORD显示菜单//关闭蜂鸣器*/voidRomCode_Menu(){ucharm;lcd_init();lcd_pos(0);for(m=0;m<16;m++)lcd_wdat(cdis1[m]);Read_RomCord();CRC8();if(crc==0){Disp_RomCode(2);}〃初始化LCD//设置显示位置为第一行//显示字符//读取64位序列码//CRC效验//CRC效验正确//显示64位序列码}/*DS18B20ERROR显示菜单*/void{Error_Menu()ucharm;lcd_init();lcd_pos(0);for(m=0;m<16;m++)lcd_wdat(cdis3[m]);lcd_pos(0x40);for(m=0;m<16;m++)lcd_wdat(cdis4[m]);///设置显示CD置为第一行的第1个字符//显示字符//设置显示位置为第二行第1个字符//显示字符}/*DS18B20正常显示菜单*/voidNatural_Menu(){ucharm;lcd_init();lcd_pos(0);for(m=0;m<16;m++)lcd_wdat(cdis5[m]);lcd_pos(0x40);for(m=0;m<16;m++)lcd_wdat(cdis6[m]);Read_Temperature();Disp_Temperature();}〃濺置显示位置为第一行的第1个字符//显示字符//设置显示位置为第二行第1个字符//显示字符//显示实时温度值//Time0中断函数voidTime0(void)interrupt1using0//50ms定时{//50ms定时TH0=0x4c;TLO=OxOO;timecount++;if(timecount>9){timecount=0;flag=~flag;}}voidt1(void)interrupt3//using1{TH1=(65536-2)%256;TL1=(65536-2)/256;CLK=~CLK;}//温度比较函数voidtemp_compare(){if(temp_comp>=temp_alarm[0]){compare_th=1;}elsecompare_th=0;if(temp_comp<temp_alarm[1]){compare_tl=1;}elsecompare_tl=0;if(compare_th){if(!alarm_on_off)//静音选择beep();count=temp_alarm[0];}if(compare_tl){if(!alarm_on_off)//静音选择beep();count=temp_alarm[1];}if(abc>1000){if(!alarm_on_off)beep();LED2=0;}//比较TH值//比较TL值}/*******数据处理********/voidADC0809_Intit(void){OE=0;STA=0;}/*主函数*/voidmain(){ucharm;TMOD=0x11;TH0=0x4c;TL0=0x00;//50ms定时TH1=(65536-2)%256;TL1=(65536-2)/256;ET1=1;//允许T0中断EA=1;//开总中断TR1=1;//启动定时器T0ET0=1;TR0=1;P0=0;P2&=0x1F;Init_DS18B20();ADC0809_Intit();Write_Temperature_alarm();//设定报警上下限温度值if(presence){Error_Menu();do{Init_DS18B20();beep();}while(presence);//显示RomCode//正常显示界面//显示RomCode//正常显示界面//读取当前温度//更新当前温度//温度上下限比较RomCode_Menu();for(m=0;m<10;m++)Delay(50000);N

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论