海南大学
题目:DS18B20数字温度计 学号:20090502310004 姓名:陈世云 年级:2009级
学院:机电工程学院
系别:电气工程及其自动化 专业:电气工程及其自动化 指导教师:马志英
1
单片机技术课程设计报告
完成日期:2012年6月5日
目录
1.设计任务和要求………………………………………………………4 2.方案设计与论证………………………………………………………4
2.1方案设计3
2.2各方案的优点…………………………………………………5 2.3各方案的缺点…………………………………………………6 2.4对比选择………………………………………………………6 3.系统设计………………………………………………………………6
3.1系统硬件设计…………………………………………………5 3.1.1.1.1DS18B20简介………………………………………6
3.1.1.2 DS18B20的性能特点…………………………………7 3.1.1.3 DS18B20测温原理…………………………………8 3.1.2电路结构框图……………………………………………9 3.1.3电路原理图………………………………………………9 3.1.4PC板图…………………………………………………10 3.1.5工作原理………………………………………………10 3.1.6 温度传感器部分………………………………………10 3.1.7 单片机部分……………………………………………11 3.1.8显示部分………………………………………………12 3.2系统软件设计…………………………………………………12
2
3.2.1程序设计框图…………………………………………12 3.2.2程序结构………………………………………………12
4.电路安装调试及结果………………………………………………16 5.设计总结……………………………………………………………17 参考文献………………………………………………………………18 元器件清单……………………………………………………………18 实物展示………………………………………………………………19
3
1.设计任务和要求
(1)本次设计的工作是用单片机和温度传感器设计数字显示温度计,要完成本电路必须要完成以下功能电路设计。 (2)用LED数码管或LCD显示温度值; (3)温度测量范围:-55℃--+125℃; (4)温度显示分辨:1℃; (5)温度超过限制报警。
2.方案设计与论证
2.1方案设计
方案一、
利用LM35温度感应器在温度变化时转化成电压的等比例变换,然后通过数码显示管以数字的显示显示出来。此电路图的核心元件是利用ICL7107来完成功能的转换,ICL7107是一块应用非常广泛的集成电路。它包含3 1/2位数字A/D转换器,可直接驱动LED数码管,内部设有参考电压、独立模拟开关、逻辑控制、显示驱动、自动调零功能等。制作时,数字显示用的数码管为共阳型,2K可调电阻最好选用多圈电阻,分压电阻选用误差较小的金属膜电阻,其它器件选用正品即可。
4
方案二、
利用集成温度传感器AD590设计并制作了一款基于AT89C51的4位数码管显示的数字温度计,其电路简单,软硬件结构模块化,易于实现。该数字温度计利用AD590集成温度传感器及其接口电路完成温度的测量并转换成模拟电压信号,经由模数转换器ADC0804转换成单片机能够处理的数字信号,然后送到单片机AT89C51中进行处理变换,最后将温度值显示在D4、D3、D2、D1共4位七段码LED显示器上。系统以AT89C51单片机为控制核心,加上AD590测温电路、ADC模数转换电路、4位温度数据显示电路以及外围电源、时钟电路等组成。本设计和方案一一样采用模数转换。 方案三、
在日常生活及工农业生产中经常要用到温度的检测及控制,传统的测温元件有热电偶和热电阻。而热电偶和热电阻测出的一般都是电压,再转换成对应的温度,需要比较多的外部硬件支持,硬件电路复杂,软件调试复杂,制作成本高。本数字温度计设计采用美国DALLAS半导体公司继DS1820之后推出的一种改进型智能温度传感DS18B20作为检测元件,温度范围为-55~125℃,最大分辨率在0.0625℃。DS18B20可以直接读出温度被测温度值,而且采用三线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。按照系统设计功能的要求,确定系统由3个模块组成:主控制器、测温电路、显示电路。数字温度计总体电路结控制器使用单片机AT89C2051,温度传感器使用DS18B20,用4位共阳LED数码管以动态扫描实现温度
5
显示.
2.2各方案的优点
方案一使用集成电路原理是将温度信号转换为模拟电信号,再经数模转换,原理简单。该电路稍加改造,还可演变出很多电路,如数显电流表、数显温度计等. 静默电流温度关系。 方案二电路简单,软硬件结构模块化,易于实现
方案三的电路温度分辨率高、电路简单、可靠,可以再较高环境要求下准确测温,故采用此方案。
2.3各方案的缺点
方案一和方案二硬件电路复杂,软件调试复杂,制作成本高,精度不高,不适合在高精度场合使用。
2.4对比选择
综合各方案优缺点决定选择方案三
3.系统设计
3.1系统硬件电路的设计
3.1.1.1.1DS18B20简介
DS18B20的引脚分布(图2),由DALLAS半导体公司生产的DS18B20型单线智能温度传感器,属于新一代适配微处理器的智能温度传感器。与传统的热敏电阻相比,它能够直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。其
6
可以分别在93.75ms和750ms内完成9位和12位的数字量,最大分辨率为0.0625℃,而且从DS18B20读出或写入DS18B20的信息仅需要一根口线(单线接口)读写
图1. DS18B20外部形状及管脚图
3.1.1.2 DS18B20的性能特点
(1)独特的单线接口,既可通过串行口线,也可通过其它I/O口线与微机接口,无需变换其它电路,直接输出被测温度值。
(2)多点(multidrop)能力使分布式温度检测应用得以简化。 (3)不需要外部元件。
(4)既可用数据线供电,也可采用外部电源供电。 (5)不需备份电源。
(6)测量范围为-55°~+125℃,固有测温分辨率为0.5℃。 (7)通过编程可实现9~12位的数字读数方式。
7
(8)用户可定义非易失性的温度告警设置。
(9)警告搜索命令能识别和寻址温度在编定的极限之外的器件(温度警告情况)。
(10)应用范围包括恒温控制、工业系统、消费类产品、温度计或任何热敏系统。
3.1.1.3 DS18B20测温原理
DS18B20的测温原理如图2所示,图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
8
斜率累加器 预值 比较 低温度系数振荡器 计数器1 预值 置位/清除 加1 =0 温度寄储器 高温度系数振荡器 计数器2 停止 =0 图1 DS18B20
测温原理
3.1.2电路结构框图
单片机复位 LCD主显 示 控 制 温 器 度 时钟振荡 传 感 器 3.1.3电路原理图
9
3.1.4PC板图
10
3.1.5工作原理
系统整体硬件电路包括,传感器数据采集电路,温度显示电路,上下限报警调整电路,状态显示电路,报警电路,单片机主板电路等,如图2所示。
3.1.6 温度传感器部分
温度传感器用DS18B20。DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。本设计电路的DS18B20采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。
11
在使用DS18B20时,首先初始化温度传感器。然后将已保存的温度的上下限值从EEPRAM调到RAM中。再读取温度。读取温度后,将温度的值发送到单片机中,并检查温度是否在设置的范围内。如果在,不发出报警信号。如果不在,就发出报警信号到单片机中。随后,再读取温度,然后将温度的值发送到单片机中,并检查温度是否在设置的范围内。最后,不断地循环此过程。
3.1.7 单片机部分
单片机为此次电路的核心,它起到了控制整个电路的作用。
第一,它能够控制温度传感器还能够读取温度传感器的相关信息。第二,他能够控制LCD显示温度,两个LED显示状态,并在异常状态下发出报警。最后,单片机能够扫描按键,并处理按键信息。 单片机先将温度传感器初始化。然后发送重调EEPRAM命令。将已保存的温度的上下限值从EEPRAM调到RAM中。这样就可以根据上次已经设定好的温度的上下限值进行报警,而且设定好的温度的上下限值关机后不会消失。各项准备做完后,发送温度转换命令,并读取温度。读完温度后,就将十六进制的温度值转换成是十进制的温度值。最后将温度的值从P0口传递给LCD显示出来。而且单片机还时刻判断接收到了报警信号没有。如果没有,则判断为正常状态,绿色发光二极管亮。如果接收到了,则判断为异常状态。此时,红色LED亮,并且发出报警信号。如果确认键按下后,程序就跳到温度的上下限值调整程序。当温度的上下限值调整完后,能将调整的数值保存到存储单元中。然后,单片机向温度传感器发出指令,将数值发送到DS18B20的
12
RAM中,再将数值从DS18B20的RAM中复制到DS18B20的EEPROM中。使调整好的温度的上下限值关机后不消失。
3.1.8显示部分
本电路采用两位LCD显示。
3.2系统软件设计
3.2.1程序设计框图 开 始 DS18B20初始化 按时序读出二进制温度值
二进制温度值转换成十进制
显示温度值
3.2.2程序结构
/********************************************************************** * * * TFT液晶红温度和时钟综合显示程序 * * ( 普中科技 ) * * * * 实验目的:1.掌握TFT彩屏驱动程序的编写、 *
* 2.学会运用取字模软件应用(取字符和汉字数组) * * 3.学会怎样处理字模数组数据 *
* *
13
*
*实验现象: 彩屏中显示温度和时钟 * * * ***********************************************************************/
#include unsigned char Tempera_Val[3] ,temp; //温度 unsigned char RTC_Val[15]; //时钟数组 unsigned int xdata TIM,TIM1; //用于间隔读取温度和时钟 extern unsigned int idata Temperature; //温度 extern unsigned char xdata D[8]; //读取时钟放到D数组中 int t=0; extern void Read_RTC(void); extern void GetTemp (void); extern void Set_RTC(void); //set RTC sbit buzz = P3^5; sbit Beep = P2^4; /********************************************************** 配置定时器参数 **********************************************************/ void Timer_Ini() { TMOD|= 0x11; TH1 = 0xD8; //10 TL1 = 0xF0; IE = 0x8A; TR1 = 1; } void delay (unsigned char m) //控制频率延时 { unsigned i=3*m; while(--i); } void delayms(unsigned char a) //豪秒延时子程序 { 14 while(--a);} /********************************************************** 主函数 **********************************************************/ void main(void) { int x; unsigned char i=0; P2 = 0xff; P0 = 0xff; Timer_Ini(); //初始化 LCD_init(); //初始化 LCD_clear(5); //清屏 ChineseChar(6,10,2,colors[2],colors[5],1); //数 ChineseChar(30,10,2,colors[2],colors[5],2); //字 ChineseChar(54,10,2,colors[2],colors[5],3); //温 ChineseChar(78,10,2,colors[2],colors[5],4); //度 ChineseChar(102,10,2,colors[2],colors[5],5); //计 ChineseChar(24,40,1,colors[0],colors[5],10); //温 ChineseChar(40,40,1,colors[0],colors[5],11); //度 ChineseChar(80,40,1,colors[3],colors[5],12); //℃ ChineseChar(20,70,1,colors[2],colors[5],13); ChineseChar(36,70,1,colors[2],colors[5],14); ChineseChar(55,70,1,colors[2],colors[5],15); ChineseChar(75,70,1,colors[2],colors[5],16); ChineseChar(95,70,1,colors[2],colors[5],17); ChineseChar(0,90,1,colors[2],colors[5],18); ChineseChar(20,90,1,colors[2],colors[5],19); ChineseChar(40,90,1,colors[2],colors[5],20); ChineseChar(70,90,1,colors[2],colors[5],21); ChineseChar(90,90,1,colors[2],colors[5],22); ChineseChar(110,90,1,colors[2],colors[5],23); ChineseChar(4,120,2,colors[2],colors[5],6); //数 ChineseChar(34,120,2,colors[2],colors[5],7); //字 ChineseChar(64,120,2,colors[2],colors[5],8); //温 15 ChineseChar(94,120,2,colors[2],colors[5],9); Set_RTC(); while(1) { if( TIM1 >= 10) //每隔 10ms 读取ds1302 { TIM1 = 0; Read_RTC(); //读取DS1302 } GetTemp(); //*****温度*********************** Tempera_Val[0] = Temperature%100/10 + 0x30; //Temperature; Tempera_Val[1] = Temperature%10 + 0x30; Tempera_Val[2] ='.'; if(Tempera_Val[0]==0x33&&Tempera_Val[1]>0x31) { for(x=1;x<101;x++){Beep=1; delay(100); Beep=0; delay(100);} } LCD_ShowString(60,40,colors[7],colors[2], Tempera_Val); //将字符送到彩屏中显示 LCD_ShowString(10,100,colors[7],colors[2], RTC_Val); //将字符送到彩屏中显示 if(t == 0) { ChineseChar(6,10,2,colors[0],colors[5],1); //数 ChineseChar(30,10,2,colors[1],colors[5],2); //字 ChineseChar(54,10,2,colors[2],colors[5],3); //温 ChineseChar(78,10,2,colors[3],colors[5],4); //度 ChineseChar(102,10,2,colors[4],colors[5],5); //计 ChineseChar(4,120,2,colors[2],colors[1],6); //数 ChineseChar(34,120,2,colors[2],colors[1],7); //字 ChineseChar(64,120,2,colors[2],colors[1],8); //温 16 ChineseChar(94,120,2,colors[2],colors[1],9); t++; } else { ChineseChar(6,10,2,colors[3],colors[5],1); // ChineseChar(30,10,2,colors[4],colors[5],2); // ChineseChar(54,10,2,colors[0],colors[5],3); // ChineseChar(78,10,2,colors[6],colors[5],4); // ChineseChar(102,10,2,colors[7],colors[5],5); // //数 //字 //温 ChineseChar(4,120,2,colors[2],colors[5],6); ChineseChar(34,120,2,colors[2],colors[5],7); ChineseChar(64,120,2,colors[2],colors[5],8); ChineseChar(94,120,2,colors[2],colors[5],9); t=0 ; } } ;} /************************************* [ t1 (10ms)中断] 中断 *************************************/ void T1zd(void) interrupt 3 { TH1 = 0xD8; //10 TL1 = 0xF0; TIM++; TIM1++; } 4.电路安装调试及结果 我们组的电路的核心功能是温度的测量与显示,这部分的调试较为顺利,很容易实现.调试中主要的问题出现在显示上. 原本温度的显示是采用数码管,后来因器材原因,我们组采用LCD 17 彩屏替代。采用彩屏实现,一方面虽然较为复杂,但实现的功能也更为丰富。我们组的扩展功能也都是集中在彩屏显示上。由于没有自带的字库,要彩屏并不能直接显示汉字。在经过搜索相关资料后,我们发现可以将汉字取模后,建立字库,再在主函数中以子程序调用的方式显示。关于这块我们组花了相当长的时间来弄清彩屏显字的原理。由于字体的颜色可以通过赋值来改变,我们又借助一个循环程序不断改变颜色值,从而实现字体闪动的扩展功能。调试结果令人满意 对于报警功能是核心功能的附属功能,主要在获取温度数值后,加一个一判断过程,对于大于设定温度的,就接通蜂鸣器报警。由于我们组在电路焊接时做的较为细致,故在调试时都实现了预定功能。 从而我可以认定是温度传感器坏了,程序没有问题。 5、设计总结 1、 在这次设计中,我们首先遇到的问题就是我们开回来的 PC 板由于孔没有符合规范,孔由于比较小,我们的元器件安装不上,本来想用实验室的扩孔机扩孔的,但由于面板比较硬,而且担心损坏焊盘,所以我们不得不该用别的组的PC板,可以说,我们第一步就比较失败,但是给我们许多启发,做什么事都要认真,不能由于小的失误就耽误正常的工作,特别是我们电气专业的学生,更是重要,以后如果是强电,那么可能由于小小的失误就可能造成人身伤亡。 2、可以说,我们这次的设计中,我们小组的高序磊出的力是最多的,如果不是他带领我们,我们是很难很好地完成本次设计的,无论是在程序调试还是对焊板时,他都起到主要作用。 18 3、在一个小组中,合作是十分重要的,通过这次的设计,充分体现了我们小组成员的协作精神,哪怕只是做小小的工作,那么对别的同学就会减少很多的工作量。 4、从这次课程设计中,我也学到了很多知识。首先温度传感器很容易损坏,所以一定要接好电源线,数据线,地线。如果接反了,就会损坏DS18B20。其次,当调试不成功时,应从最简单的功能入手,根据实验现象找到问题所在。然后一步步的加载功能,逐步调试,就能调试成功。 参考文献 [1] 楼然苗,李光飞编著.51系列单片机设计实例[M].北京:航天航空大学出版社. [2] 先锋工作室.单片机程序设计实例[M].北京:清华大学出版社. [3] 吴金戌,沈庆阳,郭庭吉编著.8051单片机实践与应用[M].北京:清华大学出版社. [4] 梅丽凤.单片机原理及接口技术[M].北京:清华大学出版社,2004. [5] 张迎新.单片机初级教程[M].北京:航空航天大学出版社,2000. [6] 陈杰.传感器与检测技术[M].北京:高等教育出版社,2002. [7] 黄继昌.传感器工作原理及应用实例[M].北京:人民邮电 19 出版社,1998. [8] 肖来胜.单片机技术实用教程[M].武汉:华中科技大学出版社,2004 实物展示 20 因篇幅问题不能全部显示,请点此查看更多更全内容