基于KL25温湿度传感器设计报告.docx

上传人:b****5 文档编号:6512827 上传时间:2023-01-07 格式:DOCX 页数:24 大小:658.76KB
下载 相关 举报
基于KL25温湿度传感器设计报告.docx_第1页
第1页 / 共24页
基于KL25温湿度传感器设计报告.docx_第2页
第2页 / 共24页
基于KL25温湿度传感器设计报告.docx_第3页
第3页 / 共24页
基于KL25温湿度传感器设计报告.docx_第4页
第4页 / 共24页
基于KL25温湿度传感器设计报告.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

基于KL25温湿度传感器设计报告.docx

《基于KL25温湿度传感器设计报告.docx》由会员分享,可在线阅读,更多相关《基于KL25温湿度传感器设计报告.docx(24页珍藏版)》请在冰豆网上搜索。

基于KL25温湿度传感器设计报告.docx

基于KL25温湿度传感器设计报告

嵌入式系统及应用报告

 

题目:

DHT11温湿度传感器设计

组员:

齐亨

班级:

物联1301

学号:

13516110

 

2016年07月15日

摘 要

在工业生产中,电流、电压、温度、湿度和开关量都是常用的主要被控参数。

其中,温湿度控制也越来越重要。

在工业生产的很多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。

采用KL25芯片对温湿度进行控制不仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而能够大大的提高产品的质量和数量。

因此,KL25芯片对温湿度的控制问题是一个工业生产中经常会遇到的控制问题。

温湿度控制系统在国内各行各业的应用虽然己经十分广泛,但从国内生产的温度控制器来讲,总体发展水平仍然不高,同日本、美国、德国等先进国家相比,仍然有着较大的差距。

成熟的温湿控产品主要以“点位”控制及常规的PID控制器为主,它们只能适应一般温度系统控制,而用于较高控制场合的智能化、自适应控制仪表,国内技术还不十分成熟,形成商品化并广泛应用的控制仪表较少.随着我国经济的发展及加入WTO,我国政府及企业对此都非常重视,对相关企业资源进行了重组,相继建立了一些国家,企业的研发中心,开展创新性研究,使我国仪表工业得到了迅速的发展。

目前,温湿度控制器产品从模拟、集成温度控制器发展到智能数码温度控制器。

智能温控器(数字温控器)是微电子技术、计算机技术和自动测试技术的结合,特点是能输出温度数据及相关的温度控制量,适配各种控制器,并且它是在硬件的基础上通过软件来实现控制功能的,其智能化程度也取决于软件的开发水平,现阶段正朝着高精度高质量的方向发展,相信以我国的实力,温湿控技术在不久的将来一定会为于世界前列!

DHT11温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。

产品为4针单排引脚封装,连接方便。

二、硬件设计:

2.1DHT11特点及电气特性

DHT11实物图

DHT11产品概述

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。

传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。

因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。

每个DHT11传感器都在极为精确的湿度校验室中进行校准。

校准系数以程序的形式存在OTP内存中,传感器内部在检测型号的处理过程中要调用这些校准系数。

单线制串行接口,使系统集成变得简易快捷。

超小的体积、极低的功耗,使其成为给类应用甚至最为苛刻的应用场合的最佳选择。

产品为4针单排引脚封装,连接方便。

DHT11与单片机的接线图

引脚说明

1pin:

VDD用于供电3-5.5VDC

2pin:

DATA  串行数据,单总线

3pin:

 NC 空脚,请悬空

4pin:

 GND 接地,电源负极

DHT11技术参数

供电电压:

3.3~5.5VDC

输出:

单总线数字信号

测量范围:

湿度20-90%RH,温度0~50℃

测量精度:

 湿度+-5%RH,温度+-2℃

分 辨率:

湿度1%RH,温度1℃

互换性:

可完全互换 ,

长期稳定性:

 <±1%RH/年

③电气特性

VDD=5V,T=25℃,除非特殊标注

参数

条件

min

typ

max

单位

供电

DC

5

5.5

V

供电电流

测量

0.5

2.5

mA

平均

0.2

mA

待机

100

150

uA

采样周期

1

④详细参数

参数

条件

Min

Typ

Max

单位

湿度

分辨率

1

1

%RH

8

Bit

重复性

±1

%RH

精度

25℃

±4

%RH

0-50℃

±5

%RH

互换性

可完全互换

量程范围

0℃

30

90

%RH

25℃

20

90

%RH

50℃

20

80

%RH

响应时间

1/e(63%)25℃,1m/s 空气

6

10

15

S

迟滞

±1

%RH

长期稳定性

典型值

±1

%RH/yr

温度

分辨率

1

1

8

8

8

Bit

重复性

±1

精度

±1

±2

量程范围

0

50

响应时间

1/e(63%)

6

30

⑤DHT11主要优点

能够进行相对湿度和温度测量

全部校准,数字输出

卓越的长期稳定性

无需额外部件

超长的信号传输距离

超低能耗

4引脚安装

完全互换

⑥DHT11工作原理

FRDM-KL25Z开发板相关介绍和资料

ﻫFRDM-KL25Z开发板是一款超低成本开发平台,由基于ARM®Cortex™-M0+处理器的Kinetis L系列 KL1x和KL2xMCU组成。

特点包括易于访问MCUI/O、配备电池管理功能、低功率运行和标准外形规格(可搭配扩展板使用),内置的调试接口可进行闪存编程和运行控制。

FRDM-KL25Z受到众多飞思卡尔和第三方开发软件的支持。

客户可以免费使用mbed.org,访问所有在线SDK、工具、可重用代码(无需下载、安装或许可)以及一个活跃的开发者网络社区。

 

特性

∙MKL25Z128VLK4MCU– 48MHz、128 KB闪存、16KB SRAM、USBOTG(FS)、80LQFP

∙电容滑动触摸感应板,MMA8451Q加速度传感器,三色LED

∙易于访问MCUI/O

∙成熟的OpenSDA调试接口

∙大容量存储设备闪存编程接口(默认) –无需安装任何工具即可评估演示app

∙P&EMultilink接口具有运行控制调试功能并兼容IDE工具

∙开源数据记录应用范例向您展示客户、合作伙伴和爱好者如何共同在OpenSDA电路上进行开发。

∙支持mbed

2.2  设计方案

将KL25Z芯片通过面包板和导线与DHT11链接在一起,并且通过显示屏显示。

2.2.1LED显示模块

本课题的LED显示模块是由一个四联共阳七段数码管组成。

七段数码管是由若干发光二极管组合而成的,一般的“8”字形显示块由“a、b、c、d、e、f、g、h”8发光二极管组成。

四个七段数码管分别与P0口相连,通过对单片机输入程序达到控制显示输出的目的(如图)。

四个七段数码管由单片机的P2.0~P2.3控制亮灭,P2.0~P2.3分别对应Q2~Q5,当P2.0~P2.3其中之一置高电平,对应的三级管导通,段码管亮,置低电平,对应的三级管截止,段码管灭。

 

2.2.2系统框架设计如下图所示:

温湿度测量模块我们采用DHT11传感器

 

1.下图为温湿度测量的原理图:

2.2.3控制器模块

本课题的控制器模块式采用KL25芯片作为MCU,如图。

KL25的P0.0~P0.7作为四联七段数码管总线;P2.4作为连接DS18B20的I/O口;P1.7作为升温电路的控制端;P2.0~P2.3控制四个七段数码管的亮灭。

2.2.4电源电路

给系统电路输入一个稳定的+5V的电源(如图)。

 

三.软件设计

3.1 DHT11数据的部分程序代码为:

#include "ioCC2430.h" //包含头文件,相应的板子以及传感器一些信息

 #include "hal.h"

 #include <math.h>

  //#include

 #include

 typedefunion   //定义联合体,

 {

 unsigned inti;

  floatf;

 }value;   //定义联合体类型名称为value

  #definenoACK0

#define ACK1

#defineSTATUS_REG_W0x06   //0x06=00000110

 #defineSTATUS_REG_R0x07   //0x07=00000111

#defineMEASURE_TEMP0x03  //0x03=00000011

  #defineMEASURE_HUMI0x05  //0x05=00000101

  #defineRESET 0x1e      //0x1e =00011110

  #defineSDAP1_6        //定义SDA代表的是P1_6脚

 #defineSCL P1_7

  #definebeginP2_0

  unsignedchard1,d2,d3,d4,d5,d6,d7;//定义无符号字符型变量

voidWait(unsigned intms) //定义wait函数,主要用于软件循环,延时作用

 {

  unsigned charg,k;

while(ms)

 {

  for(g=0;g<=167;g++)

  {

 for(k= 0;k<=48;k++);

  }

 ms--;

 }

 }

 voidQWait()//1us的延时

{

 asm("NOP"); //加入汇编操作语句,空操作,主要用于机器周期执行

asm("NOP");

  asm("NOP");

asm("NOP");

  asm("NOP");

 asm("NOP");

 asm("NOP");

asm("NOP");

 asm("NOP");

  asm("NOP");

 asm("NOP");

  voidinitUART(void)    //初始化串口

 {

 IO_PER_LOC_USART0_AT_PORT0_PIN2345(); //具体函数的定义与用法,你得参考头文件中的程序代码了

 IO_DIR_PORT_PIN(1,6,IO_OUT);

 IO_DIR_PORT_PIN(1,7,IO_OUT);

 //IO_IMODE_PORT_PIN(1,6,IO_IMODE_TRI);

 //IO_IMODE_PORT_PIN(1,7, IO_IMODE_TRI);

 IO_DIR_PORT_PIN(2, 0,IO_OUT);

 IO_FUNC_PORT_PIN(2,0,IO_FUNC_GIO);

//SET_MAIN_CLOCK_SOURCE(RC);

 SET_MAIN_CLOCK_SOURCE(CRYSTAL);

  UART_SETUP(0, 115200,HIGH_STOP); //设置传输数据的波特率115200

 

 UTX0IF=1;

 U0CSR|=0XC7;    //U0CSR = U0CSR|0x1010 0111 (进行位或操作)

 IEN0|=0x84;

  SDA=1;

SCL =0;

 

  }

  int putchar (int c)   //定义输入字符函数,给的参数是一个整型的数

  {

if(c=='\n')   //判断参数c的值是否和'\n'的值相等

 {

  while(!

UTX0IF);    //执行的时候UTX0IF的值是0,此处不是很理解?

 UTX0IF=0;     //给UTX0IF赋0

  U0DBUF= 0x0d;   //U0DBUF赋值0x0d = 00001011

  }

 while(!

UTX0IF);

UTX0IF=0;

  return(U0DBUF= c);    //如果c的值不是'\n'也就是换行符的时候,将c的值传递到U0DBUF寄存器中

 }

  chars_write_byte(unsignedcharvalue) //定义写字节函数(8位)

  {

unsignedchar i,error =0;

 for(i= 0x80;i >0;i/= 2) //i赋初始值0x80=128,执行判断是i> 0,执行语句是i=i/2;即i=128,64,32,16,8,4,2,1,0.5(0),8位

 {

 if(i &value)

 SDA= 1;

  else

 SDA= 0;

 SCL=1;     //此时SCL端口处,也就是p1_7引脚处是高电平

 QWait();   //因为写入需要时间,所以程序之中加入下面几条语句

 QWait();

 QWait();

 QWait();

  QWait();

 SCL=0;    //使能p1_7眼角处低电平,使的数据写入(具体需要看单片机控制芯片的手册

 asm("NOP");

asm("NOP");

  SDA= 1;

SCL=1;

asm("NOP");

 error=SDA;

 QWait();

QWait();

  QWait();

 SDA=1;

SCL=0;

returnerror;

 }

 chars_read_byte(unsigned charack) //读取数据,按照字节位的顺序读取(8位)128= 1000 0000,64=0100 0000,32 =0010 0000 ,16 =00010000, 8=0000 1000, 4=00000100,2=00000010,1=0000 0001

 {

unsignedchari,val= 0;

 SDA= 1;

  for(i =0x80;i>0;i/=2)  //同上

 {

  SCL= 1;

  if(SDA)   //判断SDA处是否有高电平

val = (val|i);   //进行或操作

 else

val= (val| 0x00);

 SCL=0;

  QWait();

 QWait();

 QWait();

QWait();

 QWait();

  }

 SDA=!

ack;

  SCL= 1;

QWait();

QWait();

 QWait();

 QWait();

  QWait();

 SCL=0;

 SDA=1;

returnval;  //返回读取到的数据,一个字节,八位

 }

  voids_transstart(void) //传输使能函数,就是给控制器引脚处相应电平,使对应模块工作

{

 SDA= 1;

 SCL=0;

 QWait();

 QWait();

  SCL =1;

QWait();

QWait();

  SDA=0;

  QWait();

QWait();

 SCL=0;

 QWait();

QWait();

 QWait();

 QWait();

 QWait();

SCL =1;

  QWait();

  QWait();

  SDA=1;

 QWait();

 QWait();

SCL =0;

  QWait();

  QWait();

  }

  void s_connectionreset(void) //复位操作函数

 {

unsignedchari;

 SDA= 1;

  SCL = 0;

for(i=0;i< 9;i++)

  SCL =1;

  QWait();

 QWait();

  SCL = 0;

 QWait();

  QWait();

  }

s_transstart(); //调用开始函数

  }

 chars_measure(unsignedchar*p_value,unsignedchar*p_checksum, unsigned charmode)//函数,主要统计传输的数据个数

  {

  unsigned er= 0;

 unsignedint i,j;

s_transstart();

 switch(mode)

 {

  case3:

er +=s_write_byte(3);

 break;

  case5 :

er +=s_write_byte(5);

  break;

 default :

break;

 }

 for(i=0;i<65535;i++)

 {

for(j =0;j <65535;j++)

 {if(SDA==0)

 {

 break;

 }

}

  if(SDA ==0)

  {

  break;

 }

  }

if(SDA)

 {

 er +=1;

 }

 *(p_value)=s_read_byte(ACK);

  *(p_value +1)=s_read_byte(ACK);

 *p_checksum=s_read_byte(noACK);

d6 =*(p_value);

  d7=*(p_value + 1);

  returner;

 }

 voidcalc_sth11(float*p_humidity,float*p_temperature)//计算温度值

 {

 constfloat C1 =-4.0;

 constfloatC2=+ 0.0405;

const float C3=-0.0000028;

 constfloatT1=+ 0.01;

constfloatT2=+0.00008;

floatrh =*p_humidity;

 float t =*p_temperature;

 floatrh_lin;

  floatrh_true;

  floatt_C;

 t_C= t *0.01- 44.0 ;

  rh_lin = C3 *rh*rh+C2*rh+C1;

  rh_true=(t*0.01-40.0 -25)* (T1+T2*rh)+rh_lin;

if(rh_true>100)

 {

 rh_true =100;

 }

  if(rh_true<0.1)

{

  rh_true=0.1;

}

*p_temperature=t_C;

 *p_humidity= rh_true;

  }

void main()  //主函数

 {

 valuehumi_val,temp_val; //声明两个联合体变量

unsignedcharerror,checksum;  //声明两个无符号的字符型变量

 initUART();   //初始化串口

 P1INP |=0xC0;  //初始化P1引脚 ,0xC0 = 1010 0000,使P1_7和P1_5引脚为1

  begin=0;

s_connectionreset();

while

(1)  //无限循环操作

{

  error= 0;

 error+=s_measure((unsigned char*)&humi_val.i,&checksum,5);  //读入串口的数据进行温度的计算

d1=d6;

  d2= d7;

 error+=s_measure((unsignedchar*) &temp_val.i,&checksum,3);

  d3 =d6;

  d4 = d7;

  if(error!

=0)

 s_connectionreset();

else

 {

 humi_val.f= (float)humi_val.i;

 temp_val.f=(float)temp_val.i;

humi_val.f=d1* 256+d2;

  temp_val.f=d3*256+ d4;

 calc_sth11(&humi_val.f,&temp_val.f);

printf("temp:

%5.1fChumi:

%5.1f%%\n",temp_val.f,humi_val.f);

//printf("t1:

%xh1:

%x\n",d1,d2);

 //printf("t2:

%xh2:

%x\n",d3,d4);

 }

 Wait(150);

 }

  }

四、设计调试和心得体会

系统软件的主程序是调用子程序的,它是所有子程序在功能上的汇总,是整个程序的“首脑”,CPU是从从主程序开始读程序的,所以主程序的设计尤为重要。

这个系统软件的主程序主要完成温度在4位8段的数码管上显示温度的功能。

4.1功能实现分析

该硬件电路在最后测试中实现了准确的温湿度采集、能够传给KL25芯片发送采集到得参数。

基本实现了设计任务,并可根据外界运用需要更换和外扩其他功能传感器。

4.2心得体会

经过一个礼拜设计,调试和实践,我们已经在电路板上成功仿真运行了显示模块和温湿度测试模块。

仿真运行结果符合最初的实验设计要求。

 唯有实践方能出真知,这次做的产品给我们上了一次很生动的课。

总的来说

这次实践,我们学到许多,不仅仅是书本或者是网上的资料给我们的知识,更重要的是动手实践后的体会,感悟。

由于时间的原因在设计过程中不能很好的做出我们设计所要达到的要求,对于以上的不足,我们只有通过以后的努力不断的提升。

在设计中我们基本实现了温湿度的读取,在后级电路中由于个人能力有限,而不能实现后级驱动电路,在这方面我相信在以后的学习生涯中能得到解决,

最后我要感谢我的导师陈儒敏老师,在他的帮助下我们做好了基于KL25芯片温湿度控制系统的课程设计,同时我也要感谢那些在我遇到难题时候给予我帮助的同学和好友。

五丶成果展示

下面为运行成功显示成果

参考文献

 

[1] 张毅刚. 单片机原理及应用[M]. 北京:

高等教育出版社,2003. [2] 万光毅. 单片机实验与实践教程[M]. 北京:

北京航空航天

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1