基于51单片机的温度湿度检测仪.docx
- 文档编号:5411356
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:24
- 大小:26.89KB
基于51单片机的温度湿度检测仪.docx
《基于51单片机的温度湿度检测仪.docx》由会员分享,可在线阅读,更多相关《基于51单片机的温度湿度检测仪.docx(24页珍藏版)》请在冰豆网上搜索。
基于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: 数据缓
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 温度 湿度 检测