基于51单片机的温度湿度检测仪.docx

上传人:b****5 文档编号:3558787 上传时间:2022-11-23 格式:DOCX 页数:24 大小:27.32KB
下载 相关 举报
基于51单片机的温度湿度检测仪.docx_第1页
第1页 / 共24页
基于51单片机的温度湿度检测仪.docx_第2页
第2页 / 共24页
基于51单片机的温度湿度检测仪.docx_第3页
第3页 / 共24页
基于51单片机的温度湿度检测仪.docx_第4页
第4页 / 共24页
基于51单片机的温度湿度检测仪.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

基于51单片机的温度湿度检测仪.docx

《基于51单片机的温度湿度检测仪.docx》由会员分享,可在线阅读,更多相关《基于51单片机的温度湿度检测仪.docx(24页珍藏版)》请在冰豆网上搜索。

基于51单片机的温度湿度检测仪.docx

基于51单片机的温度湿度检测仪

单片机实践报告

 

题目:

基于51单片机的温度和湿度传感器

 

院系:

班级:

学生姓名:

学号:

完成日期:

年月日

 

设计内容综述

本次作业的要求是利用51单片机实现一个温度和湿度传感器,并且要求达到一定的精度。

初步分析,本次作业共有以下四部分组成:

1.以AT89S51单片机组成的最小系统板。

2.由ZLG7289组成的数码管显示和键盘。

3.由温度湿度传感器和TLC555组成的探测部分。

4.程序部分。

1.所使用的关键器件和基本参数

1.最小系统板:

ATS51,蜂鸣器等。

2.显示板:

ZLG7289,数码管等。

3.探测部分:

DS18B20,HS1101,TLC555。

2.工作原理说明(参考原理图)

(1)探测部分

4,程序部分

(1)测温程序

#include

#include

#include

#defineNOP_nop_

#defineint8uunsignedchar

sbitDQ=P3^7;//温度输入口

sbitP04=P0^4;//蜂鸣

int8uh=0;

/***********************************显示部分*****************************************/

#defineucharunsignedchar

staticucharbdataucByte;

sbitSCLK_7289a=P1^3;

sbitSDIO_7289a=P1^4;

sbitCS_7289a=P1^2;

sbitMSB_7289a=ucByte^7;

sbitLSB_7289a=ucByte^0;

voidInitZlg7289a(void);

voidTrZlg7289a(ucharucCommand);

voidTrZlg7289ad(ucharucCommand,ucharucDat);

staticvoidSendByte(void);

staticvoidDelay(ucharucTime);

/********************************************************

*函数名:

InitZlg7289a(void)

*功能模式:

全局

*函数说明:

ZLG7289A初始化,初始化命令:

0xa4

*调用函数:

TrZlg7289a()

*全局变量:

*输入:

*返回:

***********************************8*******************************/

voidInitZlg7289a(void)

{

TrZlg7289a(0xa4);

}

/************************************************************************

*函数名:

voidTrZlg7289a(ucharucCommand)

*功能模式:

全局

*函数说明:

向ZLG7289A传送单指令函数

*调用函数:

Delay()、SendByte()

*全局变量:

ucByte

*输入:

ucCommand

*返回:

************************************************************************/

voidTrZlg7289a(ucharucCommand)

{

CS_7289a=0;

SCLK_7289a=0;

SDIO_7289a=0;

Delay(50);

ucByte=ucCommand;

SendByte();

CS_7289a=1;

SDIO_7289a=1;

SCLK_7289a=1;

}

/************************************************************************

*函数名:

voidTrZlg7289ad(ucharucCommand,ucharucDat)

*功能模式:

全局

*函数说明:

向ZLG7289A传送带数据的指令函数

*调用函数:

Delay()、SendByte()

*全局变量:

ucByte

*输入:

ucCommand、ucDat

*返回:

************************************************************************/

voidTrZlg7289ad(ucharucCommand,ucharucDat)

{

SCLK_7289a=0;

SDIO_7289a=0;

CS_7289a=0;

Delay(50);

ucByte=ucCommand;

SendByte();

ucByte=ucDat;

SendByte();

CS_7289a=1;

SDIO_7289a=1;

SCLK_7289a=1;

}

/************************************************************************

*函数名:

staticvoidSendByte(void)*

*功能模式:

内部

*函数说明:

向ZLG7289A发送一个字节的数据。

*

*调用函数:

Delay()

*全局变量:

ucByte、MSB_7289a*

*输入:

*返回:

************************************************************************/

staticvoidSendByte(void)

{

uchari;

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

{

SDIO_7289a=MSB_7289a;

SCLK_7289a=1;

Delay(10);

ucByte<<=1;

SCLK_7289a=0;

Delay(10);

}

}

/************************************************************************

*函数名:

staticvoidDelay(ucharucTime)

*功能模式:

内部

*函数说明:

延时函数。

*调用函数:

*全局变量:

无*输入:

ucTime

*返回:

************************************************************************/

staticvoidDelay(ucharucTime)

{

uchari;

for(i=0;i

;

}

/***************温度查表法**********************************/

int8ucodeditab[16]=

{0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x09,0x09};

int8udatabuf[2]={0x00,0x00};//读出温度暂时存放

int8udatadisplay[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据,一个运算暂存用

/*****************************************************************************/

//延时函数

/*延时计算式:

2×x+5;Step:

2us;*/

voidDelay_Xus(int8ux)//x取值1~255;

{

while(--x);

//int8ui;

//x/=8;

//for(i=0;i

}

voidDelay_Xms(int8ux)//x取值1~255;

{

int8ui,j;

for(i=0;i

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

{

_nop_();

_nop_();

}

}

/******************************************************************************/

/*****************显示扫描函数************************************************/

voidshow(uchar*p)

{uchari;

ucharseg[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x00,0x01};

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

{

if(i==1)TrZlg7289ad(0x90+i,(seg[p[i]])|0x80);

elseTrZlg7289ad(0x90+i,seg[p[i]]);

}

}

//-----------------DS18B20单总线模块----------------------------*/

staticvoidOneWire_Rst(void);

staticvoidOneWire_Init(void);

staticvoidOneWire_WriteByte(int8ucmd);

staticint8uOneWire_ReadByte(void);

staticvoidOneWire_Idle(void);

 

/*************************************************

子函数定义

*************************************************/

/*******************************************************************************

***函数名:

staticvoidOneWire_Init(void)

***功能描述:

***全局变量:

***输入:

NO!

***输出:

NO!

***创建人:

huangtiexiong日期:

2006-11-28

***修改人:

日期:

2006-11-28

***函数说明:

单总线数据传输初始化;

/******************************************************************************/

staticvoidOneWire_Init(void)

{

DQ=1;

NOP();

DQ=0;//拉低数据线,准备ResetOneWireBus;

Delay_Xus(125);//延时510us,ResetOne-WireBus.

Delay_Xus(125);

DQ=1;//提升数据线;

Delay_Xus(15);//延时35us;

while(DQ)//等待Slave器件Ack信号;

{

NOP();

}

Delay_Xus(60);//延时125us;

DQ=1;//提升数据线,准备数据传输;

}

/*******************************************************************************

***函数名:

staticvoidOneWire_Rst(void)

***功能描述:

***全局变量:

No!

***输入:

NO!

***输出:

NO!

***创建人:

huangtiexiong日期:

2006-11-28

***修改人:

日期:

2006-11-28

***函数说明:

单总线Resetpulse;

/******************************************************************************/

staticvoidOneWire_Rst(void)

{

DQ=0;//拉低数据线,准备ResetOneWireBus;

Delay_Xus(125);//延时511us,ResetOne-WireBus.

DQ=0;

Delay_Xus(125);

}

/***函数名:

staticvoidOneWire_WriteByte(int8ucmd)

***功能描述:

写一个字节;

***全局变量:

NO!

***输入:

cmd:

8bit;

***输出:

NO!

***创建人:

huangtiexiong日期:

2006-11-28

***修改人:

日期:

2006-11-28

***函数说明:

cmd主要有Rom操作指令和E2Ram操作指令两种;

/******************************************************************************/

staticvoidOneWire_WriteByte(int8ucmd)

{

int8ui;

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

{

if(cmd&0x01)//低位在前;

{

DQ=0;//结束Recoverytime;

NOP();

NOP();

NOP();

DQ=1;//发送数据;

}

else

{

DQ=0;//结束Rectime;

NOP();

NOP();

NOP();

//DQ=0;//发送数据;

}

Delay_Xus(30);//等待SlaveDevice采样;

DQ=1;//Recovery;

NOP();//RecoveryTimeStart;

cmd>>=1;

}

}

/*******************************************************************************

***函数名:

staticint8uOneWire_ReadByte(void)

***功能描述:

读取一个字节;

***全局变量:

NO!

***输入:

NO!

***输出:

8bitdata;

***创建人:

huangtiexiong日期:

2006-11-28

***修改人:

日期:

2006-11-28

***函数说明:

读之前必须首先写1;

/******************************************************************************/

staticint8uOneWire_ReadByte(void)

{

int8ui;

int8utmp=0;

DQ=1;//准备读;

NOP();

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

{

tmp>>=1;//低位先发;

DQ=0;//Readinit;

_nop_();//2ms;

DQ=1;//必须写1,否则读出来的将是不预期的数据;

Delay_Xus

(2);//延时9us;

_nop_();

if(DQ)//在12us处读取数据;

tmp|=0x80;

Delay_Xus(30);//延时55us;

DQ=1;//恢复OneWireBus;

NOP();

}

returntmp;

}

/*******************************************************************************

***函数名:

staticvoidOneWire_Idle(void)

***功能描述:

总线空闲模式;

***全局变量:

NO!

***输入:

NO!

***输出:

NO!

***创建人:

huangtiexiong日期:

2006-11-28

***修改人:

日期:

2006-11-28

***函数说明:

/******************************************************************************/

staticvoidOneWire_Idle(void)

{

DQ=1;

NOP();

}

/*******************************************************************************

***函数名:

externvoidDS18B20_RomCmd(int8uromCmd)

***功能描述:

DS18B20Rom操作命令写;

***全局变量:

NO!

***输入:

romCmd;

***输出:

NO!

***创建人:

huangtiexiong日期:

2006-11-28

***修改人:

日期:

2006-11-28

***函数说明:

0x33:

ReadRom;0x55:

MatchRom;0xcc:

Skiprom;0xf0:

Searchrom;

0xec:

AlarmSearch.

/******************************************************************************/

externvoidDS18B20_RomCmd(int8uromCmd)//仅写了SkipRom例程;

{

switch(romCmd)

{

case0xcc:

//SkipRomcommand;

OneWire_WriteByte(0xcc);

break;

default:

break;

}

}

/*******************************************************************************

***函数名:

externvoidDS18B20_MemCmd(int8umemCmd)

***功能描述:

DS18B20Memory操作命令;

***全局变量:

NO!

***输入:

NO!

***输出:

NO!

***创建人:

huangtiexiong日期:

2006-11-28

***修改人:

日期:

2006-11-28

***函数说明:

仅写了ConvertT(0x44)和0xBE命令;

0x44:

ConvertT;0xbe:

ReadScratch-pad;

/******************************************************************************/

externvoidDS18B20_MemCmd(int8umemCmd)

{

switch(memCmd)

{

case0x44:

//StarttoConverttemperature;

OneWire_WriteByte(0x44);

NOP();

OneWire_Idle();

Delay_Xms(250);//延时750ms;

Delay_Xms(250);

Delay_Xms(250);

break;

case0xbe:

//Readscratchpad;

OneWire_WriteByte(0xbe);

break;

default:

break;

}

}

/*******************************************************************************

***函数名:

externvoidDS18B20_ReadDat(int8ulen,int8u*buf)

***功能描述:

读取DS18B20内部的Scratchpad内容;

***全局变量:

NO!

***输入:

len:

将要读取的数据长度;

***输出:

buf:

数据缓

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

当前位置:首页 > 初中教育 > 数学

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

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