当前位置:文档之家› 基于KL25温湿度传感器设计报告

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

嵌入式系统及应用报告题目:DHT11温湿度传感器设计组员:**班级:物联1301学号:********2016年07月15日摘要在工业生产中,电流、电压、温度、湿度和开关量都是常用的主要被控参数。

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

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

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

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

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

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

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

智能温控器(数字温控器)是微电子技术、计算机技术和自动测试技术的结合,特点是能输出温度数据及相关的温度控制量,适配各种控制器,并且它是在硬件的基础上通过软件来实现控制功能的,其智能化程度也取决于软件的开发水平,现阶段正朝着高精度高质量的方向发展,相信以我国的实力,温湿控技术在不久的将来一定会为于世界前列!DHT11温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。

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

关键词:KL25芯片,DHT11温湿度传感器,温湿控制技术二、硬件设计:2.1 DHT11特点及电气特性①DHT11实物图①DHT11产品概述DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。

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

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

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

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

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

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

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

②DHT11与单片机的接线图引脚说明1pin:VDD 用于供电3-5.5VDC 2pin: DATA 串行数据,单总线FRDM-KL25Z开发板相关介绍和资料FRDM-KL25Z开发板是一款超低成本开发平台,由基于ARM® Cortex™-M0+处理器的Kinetis L 系列KL1x和KL2xMCU组成。

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

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

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

特性•MKL25Z128VLK4 MCU – 48 MHz、128 KB闪存、16 KB SRAM、USB OTG (FS)、80LQFP•电容滑动触摸感应板,MMA8451Q加速度传感器,三色LED•易于访问MCU I/O•成熟的OpenSDA调试接口•大容量存储设备闪存编程接口(默认)–无需安装任何工具即可评估演示app•P&E Multilink接口具有运行控制调试功能并兼容IDE工具•开源数据记录应用范例向您展示客户、合作伙伴和爱好者如何共同在OpenSDA电路上进行开发。

•支持mbed2. 2 设计方案将KL25Z芯片通过面包板和导线与DHT11链接在一起,并且通过显示屏显示。

2. 2.1 LED显示模块本课题的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.下图为温湿度测量的原理图:温湿度测量模块LED 显示模块控 制 器 模 块电源模块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 的电源(如图)。

0.1uF470uF 0.1uF 1000uF 输出+5V7805输入电源三.软件设计3.1 DHT11数据的部分程序代码为:#include "ioCC2430.h" //包含头文件,相应的板子以及传感器一些信息#include "hal.h"#include <math.h>//#include <intrins.h>#include <stdio.h>typedef union //定义联合体,{unsigned int i;float f;} value; //定义联合体类型名称为value#define noACK 0#define ACK 1#define STATUS_REG_W 0x06 //0x06 = 0000 0110#define STATUS_REG_R 0x07 //0x07 = 0000 0111#define MEASURE_TEMP 0x03 //0x03 = 0000 0011#define MEASURE_HUMI 0x05 //0x05 = 0000 0101#define RESET 0x1e //0x1e = 0001 1110#define SDA P1_6 //定义SDA代表的是P1_6脚#define SCL P1_7#define begin P2_0unsigned char d1,d2,d3,d4,d5,d6,d7; //定义无符号字符型变量void Wait(unsigned int ms) //定义wait函数,主要用于软件循环,延时作用{unsigned char g,k;while(ms){for(g = 0;g <= 167; g++){for(k = 0;k <= 48; k++);}ms--;}}void QWait() //1us的延时{asm("NOP"); //加入汇编操作语句,空操作,主要用于机器周期执行asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");}void initUART(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); //设置传输数据的波特率115200UTX0IF = 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赋0U0DBUF = 0x0d; //U0DBUF赋值0x0d = 0000 1011}while (!UTX0IF);UTX0IF = 0;return (U0DBUF = c); //如果c的值不是'\n'也就是换行符的时候,将c的值传递到U0DBUF寄存器中}char s_write_byte(unsigned char value) //定义写字节函数(8位){unsigned char 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;elseSDA = 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;return error;}char s_read_byte(unsigned char ack) //读取数据,按照字节位的顺序读取(8位)128 = 1000 0000 ,64 = 0100 0000,32 = 0010 0000 ,16 = 0001 0000,8 = 0000 1000,4 = 0000 0100 ,2 = 0000 0010,1 = 0000 0001{unsigned char i,val = 0;SDA= 1;for(i = 0x80;i > 0;i /= 2) //同上{SCL = 1;if (SDA) //判断SDA处是否有高电平val = (val | i); //进行或操作elseval = (val | 0x00);SCL = 0;QWait();QWait();QWait();QWait();QWait();}SDA = !ack;SCL = 1;QWait();QWait();QWait();QWait();QWait();SCL = 0;return val; //返回读取到的数据,一个字节,八位}void s_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) //复位操作函数{unsigned char i;SCL = 0;for(i = 0;i < 9; i++){SCL = 1;QWait();QWait();SCL = 0;QWait();QWait();}s_transstart(); //调用开始函数}char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) //函数,主要统计传输的数据个数{unsigned er = 0;unsigned int i,j;s_transstart();switch(mode){case 3 :er += s_write_byte(3);break;case 5 :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);return er;}void calc_sth11(float *p_humidity ,float *p_temperature)//计算温度值{const float C1 =- 4.0;const float C2 =+ 0.0405;const float C3 =- 0.0000028;const float T1 =+ 0.01;const float T2 =+ 0.00008;float rh =* p_humidity;float t =* p_temperature;float rh_lin;float rh_true;float t_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() //主函数{value humi_val,temp_val; //声明两个联合体变量unsigned char error,checksum; //声明两个无符号的字符型变量initUART(); //初始化串口P1INP |= 0xC0; //初始化P1引脚,0xC0 = 1010 0000 ,使P1_7和P1_5引脚为1begin = 0;s_connectionreset();while(1) //无限循环操作{error = 0;error += s_measure((unsigned char*) &humi_val.i,&checksum,5); //读入串口的数据进行温度的计算d1 = d6;d2 = d7;error += s_measure((unsigned char*) &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.1fC humi:%5.1f%%\n",temp_val.f,humi_val.f);// printf("t1:%x h1:%x\n",d1,d2);//printf("t2:%x h2:%x\n",d3,d4);}Wait(150);}}四、设计调试和心得体会系统软件的主程序是调用子程序的,它是所有子程序在功能上的汇总,是整个程序的“首脑”,CPU是从从主程序开始读程序的,所以主程序的设计尤为重要。

相关主题