迅维网

查看: 3758|回复: 2
打印 上一主题 下一主题

DHT温度、湿度测量系统(等你上实物图)

[复制链接]
跳转到指定楼层
1#
发表于 2010-8-7 22:42:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式 来自: 江苏南京 来自 江苏南京

马上注册,获取阅读精华内容及下载权限

您需要 登录 才可以下载或查看,没有帐号?注册

x
我是电子工程系的学生,还未参加工作,平时只会做一些单片机的东西。我想对主板进行深入的了解,但是对维修方面暂时没有经验,我想分享下自己用单片机写的电脑控制的测温系统,希望版主哥哥通情达理下?鼓励鼓励我们学生。下面是我做的DHT温度,湿度测量系统,上位机需要.NET2.0的支持.
DHT温度、湿度测量系统
一、设计目的

1
、本测量系统要求用温湿度传感器测量出温度和湿度两个物理量

2
、本系统分为上位机和下位机两个部分,围绕着上位机(PC机)进行数据的测量及处理
二、方案设计与论证
       下位机的核心为STC89C51单片机。上位机程序用C#语言编写,由于在VS2005开发环境下编写,所以需要用到.net framework 2.0框架。
对于传感器的选择总共有以下几种方案:
1、
使用AD转换器将传感器测出的电压量转换为数字量,再通过单片机计算转换为实际的物理量数值。此方法成本适中,电路比较复杂,测量精度与AD转换器有关,精度较高。
2、
使用SHT11作为传感器。SHT11为数字式传感器,传感器包括一个电容式聚合体测湿元件和一个能隙式测温元件,并与一个14 位的A/D 转换器以及串行接口电路在同一芯片上实现无缝连接。以一个数据引脚传送数据,此方法成本昂贵,电路非常简单,测量精度固定,精度适中。
3、
使用DHT11作为传感器。DHT11也为数字式传感器,同SHT11一样以一个数据引脚传送数据,传感器包括一个电阻式感湿元件和一个NTC测温元件。此方法成本低,电路简单,但精度不高。
综合考虑本次试验的具体情况,选择了DHT11作为温湿度传感器。
三、设计原理及电路图
下位机部分:
(总电路。DHT11在图中由SHT11代替)
(MAX232 PDF说明文件中电路图)
(MAX232接口电路)
电路图如图。
单片机管脚分配情况如下:
P07:减短显示时间按钮(保留)
P1口为8段数码管的位码,P10P17分别对应数码管的最高位到最低位
P2口为8段数码管的段码,P20P27分别对应段码的a,b,c,d,e,f,g,dp
P3口:
P30:串口传输的RXT脚,接MAX2329脚。
P31:串口传输的TXD脚,接MAX23210脚。
P32:增加显示时间按钮(保留)
P33:温度、湿度分时显示按钮(保留)
P35DHT11的数据脚
P36:温度(EP)显示按钮(保留)
P37:湿度(RH)显示按钮(保留)
复位电路和时钟电路为总电路图所示,在复位电路上增加了按键,使测量系统有了按键复位功能

#include<at89x51.h>
#include<delayt.h>
#include "dht.h"
sbit dht=P3^7;
sbit DOUBLED=P3^3;
sbit EP=P3^6;
sbit RH=P3^7;
sbit ADD=P3^2;
sbit SUB=P0^7;
unsigned char distime=0,bttime=0,atime=0,display=0,turnB=ON,buttonB=OFF,btflag=0,autoB=OFF,disMod;
unsigned int minturn=20,autotime=40;
unsigned char timeout=2;
unsigned char th=0,tl=0,hh=0,hl=0,err=0,check;
unsigned char digital[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x76,0x40,0x79,0x73,0x39};
unsigned char digRH[]={0x77,0x76,0x09,0,0,0,0,0};
unsigned char digEP[]={0x79,0x73,0x09,0,0,0,0,0};
unsigned char getx;
void show(unsigned char dig)      //显示程序
{
unsigned char x;
P1=02=0xfe;
for(x=0;x<8;x++)        //8位数码管循环动态显示
{
  if(dig==0xff)        //若标记为0XFF,显示温度
   P1=digEP[x];
  if(dig==0)         //若标记为0,显示湿度
   P1=digRH[x];
  delay2ms(1);
  P1=0;          //移位显示
  P2=(P2<<1)+1;
}
}
void PortSend(unsigned char res)     //串口发送数据
{
SBUF=res;
while(!TI);
TI=0;
}
void Send()           //发送测得的数据
{
if(!err)
{            //若错误代码为0
  PortSend(th);        //发送温度高8位
  PortSend(tl);        //发送温度低8位
  PortSend(hh);        //发送湿度高8位
  PortSend(hl);        //发送湿度低8位
}
else
{
  PortSend(ERROR);       //发送错误代码
  digRH[4]=0x79;        //数码管待显示代码里显示E
  digEP[4]=0x79;        //数码管待显示代码里显示E
}
}
void Delay_10us()         //延迟程序
{
unsigned char i;
i--;
i--;
i--;
i--;
i--;
i--;
}
unsigned char get()         //获取数据
{
unsigned char x=0,res=0,temp=0;
for(x=0;x<8;x++)        //循环8次
{
  timeout=2;         //设超时初值为2
  while(!dht&&timeout++);      //若DHT没准备好,则超时标记循环加1,加到0时退出循环
  Delay_10us();        //延时20秒
  Delay_10us();
  temp=0;          //设此位为0
  if(dht)temp=1;        //若此时DHT管脚为1,则此位数据位1
  timeout=2;         //恢复超时标记,设为2
  while(dht&&timeout++);      //等待DHT准备完毕,并循环增加超时标记
  if(timeout==0)err=1;;      //若超时标记此时为0,则已经超时,返回错误代码
  res<<=1;         //数据变量左移1位
  res|=temp; //0        //获取当前数据加到数据变量中
}
return res;          //返回数据变量
}
void read()           //读取DHT的过程
{            
dht=0;           //
delay2ms(10);         //
dht=1;           //   DHT复位及初始化
delay7us(4);         //
dht=1;           //
if(!dht)
{
  while(!dht&&timeout++);      //等待DHT信号,并设超时标记
  timeout=2;
  while(dht&&timeout++);      //等待DHT数据完毕信号,并设超时标记
  if(timeout!=1)        //若未超时
  {
   hh=get();        //获取湿度高8位
   hl=get();        //获取湿度低8位
   th=get();        //获取温度高8位
   tl=get();        //获取温度低8位
   check=get();       //获取校验和数据
   dht=1;         //释放DHT引脚
   if(!err)        //若无错误代码
   {
    if(hh+hl+th+tl==check)    //将所得数据相加和校验和比对
     err=0;      
    else
     err=2;       //若不等,错误代码为2
   }
  }
  else
   err=1;
  delay7us(8);
}
else
  err=3;  
}
由于程序太长,完整程序在附件中
源文件及PC段程序:
dht.rar (45.76 KB, 下载次数: 91)

2#
发表于 2010-8-8 20:07:52 | 只看该作者 来自: 江苏南京 来自 江苏南京
回复 xiaosapeng 的帖子
希望能快点转正啊~~感觉论坛里有无穷的力量啊~

   

回复 支持 反对

使用道具 举报

3#
发表于 2010-8-13 12:13:48 | 只看该作者 来自: 重庆 来自 重庆
你做的板子呢?上照片。
程序中把延时语句去掉一些,特别是20S的,用计数器标记,时间调用方式写程序。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表
附近
店铺
微信扫码查看附近店铺
维修
报价
扫码查看手机版报价
信号元
件查询
点位图 AI维修
助手



芯片搜索

快速回复