1 / 14
文档名称:

数字温度计课程设计.doc

格式:doc   页数:14页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

数字温度计课程设计.doc

上传人:nb6785 2015/6/14 文件大小:0 KB

下载得到文件列表

数字温度计课程设计.doc

相关文档

文档介绍

文档介绍:数字温度计
概述:
由于单片机体积小、功能全、价格低、编程容易等优点,在工业领域的应用越来越广泛。本文数字温度计的实现,主要基于芯片DS18B20和数码管的显示功能,把现场测得的温度显示出来。
DS18B20是美国Dallas公司生产的单总线数字输出型集成温度传感器,能够直接读出被测温度值,并且可根据实际要求通过编程实现9~12位的数字量输出, ms,转化为12位数字量所需时间为750 ms。测试温度范围为-55~+125,℃。
二、工作原理:
本电路包含了单片机最小系统(包括复位按钮、晶振电路)、单总线接口的温度传感器芯片DS18B20、LED数码管显示电路的设计。
本电路采用8位单片机 AT89C51,工作原理图如下页所示:
1、AT89C51单片机引脚资源及分配如下:
2、复位电路:
RST引脚是复位信号的输入端。复位信号是高电平有效,其有效时间应持续24个振荡脉冲周期以上,整个复位电路包括芯片内、外两部分。外部电路产生的复位信号送施密特触发器,再由片内复位电路在每个机器周期的S5P2时刻对施密特触发器的输出进行采样,然后才得到内部复位操作所需要的信号。
复位操作有上电自动复位、按键电平复位和外部脉冲复位三种方式,本文采用按键电平复位的方式,复位电路如下:
按下按钮并持续两个机器周期以上,则RES位高电平,单片机复位。
3、晶振电路:
在89C51内部有一个高增益反相放大器,其输入端为引脚XTAL1,其输出端为引脚XTAL2。只需要在片外通过XTAL1和XTAL2引脚跨接晶体振荡器或在引脚与地之间加接微调电容,形成反馈电路,振荡器即可工作。振荡电路的工作原理如下图:
由于电容的大小影响振荡器震荡的稳定性和起振的快速性,通常选择范围10~30 pF。
当由外部输入时钟信号时,外部信号接入XTAL1端,XTAL2端悬空不用。对外部信号的占空比没有要求,高低电平持续时间不小于20 ns。
4、温度传感器的接口:
前面已经略微介绍过芯片DS18B20,下面主要介绍其使用方法:
(1)引脚分配图如下:
GND:地 DQ:数据I/O NC:空脚
(2)软件操作:
a、主机先作复位操作
b、H)命令
c、然后主机接着写个转换温度的操作命令,后面释放总线至少一秒,让DS18B20完成转换的操作。整个操作的总线状态如下图:
初始化时序:
bit Init_DS18B20(void)
{ bit flag; // flag=0,存在;flag=1,不存在
DQ = 1; //先将数据线拉高
for(time=0;time<2;time++) ;//略微延时约6微秒,再将数据线从高拉低,要求保持480~960us
DQ = 0;
for(time=0;time<200;time++) ; //略微延时约600微秒,以向DS18B20发出一持续480~960us的低电平复位脉冲
DQ = 1; //释放数据线(将数据线拉高)
for(time=0;time<10;time++) ; //延时约30us(释放总线后需等待15~60us,让DS18B20输出存在脉冲)
flag=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在)
for(time=0;time<200;time++) ; //延时足够长时间,等待存在脉冲输出完毕
return (flag); //返回检测成功标志
}
读时序:
ReadOneChar(void)
{ unsigned char i=0;
unsigned char dat; //储存读出的一个字节数据
for (i=0;i<8;i++)
{DQ =1; // 先将数据线拉高
_nop_(); //等待一个机器周期
DQ = 0; //单片机从DS18B20读数据时,将数据线从高拉低即启动读时序
_nop_( ); //等待一个机器周期
DQ = 1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
for(time=0;time<2;time++) ; //延时约6us,使主机在15us内采样
dat>>=1;
if(DQ==1) dat|=0x80; //如果读到的数据是1,则将1存入dat
else dat|=0x00;//如果读unsigned char到的数据是0,则将0存入dat
for(time=0;time<8;time++); //延时3us,两个读时序之间必须有大于1us的恢复期
}
return(dat); //返回读出的十六进制数据
}