基于单片机和DS18B20的温度采集系统Word文件下载.docx
《基于单片机和DS18B20的温度采集系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于单片机和DS18B20的温度采集系统Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
该产品已经投放市场,很快轰动神州大地,消费者争相购买,很多家庭也纷纷在各自家门外挂起了这样的智能温度计,具有非常大的市场前景。
第2章测温器件原理和特性
2.1DS18B20工作原理
DS18B20的测温原理如图2.1所示,图中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度,这就是DS18B20的测温原理。
图2.1温度测量电路原理图
另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。
系统对DS18B20的各种操作必须按协议进行。
操作协议为:
初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
各种操作的时序图与DS1820相同,可参看文献[2]。
2.2DS18B20的特性
1.独特的单线接口方式:
DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
2.在使用中不需要任何外围元件。
3.可用数据线供电,电压范围:
+3.0~+5.5V。
4.测温范围:
-55~+125℃。
固有测温分辨率为0.5℃。
5.通过编程可实现9~12位的数字读数方式。
6.用户可自设定非易失性的报警上下限值。
7.支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。
8.负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常作。
第3章硬件电路设计
3.1测温电路的原理
如图3.1所示,模拟量的温度首先经过温度采集传感器即DS18B20,并在单片机的控制处理下,发送初始化命令,写入控制字,读出相应的转化数据,最后经过相应的处理送到显示系统上显示。
图3.1测温系统框图
3.2部分接口电路原理与设计
3.2.1DS18B20测温过程与电路设计
由于DS18B20采用的是单总线传输方式,即在一根数据线实现数据的双向传输,而对单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
该协议定义了几种信号的时序:
初始化时序(dsInit()实现)、读时序(readByte())、写时序(writeByte())。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收,数据和命令的传输都是低位在先,进而完成对数据的采集。
电路设计可以参看图4.2关于DS18B20详细的引脚功能描述如下:
1、GND地信号;
2、DQ数据输入出引脚。
开漏单总线接口引脚。
当被用在寄生电源下,此引脚可以向器件提供电源;
漏极开路,常态下高电平。
通常要求外接一个约5kΩ的上拉电阻。
3、VCC可选择的VCC引脚。
电压范围:
3~5.5V;
当工作于寄生电源时,此引脚必须接地。
图3.2DS18B20接口电路
3.2.2单片机工作过程与电路设计
单片机是指一个集成在一块芯片上的完整计算机系统。
它具有一个完整计算机所需要的大部分部件:
CPU、内存、内部和外部总线系统。
同时集成诸如通讯接口、定时器,实时时钟等外围设备。
在内部ROM中载入程序既可以实现对其的操作控制。
我们使用了AT89S52这款单片机,它具有内部ROM空间大,工作速度快等优点,便于以后的升级扩展,具体的技术细节请参看技术手册。
现在主流的MCS-51单片机要想正常工作必须配备复位和时钟电路,复位脚必需在振荡器起振后至少保持两个机器周期复位电平。
也就是说,复位脚(RST)复位电平保持时间应包含VCC的建立时间、振荡器起振时间和至少两个机器周期时间。
本次设计采用最基本的上电复位电路,具体参数和连接请参看图3.3。
另外的时钟电路则为整个系统提供了系统的时基,主要有一个晶振来起振,另外两个电容可以增强时钟电路的稳定性,具体参数和连接图请参看图3.4。
图3.3单片机复位电路
图3.4单片机时钟电路
3.2.3液晶显示电路设计
为了保证连接的简单和方便我们使用了一款8×
2的字符型LCD,具体型号为VT082A它具有体积小、接口简单、功率损耗低和使用寿命长等许多优点,在各种设计中得到了广泛的使用。
它的操作时序完全符合6800的8位并行接口时序。
具体的控制字可以参考手册,操作的时序如图3.5所示:
图3.5液晶接口时序
3.3测温电路总体的电路设计
经过以上论述我们以AT89S52单片机为例,电路采用正常供电方式,当DS18B20处于写存储器操作和温度A/D变换操作时,总线上须有强的上拉,上拉开启时间最大为10μs。
只要在数据线上加一个上拉电阻4.7kΩ,另外2个脚分别接电源和地即可。
显示部分并没有采用数码管,而是使用了8×
2型字符LCD。
(硬件电路图见附录1)
第4章软件设计
4.1程序主要部分
程序主要部分如下:
详细完整的程序请参看附录。
voidDelay_Us(inti)//微秒延时程序
voidCheck_Bf(void)//LCD读忙函数
voidLcd_W(unsignedchardat,unsignedcharcd)//LCD写命令或数据函数
voidLcd_Init(void)//LCD初始化函数
voiddsInit()//DS18B20初始化函数
voiddsWait()//DS18B20等待函数
bitreadBit()//向DS18B20读取一位数据
unsignedcharreadByte()//读取一字节数据,通过调用readBit()来实现
voidwriteByte(unsignedchardat)//向DS18B20写入一字节数据
voidsendChangeCmd()//向DS18B20发送温度转换命令
intgetTmpValue()//获取当前温度值
voiddisplay(intv)//调用液晶显示函数
voidmain(void)//主函数
{
unsignedchari;
Lcd_Init();
//调用液晶初始化函数
while
(1)//
{
sendChangeCmd();
//启动温度转换
for(i=0;
i<
40;
i++)
{
display(tempValue);
//调用显示函数
}
tempValue=getTmpValue();
//调用读取函数获取温度
4.2详细完整的程序请参看附录2。
第5章安装与调试
5.1电路参数的选取与安装
在确定了电路主要的器件之后,我们可以查阅参考文献确定具体的电路参数,具体如下:
单片机选择AT89S52一片,单片机的复位电路需要22uf电容和1K电阻各一,时钟电路需要12M晶振一个60pf电容两个,测温电路只需要一个DS18B20和一个4.7K的电阻即可,显示电路只要一快LCD就可以完成显示任务。
1.电路的组装是在单元电路设计,参数计算和元器件选择的基础上,对理论设计进行验收,并进行修改完善,直至达到设计要求为止。
电路的组装与调试分为单元电路和整机两步进行。
2.电路组装是按照所设计的电路图把元器件可靠的安装连接好,使电路实现正常工作。
在组装前应尽可能把元器件检测一遍,保证所有元器件都合格。
在电路组装时应注意以下原则:
3.所有集成电路的组装方向要一致,以有利于布线和查线。
4.导线的颜色应该符合一般的使用习惯。
5.元器件安排从左向右或从右向左,不应形成环路使信号的输入极与输出极靠近。
6.连线尽量做到横平竖直,连线不能跨接在元器件上。
信号线与电源线不能长距离并行。
合理的布置地线,低频电路要一点接地。
5.2调试
电路的调试是在电路组装后进行的。
首先对电路工作状态和相应的参数进行测量,然后根据性能要求对电路的某些参数进行修改或变更,使之达到设计要求。
把整机组装好后就可以写入程序以便进行调试。
程序全文请参考附录。
在调试的时候应该单独调试,先调试显示电路的LCD,这样可以方便以后的进一步调试,当LCD正常工作之后即可调试DS18B20,对其要加倍注意他的时序要求,注意程序的写法,按要求操作直到达到理想的结果。
第6章总结
在本次课程设计过程中,使用了广泛的参考如:
电路,数、模电子技术,单片机技术,自动检测技术,电路板设计,智能仪器的设计应用,传感器的使用等方面的资料。
使得在本次设计中,接线等方面比较合理,运行平稳,没有任何故障。
设计成功,LCD
的显示范围从-55到+125,并具有5位的显示位数,这样的精度在一般的温度测试仪器上是很难见到的,由于LCD的使用也减小了硬件电路焊接的繁杂,减少了出错的机会。
在一定的温度范围内,不考虑器件导致的误差的话,精度已经达到了0.003。
由于设备的欠缺,最后的温度标定没能够实现,所以LCD的显示结果有一定的误差,其显示温度比真实温度偏高了一点。
参考文献
[1]李玉峰,倪虹霞.《MCS-51系列单片机原理与接口技术》.人民邮电出版社2004-5
[2]何宏,龚威,田志宏.《单片机原理与接口技术》.国防工业出版社2006-1
[3]朱勇,吴周桥,乔宇锋,唐新东.《ProtelDxp范例入门与提高》.清华大学出版社2004-1
[4]凌玉华,刘连浩,杨进宝等.《单片机原理及应用系统设计》.中南大学出版社2006-5
[5]邹振春.《MCS-51系列单片机原理及接口技术》.机械工业出版社2006-8
[6]赵晓安,杨鹏,耿恒山.《MCS-51单片机原理及应用》.天津大学出版社2001-3
[7]Martin,K..《数字集成电路设计》(英文版)(DigitalIntegratedCircuitDesign(TheOxfordSeriesinElectricalandComputerEngineering).OxfordUniversityPress,电子工业出版社
[8]韩建国,廖俊必,[英国]GuiyunTian.《单片机原理及应用》(英文版).高等教育出版社
附录1:
硬件电路图
附录2完整的程序:
#include"
REGX52.h"
#defineRWP1_0
#defineENP1_1
#defineRSP1_2
#defineDQP1_3
#defineLCD_PP2
inttempValue;
voidDelay_Us(inti)
{
while(i--);
}
voidCheck_Bf(void)
unsignedcharshuju;
do
RS=0;
RW=1;
EN=1;
shuju=LCD_P;
EN=0;
while((shuju>
>
7)&
1);
Delay_Us(20);
voidLcd_W(unsignedchardat,unsignedcharcd)
Check_Bf();
RS=cd;
//cd=0为指令,为1为数据
RW=0;
EN=1;
LCD_P=dat;
EN=0;
//下降沿有效
voidLcd_Init(void)
Lcd_W(0x38,0);
Lcd_W(0x08,0);
Lcd_W(0x01,0);
Lcd_W(0x0f,0);
Lcd_W(0x06,0);
Lcd_W(0x80,0);
//通过DS18B20测试当前环境温度,并通过数码管显示当前温度值,目前显示范围:
-55~+125度
//延时函数,对于11.0592MHz时钟,例i=10,则大概延时10ms.
voiddelay(unsignedinti)
unsignedintj;
while(i--)
for(j=0;
j<
125;
j++);
//初始化DS18B20
//让DS18B20一段相对长时间低电平,然后一段相对非常短时间高电平,即可启动
voiddsInit()
//对于11.0592MHz时钟,unsignedint型的i,作一个i++操作的时间大于为8us
unsignedinti;
DQ=0;
i=100;
//拉低约800us,符合协议要求的480us以上
while(i>
0)i--;
DQ=1;
//产生一个上升沿,进入等待应答状态
i=4;
voiddsWait()
while(DQ);
while(~DQ);
//检测到应答脉冲
while(i>
0)i--;
//向DS18B20读取一位数据
//读一位,让DS18B20一小周期低电平,然后两小周期高电平,
//之后DS18B20则会输出持续一段时间的一位数据
bitreadBit()
bitb;
//写"
1"
将DQ拉低15us后,在15us~60us内将DQ拉高,即完成写1
if(b)
DQ=0;
i++;
//拉低约16us,符号要求15~60us内
i=8;
//延时约64us,符合写时隙不低于60us要求
else//写"
0"
将DQ拉低60us~120us
//拉低约64us,符号要求
//整个写0时隙过程已经超过60us,这里就不用像写1那样,再延时64us了
}
voidsendChangeCmd()//向DS18B20发送温度转换命令
dsInit();
//初始化DS18B20,无论什么命令,首先都要发起初始化
dsWait();
//等待DS18B20应答
delay
(1);
//延时1ms,因为DS18B20会拉低DQ60~240us作为应答信号
writeByte(0xcc);
//写入跳过序列号命令字SkipRom
writeByte(0x44);
//写入温度转换命令字ConvertT
voidsendReadCmd()//向DS18B20发送读取数据命令
writeByte(0xbe);
//写入读取数据令字ReadScratchpad
intgetTmpValue()//获取当前温度值
unsignedinttmpvalue;
intvalue;
//存放温度数值
floatt;
unsignedcharlow,high;
sendReadCmd();
//连续读取两个字节数据
low=readByte();
high=readByte();
//将高低两个字节合成一个整形变量
//计算机中对于负数是利用补码来表示的
//若是负值,读取出来的数值是用补码表示的,可直接赋值给int型的value
tmpvalue=high;
tmpvalue<
<
=8;
tmpvalue|=low;
value=tmpvalue;
//使用DS18B20的默认分辨率12位,精确度为0.0625度,即读回数据的最低位代表0.0625度
t=value*0.0625;
Lcd_W(datas[3]+30,1);
Lcd_W(datas[4]+30,1);
Lcd_W(0xdf,1);
Lcd_W('
C'
1);
voidmain(void)
while
(1)
//启动温度转换
sendChangeCmd();
//显示5次