您的当前位置:首页正文

单片机温度采集与显示

2024-10-18 来源:威能网
单片机课程设计

1、课程设计目的

(1)利用单片机及相应温度传感器设计单检测节点或多检测节点数字温度计 (2)精度误差:0.5摄氏度以内;测温范围:10-50摄氏度 (3)LED数码管或LCD直接显示 (4)完成对设计系统测试

2、数字温度计正文

摘要:随着时代的进步和发展,单片机技术已经普及到我们生活、工作、科研、各个领域,已经成为一种比较成熟的技术,本文主要介绍了一个基于89C52单片机的测温系统,详细描述了利用数字温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,对各部分的电路也一一进行介绍,该系统可以方便的实现温度采集和显示,并可根据需要任意设定上下限报警温度,使用起来相当方便,适合于我们日常生活和嵌入其它系统中,作为其AT89C52结合最简温度检测系统,该系统恶劣环境下进行现场温度测量,有广泛的应用前景。本文将介绍一种基于单片机往制的数字温度计,本温度计属于多功能温度计,可以设置上下报警温度,当温度不在设置范围内时,可以报警。

关键词:单片机,数字控制,温度计,DSIBB20, AT89C52 2.1引言

随着科技的不断发展,现代社会对各种信息参数的准确度和精确度的要求都有了几何级的增长,而如何准确而又迅速的获得这些参数就需要受制于现代信息基础的发展水平。在三大信息信息采集(即传感器技术)、信息传输(通信技术)和信息处理(计算机技构中,传感器属于信息技术的前沿尖端产品,尤其是温度传感器技术,在我国各领域己经引用的非常广泛,可以说是渗透到社会的每一个领域,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。

测量温度的关键是温度传感器,温度传感器的发展经历了三个发展阶段 ①传统的分立式温度传感器 ②模拟集成温度传感器 ③智能温度传感器

目前的智能温度传感器(亦称数字温度传感器)是在20世纪90年代中期问世的,它是微电子技术、计算机技术和自动测试技术(ATE)的结晶,特点是能输出温度数据及相关的温度控制量,适配各种微控制器(MCU)。社会的发展使人们对传感器的要求也越来越高,现在的温度传感器正在基于单片机的基础上从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展,并朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展,本文将介绍智能集成温度传感器DS18B20的结构特征及控制方法,并对以此传感器,AT89C52单片机为控制器构成的数字温度测量装置的工作

第 1 页 共 25 页

单片机课程设计

原理及程序设计作了详细的介绍。与传统的温度计相比,其具有读数方便,测温范围广,测温准确,输出温度采用数字显示,主要用于对测温要求比较准确的场所,或科研实验室使用。该设计控制器使用ATMBL公司的AT89C52单片机,测温传感器使用DALLAS公司DS18B20,用液晶来实现温度显示。

2.2系统方案论证

该系统主要由温度测量和数据采集两部分电路组成,实现的方法有很多种,下面将列出一种在日常生活中和工农业生产中经常用到的实现方案:

2.2.1系统设计方案

数字温度芯片DS18B20测量温度,输出信号全数字化.便于单片控制,省去传统的测温方法的很多外围电路。DS18B20的最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和微控制器AT89C52构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接。这样,测温系统的结构就比较简单体积也不大。采用51单片机控制,软件编程的自由度大,可通过控制工作,还可以与PC机通信上传数据,另外AT89C52在工业控制上也有着广泛的应用,编程技术及外围功能电路的配合使用都很成熟。

该系统利用AT89C52芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度该系统扩展性非常强,它可以在设计中加入时钟芯片DS1302以获取时间数据,在数据处理同时显示时间,并可以利用AT24C16芯片作为存储器件,以此来对某些时间点的温度数据进行存储,利用键盘来进行调时和温度查询,获得的数据可以通过MAX232芯片与计算机的RS232接口进行串口通信,方便的采集和整理时间温度数据。

2.2.1.1 数字温度计设计方案论证

由于本设计是测温电路,可以使用温度传感器利用其感温效应,在将随被测温度变化的电压或电流采集过来,在其内部进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,将被测温度显示出来,这种设计不需要用到A/D转换电路,感温电路比较容易,所以采用了温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。

2.2.2 方案的总体设计框图

温度计电路设计总体设计方框图如图1所示,控制器采用单片机AT89C52,温度传感器采用DS18B20,用3位LED数码管以串口传送数据实现温度显示。

第 2 页 共 25 页

单片机课程设计

温度传感器 单LED显示温度 单片机复位 片温度报警 时钟震荡 机 图l 总体设计方框图 2.3系统器件的选择和性能介绍 2.3.1单片机的性能介绍

AT89C52单片机为40引脚双列直插式封装。 引脚排列和逻辑符号如图2所示: 各引脚功能简单介绍 ●VCC:供电电压 ●GND:接地

●P0口:P0口为一个8位漏级开路双向1/O口,每个管脚可吸收8TTL门电流。当P1口的管脚写“1”时,被定义为高阻态输入。PO能够用于外部程序数据存储器,它可以被定义为数据地址的第八位. 在FLASH编程时,PO口作为原码输入口,当FLASH进行校验时,PO输出原码,此时PO外部电位必须被拉高

●P1口:P1口是一个内部提供上拉电阻的8位双向1/0口,P1口缓冲器能接收输出4TTL门电流.P1口管脚写入“1\"后,电位被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。

图2 AT89C52单片机引脚图

第 3 页 共 25 页

单片机课程设计

●P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚电位被内部上拉电阻拉高,且作为输入。作为输入时,P2口的管脚电位被外部拉低,将输出电流,这是由于内部上拉的缘故。当P2口用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉的优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

●P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入,“1”后,它们被内部上拉为高电平,并用作输入。作为输入时,由于外部下拉为低电平,P3口将输出电流(ILL),也是由于上拉的缘故,P3口也可作为AT89C52的一些特殊功能口:

P3.0 RDX(串行输入口) P3.1 RDX(串行输出口) P3.2 INTO(外部中断0) P3.3 INTO(外部中断1) P3.4 T0(记时器0外部输入) P3.5 Tl(记时器1外部输入) P3.6 WR(外部数据存储器写选通)

P3.7 RD(外部数据存储器读选通) 同时P3口同时为闪烁编程和编程校验接收一些控制信号。

●RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

●ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,Al王端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部偷出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFRBEH地址上置0。此时,ALE只有在执行MOVX或MOVC指令时ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。

●PSEN: 外部程序存储器的选通信号。在由外部程序存储器取址期间,每个机器周期PSEN两次有效。但在访问外部数据存储器时,这两次有效的PSEN信号将不出现.

●EA/VPP:当EA保持低电平时,访问外部ROM;注意加密方式1时,EA将内部锁定为RESET;当EA端保持高电平时,访问内部ROM。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 ●XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入

●XTAL2:来自反向振荡器的输出。 2.3.2温度传感器的选择和性能介绍

这里采用DALLAS公司的数字温度传感器DS18B20作为测温元件

第 4 页 共 25 页

单片机课程设计

2.3.2.1 DS18B20性能介绍

DALLAS最新单线数字温度传感器DS18B20是一种新型的“一线器件”,其体积更小、更适用于多种场合、且适用电压更宽、更经济。DALLAS半导体公司的数字化温度传感器DS18B20是世界上第一片支持“一线总线”接口的温度传感器。温度测量范围为-55~+125摄氏度,可编程为9位~12位转换精度,测温分辨率可达0.0625摄氏度,分辨率设定参数以及用户设定的报警温度存储在EEPROM中,掉电后依然保存。被测温度用符号扩展的16位数字量方式串行输出:其工作电源既可以在远端引入,也可以采用寄生

电源方式产生:多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。 DS18B20的性能特点如下:

●独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯

●DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温

●DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内 ●适应电压范围更宽,电压范围:3.0-5.5V,在寄生电源方式下可由数据线供电 ●测温范围-55℃~+125℃,在-10~+85℃时精度为+/-0.5℃ ●零待机功耗

●可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温

●在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快

●用户可定义报警设置

●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件

●测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力

●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作 以上特点使DSISB20非常适用与多点、远距离温度检测系统。

DSISB20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列、各种封装形式如图4.2所示,DQ为数据输刀输出引脚.开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源;GDN为地信号;VDD为可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。其电路图3所示:

第 5 页 共 25 页

单片机课程设计

图 3外部封装形式和传感器电路图

2.3.2.2 DS18B20使用中的注意事项

DS18B20虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:

①DS18B20从测温结束到将温度值转换成数字量需要一定的转换时间,这是必须保证的,不然会出现转换错误的现象,使温度输出总是显示85。

②在实际使用中发现,应使电源电压保持在5V左右,若电源电压过低,会使所测得的温度精度降低。 较小的硬件开销需要相对复杂的软件进行补偿,由于DS1820与微处理器间采用串行数据传送,因此,在对DS1820进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果在使用PL/M、C等高级语言进行系统程序设计时,对DS1820操作部分最好采用汇编语言实现。

③在DS18B20的有关资料中均未提及单总线上所挂DS18B20数量问题,容易使人误认为可以挂任意多个DS18B20,在实际应用中并非如此,当单总线上所挂DS18B20超过8个时,就需要解决微处理器的总线驱动问题,这一点在进行多点测温系统设计时要加以注意。

④在DS18B20测温程序设计中,向DS18B20发出温度转换命令后,程序总要等待DS18B20的返回信号,一旦某个DS18B20接触不好或断线,程序读该DS18B20时,将没有返回信号,程序进入死循环,这一点接和软件设计时也要给予一定的重视。 2.3.2.3 DS18B20内部结构

图4为DS18B20的内部框图,它主要包括寄生电源、温度传感器、64位激光ROM单线接口、存放中间数据

第 6 页 共 25 页

单片机课程设计

的高速暂存器(内含便笺式RAM),用于存储用户设定的温度上下限值的TH和TL触发器存储与控制逻辑、8位循环冗余校验码(CRC)发生器等七部分。

DS18B20采用3脚PR-35封装或8脚SOIL封装,其内部结构框图如图4所示:

图4 DS18B20内部结构

64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18320可以采用一线进行通信的原因。温度报警触发器TH和TL,可通过软件写入报警上下限。

DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为8字节的存储器,结构如图3所示。头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图5所示。低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和RO决定温度转换的精度位数,来设置分辨率。

第 7 页 共 25 页

单片机课程设计

图5 DS18B20字节定义 表1 DS18B20温度转换时问表

由表1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。因此,在实际应用中要将分辨率和转换时间权衡考虑。

高速暂存RAM的第6、7, 8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性

当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据读数据时低位在先,高位在后,数据格式以0.0625℃/ LSB形式表示。

表2 LSB和MSB的位定义

当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表3是一部分温度值对应的二进制温度数据。

DS18B20完成温度转换后,就把测得的温度值与RAN中的TH, T L字节内容作比较。若T >TH或T在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。主机ROM的前56位来计算CRC值,井和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。

DS18020的测温原理是这样的器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振的振荡频率随温度变化明显改变,所产生的信号作为减法计数器2的脉冲输入。器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度侧量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55'C所对应的一个基数分别置入减法计数器1I温度寄存器中,计数器1和温度寄存器被预置在-55'C所对应的一个基数值。

减法计数器1对低温度系数晶振所产生的脉冲信号进行减法计数,当减法计数器1的数值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振所产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存

第 8 页 共 25 页

单片机课程设计

器值大致被测温度值。

表3 一部分温度对应值表

DS18B20有六条控制命令,如表所示:

指令 温度转换 读暂存器 写暂存器 复制暂存器 重新调E2RAM 读电源供电方式 约定代码 44H BEH 4EH 48H B8H B4H 操作说明 启动DS18B20进行温度转换 读暂存器9个字节内容 将数据写入暂存器的TH, TL字节 把暂存器的TH, TL字节写到E2RAh1中 把E2RAh1中的TH, TL字节写到暂存器TH, TL字节 启动DS18B20发送电源供电方式的信号给主CPU 2.3.2.4 DS18B20的通信协议

DS18B20器件要求采用严格的通信协议,以保证数据的完整性。该协议定义了几种信号类型:复位脉冲,应答脉冲时隙;写0,写1时隙;读0,读1时隙。

a)复位和应答脉冲时隙

每个通信周期起始于微控制器发出的复位脉冲,其后紧跟DS18B20发出的应答脉冲,在写时隙期间,主机向DS18B20器件写入数据,而在读时隙期间,主机读入来自DS18B20的数据。在每一个时隙,总线只能传输一位数据。

b)写时隙

当主机将单总线DQ从逻辑高拉到逻辑低时,即启动一个写时隙,所有的写时隙必须在60~120us完成,且在每个循环之间至少需要1us的恢复时间。时隙期间,微控制器在整个时隙中将总线拉低;而写1时隙期间,微控制器将总线拉低,然后在时隙起始后15us之释放总线。

c)0读时隙

DS18B20器件仅在主机发出读时隙时,才向主机传输数据。在主机发出读数据命令后,必须马上产生时隙,以便DS18B20能够传输数据。每个读时隙都由主机发起,至少拉低总线1us。在主机发起读时隙之后,DS18B20

第 9 页 共 25 页

单片机课程设计

器件才开始在总线上发送0或1,若DS18B20发送1,则保持总线为高电平。若发送为0,则拉低总线当发送0时,DS18B20在该时隙结束后,释放总线,由上拉电阻将总线拉回至高电平状态DS18B20发出的数据,在起始时隙之后保持有效时间为15us。

另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要,系统对DS18B20的各种操作按协议进行。操作协议为:初使化DS18B20(发复位脉冲) 发ROM劝能命令 发存储器操作命令 处理数据。

2.3.3 DS18B20温度传感器与单片机的接口电路

DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。另一种是寄生电源供电方式,如图5所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。

当S18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时问最大为10us。采用寄生电源供电方式时VDD端接地。由于单线制只有一根线,因此发送接口必须是三态的.

图5 DS18B20与单片机连接

2.4 系统整体硬件电路 2.4.1 主板电路

系统整体硬件电路包括,传感器数据采集电路,温度显示电路,上下限报警调整电路,单片机主板电路等,见附录。其中蜂鸣器可以在被测温度不在上下限范围内时,发出报警鸣叫声音,同时LED数码管将没有被测温度值显示。

2.4.2 显示电路

显示电路是使用74HC373锁存器和74LS138译码器分别控制段选和位选,利用动态显示。好处是LED数码管数量大时,电路简单。

2.4.3 温度报警电路

本设计的发挥部分,是加入了报警,如果我们所设计的系统是监控某一设备,当设备的温度超过我们所设定的温度值时,系统会产生报警.

第 10 页 共 25 页

单片机课程设计

报警时由单片机产生一定频率的脉冲,由P2.7引脚输出,P2.7外接一只PNP的三极管来驱动杨声器发出声音,以便操作员来维护,从而达到报警的目的。如下图.

图6 温度报警电路

2.5 系统软件 2.5.1 程序分析

主机发送(Tx)一复位脉冲(最短为480 us)的低电平信号。接着主机使释放此线并进入接收方式(Rx)总线经过4.7K的上拉电阻被拉至高电平状态。在检测到I/O引脚上的上升沿之后,DS18B20等待15~60us并且接着发送脉冲(60~240us的低电平信号)。然后以存在复位脉冲表示DSI8B20已经推备好发送或接收,然后给出正确的ROM命令和存储操作命令的数据。DS1SB20通过使用时间片来读出和写入数据时间片用于处理数据位和进行何种指定操作的命令。它有写时间片和读时间片两种:

①写时间片:当主机把数据线从逻辑高电平拉至逻辑低电平时,产生写时间片,有两种类型的写时间片:写1时间片和写0时间片。所有时间片必须有60微秒的持续期,在各写周期之间必须有最短为l微秒的恢复时间。

②读时间片:从DSI8B20读数据时,使用读时间片。当主机把数据线从逻辑高电平拉至逻辑低电平时产生读时间片。数据线在逻辑低电平必须保持至少1微秒来自DS18B20的输出数据在时间下降沿之后的15微秒内有效。为了读出从读时间片开始算起15ms的状态,主机必须停止把引脚驱动拉至低电平。在时间片结束时,I/O引脚经过外部的上拉电阻拉回高电平.所有读时向片的最短持续期为60微秒,包括两个读周期间至少lus的恢复时间。

一旦主机检测到DSI8B20的存在,它便可以发送一个ROM操作命令,所有ROM操作命令均为8位长。 所有的串行通讯,读写每一位数据都必须严格遵守器件的时序逻辑来编程,同时还必须遵守总线命令序列,对单总线的DS18B20芯片来说,访问每个器件都要遵守下列命令序列:首先是初始化,其次执行ROM命令;最后是执行功能命令(ROM命令和功能命令后面以表格形式给出)。如果出现序序混乱,则单总线器件不会响应主机。当然,搜索ROM命令和报警搜索命令、在执行两者中任何一条命令后,要返回初始化。

2.5.2 各程序设计与实现

第 11 页 共 25 页

单片机课程设计

2.5.2.1 主程序

主程序需要调用5个子程序,各模块程序功能如下:

①DS18B20复位程序:每次重新从DS18B20读数据时需要系统复位

②DS18B20写命令程序:DS18B20有六条控制命令,通过此程序来进行控制DS18B20 ③DS18B20读1字节程序:从引脚接收数据并保存数据 ④读出温度程序:对DS18B20进行读数据,并进行处理 ⑤温度数据处理程序:向5个LED送数,控制系统的显示部分

其中因为DS18B20有两个,所以前4个子程序分别有两个,对应相应的DS18B20。 主流程图见图7。 其中主程序的源程序为: void main() {

DP=1; while(1)

{

for(w1=0;w1<5;w1++) { }

for(w3=0;w3<5;w3++) {

for(w4=0;w4<50;w4++) { init2();

第 12 页 共 25 页

for(w2=0;w2<50;w2++) { }

init1(); P2=3; P0=0x06;

temp=read_temperature1(); display1();

单片机课程设计

}

}

P2=3; P0=0x5b;

temp=read_temperature2(); display2(); }

}

2.5.2.2 DS18B20复位程序

每次重新从DS18B20读数据时都需要系统复位,这是为了防止原来的操作影响新的数据的正确性。且因为AT89C52工作在12M晶振下,机器周期大约为600us。

复位时序:复位要求主CPU数据线下拉500us,然后释放。DS18B20收到信号后等待16~60us左右,后发出60~240us的存在低脉冲,主CPU收到此信号表示复位成功。

复位流程图见图8. 源程序: void init1() { }

DQ1=1; delay(8); DQ1=0;

delay(80); DQ1=1; delay(15);

第 13 页 共 25 页

单片机课程设计

图7 主流程图 图8 复位流程图 2.5.2.3 DS18B20写命令程序

写时序均起始于主机拉低总线,产生写1时序的方式:主机在拉低总线后,接着必须在15us之内释放总线。产生写0时序的方式:在主机拉低总线后,只需在整个时序期间保特低电平即可(至少60us)。在写字节程序中的写一位的时候,没有按照通常的分别写0时序和写1时序,而是把两者结合起来,当主机拉低总线后在15us之内将要写的位c给DQ。如果c是高电平,满足15us内释放总线的要求;如果c是低电平,则DQ=0这条语句仍然是把总线拉在低电平,最后都通过延时58us,完成一个写时序(写时序O或写时序1)过程.

写时间时序:当主机把数据从逻辑高电平拉到逻辑低电平的时候,写时间隙开始,有两种写时间隙,写1时间隙和写0时间隙。所有写时间隙必须最少持续60us,包招两个写周期至少1us的恢复时间。I/O线电平变低后,DS18B20在一个15us到60us的窗口内对I/O线采样。如果线上是高电平,就写1.如果是低电平,就写0.主机要生成一个写0时间隙,必须把数据缓拉到低电平然后释放,在写时间隙开始后的15us内允许数据线拉到高电平。主机要生成一个写0时间隙,必须把数据线拉到低电平并保存60us。

每个读时隙部由主机发起,至少拉低总线1us,在主机发起读时序之后,单总线器件才开始在总线上发送0或1。所有读时序至少需要60us。

写命令流程图见图9。

源程序:假设要写1B的数据,且数据放在dat中 //向1-WIRE 总线上写1个字节

void write_byte1(int dat) //写一个字节

第 14 页 共 25 页

单片机课程设计

{ }

for(i=0;i<8;i++) { DQ1=0; DQ1=dat&0x01; //此条语句可延时1u秒 delay(4); DQ1=1; dat>>=1; } delay(4);

2.5.2.4 DS18B20读1字节程序

读时间时序:当从DS18B20读数据时,主机生成读时间隙。当主机把数据从高电平拉到低电平时,写时间

隙开始,数据线必领保持至少1us;从DS18B20输出的数据在读时间隙的下降沿出现后15us内有效.

因此,主机在读时间隙开始后必须把I/O脚驱动拉为的电平保持l5us,以读取I/O脚状态。在读时间隙的结尾,I/O引脚将被外部上拉电阻拉到高电平。所有读时间隙必须最少60us,包括两个读周期至少1us的恢复时间。

读数据流程图见图10。 源程序:从总线上取1个字节

int read_byte1() //读一个字节 { for(k=0;k<8;k++) { DQ1=0; value>>=1; DQ1=1; //释放总线 if(DQ1) value=value|0x80; delay(4); } return value; }

第 15 页 共 25 页

单片机课程设计

图10 读数据流程图 图9 写命令流程图 2.5.2.5读温度子程序

读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。把读到的数据分别转化成整数部分和小数部分。当符号位为1,即温度为零下时,进行报警程序。其程序流程图如图11所示.

源程序:

int read_temperature1() //读温度函数 {

init1();

write_byte1(0xcc); //跳过ROM命令 write_byte1(0x44); //写转换指令

第 16 页 共 25 页

单片机课程设计

delay(300); init1();

write_byte1(0xcc);

write_byte1(0xbe); //写读温度指令 LSB=read_byte1(); MSB=read_byte1(); ss=MSB&0x0f8; if(ss==0x00) { MSB<<=4;

MSB=MSB|(LSB&0xf0)>>4; // } else { DP=0;delay(50);DP=1; P2=7;P0=table[0]; MSB=0x00; }

return MSB;

}

整数部分

第 17 页 共 25 页

单片机课程设计

图11 读温度程序流程图 2.5.2.6 温度数据处理程序

温度数据处理部分在硬件上使用74HC373锁存器和74LS138译码器分别控制段选和位选,利用动态显示。好处是LED数码管数量大时,电路简单。而软件部分则通过向74LS138译码器发送信号选中某个LED后再将相应的数据发给74HC373锁存器进行显示。

本设计运用了5个LED,其中第1个为两个DS18B20的序号,第2个显示“—”,后三个为温度,其中最后一位为小数部分。如当前1号DS18B20所测得的温度为30.5,则显示“1—30.5”。

而且,当温度不在10~50℃之间时,蜂鸣器响且灯亮。 源程序:

void display1() //显示函数 {

while(MSB<10||MSB>50) { } P2=4; P0=0x40;

第 18 页 共 25 页

DP=0;delay(50);DP=1; P2=7;P0=table[0]; read_temperature1();

单片机课程设计

}

delay_50us(5); P2=5;

P0=table[temp/10+1]; delay_50us(5);

P2=6; //整数部分显示 P0=table[temp%10+1]|0x80; delay_50us(5); LSB=LSB&0x0f; P2=7;

P0=table[LSB%10+1]; //小数部分显示 delay_50us(5);

2.5.3 整体源程序

#include sbit DQ1=P1^3;

sbit DQ2=P1^4;//温度输入口 sbit DP=P1^2;

int table[]={0xff,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}, i,k,value,MSB,LSB,temp,ss,w1,w2,w3,w4; void delay_50us(int m) { int j; for(;m>0;m--) for(j=5;j>0;j--); }

void delay(int t) { while(t--); }

/****************DS18B20复位函数************************/ void init1() { DQ1=1; delay(8); DQ1=0; delay(80); //大约600u秒,在12M晶振下 DQ1=1; delay(15); }

/****************DS18B20写命令函数************************/

第 19 页 共 25 页

单片机课程设计

//向1-WIRE 总线上写1个字节

void write_byte1(int dat) //写一个字节 { for(i=0;i<8;i++) { DQ1=0; DQ1=dat&0x01; //此条语句可延时1u秒 delay(4); DQ1=1; dat>>=1; } delay(4); }

/***************DS18B20读1字节函数************************/ //从总线上取1个字节

int read_byte1() //读一个字节 { for(k=0;k<8;k++) { DQ1=0; value>>=1; DQ1=1; //释放总线 if(DQ1) value=value|0x80; delay(4); } return value; }

/****************读出温度函数************************/ int read_temperature1() //读温度函数 { init1(); write_byte1(0xcc); //跳过ROM命令 write_byte1(0x44); //写转换指令 delay(300); init1(); write_byte1(0xcc); write_byte1(0xbe); //写读温度指令 LSB=read_byte1(); MSB=read_byte1(); ss=MSB&0x0f8; if(ss==0x00) { MSB<<=4; MSB=MSB|(LSB&0xf0)>>4; //整数部分?

第 20 页 共 25 页

单片机课程设计

} else { DP=0;delay(50);DP=1; P2=7;P0=table[0]; MSB=0x00; } return MSB; }

/****************温度数据处理函数************************/ void display1() //显示函数 { while(MSB<10||MSB>50) { DP=0;delay(50);DP=1; P2=7;P0=table[0]; read_temperature1(); } P2=4; P0=0x40; delay_50us(5); P2=5; P0=table[temp/10+1]; delay_50us(5); P2=6; //整数部分显示 P0=table[temp%10+1]|0x80; delay_50us(5); LSB=LSB&0x0f; P2=7; P0=table[LSB%10+1]; //小数部分显示 delay_50us(5); }

/****************DS18B20复位函数************************/ void init2() { DQ2=1; delay(8); DQ2=0; delay(80); //大约600u秒,在12M晶振下 DQ2=1; delay(15); }

/****************DS18B20写命令函数************************/ //向1-WIRE 总线上写1个字节

void write_byte2(int dat) //写一个字节 {

第 21 页 共 25 页

单片机课程设计

for(i=0;i<8;i++) { DQ2=0; DQ2=dat&0x01; //此条语句可延时1u秒 delay(4); DQ2=1; dat>>=1; } delay(4); }

/****************DS18B20读1字节函数************************/ //从总线上取1个字节

int read_byte2() //读一个字节 { for(k=0;k<8;k++) { DQ2=0; value>>=1; DQ2=1; //释放总线 if(DQ2) value=value|0x80; delay(4); } return value; }

/****************读出温度函数************************/ int read_temperature2() //读温度函数 { init2(); write_byte2(0xcc); //跳过ROM命令 write_byte2(0x44); //写转换指令 delay(300); init2(); write_byte2(0xcc); write_byte2(0xbe); //写读温度指令 LSB=read_byte2(); MSB=read_byte2(); ss=MSB&0x0f8; if(ss==0x00) { MSB<<=4; MSB=MSB|(LSB&0xf0)>>4; //整数部分? } else { DP=0;delay(50);DP=1;

第 22 页 共 25 页

单片机课程设计

P2=7;P0=table[0]; MSB=0x00; } return MSB; }

/****************温度数据处理函数************************/ void display2() //显示函数 { while(MSB<10||MSB>50) { DP=0;delay(50);DP=1; P2=7;P0=table[0]; read_temperature2(); } P2=4; P0=0x40; delay_50us(5); P2=5; P0=table[temp/10+1]; delay_50us(5); P2=6; //整数部分显示 P0=table[temp%10+1]|0x80; delay_50us(5); LSB=LSB&0x0f; P2=7; P0=table[LSB%10+1]; //小数部分显示 delay_50us(5); }

void main() { DP=1; while(1) { for(w1=0;w1<5;w1++) { for(w2=0;w2<50;w2++) { init1(); P2=3; P0=0x06; temp=read_temperature1(); display1(); } } for(w3=0;w3<5;w3++)

第 23 页 共 25 页

单片机课程设计

{ for(w4=0;w4<50;w4++) { init2(); P2=3; P0=0x5b; temp=read_temperature2(); display2(); } } } }

3、课程设计总结

经过将近两周的单片机课程设计,终于完成了我的数字温度计的设计。在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事。

比如,时序问题,尤其是DS18B20的时序与单片机的时序结合,真的很不容易,若不是反反复复的看DS18B20的时序要求和介绍,直至真正弄懂,程序是写不出来的。

再比如说,通过查阅资料知道,DS18B20支持单总线协议,可以通过将多个DS18B20并联到1根线上,实现CPU只需一根端口线就能与诸多DS18B20通信,占用较少的微处理器的端口就可以实现多点测温监控系统。但我曾尝试着通过编程找到了2个DS18B20的序列号,也编写了序号匹配函数(mach函数),但没行通,这也让我明白理论和实际的差距。

但总体来说,感觉效果比较好,有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。所以从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的读与写的过程中才能提高,这就是我在这次课程设计中的最大收获。同时,也要细细的阅读资料,尤其是没学过的芯片。

最后,还要感谢吴开兴老师,在设计期间吴老师的指导和建议给了我们很大帮助。 4、参考文献

[1]李朝青.单片机原理及接口技术〔简明修订版).杭州:北京航空航天大学出版社,1998 [2]李广弟.单片机*MB rmi.北京:北京航空航天大学出版社,1994 [3]孙育才.单片机微型计算机及其应用.东南大学出版社,2004

[4]沈德金,陈粤初.单片机接口电路与应用称序实例.北京航天航空大学出版社,1990. [5]李广弟.单片机基础[M].北京:北京航空航天大学出版杜,1994

第 24 页 共 25 页

单片机课程设计

课程设计 评 语 课程设计 成 绩 指导教师 (签字) 年 月 日

第 25 页 共 25 页

因篇幅问题不能全部显示,请点此查看更多更全内容