马上注册,获取阅读精华内容及下载权限
您需要 登录 才可以下载或查看,没有帐号?注册
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段数码管的位码,P10到P17分别对应数码管的最高位到最低位 P2口为8段数码管的段码,P20到P27分别对应段码的a,b,c,d,e,f,g,dp P3口: P30:串口传输的RXT脚,接MAX232的9脚。 P31:串口传输的TXD脚,接MAX232的10脚。 P32:增加显示时间按钮(保留) P33:温度、湿度分时显示按钮(保留) P35:DHT11的数据脚 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=0 2=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)
|