1、电子信息工程《电子专业基础课程设计》研究报告
温度测量系统设计
学生姓名:郑探伟 学生学号:20084075118 指导教师:席桂清 所在学院:信息技术学院 专业班级:电子一班
中国·大庆 2011 年 11 月
1
信息技术学院 课 程 设 计 任 务 书
信息技术 院 电子信息工程 专业 08 级,学号 20084075118 姓名 郑探伟 一、课程设计课题:
温度测量系统设计
二、课程设计工作日自 2011 年 10 月 31 日至 2011 年 11 月 18 日
三、课程设计进行地点: 信息技术学院205 四、课程设计任务要求: (详细内容见课程设计文档)
1.课题来源: 老师派发题目
2.目的意义: 随着社会的进步和工业技术的发展,人们越来越重视温度因素,许多产品对温度范围要求严格,而目前市场上普遍存在的温度检测仪器大都存在精度不够的缺点,不利于工业控制者根据温度变化及时做出决定。实时性高、精度高,能够综合处理多点温度信息的测量系统就很有必要。
3.基本要求:
1) 采用单片机80C51.要求温度范围0℃~100℃之间 。 2) 温度传感器选用模拟的数字的都可以。 3) 在LED中显示温度。 4) 精度达到±1%。 5) 分辨率≤0.1℃
6) 根据精度自选A/D转换芯片。 7) 直流稳压电源自行设计。 8) 辅助电路及元器件自选。
2
课程设计评审表
指导教师评语: 成绩: 签字: 日期:
3
目录
1 设计任务要求………………………………………………….……...1
2 方案比较……………………………………………………….……...1
3单元电路设计………………………………………………….……….2
4软件的编程……………………………….…………………………...10
总结与体会……………………………………………………………..11
致谢………………………………………………………….………….12
参考文献………………………………………………….…………….13
附录……………………………………………………………………..14
4
1、设计任务要求
1) 2) 3) 4) 5) 6) 7) 8)
采用单片机80C51.要求温度范围0℃~100℃之间。 温度传感器选用模拟的数字的都可以。 在LED中显示温度。 精度达到±1%。 分辨率≤0.1℃
根据精度自选A/D转换芯片。 直流稳压电源自行设计。 辅助电路及元器件自选。
2、方案比较
方案一、采用模拟分立元件,如电容、电感或晶体管等非线形元件,实现多点温度的测量及显示,该方案设计电路简单易懂,操作简单,且价格便宜,但采用分立元件分散性大,不便于集成数字化,而且测量误差大。采用模拟的温度传感器实现温度的测量
方案二、本方案采用AT89S51单片机为核心,通过温度传感器AD590采集温度信号,经信号放大器放大后,送到A/D转换芯片,最终经单片机检测处理温度信号。
图1 方案二的框图 方案三、本方案由AT89S51单片机为核心,温度传感器采用的是DS18B20数字温度传感器实现温度的测量并且由LED显示温度值。
- 1 -
图2 方案三框图
方案的比较:DS18B20将温度信号直接转换为数字信号,实现了与单片机的直接接口,从而省去了信号调理电路。该元件的最大分辨率为0.0625℃能达到设计要求。该仪器电路简单、功能可靠、测量效率高,很好地弥补了传统温度测量方法的不足。相对与方案1,在功能、性能、可操作性等方面都有较大的提升。相对与方案2,硬件电路简单,易于操作,具有更高的性价比,更大的市场。所以我采用方案3完成本设计。
3、单元电路设计
3.1 控制电路
3.1.1 单片机电路及原理
At89S51是美国ATMEL公司生产的低电压、高性能CMOS8位单片机;片内
含有4k字节的可反复擦写的只读程序存储器(PEROM)和128字节的随机存取数据存储器(RAM);器件采用AMTEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统;片内置通用2位中央处理器(CPU)和Flash存储单元,功能强大的AT89C51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。功能特性概述
AT89S51提供以下标准功能:4k字节Flash闪速存储器、128字节内部RAM、32个I/O口线、两个16位定时/计数器、1个5向量两级中断结构、一个全双工串行通信口、片内振荡器及时钟电路,同时,AT89S51可降至0Hz的静态逻辑操作并支持两种软件可选的节电工作模式;空闲方式停止CPU的工作,但允许RAM、定时/计数器、串行通信口及中断系统继续工作;掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作一直到下个硬件复位[2]。 引脚功能说明 Vcc:电源电压
- 2 -
GND:地
P0口:P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口;作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。
在访问外部数据存储器或者程序存储器时,这组口线分时转换地址(低8位)和数据总线复用;在访问期间激活内部上拉电阻。
在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时要求外接上拉电阻
P1口:P1是一个带内部上拉电阻的8位双向I/O口;P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路,对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口;作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低会输出一个电流。 Flash编程和程序校验期间,P1接收低8位地址
P2口:P2口是一个带有内部上拉电阻的8位双向I/O口;P2的输出缓冲级可驱动个(吸收或输出电流)4个TTL逻辑门电路,对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口;作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低会输出一个电流。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX @DPTR指令)时,P2口送出高8位地址数据;在访问8位地址的外部数据存储器(如执行MOVX @RI)时,P2口线上的内容(即特殊功能寄存器(SFR)区中的R2寄存器的内容),在整个访问期间不改变;
Flash编程或校验时,P2亦接收高位地址和其它控制信号。
P3口:P3口是一个带有内部上拉电阻的8位双向I/O口;P2的输出缓冲级可驱动个(吸收或输出电流)4个TTL逻辑门电路,对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口;作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低会输出一个电流。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能;如下表2-1所示:
表2-1 端口引脚 第二功能 P3.0 P3.1 RXD (串行输入口) TXD (串行输出口) - 3 -
P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 INT0(外中断0) INT1(外中断1) T0 (定时/计数器0) T1 (定时/计数器1) WR (外部数据存储器写选通) RD (外部数据存储器读选通) P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。 RST:复位输入;当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位
ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节;即使不访问外部存储器,ALE仍以时钟振荡频率的1/6输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的;要注意的是,每当访问外部数据存储器时将跳过一个ALE脉冲。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作,该位置位后,只有一条MOVX和MOVC指令ALE才会被激活,此外该引脚会被微弱拉高,单片机执行外部程序时,应该置ALE无效。
EA/VPP:外部访问允许;欲使CPU仅访问外部程学存储器(地址为0000H FFFFH),EA端必须保持低电平(接地)。需要注意的是,如果加密位LB1被编程,复位时内部会锁存EA端的状态[3]。
如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。 Flash存储编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
XTML1:振荡器反相放大器的及内部时钟发生器的输入端。 XTML2: 振荡器反相放大器的输出端。
- 4 -
图3 单片机的工作电路图
图4 复位电路
3.1.3 晶振电路
晶体振荡器,简称晶振。在电气上它可以等效成一个电容和一个电阻并联再
3.1.2 复位电路
复位电路的用途:单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。
复位电路的工作原理:51单片机要复位只需要在第9引脚接个高电平持续2us就可以实现在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位。所以可以通过按键的断开和闭合在运行的系统中控制其复位。电路图如下:
- 5 -
串联一个电容的二端网络,电工学上这个网络有两个谐振点,以频率的高低分其中较低的频率是串联谐振,较高的频率是并联谐振。由于晶体自身的特性致使这两个频率的距离相当的接近,在这个极窄的频率范围内,晶振等效为一个电感,所以只要晶振的两端并联上合适的电容它就会组成并联谐振电路。这个并联谐振电路加到一个负反馈电路中就可以构成正弦波振荡电路,由于晶振等效为电感的频率范围很窄,所以即使其他元件的参数变化很大,这个振荡器的频率也不会有很大的变化。
晶振有一个重要的参数,那就是负载电容值,选择与负载电容值相等的并联电容,就可以得到晶振标称的谐振频率。
一般的晶振的负载电容为15p或12.5p ,如果再考虑元件引脚的等效输入电容,则两个22p的电容构成晶振的振荡电路就是比较好的选择。
晶体振荡器也分为无源晶振和有源晶振两种类型。无源晶振与有源晶振(谐振)的英文名称不同,无源晶振为crystal(晶体),而有源晶振则叫做oscillator(振荡器)。无源晶振需要借助于时钟电路才能产生振荡信号,自身无法振荡起来,所以“无源晶振”这个说法并不准确;有源晶振是一个完整的谐振振荡器。
谐振振荡器包括石英(或其晶体材料)晶体谐振器,陶瓷谐振器,LC谐振器等。 在本次课程设计中使用的是无源晶振电路图如下示:
图5 晶振电路
3.2 直流电源
在本次的课程设计中采用的是自主设计的直流电源主要是通过变压器进行降
压,用二极管整流桥进行整流操作,用稳压芯片对电源实现稳压。
在正常的工作情况下输入220V交流电经过整流二极管进行整流使用电桥实现全波整流经过4700uf大电容的滤波得到较低的直流电压,经过LM7812把直流电压稳压为12V,然后在经过直流稳压芯片LM7805得到了单片机稳定的工作电压。如下图示:
- 6 -
图6 自制直流电源
3.3 测温电路
在本次的课程设计中使用的是的DS18B20数字式温度传感器。DS18B20型单线智能温度传感器,属于新一代适配微处理器的智能温度传感器。全部传感元件及转换电路集成在形如一只三极管的集成电路内。与传统的热敏电阻相比,它能够直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。其可以分别93.75ms和750ms内完成9位和12位的数字量,最大分辨率为0.0625℃ , 而且从DS18B20读出或写入DS18B20的信息仅需要一根口线(单线接口)读写。
3.3.1 DS18B20的性能特点
单线数字化智能集成温度的传感器,其特点是:
① DSI8B20可将被测温度直接转换成计算机能识别的数字信号输出,温度值不需要经电桥电路先获取电压模拟量,再经信号放大和A/D转换成数字信号,解决了传统温度传感器存在的因参数不一致性,在更换传感器时会因放大器零漂而必须对电路进行重新调试的问题,使用方便.
② DS18B20能提供9到12位温度读数,精度高,且其信息传输只需1根信号线,与计算机接口十分简便,读写及温度变换的功率来自于数据线而不需额外的电源.
③ 每一个DS18B20都有一个惟一的序列号,这就允许多个DS18B20连接到同一总线上.尤其适合于多点温度检测系统.
④ 负压特性:当电源极性接反时,DS18B20虽然不能正常工作,但不会因发热而烧毁 正是由于具有以上特点,DS18B20在解决各种误差、可靠性和实现系统优化等方面与传统各种温度传感器相比,有无可比拟的优越性,因而广泛应用于过程控制、环境控制、建筑物、机器设备中的温度检测。 3.3.2 DS18B20与单片机的典型接口设计
DS18B20测温系统具有测温系统简单、测温精度高、连接方便、占用口线少
- 7 -
等优点。Dsl8B20与单片机的硬件连接有两种方法:一是Vcc接外部电源,GND接地,I/0与单片机的I/0线相连;二是用寄生电源供电,此时,~UDD和GND接地,I/0接单片机I/0。无论是哪种供电方式,I/0口线都要接4.7k Q左右的上拉电阻。图4给出了DSl8B20与微处理器的典型连接。 ① DS18B20寄生电源供电方式:
如下面图3.2(a)所示,在寄生电源供电方式下,DS18B20从单线信号线上汲取能量:在信号线DQ处于高电平期间把能量储存在内部电容里,在信号线处于低电平期间消耗电容上的电能工作,直到高电平到来再给寄生电源(电容)充电。 独特的寄生电源方式有三个好处:
1)进行远距离测温时,无需本地电源 2)可以在没有常规电源的条件下读取ROM 3)电路更加简洁,仅用一根I/O口实现测温
要想使DS18B20进行精确的温度转换,I/O线必须保证在温度转换期间提供足够的能量,由于每个DS18B20在温度转换期间工作电流达到1mA,当几个温度传感器挂在同一根I/O线上进行多点测温时,只靠4.7K上拉电阻就无法提供足够的能量,会造成无法转换温度或温度误差极大。
因此,该电路只适应于单一温度传感器测温情况下使用,不适宜采用电池供电系统中。并且工作电源VCC必须保证在5V,当电源电压下降时,寄生电源能够汲取的能量也降低,会使温度误差变大。 ② DS18B20寄生电源强上拉供电方式:
改进的寄生电源供电方式如下面图3.2(b)所示,为了使DS18B20在动态转换周期中获得足够的电流供应,当进行温度转换或拷贝到E2存储器操作时,用MOSFET把I/O线直接拉到VCC就可提供足够的电流,在发出任何涉及到拷贝到E2存储器或启动温度转换的指令后,必须在最多10μS内把I/O线转换到强上拉状态。在强上拉方式下可以解决电流供应不走的问题,因此也适合于多点测温应用,缺点就是要多占用一根I/O口线进行强上拉切换。 ③ DS18B20的外部电源供电方式:
如下面图3.2(c)所示,在外部电源供电方式下,DS18B20工作电源由VDD引脚接入,其VDD端用3~5.5V电源供电,此时I/O线不需要强上拉,不存在电源电流不足的问题,可以保证转换精度,同时在总线上理论可以挂接任意多个DS18B20传感器,组成多点测温系统。注意:在外部供电的方式下,DS18B20的GND引脚不能悬空,否则不能转换温度,读取的温度总是85℃。
- 8 -
图7 温度传感器电路
3.4 显示电路
该显示电路是采用7段LED数码管显示温度。电路图如下:
主要的工作原理:7段数码管又分共阴和共阳两种显示方式。如果把7段数码管的每一段都等效成发光二极管的正负两个极,那共阴就是把abcdefg这7个发光二极管的负极连接在一起并接地;共阳是把所有的二极管的正极连接在一起。如果7段数码管是共阳显示电路,那就需要选用驱动电路。共阳就是把abcdefg的7个发光二极管的正极连接在一起并接到5V电源上,其余的7个负极接到单片机相应的IO口。无论共阴共阳7段显示电路,都需要加限流电阻,否则通电后就把7段译码管烧坏了!限流电阻的选取是:5V电源电压减去发光二极管的工作电压除上10ma到15ma得数即为限流电阻的值。发光二极管的工作电压一般在1.8V--2.2V,为计算方便,通常选2V即可!发光二极管的工作电流选取在10-20ma,电流选小了,7段数码管不太亮,选大了工作时间长了发光管易烧坏!对于大功率7段数码管可根据实际情况来选取限流电阻及电阻的瓦数!
图 8 LED显示电路
- 9 -
4、软件的编程
在本课程设计中使用Keil C51开发软件,该软件是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。
Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。
该课程设计中主要利用了DS18B20芯片进行测温,该芯片是单总线器件,顾名思义单总线只有一根数据线,因此在通信时时序就显得十分重要,我们在编程时也要十分注意这一点。在程序中测温时首先要对DS18B20进行初始化,初始化过程由单片机发出的复位脉冲和芯片响应的应答脉冲组成,应答脉冲使主机知道,总线上有从机设备,且准备就绪。由于总线上只挂接了一片测温芯片,因此可直接跳过ROM匹配发出测温命令。该设计可实时显示温度值,便于连续观测。系统源程序见附录。软件流程图如下所示:
图9 程序设计流程图
- 10 -
总结与体会
在本次课程设计中使用的是数字温度传感器DS18B20。通过调试成型系统发现了DS18B20除了上述优点外,还有一些缺点,如:简单的硬件连接的代价是复杂的软件时序,DS18B20在测量温度的时候,灵敏度不够高,温度快速变化时无法迅速显示出其变化。通过一系列的实验发现:由DS18B20构建的测温小系统适用于环境温度监控,对温度小变化较敏感;不适合应用于要求实时性强、温度跨度大的测温方式。
在显示电路中采用的数码管的显示方式,虽然操作简单但是在代码书写时要注意在字型码这块要区分好是共阳极还是共阴极的数码管。本文中采用动态扫描的方式控制共阳极的数码管。在按键的处理时使用的是软件消抖,要注意延长时间的把握。在本次的课程设计中了解了很多知识并且为毕业设计的书写锻炼了自己。
- 11 -
致谢
这次课程设计使我掌握了很多实践知识,在老师和同学的帮助下对单片机有了进一步的了解。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,进而提高自己的实际动手能力和独立思考的能力。整个设计过程可以说不是很顺利,因为有很多知识已经淡忘,还有很多新的东西没有掌握,所以这次设计在不断的复习、学习中度过,使我受益匪浅,也使我对单片机的运用有了进一步的了解和掌握,也为今后的学习生活和工作打下良好的基础。最后我要衷心感谢帮助我的同学。
- 12 -
参考文献
[1] 李朝青.单片机原理及接口技术(修订版).北京:北京航空航天大学出版
社,1998
[2] 李广弟.单片机基础.北京:北京航空航天大学出版社,1992
[3] 何立民.单片机应用技术大全.北京:北京航空航天大学出版社,1994 [4] 张毅刚.单片原理及接口技术.哈尔滨:哈尔滨工业大学出版社,1990 [5] 谭浩强.单片机课程设计.北京:清华大学出版社,1989
[6]马家辰.MCS-51单片机原理及接口技术.哈尔滨: 哈尔滨工业大学出版社,
1997
[7]康华光.数字电子技术.第四版.北京:高等教育出版社,1998
[8]OMAC Baseline Architecture Functional Requirement.Version 1.0.WWW.arcweb.com. [9]付家才.单片机测控工程实践技术.北京: 化学工业出版社, 2001 [10]李广弟.单片机基础(修订本).北京:北京航空航天大学出版社, 2001 [11] 诸昌铃.LED显示屏系统原理及工程技术.西安:西安电子科技大学出版
社,2000.9
[12]Astrom, Karl J. (Karl Johan).Computer-controlled systems: theory and design.
Beijing: Tsinghua University Press, 2002.2
[13]沈红卫.单片机应用系统设计实例与分析.北京:北京航空航天大学出版
社,2003
- 13 -
附录
附录一 电路图
14
附录二 代码
//DS18B20的读写程序,数据脚P2.4 // //温度传感器18B20汇编程序,采用器件默认的12位转化 // //最大转化时间750微秒,显示温度-55到+125度,显示精度 // //为0.1度,显示采用4位LED共阳显示测温值 // //P1口为段码输入,P2^0~P2^3为位选 // /***************************************************/
#include \"reg51.h\"
#include \"intrins.h\" //_nop_();延时函数用 #define Disdata P1 //段码输出口 #define discan P2 //扫描口 #define uchar unsigned char #define uint unsigned int
sbit DQ=P2^4; //温度输入口 sbit DIN=P1^7; //LED小数点控制 uint h; uchar flag;
//**************温度小数部分用查表法***********// 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--); } //
/***********显示扫描函数**********/
15
scan() {
char k;
for(k=0;k<4;k++) //四位LED扫描控制 {
Disdata=0xff;
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_();
16
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); // 发转换命令 } //
/***********温度数据处理函数**********/
17
void work_temp() {
uchar n=0;
uchar doth,dotl;
uchar flag3=1,flag2=1; //数字显示修正标记 if((temp_data[1]&0xf8)!=0x00) {
temp_data[1]=~(temp_data[1]); temp_data[0]=~(temp_data[0])+1; n=1; flag=1;
}//负温度求补码
if(temp_data[0]>255) {
temp_data[1]++; }
display[4]=temp_data[0]&0x0f; display[0]=ditab[display[4]]; doth=display[0]/10; dotl=display[0]%10;
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x07)<<4); display[3]=display[4]/100; display[2]=display[4]/10%10; display[1]=display[4]%10; if(!display[3]) {
display[3]=0x0a; flag3=0;
if(!display[2]) {
display[2]=0x0a; flag2=0; }
}//最高位为0时都不显示 if(n) {
display[3]=0x0b;//负温度时最高位显示\"-\" flag3=0; } } // //
/**************主函数****************/
18
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(); //处理温度数据
scan(); //显示温度值2秒 } } //
//*********************结束**************************//
19
因篇幅问题不能全部显示,请点此查看更多更全内容