基于单片机的室内环境检测_第1页
基于单片机的室内环境检测_第2页
基于单片机的室内环境检测_第3页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

一、设计任务LCD二、方案设计硬件设计在室内环境监测硬件设计上,由单片机(AT89C52)控制整个系统的运作,MQ211气敏传感器模块实现监测室内可燃气体功能、SHT11温湿度传感器模块实现监测室内的温度和湿度功能、按键模块实现设置报警上限功能、LCD液晶模块实现显示功能、蜂鸣器报警功能。这六大模块组成的原理图来实现家庭环境检测系统的各个功能。在该设计中,选用了AT89C52单片机作为控制芯片。该芯片有丰富的内部资源,丰富的I/OCSHT11A/DA/D转换模块选用ADC0831,具有接口电1.图1系统硬件结构图芯片管脚连接在该设计电路中,用单片机I/O口中的P1口作为LCDP2.0P2.1P2.2作为控制信号输出口,分别接LCDRS、R/W、EP2.4SHT11SCKP2.6和P2.7P1P1.1、P1.2分别接ADC0831P1.4图2STC89C52管脚分布图晶振和复位电路片机来说,是程序还没有开始执行,是在做准备工作。晶振电路和复位电路见图3.

图3晶振和复位电路MQ2114.图4气敏传感器的连接温湿度传感器传感器SHT11将温度感测、湿度感测、信号变换、A/D转换和加热器等功能集成到一个514位的A/D转换器,最后经过二线串行数字接口输出数字信号。5温湿度传感器内部结构6温湿度传感器指令代码图7温湿度传感器电路LCD在该设计中,LCD要显示温度、湿度、可燃气体是否超标的功能,所以使用了一块行列点阵数为128*64,每行可以显示8个字符,共显示2行字的LCD。图8LCD管脚名称和功能LCDLCD8个数据送到芯片,而LCD3LCDLCD9图9LCD连接电路按键电路块10S1S3断开时,端口P2.5P2.6P2.7S1S2S3合上时,端口P2.5P2.6P2.7

图10按键电路图11,在本系统中,采用P1.4图11报警电路软件设计在上述硬件基础上,编写系统程序,实现以下几项功能:当室内温度大于设定的温度、湿度(28度、湿度80气体超标时,蜂鸣器报警。上限值,4次按设置按键,退出设置状态。软件系统设计系统的软件设计采用CSHT11ADC083112图12软件结构方框图主程序设计LCD1602SHT11三、程序代码#include<REG51.H>#include<intrins.h>#include<LCD1602.h>#include<sht10.h>#include<adc0831.h>#defineucharunsigned#defineuintunsignedintUnsignedcharTempBuffer[5];Ucharhumibuffer[4];Ucharqitibuffer[3];Voidmainwendu_to_str(){inti;intTempBuffer[5];for(i=0;i<5;i++)Tempbutter[i]=i;Tempbutter[0]=(SHUO[xts_zi]);Tempbutter[1]=(SHUO[xtg_zi]);Tempbutter[2]=0xdf;Tempbutter[3]=’C’;Tempbutter[4]=’\0’;Printf(“%d”,TempBuffer[i]);Printf(“\n”);}Voidmainshidu_to_str(){inti;for(i=0;i<4;i++)humibuffer[i]=i;humibuffer[0]=(SHUO[xzz_zi]);humibuffer[1]=(SHUO[xsg_zi]);humibuffer[2]=’%’;humibuffer[3]=’\0’;printf(“\n”);}Voidmainqiti_to_str(){intI;for(i=0;i<3;i++)qitibuffer[0]=b1;qitibuffer[1]=b2;qitibuffer[2]=b3;printf(“\n”);}Voidshow_LCD(){LCD_Initial();text_jishuan_temp11();data_pro();wendu_to_str();GotoXY(6,1);Print(TempBuffer);GotoXY(0,1);shidu_to_str();GotoXY(11,1);Print(“shidu”);GotoXY(17,1);Print(humibuffer);GotoXY(13,0);Print(qitibuffer);}csh(){P2.0=0;}main(){csh();show_LCD();delay_n10us(100000);}LCD显示屏驱动程序1602.h#ifndefLCD_CHAR_1602_2005_4_9#defineLCD_CHAR_1602_2005_4_9#include<intrins.h>sbitLcdRs=P2^0;sbitLcdRw=P2^1;sbitLcdEn=P2^2;sfrunsignedcharLCD_Wait(void){LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_();//while(DBPort&0x80);LcdEn=0;returnDBPort;}//向LCD写入命令或数据#defineLCD_COMMAND0//Command#defineLCDDATA1//DATA#defineLCD_CLEAR_SCREEN0x01 清屏#defineLCD_HOMING 0x02 光标返回原VoidLCD_Write(bitstyle,unsignedcharinput){LcdEn=0;LcdRs=style;LcdRw=0; _nop_();DBPort=input; 注意顺LcdEn=1; 注意顺序LcdEn=0; LCD_wait();}//设置显示模式#defineLCD_SHOW 0x04 显示开#defineLCD_HIDE 0x00 显示关#defineLCD_CURSOR 0x02 显示光#defineLCD_NO_CURSOR 0x00 无光标#defineLCD_FLASH 0x01 光标闪#defineLCD_NO_FLASH 0x00 光标不闪动VoidLCD_SetDisplay(unsignedcharDisplayMode){LCD_Write(LCD_COMMAND,0x08|DisplayMode);}//设置输入模式#defineLCD_AC_UP 0x02#defineLCD_AC_DOWN 0x00 //default#defineLCD_MOVE 0x01 画面可移#defineLCD_NO_MOVE 0x00 //defaultVoidLCD_SetInput(unsignedcharInputMode){LCD_Write(LCD_COMMAND,0x04|InputMode);}//移动光标或屏幕#defineLCD_CURSOR0x02#defineLCD_SCREEN0x08#defineLCD_LEFT0x00#defineLCD_RIGHT0x04VoidLCD_Move(unsignedcharobject,unsignedchardirection){if(object==LCD_CURSOR)LCD_Write(LCD_COMMAND,0x10|diriction);if(object==LCD_SCREEN)LCD_Write(LCD_COMMAND,0x18|diriction);}//初始化LCDVoidLCD_Initial(){LcdEn=0;LCD_Write(LCD_COMMAND,0x38);LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);}VoidGotoXY(unsignedcharx,unsignedchary){if(y==0)LCD_Write(LCD_COMMAND,0x80|x);if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0x40));}VoidPrint(unsignedchar*str){while(*str!=’\0’){LCD_Write(LCD_DATA,*str);str++;}}VoidLCD_LoadChar(unsignedcharuser[8],unsignedcharplace){Unsignedchari;LCD_Write(LCD_COMMAND,0x40|(place*8));for(i=0;i<8;i++)LCD_Write(LCD_DATA,user[i]);}#endif温湿度传感器驱动程序SHT11.h#include<reg51.h> #include<intrins.h>#include<stdio.h>#include<math.h> //KeilsbitDATA=P2^4; 数据sbitSCK=P2^3; 时钟#defineTEMP_ML0x03//00000011#defineHUMI_ML0x05//00000101unsignedcharerror;全局错误变量unsignedcharack;全局错误变量//floattemp_zi; 全局应答变量//floathumi_zi; unsignedchartemp_h;全局应答变量unsignedchartemp_LL;unsignedcharunsignedchar#defineucharunsignedchar#defineunitunsignedint#defineulongunsignedlongunsignedintrecs=0;//接收次数ucharTempBuffer[5];ucharhumibuffer[4];constunsignedcharintxts_zi=0;//温度值intxtg_zi=0;//intxtd_zi=0;//温度点值intxss_zi=0;//湿度值intxsg_zi=0;//intxsd_zi=0;//湿度点值sbitsoud=P1^4;//声音//基本驱动程序//系统初始化Voidstart(void) 启动{DATA=1;SCK=0; 1,SCK=0_nop_();SCK=1; 第一个脉冲DATA=0; 数据跌落_nop_();SCK=0; 完成一个脉冲_nop_();_nop_();_nop_();SCK=1;//再一个脉冲_nop_();DATA=1;//数据变为1_nop_();SCK=0; 变为该脉冲}Voidsht_rest(void) 复位{unsignedcharI;DATA=1;SCK=0; 数据为1时钟为0for(i=0;i<9;i++) //9个脉冲为复{SCK=1;SCK=0;}Start(); 启动}charwrite(unsignedcharvalue)//写一个字节返回应答信号{UnsignedcharI;ack=0;for(i=0x80;i>0;i/=2) 释放数据总线{if(i&value)DATA=1; ElseDATA=0;SCK=1; 上升沿写入_nop_();_nop_(); _nop_(); SCK=0;}DATA=1; SCK=1;returnack; //error=1}charread()//读一个字节返回应答信号{UnsignedcharI,val=0;temp_LL=0;temp_h=0;DATA=1; 释放数据总for(i=0x80;i>0;i/=2) 位移8位{SCK=1; 上升沿读if(DATA)val=(val|i) 确定值SCK=0;}DATA=0; 1,0通过CPUSCK=1; 9_nop_();_nop_(); _nop_(); //pulswithapprox.5usSCK=0;DATA=1; temp_h=val;val=0;//低8位DATA=1; 释放数据总for(i=0x80;i>0;i/=2) 位移8位{SCK=1; 上升沿读入if(DATA)val=(val|i) SCK=0;}DATA=1;//0; 不需要应答通过CPUSCK=1; 9_nop_();_nop_(); _nop_(); //pulswithapprox.5usSCK=0;DATA=1; temp_LL=valreturnval;}//测量温度或者是湿度,返回校验值text_a(unsignedcharml){unsignedintI;start(); 启动write(ml); if(ack==1){sht_rest(); 复位write(ml); 写入测温度}//DATA=1;//释放数据总线For(i=0;i<65535;i++)if(DATA==0)break;read();//度温度}text_jishuan_temp(){floataa=0,bb=0,tempzi;intabcd=0;aa=(float)temp_h*256+(float)temp_LL;temp_zi=0.01*aa-40;if(temp_zi<0){temp_zi=-temp_zi;}temp_zi=temp_zi*10;abcd=(int)temp_zi;xts_zi=abcd/100;abcd=abcd%100;xtg_zi=abcd/10;abcd=abcd%10;xtd_zi=abcd/1;}text_jishuan_humi(){floataa=0,bb=0,humi_zi;intabcd=0;aa=(float)temp_h*256+(float)temp_LL;baa*aa*2.8/1000000;aa=0.0405*aa;aa=aa-4-bb;humi_zi=humi_zi*10;abcd=(int)humi_zi;xss_zi=abcd/100;abcd=abcd%100;xsg_zi=abcd/10;abcd=abcd%10;xsd_zi=abcd/1;}text_jishuan_temp11(){error=0;ack=0;sht_rest(); text_a(TEMP_ML);text_jishuan_temp();text_a(HUMI_ML);text_jishuan_humi();}unsignedintwendu,shidu;voiddelay_n10us(unitn) n10us@12M{uinti;for(i=n;i>0;i--){_nop_();_nop_(); _nop_();_nop_();_nop_(); _nop_();}四、心得体会通过本次课程设计的学习与实践LED显示器都有了一定的了解,在设计过程中通过图书馆、网上查阅资料,自己的专业知识也有了

温馨提示

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

评论

0/150

提交评论