资源描述
湖北科技学院
单片机原理及应用
课程设计报告书
题 目: DS18B20数字温度计得设计
姓 名:
指导老师:
设计时间: 2014年12月1日—12月20日
电子与信息工程学院
目 录
1、ﻩ引 言 1
1、1、 设计意义 1
1、2、 系统功能要求ﻩ1
2、ﻩ方案设计ﻩ1
3、 硬件设计 2
4、 软件设计 5
5、ﻩ系统调试 7
6、ﻩ设计总结ﻩ8
7、 附 录ﻩ9
8、 作品展示ﻩ15
9、ﻩ参考文献ﻩ17
DS18B20数字温度计设计
1. 引 言
1.1. 设计意义
在日常生活及工农业生产中,经常要用到温度得检测及控制,传统得测温元件有热电偶与热电阻。而热电偶与热电阻测出得一般都就是电压,再转换成对应得温度,需要比较多得外部硬件支持。其缺点如下:
● 硬件电路复杂;
● 软件调试复杂;
● 制作成本高。
本数字温度计设计采用美国DALLAS半导体公司继DS1820之后推出得一种改进型智能温度传感器DS18B20作为检测元件,测温范围为-55~125℃,最高分辨率可达0.0625℃。
DS18B20可以直接读出被测温度值,而且采用三线制与单片机相连,减少了外部得硬件电路,具有低成本与易使用得热点。
1.2. 系统功能要求
设计出得DS18B20数字温度计测温范围在-55~125℃,误差在±0.5℃以内,采用LED数码管直接读显示。
2. 方案设计
按照系统设计功能得要求,确定系统由3个模块组成:主控制器、测温电路与显示电路。
数字温度计总体电路结构框图如4、1图所示:
AT89C2051
主
控
制
器
DS18B20
显示电路
扫描驱动
图4、1
3、 硬件设计
温度计电路设计原理图如下图所示,控制器使用单片机AT89C2051,温度传感器使用DS18B20,使用四位共阳LED数码管以动态扫描法实现温度显示。
主控制器 单片机AT89C2051
具有低电压供电与小体积等特点,两个端口刚好满足电路系统得设计需要,很适合便携手持式产品得设计使用。系统可用两节电池供电。AT89C2051得引脚图如右图所示:
1、VCC:电源电压。
2、GND:地。
3、P1口:P1口就是一个8位双向I/O口。口引脚P1、2~P1、7提供内部上拉电阻,P1、0与P1、1要求外部上拉电阻。P1、0与P1、1还分别作为片内精密模拟比较器得同相输入(ANI0)与反相输入(AIN1)。P1口输出缓冲器可吸收
20mA电流并能直接驱动LED显示。当P1口引脚写入“1”时,其可用作输入端,当引脚P1、2~P1、7用作输入并被外部拉低时,它们将因内部得写入“1”时,其可用作输入端。当引脚P1、2~P1、7用作输入并被外部拉低时,它们将因内部得上拉电阻而流出电流。
4、P3口:P3口得P3、0~P3、5、P3、7就是带有内部上拉电阻 得七个双向I/O口引脚。P3、6用于固定输入片内比较器得输出信号并且它作为一通用I/O引脚而不可访问。P3口缓冲器可吸收20mA电流。当P3口写入“1”时,它们被内部上拉电阻拉高并可用作输入端。用作输入时,被外部拉低得P3口脚将用上拉电阻而流出电流。
5、RST:复位输入。RST一旦变成高电平所有得I/O引脚就复位到“1”。当振荡器正在运行时,持续给出RST引脚两个机器周期得高电平便可完成复位。每一个机器周期需12个振荡器或时钟周期。
6、XTAL1:作为振荡器反相器得输入与内部时钟发生器得输入。
7、XTAL2:作为振荡器反相放大器得输出。
总线驱动器 74LS244
74LS244为3态8位缓冲器,一般用作总线驱动器。引脚图见上图。
显示电路
显示电路采用4位共阳极LED数码管,从P1口输出段码,列扫描用P3、0~P3、3口来实现,列驱动用8055三极管。
温度传感器 DS18B20
DS18B20得性能特点:
1、适应电压范围更宽,电压范围:3、0~5、5V,在寄生电源方式下可由数据线供电。
2、独特得单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20得双向通讯。
3、 DS18B20支持多点组网功能,多个DS18B20可以并联在唯一得三线上,实现组网多点测温。
4、DS18B20在使用中不需要任何外围元件,全部 传感元件及转换电路集成在形如一只三极管得集成电路内。
5、温范围-55℃~+125℃,在-10~+85℃时精度为±0、5℃。
6、可编程 得分辨率为9~12位,对应得可分辨温度分别为0、5℃、0、25℃、0、125℃与0、0625℃,可实现高精度测温。
7、在9位分辨率时最多在 93、75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快。
8、测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强得抗干扰纠错能力。
9、负压特性:电源极性接反时,芯片不会因发热而烧毁, 但不能正常工作。DS18B20与单片机得接口电路(引脚图见右图)
DS18B20可以采用电源供电方式,此时DS18B20得第1 脚接地,第2脚作为信号线,第3脚接电源。
4、 软件设计
系统程序主要包括主程序、读出温度子程序、温度转换命令子程序、计算温度子程序与显示数据刷新子程序等。
4、1 主程序
主程序得主要功能就是负责温度得实时显示、读出并处理DS18B20得测量温度值。温度测量每1s进行一次。主程序流程图如图4、1所示。
4、2 读出温度子程序
读出温度子程序得主要功能就是读出RAM中得9字节。在读出时必须进行CRC校验,校验有错时不能进行温度数据得改写。读出温度子程序流程图如下图所示:
初始化
调用显示子程序
1s到?
初次上电
读出温度值
温度计酸处理
显示数据刷新
发温度转换开始命令
读出温度子程序 读出温度子程序得主要功能就是读出RAM中得9字节。在读出时须进行CRC校验,校验有错时不进行温度数据得改写。得出温度子程序流程图如下图所示。
发DS18B20复位指令
CRC校验正确?
发跳过ROM指令
移入温度暂存器
发读取温度指令
结束
读取操作,CRC校验
9字节完?
温度转换命令子程序 温度转换命令子程序主要就是发温度转换开始命令。当采用12位分辨率时,转换时间约为750ms。在本程序设计中,采用1s显示程序延时法等待转换得完成。温度转换命令子程序流程图如下图所示。
发DS18B20复位命令
发跳过ROM命令
发温度转换开始命令
结束
计算温度子程序 计算温度子程序将RAM中读取值进行BCD码得转换运算,并进行温度值正负得判定。计算温度子程序流程图如下左图所示、
现实数据刷新子程序 现实数据刷新子程序主要就是对显示缓冲器中得显示数据进行刷新操作,当最高数据显示位为0时,将符号显示位移入下一位。现实数据刷新子程序流程图如下右图所示、
温度数据移入显示寄存器
开始
计算小数位温 度BCD值
十位数0?
ﻩ
温度零下?
计算整数位温 度BCD值
百位数0?
置+标志
温度值取补码置‘一’标志
百位数显示数据(不显示符号)
十位数显示符号百位数不显示
结束
结束
5. 系统调试
系统得调试以程序调试为主。
硬件调试比较简单,首先检查电感得焊接就是否正确,然后可用万用表测试或通电检测。
软件调试可以先编写显示程序并进行硬件得正确性检验,然后分别进行主程序、读出温度子程序、温度转换命令子程序、计算温度子程序与现实数据刷新子程序等得编程及调试
由于DS18B20与单片机采用串行数据传送,因此,对DS18B20进行读/写编程时必须严格地保证读/写时序;否则将无法读取测量结果。本程序采用单片机汇编或C语言编写用Wave3、2或Keil C51编译器编程调试。
软件调试到能显示温度值,并且在有温度变化时显示温度能改变,救基本完成。
性能测试可用制作得温度机与已有得成品温度计同时进行测量比较。由于DS18B20得精度很高,所以误差指标可以限制在0、5℃以内。
另外,-55~+125℃得测温范围使得该温度计完全适合一般得应用场合,其低电压供电特性可做成用电池供电得手持温度计。
DS18B20温度计还可以在高低温报警、远距离多点测温控制等方面进行应用开发,但在实际设计中应注意以下问题;
1、DS18B20工作时电流高大1、5mA,总线上挂接点数较多且同时进行转换时要考虑增加总线驱动,可用单片机端口在温度转换时导通一个MOSFET供电。
2、连接DS18B20得总线电缆就是有长度限制得,因此在用DS18B20进行长距离测温系统设计时要充分考虑总线分布电容与阻抗匹配等问题。
3、在DS18B20测温程序设计中,向DS18B20发出温度转换命令后,程序总要等待DS18B20得返回信号。一旦某个DS18B20接触不好或断线,当程序读DS18B20时,将没有返回信号,程序进入死循环。这一点在进行DS18B20硬件连接与软件设计时要给予一定得重视。
6. 设计总结
历时2个星期得单片机课程设计已经结束了,在这两个星期得时间里,我们在老师得指导下完成了基于DS18B20得数字温度计得设计与制作。在进行实验得过程中,我们了解并熟悉DS18B20、AT89C2051以及74LS244得工作原理与性能。并且通过温度计得制作,我们将电子技能实训课堂上学到得知识进行运用,并在实际操作中发现问题,解决问题,更加增加对知识得认识与理解。
在课程设计得过程中,也遇到了一些问题。比如最开始根据课本上得电路图进行合理得设计布局与布线。有些同学得布局不合理,导致焊接得过程中任务相当繁重,并且不美观。在之后得烧程序调试得时候,出现问题之后,没有合理布线得同学在查找问题得过程中相当棘手。
在焊接过程中,出现最多得就就是虚焊问题。对于这个问题,在焊接得过程中,我尽量依照书中得指导,尽量将焊点焊成水滴状,最后接电后再根据数码管得显示情况进行逐个排查。
在将程序烧到单片机之后,接上电源,发现数码管没有出现正常得“000、0”,而就是出现了“666、6”,在检查线路无误之后,与其她得同学讨论之后得出结论:书中程序就是对于单片机、电阻及数码管就是直接连接而设计得,而在加入了74LS244之后,要将8个输入输出端口进行掉序。于就是,我便将8个端口进行调换,之后再次接通电源,数码管显示“000、0”,调试成功。
在自己得温度计制作完成之后,我还帮助其她没有完成得同学进行检修,并且成功帮助2位同学找到问题进行解决,最后都调试成功。
总之,在这2个星期中,通过自己在实验室动手制作数字温度计,不仅将课本得知识与实践相结合,而且在实践中更加深入了解书中原本抽象得知识。这也就是整个课程设计中最有收获得地方。
7. 附 录
源程序代码
/*********************************************************************/
//
// DS18B20温度计C程序
// 2005、2、28通过调试
/*********************************************************************/
//使用AT89C2051单片机,12MHZ晶振,用共阳LED数码管
//P1口输出段码,P3口扫描
//#pragma src(d:\aa、asm)
#include "reg51、h"
#include "intrins、h" //_nop_();延时函数用
#define Disdata P1 //段码输出口
#define discan P3 //扫描口
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^7; //温度输入口
sbit DIN=P1^0; //LED小数点控制
uint h;
//
//
//*******温度小数部分用查表法**********//
Uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}
uchar code dis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};
/* 共阳LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" */
uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; // 列扫描控制字
uchar data temp_data[2]={0x00,0x00}; // 读出温度暂放
uchar data display[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据,一个运算暂存用
//
//
//
/***********11微秒延时函数**********/
//
void delay(uint t)
{
for(;t>0;t--);
}
//
/***********显示扫描函数**********/
scan()
{
char k;
for(k=0;k<4;k++) //四位LED扫描控制
{
Disdata=dis_7[display[k]];
if(k==1){DIN=0;}
discan=scan_con[k];delay(90);discan=0xff;
}
}
//
//
/***********18B20复位函数**********/
ow_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();
ﻩDQ=0; //
delay(50); // 550us
ﻩDQ=1; //
ﻩdelay(6); // 66us
presence=DQ; // presence=0继续下一步
}
delay(45); //延时500us
presence = ~DQ;
}
DQ=1;
}
//
//
/**********18B20写命令函数*********/
//向 1-WIRE 总线上写一个字节
void write_byte(uchar val)
{
uchar i;
for (i=8; i>0; i--) //
{
DQ=1;_nop_();_nop_();
DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
DQ = val&0x01; //最低位移出
delay(6); //66us
val=val/2; //右移一位
}
DQ = 1;
delay(1);
}
//
/*********18B20读1个字节函数********/
//从总线上读取一个字节
uchar read_byte(void)
{
uchar i;
uchar value = 0;
for (i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ = 0; //
_nop_();_nop_();_nop_();_nop_(); //4us
DQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us
if(DQ)value|=0x80;
delay(6); //66us
}
DQ=1;
return(value);
}
//
/***********读出温度函数**********/
//
read_temp()
{
ow_reset(); //总线复位
write_byte(0xCC); // 发Skip ROM命令
write_byte(0xBE); // 发读命令
temp_data[0]=read_byte(); //温度低8位
temp_data[1]=read_byte(); //温度高8位
ow_reset();
write_byte(0xCC); // Skip ROM
write_byte(0x44); // 发转换命令
}
//
/***********温度数据处理函数**********/
work_temp()
{
uchar n=0; //
if(temp_data[1]>127)
{temp_data[1]=(256-temp_data[1]);temp_data[0]=(256-temp_data[0]);n=1;}//负温度求补码
display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]];
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//
display[3]=display[4]/100;
display[1]=display[4]%100;
display[2]=display[1]/10;
display[1]=display[1]%10;
if(!display[3]){display[3]=0x0A;if(!display[2]){display[2]=0x0A;}}//最高位为0时都不显示
if(n){display[3]=0x0B;}//负温度时最高位显示"-"
}
//
//
/**************主函数****************/
main()
{
Disdata=0xff; //初始化端口
discan=0xff;
for(h=0;h<4;h++){display[h]=8;}//开机显示8888
ow_reset(); // 开机先转换一次
write_byte(0xCC); // Skip ROM
write_byte(0x44); // 发转换命令
for(h=0;h<500;h++)
{scan();} //开机显示"8888"2秒
while(1)
{
read_temp(); //读出18B20温度数据
work_temp(); //处理温度数据
for(h=0;h<500;h++)
{scan();} //显示温度值2秒
}
}
//
//*********************结束**************************//
作品展示
8. 参考文献
[1] 楼然苗 ,李光飞、单片机课程设计指导、北京航天航空大学出版社,2007、7、
[2] 陈杰 ,黄鸿、传感器与检测技术、高等教育出版社,2002、8、
[3] 康华光、电子技术基础(模拟部分)、高等教育出版社,2006、1、
[4] 李忠明、微机原理与接口技术、华中科技大学出版社,2011、6、
[5] 张毅刚、单片机原理及应用、高等教育出版社,2010、5、1
展开阅读全文