神武95lg装备:硕士论文:温湿度监测系统

来源:百度文库 编辑:偶看新闻 时间:2024/05/01 10:43:37

硕士论文:温湿度监测系统


 

 

题目:     温 湿 度 监 测 系 统        


SuZhou  University
Year 2010 Bachelor Graduation Design

Title:  Temperature and humidity monitoring system
Author: Kong Xianglei       
Student ID: 2006080248   
Department: Electronic and Electronical Engineering
Major: Electrical Information Engineering
Instructotr: Li Guangyu  
Professional Title: Lecturer
 

 

March  20th, 2010

 

摘  要
                      
温湿度监测系统主要由温湿度传感器SHT11,AT89C51单片机和键盘显示电路三部分组成,采用软件编程。使其达到了整个系统的温度测量误差优于0.5℃,相对湿度测量误差优于4%的预期指标.

关键词:温度;湿度;传感器;单片机

ABSTRACT

Temperature and humidity monitoring system consists of temperature and humidity sensor SHT11,AT89C51 microcontroller and the keyboard display circuit of three components,using software programming. To achieve the overall system temperature measurement error isbetter than 0.5 ℃, relative humidity measurement error is better than 4% of the expected target.

Key words: Temperature; Humidity; Sensor; SCM


 

 

 

 

目    录

绪  论 1
1  温湿度监测系统设计原理 2
1.1  温湿度监测系统总体框图 2
1.2  设计的主要内容与要求 2
1.3  总体方案论证 2
2  硬件电路设计与计算 4
2.1  湿度采样电路 4
2.2  单片机控制部分 4
2.3   键盘及数字显示部分 5
3  软件设计 6
结  论 7
参考文献 8
附    录 9
附 录 一 9
SHT11应用程序 9
附 录 二 15
测试 15
致  谢 17

 

 

 

 

 

 
绪论
温湿度传感器在工农业生产、气象、环保等领域得到越来越广泛的应用。传统的模拟式湿度传感器一般不仅要设计信号调理电路,还要经过复杂的校准和标定过程,其测量精度难以保证。SHT11是具有二线串行接口的单片全校准数字式新型相对湿度和温度传感器,可用来测量相对湿度、温度和露点等参数,具有数字式输出、免调试、免标定、免外围电路及全互换的特点。该传感器将CMOS芯片技术与传感器技术融合,为开发高集成度、高精度、高可靠性的温湿度测控系统提供了解决方案。
  温湿度控制器将单片机与温湿度传感器等技术相结合AT89C51 单片机为主体,利用数字温湿度传感器SHT11 对环境温湿度进行检测,实现对环境温湿度的测控。
     

 

 

 

 

 


  

 

 

 


 
1  温湿度监测系统设计原理
1.1  温湿度监测系统总体框图
 
 
图1总体框图
   该系统主要由AT89C51单片机系统,温湿度采样电路,键盘显示电路等三部分组成。
1.2  设计的主要内容与要求 
本题目是设计制作一个温湿度监测系统,基本功能是能够检测出室内温度和湿度;能够显示温度、湿度;温度和湿度超过设定范围时能够报警。
主要技术参数:
1)温度检测范围 :  -20℃-+50℃
  测量精度 :       0.5℃
2 )湿度检测范围 :  10%-100%RH
 检测精度 :       1%RH
1.3  总体方案论证
本题目需要重点研究的问题:
1).温度及湿度的数据采集
2).程序的时序分析
解决问题的思路:
方案一:采用传统的传感器将温度和湿度转换成模拟的电信号,然后进行线性补偿。
方案二:采用现成的带有A/D转换功能的SHT11温湿度传感器直接输出的数字信号,与单片机通信。SHT11传感器默认的测量温度和相对湿度的分辨率分别为14位、12位,通
过状态寄存器可降至12位、8位。湿度测量范围是0~100%RH,对于12位的分辨率为0.03%RH,测温范围为- 40℃~ + 123.18℃,对于14位的分辨率为0.01℃。其测量原理是首先利用两只传感器分别产生相对湿度、温度的信号,然后经过大,分别送至A /D转换器进行模数转换、校准和纠错,最后通过二线串行接口将相对湿度及温度的数据送至微控器,再利用微控器完成非线性补偿和温度补偿。
相比方案一和二,方案二的电路简单易于操作。
3)程序的流程图分析
    由于SHT11传感器的驱动程序比较复杂,采用子程序调用的方法进行调试,在主程序中只进行函数调,这样使得程序更加明了。


 
2  硬件电路设计与计算
本系统主要由AT89C51单片机系统,温湿度采样电路,键盘显示电路等三部分组成。
  
图2 电路原理图
2.1  湿度采样电路  
   该温湿度采样电路主要由温湿度传感器SHT11组成。SHT11的性能:SHT11传感器默认的测量温度和相对湿度的分辨率分别为14位、12位,通过状态寄存器可降至12位、8位。湿度测量范围是0~100%RH,对于12位的分辨率为0.03%RH,测温范围为- 40℃~ + 123.18℃,对于14位的分辨率为0.01℃。
 
2.2  单片机控制部分
该系统的控制采用了单片机AT89C51。单片机AT89C51内部有8KB单元的程序存储器及256字节的数据存储器。因此系统不必扩展外部程序存储器和数据存储器这样大大的减少了系统硬件部分。电路原理图如图2所示:
 
图3 单片机控制电路部分原理图
2.3   键盘及数字显示部分
     设计中采用1602液晶显示器,液晶显示器程序编写容易,下图是液晶显示器与单片机接口的原理图。

 

 

 

 

 


图4 显示电路

 
3  软件设计
本次程序主要用C语言编程,较其他编程语言清楚,易懂。有主控程序和子程序组成。主要包括以下几个模块:
(1) 主程序初始化:主要完成系统上电后进行定时器和LED液晶模块,通信电路的初始化。初始化完成后,系统将正常运行,并进行
(2) 键盘扫描、显示子程序:提供人机信息交换接口,完成温湿度的上下限值的设定与显示功能。
(3)温湿度控制子程序:AT89C51比较温湿度预设值和实际值的大小。
 
 

图 5 程序流程图
结  论 
该温湿度测控系统采用SHT11为测量元件,大大简化了软硬件的设计,系统结构简单紧凑,调试安装方便,性价比极高。且由于SHT11 的极好的性能特点,提高了系统的稳定性和测量精度。SHT11 是单片集成的数字温湿度传感器,所有信号的调理由芯片完成,采用I2C 总线实现通信,并直接输出数字信号。该系统电路结构简单、检测准确、稳定性好,实现了对温湿度参数的测控。
 
 
参考文献

[1]  军勇,冀捐灶,杨宝强 基于AT89C2051的温湿度控制仪 
[2]  Sensirion 公司.SHT11 数据手册.     
[3]  孟臣, 李敏 温湿度传感器SHT11及其在单片机系统的应用 
[4]  沙占友 集成化智能传感器原理与应用.   
[5]   魏立峰 单片机原理与应用技术[M].北京:北京大学出版社
[6]  何小艇 电子系统设计.浙江:浙江大学出版社
[7]  康光华.电子技术基础(第五版) . 北京:高等教育出版社,2007年6月
[8]  王福瑞.单片微机测控系统设计大全[M].北京:北京航空航天大学出版社,1999.
[9]  谭浩强. C 程序设计[M].北京:清华大学出版社,1999 年12 月第2 版
[10] 沈任元,吴勇.常用电子元器件手册[M].机械工业出版社
 
 
附    录
附 录 一
SHT11应用程序
unsigned char t0=0,t1=0;//温度小数位、整数位
unsigned char h0=0,h1=0;//湿度小数位、整数位

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// SHT10 相关控制信号及变量
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
enum {TEMP,HUMI};//16位的数据类型
sbit DATA = P3^0;//定义通讯数据端口
sbit SCK = P3^1;//定义通讯时钟端口

unsigned char Tem[2];//温度数组,一个存整数,一个存小数
unsigned char Hum[2];//湿度数组,一个存整数,一个存小数

unsigned char error;
////////////////////////////////////////////////
//温湿度传感器地址定义
///////////////////////////////////////////////
#define noACK 0//继续传输数据,用于判断是否结束通讯
#define ACK   1//结束数据传输;
                            //adr command r/w

#define MEASURE_TEMP 0x03   //000   0001    1
#define MEASURE_HUMI 0x05   //000   0010    1
/*************************************  end SHT10 声明 **************************************/
 


/*************************************  SHT10语句 **************************************/

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//1 SHT10 温湿度写字节子程序
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
char s_write_byte(unsigned char value)
{
unsigned char i,error=0;
for (i=0x80;i>0;i/=2)             // shift bit for masking//高位为1,循环右移
{
   if (i & value)
    DATA=1;          //masking value with i , write to SENSI-BUS //和要发送的数相与,结果为发送的位
   else
    DATA=0;                       
   SCK=1;                          //clk for SENSI-BUS
   _nop_();_nop_();_nop_();        //pulswith approx. 5 us
   SCK=0;
}
DATA=1;                           //release DATA-line//释放数据线
SCK=1;                            //clk #9 for ack
error=DATA;                       //check ack (DATA will be pulled down by SHT11)//检查应答信号,确认通讯正常
SCK=0;       
return error;                     //error=1 in case of no acknowledge//error=1 通讯错误
}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//2 SHT10 温湿度读字节子程序
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
char s_read_byte(unsigned char ack)
{
unsigned char i,val=0;
DATA=1;                           //release DATA-line //数据线为高
for (i=0x80;i>0;i/=2)             //shift bit for masking//右移位
{
   SCK=1;                          //clk for SENSI-BUS
   if (DATA) val=(val | i);        //read bit //读数据线的值
   SCK=0;      
}
DATA=!ack;                        //in case of "ack==1" pull down DATA-Line//如果是校验,读取完后结束通讯;
SCK=1;                            //clk #9 for ack
_nop_();_nop_();_nop_();          //pulswith approx. 5 us
SCK=0;         
DATA=1;                           //release DATA-line//释放数据线
return val;
}


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//3 SHT10 温湿度传输其始子程序
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void s_transstart(void)
// 启动传输
//       _____         ________
// DATA:      |_______|
//           ___     ___
// SCK : ___|   |___|   |______

{
DATA=1; SCK=0;                   //Initial state
_nop_();
SCK=1;
_nop_();
DATA=0;
_nop_();
SCK=0;
_nop_();_nop_();_nop_();
SCK=1;
_nop_();
DATA=1;    
_nop_();
SCK=0;    
}


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//4 SHT10 温湿度连接复位子程序
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void s_connectionreset(void)
{
unsigned char i;
DATA=1;  SCK=0;                    //Initial state//准备
for(i=0;i<9;i++)                  //9 SCK cycles //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位
{
   SCK=1;
   SCK=0;
}
s_transstart();                  //transmission start//启动传输
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//5 SHT10 温湿度获取温度或湿度子程序
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)// 进行温度或者湿度转换,由参数mode决定转换内容;
{
unsigned error=0;
unsigned int i;

s_transstart();                   //transmission start//启动传输
switch(mode)
{                     //send command to sensor
   case TEMP : error+=s_write_byte(MEASURE_TEMP); break;
   case HUMI : error+=s_write_byte(MEASURE_HUMI); break;
   default     : break;
}
for (i=0;i<65535;i++)
   if(DATA==0) break; //wait until sensor has finished the measurement//等待测量结束;
if(DATA) error+=1;                // or timeout (~2 sec.) is reached // 如果长时间数据线没有拉低,说明测量错误
*(p_value) =s_read_byte(ACK);    //read the first byte (MSB)//读第一个字节,高字节 (MSB)
*(p_value+1)=s_read_byte(ACK);    //read the second byte (LSB)//读第二个字节,低字节 (LSB)
*p_checksum =s_read_byte(noACK); //read checksum//read CRC校验码
return error;
}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//6 SHT10 温湿度换算子程序
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void Calculate(unsigned char *ptem,unsigned char *phum)
{
int ntemp;
int nhum;
float flt1;//湿度浮点表示

ntemp= (*ptem)*256+ (*(ptem+1));
t1=(ntemp)/100-40;
t0=(ntemp)%100;

nhum = (*phum)*256+ (*(phum+1));
flt1=0.0405*nhum-0.0000028*nhum*nhum-4;
h1=flt1;
h0=(flt1-h1)*100;
}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//7主程序
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void sht11()
{
unsigned char checksum;//CRC校验码
s_connectionreset();// SHT10 温湿度连接复位子程序
   error=0;
   error+=s_measure(&Tem,&checksum,TEMP); //measure temperature//温度测量
   error=0;
   error+=s_measure(&Hum,&checksum,HUMI); //measure temperature //湿度测量
Calculate(&Tem,&Hum);//转换温湿度子程序
   }/********************************** EDN SHT10语句 **************************************/

附 录 二
测试
  #include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define com 0
#define dat 1
sbit lcd_cs=P1^2;
sbit lcd_sid=P1^1;
sbit lcd_sclk=P1^0;
uchar date1,date2;
uint i,j,k,m;
uchar line1[]="温湿度调节系统  ";
uchar line2[]="当前温度:  . 度";
uchar line3[]="当前湿度:  .  %";
uchar line4[]="水阀状态:    关";
xdata uchar line5[]="0123456789";
void lcd_write(bit control,uchar date);     
void delay(uint);
void lcd_inte();
void lcd_date_cut(uchar date);
void lcd_write_byte(uchar x);
void main()

 lcd_inte();//12864初始化
  while(1)
 {
   sht11();   //sht初始化
   lcd_write(com,0x94);
   lcd_write(dat,0x3a);
   lcd_write(dat,line5[(t1/10)%10]);
   lcd_write(dat,line5[t1%10]);
   lcd_write(dat,0x2e);
   lcd_write(dat,line5[t0/10]);
   lcd_write(dat,line5[t0%10]);
   lcd_write(com,0x8c);
   lcd_write(dat,0x3a);
   lcd_write(dat,line5[h1/10]);
   lcd_write(dat,line5[h1%10]);
   lcd_write(dat,0x2e);
   lcd_write(dat,line5[h0/10]);
   lcd_write(dat,line5[h0%10]);
   delay(100);
  // lcd_write(com,0x01);//写命令道lcd,清屏
  // delay(10); 
  } 
}
/**************************************
向lcd写数据或命令
**************************************/
void lcd_write(bit control,uchar date)
{
 lcd_cs=1;
 if(control==0)
  lcd_write_byte(0xf8);
else
  lcd_write_byte(0xfa);
lcd_date_cut(date);
 
致  谢
在本次论文设计过程中,李光宇老师对该论文从选题,构思到最后定稿的各个环节给予细心指引与教导,使我得以最终完成毕业论文设计。 在此,谨向老师们致以衷心的感谢和崇高的敬意!
    同时也感谢学院为我提供良好的做毕业设计的环境。
最后再一次感谢所有在毕业设计中曾经帮助过我的良师益友和同学,以及在设计中被
引用或参考的论著的作者。