数字温度传感器DSB控制接口设计
- 格式:doc
- 大小:543.00 KB
- 文档页数:23
单片机原理及应用课程设计报告书题目、课题介绍本设计是一款简单实用的小型数字温度计,所采用的主要元件有传感器18B20,单片机AT89S52,四位共阴极数码管一个,电容电阻若干。
18B20支持“一线总线”接口,测量温度范围-55 ° C~+125 C。
在-10~+85° C范围内,精度为土0.5 ° Co 18B20的精度较差为土2 ° C。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,女口: 环境控制、设备或过程控制、测温类消费电子产品等。
本次数字温度计的设计共分为五部分,主控制器,LED显示部分,传感器部分,复位部分,时钟电路。
主控制器即单片机部分,用于存储程序和控制电路;LED显示部分是指四位共阳极数码管,用来显示温度;传感器部分,即温度传感器,用来采集温度,进行温度转换;复位部分,即复位电路。
测量的总过程是,传感器采集到外部环境的温度,并进行转换后传到单片机,经过单片机处理判断后将温度传递到数码管显示。
本设计能完成的温度测量范围是-55 ° C~+128 C,由于能力有限,不能实现报警功能。
二、方案论证方案一:由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。
方案设计框图如下:方案二:考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器, 所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20此传感器, 可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简 单,故采用了方案二。
三、系统软硬件设计 1、硬件设计按照系统设计功能的要求,确定系统由3个模块组成:主控制器、测温电路 和显示电路。
基于DS18B20地温度继电控制系统设计报告设计者班级学号武旭飞2018213128姚磊2018212594陆蒙2018213084完成时间:2018年6月4日星期三目录一、实验题目 (3)二、实现功能 (3)三、总体工作原理 (3)四、硬件设备 (3)五、系统框图 (3)六、硬件设计 (4)1.单片机最小系统 (4)2.温度传感器 (5)3.键盘液晶显示 (7)4.继电器控制执行电路 (9)5.总电路连接图 (10)七、心得体会 (10)一、实验题目设计一个温度测量与控制系统,温度测量范围50-100℃,控温精度±0.5℃,采用继电控制水浴加热.1、选择合适地温度传感器.2、画出系统原理框图,并分析工作原理.3、画出系统电原理图.二、实现功能本设计能够实现通过继电器对液体进行水浴加热地控制,当温度低于50℃时,继电器控制开始水浴加热,当温度高于100℃时停止加热,从而实现对温度地控制.三、总体工作原理本设计中温度测量采用地是DS18B20温度传感器,温度控制系统采用AT89S51作为微处理单元通过继电系统进行控制,同时采用4*4键盘把设定温度地最高值和最低值键入单片机地数据存储器,通过温度传感器把测得地温度信号传给单片机,与单片机里地数据相比较,通过继电控制来判断是否进行水浴加热.四、硬件设备继电器 1个DS18B20 1个AT89S51芯片 1个MAX232芯片 1个LCD1602液晶显示器 1个五、系统框图经过反复思索设计,整个系统可以分成以下几个部分:AT89S51构成地控制电路、显示电路、温度传感器、键盘设定、继电控制、水浴加热温度传感器DS18B20把所测得地温度送到AT89S51单片机上,经过单片机地处理,把温度在电路上显示,本系统显示器为液晶显示器LCD1602.通过键盘设定温度范围,将测得地实际温度与设定温度相比较,由继电器控制是否加热.控制电路采用单片机最小系统同时完成控制、显示、键盘采集温度等功能.六、硬件设计整个系统以单片机AT89S51为核心部件,在51最小系统外围添加了温度测量、键盘输入、液晶显示部分以及继电器构成地执行部件.1.单片机最小系统本设计选择地芯片是AT89S51,其主要特点如下:4KB片内程序存储器,128bytes地随机存取数据存储器<RAM),32个外部双向输入/输出<I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗<WDT)电路,片内时钟振荡器.单片机接口使用情况如下:P1.3作为继电器控制端口;P3.5作为温度检测元件输入端口;P2口键盘扫描端口;P0口作为LCD液晶显示数据输入端口;P3口作为上位通信串口输入端.单片机最小系统工作电路如图:最小系统2.温度传感器因为DS18B20芯片将温度传感器、信号放大调理、A/D转换、接口全部集成于一芯片,与单片机连接简单、方便,与AD590相比是更新一代地温度传感器,所以温度传感器采用DS18B20.DS18B20为单线数字温度传感器,支持“一线总线”接口,大大提高了系统地抗干扰性,应用于温控控制、工业系统、消费品、温度计或任何热感测系统.DS18B20具有以下特性:<1)、零待机功耗;<2)、无需外部器件;<3)、可通过数据线供电;<4)、温度以9位数字量读出;<5)、独特地单线接口仅需一个端口引脚进行通讯;<6)、测温范围-55℃~+125℃,在-10℃~+85℃内,精度为±0.5℃.CPU对DS18B20地访问流程是:先对DS18B20初始化,再进行ROM操作命令,最后才能对存储器操作,数据操作.DS18B20每一步操作都要遵循严格地工作时序和通信协议.如主机控制DS18B20完成温度转换这一过程,根据DS18B20地通讯协议,须经三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令.电路采用温度传感器DS18B20,可直接输出数字量,单线器件和单片机地接口只需一根信号线,所以本设计地硬件电路十分简单,容易实现.能达到0.5ºC地固有分辨率,使用读取温度暂存寄存器地方法能达到0.2ºC以上地精度.DS18B20连接电路图如图所示:3.键盘液晶显示本设计在键盘输入方面,选择常用地4*4扫描键盘,分别用作PID模式选择、温度设定值输入、确定或取消设置.在显示方面,选用了常用地显示容量为16*2个字符地液晶显示模块LCD1602.键盘及显示部分地连接图如图所示:4.继电器控制执行电路电磁式继电器介绍:电磁式继电器一般由铁芯、线圈、衔铁、触点簧片等组成.只要在线圈两端加上一定电压,线圈中就会流过电流,从而产生电磁效应,衔铁就会在电磁力吸引地作用下克服返回弹簧地拉力吸向铁芯,从而带动衔铁地动触点与静触点吸合,从而接通原来断开地电路;当线圈断电后,电磁地吸力也随之消失,衔铁就会在弹簧地反作用力下返回原来地位置,使动触点与静触点断开.这样吸合、释放,从而达到了在电路中地导通、切断地目地.继电器电路如图所示:通过给I/O端口高低电位来控制继电器地通断,继而控制水浴加热是否执行,以达到控制水温地目地.其中三极管为控制开关作用,当接口为高电平,三极管截止,5V加不到继电器地线圈,继电器不吸合,此时不执行加热操作;当端口为低电平,三极管导通,5V通过三极管加到继电器线圈,继电器吸合,此时可以开始水浴加热.5.总电路连接图见附件.七、心得体会本次温度控制系统地设计,使我对单片机控制系统地了解更进一步.同时体会到团队协作地重要性,每个人在团队中都要找到自己擅长地部分.对相关软件地熟练应用也是设计过程中重要部分.。
封面作者:Pan Hongliang仅供个人学习东北林业大学综合电子课程设计总结报告设计项目:基于ARM7与DS18B20地数字温度计地设计项目完成人:指导教师:学院:信息与计算机工程学院专业:电子信息工程2008级3班2011年7月7日综合电子课程设计任务书数字温度计地设计摘要本系统用ARM7 LPC2131.温度传感器DS18B20.液晶屏12864.LED等组成,系统可实现实时显示当前室内温度功能.系统除基本数字温度计功能外,还具有显示当前时间和日期.温度超限报警.设置时间和日期初值功能.在设计中我们应用ARM7开发板.ARM7开发板具有丰富地硬件资源.本设计采用LPC2131控制可编程芯片DS18B20实现对温度地采集.利用LPC213内部时钟资源采集时间和日期.温度.时间和日期通过液晶屏12864显示,温度超限报警通过LED闪烁提示.本文详细介绍了如何实现对DS18B20编程采集温度功能,以及如何采集ARM7 LPC2131内部时钟资源,并实现键盘输入修改日期时间.温度超限报警等功能.关键词:LPC2131;DS18B20;12864;温度超限报警;目录1 绪论 (2)1.1 引言.... . (2)1.2 系统方案设计 (3)1.3 方案论证 (3)2系统主要器件选型与依据 (4)2.1 EasyARM2131 开发板 (4)2.2温度传感器DS18B20 (5)2.3MS12864R液晶屏简介 (6)3系统地硬件设计 (9)3.1ARM7开发板硬件设计 (9)3.2 LCD液晶屏显示设计............................................................................................... (9)3.3DS18B20温度传感器地设计.............. . (10)4 系统地软件设计 (11)4.1系统主流程图 (11)4.2温度传感器功能模块 (12)4.3液晶显示功能模块 (12)5 总结 (13)参考文献附录A数字温度计设计1绪论1.1引言近年来随着科技地飞速发展,嵌入式地应用正在不断深入,同时带动传统控制检测技术日益更新.在实时检测和自动控制地嵌入式应用系统中,嵌入式往往作为一个核心部件来使用,仅嵌入式方面知识是不够地,还应根据具体硬件结构软硬件结合,加以完善.温度是一种最基本地环境参数,人们生活与环境温度息息相关,在工业生产过程中需要实时测量温度,在工业生产中也离不开温度地测量,因此研究温度地测量方法和控制具有重要地意义.DS18B20是美国DALLAS半导体公司继DS1820之后最新推出地一种改进型智能温度传感器,通过此次项目设计,可以在原有地理论基础上,更加深入地了解传感器地工作原理特别是DS18B20温度传感器地工作原理,同时提高我们地实践动手能力以及逻辑思维能力,特别是拓宽了对ARM控制器地使用视野.数字温度计地控制方式很多.本系统采用LPC2000系列ARM芯片和可编程串行I/O接口芯片DS18B20为中心器件来设计数字温度计,实现了设计一个数字温度采集系统,利用LCD液晶屏显示当前温度.时间和日期,并具有温度超限报警功能1.2 系统方案设计利用控制芯片.温度传感器.LCD液晶屏.时钟资源.LED等分别实现:(1)实时显示当前室内温度(2)显示年.月.日.星期.时.分.秒;(3)能够通过键盘输入日期和时间地初值;(4)温度超限报警;图1-1为设计方案总体框图图1-1设计方案总体框图系统初始化后,LCD上显示当前室内温度 ,同时LCD上显示时间和日期,通过功能键能实现日期和时间地初值设定,如果温度超过预先设定地温度值,八个LED灯会闪烁提示温度超限.1.3方案论证(1)显示模块方案一:使用LCD液晶屏12864作为时间日期显示,LCD 液晶显示器地构造是在两片平行地玻璃当中放置液态地晶体,两片玻璃中间有许多垂直和水平地细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面.显示清晰,实现功能全.方案二:使用8为数码管作为显示,通过芯片HD7279控制数码管,可实现时间和日期还有当前温度显示,缺点是数码管显示数字,显示不灵活多变.由于LCD可同时显示温度和时间,显示清晰,实现功能全.故选用方案一LCD12864作为显示模块.(2) 温度传感器DS18B20数字温度传感器,该产品采用美国DALLAS公司生产地DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域.由于DS18B20性能已经够好,控制起来也比较方便,故不需要对比,直接选用DS18B20作为温度传感器(3) 时钟电路模块方案一:DS1302一种高性能.低功耗.带RAM地实时时钟电路,它可以对年.月.日.周日.时.分.秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V.采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节地时钟信号或RAM数据.DS1302内部有一个31×8地用于临时性存放数据地RAM寄存器.方案二:ARM7LPC2131具有丰富地硬件资源,直接编程即可使用内部时钟资源由于使用DS1302还得外接电路而且编程比较麻烦,故选用ARM7内部时钟资源(4)报警电路报警电路采用8只LED,控制方便.准确.2 系统主要器件选型及依据2.1 EasyARM2131 开发板EasyARM2131 开发板是广州周立功公司设计地EasyARM 系列开发套件之一,采用了PHILIPS 公司基于ARM7TDMI-S 核.单电源供电.LQFP64 封装地LPC2131,具有 JTAG 仿真调试.ISP 编程等功能.开发板上提供了一些键盘.LED.蜂鸣器等常用功能部件,还具有RS232 接口电路. I2C存储器电路.另外,用户也可以更换兼容地CPU进行仿真调试,如LPC2132.LPC2138. LPC2142 等.灵活地跳线组合(开发板内使用地所有I/O均可断开连接),还有用户I/O接口,极大地方便了用户进行32 位ARM嵌入式系统地开发实验.EasyARM2131 实验板功能特点:* 完全自主设计地软硬件.拥有自主版权地JTAG 仿真技术;* 支持ADS1.2 集成开发环境及其PHILIPS 所有型号ARM 微控制器地仿真与开发;* 采用“主板+CPU PACK 适配器+SD 卡适配器(标准配置)+多种可选配置适配器”* 地形式构成EasyARM2131 开发套件,标准配置地CPU PACK 主芯片为LPC2131FBD;* 板上地功能部件与CPU 之间,可以使用跳线器选择连接;* 全面支持9 种型号地64 PIN 小管脚ARM7 微控制器:-LPC213x(LPC2131/2132/2134/2136/2138)-内置USB 接口地LPC214x(LPC2142/2144/2146/2148)* 多种免费商业化软件包及其详细地开发文档:* 移植μC/OS-II到ARM7 软件包* 数据队列软件包* 串口驱动软件包* MODEM接口软件包* SPI总线软件包* I2C总线软件包* ZLG/FS V1.0 版本文件管理系统软件包* ZLG/GUI图形用户界面软件包* ZLG/SD卡读写软件包* ZLG/USB固件程序及其驱动程序软件包* 多种可选配置适配器:-各种型号地CPU PACK,用户可按需求和喜好配置主ARM 芯片-MG12864 点阵图型液晶模块* 所有I/O 口全部引出,方便用户连接外部电路地开发与使用;* 可进行GPIO 地控制实验,如键盘输入.蜂鸣器控制.模拟SPI 等;* 6 个独立按键(可用于外部中断.定时器捕获输入),8 个LED 指示灯;* 具有RS232 转换电路,可与上位机进行通讯,完成UART 通讯实验;* 可以与标准串行modem 直接接口,方便远程通讯;* 具有I2C接口和SPI/SSP接口输出;* 提供基于PC 地人机界面,方便调试实时时钟.串口通信等功能;* 可进行外部中断实验,学习向量中断控制器(VIC);* 定时器控制实验,如定时控制LED.定时器捕获等;* 使用板内地CAT1025(内含复位功能),完成I2C总线地实验;* 使用74HC595 芯片,实现SPI 接口数据发送.接收实验;* A/D 转换实验;DAC 转换实验(更换CPU 为LPC2132 及以上);* 实时时钟控制实验;* WDT 及低功耗控制实验;* 54 个基础实验及其大量地中间件软件包,完整地验证了几乎所有地硬件功能资源;* 详细地配套资料(《深入浅出ARM7—LPC213x/214x》(上/下册),北航出版社,其中上册为标准配置).2.2 温度传感器DS18B20DS18B20数字温度计是DALLAS公司生产地1-Wire,即单总线器件,具有线路简单,体积小地特点.因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样地数字温度计,十分方便.DS18B20产品地特点(1).只要求一个端口即可实现通信.(2).在DS18B20中地每个器件上都有独一无二地序列号.(3).实际应用中不需要外部任何元器件即可实现测温.(4).测量温度范围在-55.C到+125.C之间.(5).数字温度计地分辨率用户可以从9位到12位选择.(6).内部有温度上.下限告警设置.DS18B20地引脚介绍TO-92封装地DS18B20地引脚排列见图1,其引脚功能描述见表1.DS18B20地使用方法由于DS18B20采用地是1-Wire总线协议方式,即在一根数据线实现数据地双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件地方法来模拟单总线地协议时序来完成对DS18B20芯片地访问.由于DS18B20是在一根I/O线上读写数据,因此,对读写地数据位有着严格地时序要求.DS18B20有严格地通信协议来保证各位数据传输地正确性和完整性.该协议定义了几种信号地时序:初始化时序.读时序.写时序.所有时序都是将主机作为主设备,单总线器件作为从设备.而每一次命令和数据地传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收.数据和命令地传输都是低位在先.DS18B20地复位时序DS18B20地读时序对于DS18B20地读时序分为读0时序和读1时序两个过程.对于DS18B20地读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上.DS18B20在完成一个读时序过程,至少需要60us才能完成.DS18B20地写时序对于DS18B20地写时序仍然分为写0时序和写1时序两个过程.对于DS18B20写0时序和写1时序地要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上地“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线.2.3 MS12864R液晶屏简介MS12864R汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵).128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM). 主要技术参数和显示特性:电源:VDD 3.3V~+5V(内置升压电路,无需负压);显示内容:128列× 64行显示颜色:黄绿显示角度:6:00钟直视LCD类型:STN与MCU接口:8位或4位并行/3位串行配置LED背光多种软件功能:光标显示.画面移位.自定义字符.睡眠模式等模块引脚说明电源地(GND):0V工作温度(Ta):0~60℃(常温) / -20~75℃(宽温)接口时序模块有并行和串行两种连接方法(时序如下):8位并行连接时序图MPU写资料到模块MPU从模块读出资料串行连接时序图串行数据传送共分三个字节完成:第一字节:串口控制—格式 11111ABCA为数据传送方向控制:H表示数据从LCD到MCU,L表示数据从MCU 到LCDB为数据类型选择:H表示数据是显示数据,L表示数据是控制指令 C固定为0第二字节:(并行)8位数据地高4位—格式 DDDD0000第三字节:(并行)8位数据地低4位—格式 0000DDDD串行接口时序参数:(测试条件:T=25℃ VDD=4.5V)3硬件设计3.1 ARM7开发板硬件设计系统原理图设计如图3-1所示,ARM7 LPC213系统实现如下功能:(1)控制温度传感器DS18B20读取当前温度值;(2)控制ARM7内部时钟资源读取时间和日期;(3)控制LCD液晶屏显示当前温度.时间和日期;(4)控制LED温度超限报警.图3-1 系统原理图3.2 LCD液晶屏显示设计:LCD液晶屏显示电路如图3-2所示.该液晶可实现显示当前年.月.日.周.时.分秒和温度值,具体控制和实现方法如下:(1)ARM7地P0.0-P0.7口连接液晶屏地DBO-DB7,控制对液晶屏并行数据读和写;(2)ARM7地P0.8口连接液晶屏地RS口,控制并行地指令/数据选择信号;(3)ARM7地P0.9口连接液晶屏地R/W口,控制并行地读写选择信号;(4)ARM7地P0.10口连接液晶屏地EN口,控制并行地使能信号;;(5)ARM7地P0.11口连接液晶屏地PSB口,控制并/串行接口选择:H-并行;L-串行;(6)ARM7地P0.12口连接液晶屏地RET口,实现对液晶屏地复位,低电平有效;图3-2LCD液晶屏电路图3.3 DS18B20温度传感器地设计电路如图3-3所示,该温度传感器电路可实现对温度传感器DS18B20数据地读写,具体控制方法如下:(1) ARM7地P0.30口连接DS18B20地DQ口,控制串行数据地读和写;(2) DS18B20 地VDD连接到ARM7开发板地VDD上;(3) DS18B20 地GND连接到ARM7开发板地GND上;图3-3 温度传感器电路4 系统地软件设计4.1系统主流程图图4-1为系统主流程图,主流程图具体介绍如下:(1)系统初始化包括对DS18B20进行初始化.设定GPIO.RTC初始化.液晶屏初始化;(2)初始化之后显示当前室内温度同时显示日期和时间;(3)与此同时进行按键判断,如果有按键继续判断是什么按键,如果是修改时间按键那么修改时间;如果是修改日期按键那么修改日期.如没有按键按下,那么判断室内温度是否超过预先设定值,如果超过驱动LED闪烁报警.图4-1 系统主流程图4.2温度传感器功能模块图4-2为温度传感器功能模块流程图;图4-2 温度传感器功能模块流程图4.3液晶显示功能模块图4-3为液晶显示功能模块流程图;图4-3 液晶显示功能模块流程图5总结本系统利用控制芯片.温度传感器.LCD液晶屏.LED等分别实现:(1)实时显示当前室内温度(2)显示年.月.日.星期.时.分.秒;(3)能够通过键盘输入日期和时间地初值;(4)温度超限报警;系统设计简便.实用性强.操作简单.程序设计简便.系统不足:时间和日期初值设定中利用按键较多,此外还没有充分考虑到温度超限报警地多变性,温度报警上限不可调节,只能预先程序中设定超限报警温度值.一周地综合电子工艺课程设计结束了,可能在别人看来,这或许只是一个小地设计,可是它给于我地却不仅仅是这样,认真地做课程设计,运用ARM做一个系统地东西,我从心里给予了足够地重视.刚开始做总是出问题,多次重新分析,从细节着手寻找问题,最后找到了.发现自己想象地太多.太复杂,实际上只需要很简单地一种方法就可以地,问题解决了,也给我很多收获.我觉得自己地方法不可行,关键地原因在于自己对ARM地工作原理没有透彻地理解,所以就不能很好地理解老师地设计要求,结果就造成了很多地弯路,找不到一种合理地途径去解决问题.希望以后有机会可以多做一些这样地设计,增强自己地设计意识,加深所学地知识.参考文献[1] 郁有文传.感器原理及工程应用(第三版).西安电子科技出版社,2008.7[2] 阎石.数字电子技术基础(第四版).高等教育出版社,1998.11[3] 周立功.ARM嵌入式系统基础教程(第二版).北京航空航天大学出版社,2008.9[4] 汪建军.基于非平衡电桥地电阻数字温度计设计[J].浙江万里学院学报,2009[5] 老虎工作室.电路设计与制板protel99se典型实例.人民邮电出版社[6] 宋文绪.杨帆.传感器与检测技术[M].高等教育出版社,2004:附录A/********************************************************************** ************* 描述: **(1)此程序所有延时采用定时器做(2)开发板上地P0.30口连接温度传感器DQ口线(3)开发板上P0.0-P0.7口连接液晶屏地DBO-DB7,其他液晶口线连接详见程序中宏定义(4)如需液晶显示地更清楚,需在液晶屏上加10K电位器,调节液晶屏输入参考电压*********************************************************************** **********/#include <LPC213X.H>#define eq 1<<30#define uint8 unsigned char#define Fpclk 11059200#define key1 1<<16#define key2 1<<17#define key3 1<<18#define key4 1<<19#define key5 1<<20#define key6 1<<21int nn=0,yy=0,rr=0,zz=0,ss=0,ff=0,mm=0;/*******************定义与LCD相关地宏*******************/#define LCD_DATA 0xFF#define LCD_DI 1<<8 //与p0.8对应#define LCD_RW 1<<9 //与p0.9对应#define LCD_EN 1<<10 //与p0.10对应.#define LCD_PSB 1<<11 //与p0.11对应//电路直接拉高#define LCD_RST 1<<12 //与p0.12对应//上电自动复位,一般也可以不接*#define clear_screen 0x01#define reset_address 0x02#define set_point 0x06 // 0000_0110#define display_set 0x0c //显示设定#define cursor_shift_control 0x1c //0001_1100#define function_set 0x30 //功能设定基本指令集#define function_set_ext 0x36 //功能设定扩充指令集绘图开//#define set_CGRAM_ADD#define set_DDRAM_ADD 0x80//#define write_data_intenalRAMunsigned char digit[10]={"0123456789"}; //定义字符数组显示数字void delay1u(unsigned long t){T1PR = 0x00000000; //Load prescalerT1TCR = 0x00000003; //Reset counter and prescalerT1MCR = 0x00000003; //On match reset the counter and generate an interruptT1MR0 = t*0x0f; //Set the cycle timeT1TCR = 0x00000001; //enable timerwhile((T1IR & 0x01) == 0);T1IR = 0x01;T1TCR = 0x00000000;}/****************************************************************************** ********************************************************************************************************* ***************************//****************************************************************************** ********************************************************************************************************* ***************************/void LCD_DATA_input(){IO0DIR = IO0DIR & (~LCD_DA TA); //把p1.16-p1.23设定为输入}/****************************************************************************** ********************************************************************************************************* ***************************/void LCD_DATA_output(){IO0DIR = IO0DIR | LCD_DA TA; //设定p0.0-p0.7为输出}/****************************************************************************** ********************************************************************************************************* ***************************/void CheckState( ) //状态检查,LCD是否忙?{delay1u(200);//while(read_instruct());}/********************************************************************************************************//****************************************************************************** ***************************** 函数名称:GPIO_Init()*** 函数功能:初始化IO端口,包含一个uart0,三个按键输入,以及几个普通地输入输出端口. *** 入口参数:无*** 出口参数:无******************************************************************************* ***************************//*void GPIO_init(){PINSEL0 = 0;IO0DIR = 0xFF<<8;}*//****************************************************************************** ***************************** 函数名称:w_data(unsigned char data_Lcm)*** 函数功能:给LCD发送数据或者命令.*** 入口参数:data_Lcm*** 出口参数:无******************************************************************************* ***************************/void W_data(uint8 data_Lcm){CheckState();LCD_DATA_output();IO0SET = LCD_DI;IO0CLR = LCD_RW;IO0CLR = 0xFF;IO0SET = data_Lcm;IO0SET = LCD_EN;IO0CLR = LCD_EN;}/****************************************************************************** ***************************** 函数名称:*** 函数功能:*** 入口参数:*** 出口参数:******************************************************************************* ***************************/void W_instruct(uint8 data_Lcm){CheckState();LCD_DATA_output();IO0CLR = LCD_DI;IO0CLR = LCD_RW;IO0CLR = 0xFF;IO0SET = data_Lcm;IO0SET = LCD_EN;IO0CLR = LCD_EN;}/****************************************************************************** ***************************** 函数名称LCD_Init()*** 函数功能:初始化lcd显示屏*** 入口参数:无*** 出口参数:无******************************************************************************* ***************************/void init_lcd(void){IO0SET = LCD_RST;IO0CLR = LCD_RST;IO0SET = LCD_RST;IO0SET = LCD_PSB;IO0SET = LCD_PSB;W_instruct(function_set);W_instruct(display_set);W_instruct(clear_screen);W_instruct(reset_address);W_instruct(set_DDRAM_ADD);}/****************************************************************************** ***************************** 函数名称:*** 函数功能:写汉字到LCDx_add 显示RAM 地地址dat1/dat2 显示汉字编码指定地位置*** 入口参数:*** 出口参数:******************************************************************************* ***************************//*void display(uint8 x_add,uint8 dat1,uint8 dat2){W_instruct(x_add); //1xxx,xxxx 到地址计数器ACW_data(dat1);W_data(dat2);}*//****************************************************************************** **************************//****************************************************************************** ***/void write(unsigned char date){unsigned char i=0;for (i=8; i>0; i--){IO0DIR |= eq; //改回输出IO0SET |= eq;delay1u(2);IO0CLR = eq;if(date&0x01){IO0SET |= eq; //释放总线delay1u(80);}else{IO0CLR = eq;delay1u(80);}delay1u(30);IO0SET |= eq;delay1u(3);date>>=1;}delay1u(6);}unsigned char read(){unsigned char i=0;unsigned char date = 0;for (i=8;i>0;i--){date>>=1;IO0DIR |= eq; //改回输出IO0SET |= eq;delay1u(2);IO0CLR = eq; // 给脉冲信号delay1u(2);IO0SET |= eq;delay1u(13);IO0DIR = IO0DIR&0xBFFFFFFF; // 拉高总线输入delay1u(12);if(IO0PIN&eq)date |=0x80;delay1u(3);}return date;}unsigned char innit(){unsigned char num;IO0DIR |= eq;//稍做延时IO0CLR = eq; //将DQ拉低delay1u(600); //精确延时大于480us 480 IO0SET = eq;delay1u(30);IO0DIR &= 0xBFFFFFFF; //拉高总线输入delay1u(30);if((IO0PIN &eq) ==0){num=0;}else{num=1;}IO0SET = num;delay1u(200); //300return num;}void zhun(){innit();write(0xCC);write(0x44);delay1u(900000);innit();write(0xCC);write(0xBE);}void display_temp1(unsigned char x){int i;unsigned char a,b,c; //j,k,l分别储存温度地百位.十位和个位unsigned char k[9] = {"温度是:"};unsigned char l[16]=("数字温度计姚--连");W_instruct(0x88);for(i=0;i<9;i++)W_data(k[i]);W_instruct(0x98);for(i=0;i<16;i++)W_data(l[i]);a=x/100; //取百位b=(x%100)/10; //取十位c=x%10; //取个位W_instruct(0x8C); //写显示地址,将在第2行第7列开始显示W_data(digit[a]); //将百位数字地字符常量写入LCDW_data(digit[b]); //将十位数字地字符常量写入LCDW_data(digit[c]); //将个位数字地字符常量写入LCDdelay1u(100); //延时1ms给硬件一点反应时间}void display_temp2(unsigned char x){unsigned char t[] ={"℃"} ;//写显示地址,将在第2行第11列开始显示W_data('.');W_data(digit[x]); //将小数部分地第一位数字字符常量写入LCDW_instruct(0x8F);W_data(t[0]);W_data(t[1]);W_data(t[2]);delay1u(100); //延时1ms给硬件一点反应时间}/******************************************************************************** ************************** 函数名称:RTCInit()** 函数功能:初始化实时时钟** 入口参数:无** 出口参数:无******************************************************************************* *************************/void RTCInit (void){PREINT = Fpclk / 32768 - 1; // 设置基准时钟分频器PREFRAC = Fpclk - (Fpclk / 32768) * 32768;CCR = 0x00; // 禁止时间计数器YEAR = 2008+nn;MONTH = 04+yy;DOM = 01+rr;DOW = 4+zz;HOUR = 8+ss;MIN = 30+ff;SEC = 59+mm;CIIR = 0x01; // 设置秒值地增量产生1次中断CCR = 0x01; // 启动RTC}/******************************************************************************** ************************** 函数名称:SendTimeRtc()** 函数功能:读取RTC地时间值,并将读出地时分秒值通过串口送到上位机显示.** 入口参数:无** 出口参数:无******************************************************************************* *************************/void SendTimeRtc (void){unsigned char a,b,c,d;int datas;int times;int bak;unsigned char t[] ={"年"};unsigned char s[] ={"月"};unsigned char r[] ={"日"};unsigned char m[] ={"周"};unsigned char n[] ={"时"};unsigned char p[] ={"分"};unsigned char q[] ={"秒"};times = CTIME0; // 读取完整地时钟寄存器datas = CTIME1;W_instruct(0x80);W_data(0x02); //显示笑脸W_data(0x02); //显示笑脸bak = (datas >> 16) & 0xfff; // 获取年a=bak / 1000;bak = bak % 1000;b=bak / 100;bak = bak % 100;c=bak / 10;d=bak % 10;W_instruct(0x81);W_data(digit[a]); //将千位数字地字符常量写入LCD W_data(digit[b]); //将百位数字地字符常量写入LCD W_data(digit[c]); //将十位数字地字符常量写入LCD W_data(digit[d]); //将个位数字地字符常量写入LCD W_instruct(0x83);W_data(t[0]);W_data(t[1]);bak = (datas >> 8) & 0x0f; // 获取月a=bak / 10;b=bak % 10;W_instruct(0x84);W_data(digit[a]);W_data(digit[b]);W_instruct(0x85);W_data(s[0]);W_data(s[1]);bak = datas & 0x1f; // 获取日c=bak / 10;d=bak % 10;W_instruct(0x86);W_data(digit[c]);W_data(digit[d]);W_instruct(0x87);W_data(r[0]);W_data(r[1]);bak = (times >> 24) & 0x07; // 获取星期a=bak;W_instruct(0x90);W_data(m[0]);W_data(m[1]);W_instruct(0x91);W_data(digit[a]);bak = (times >> 16) & 0x1f; // 获取小时a=bak / 10;b=bak % 10;W_instruct(0x92);W_data(digit[a]);W_data(digit[b]);W_instruct(0x93);W_data(n[0]);W_data(n[1]);bak = (times >> 8) & 0x3f; // 获取分钟a=bak / 10;b=bak % 10;W_instruct(0x94);W_data(digit[a]);W_data(digit[b]);W_instruct(0x95);W_data(p[0]);W_data(p[1]);bak = times & 0x3f; // 获取秒钟a=bak / 10;b=bak % 10;W_instruct(0x96);W_data(digit[a]);W_data(digit[b]);W_instruct(0x97);W_data(q[0]);W_data(q[1]);}int main(){unsigned char a,b,TN,TD ;PINSEL0 = 0;PINSEL1 = 0;IO0DIR = 0x0000FFFF;IO1DIR = 0xFFFFFFFF;RTCInit();// GPIO_init();init_lcd();while(1){zhun() ;b=read();a=read();TN=a*16+b/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16//这样得出地是温度地整数部分,小数部分被丢弃了TD=(b%16)*10/16;display_temp1(TN);display_temp2(TD);if(TN>=33){IO1PIN = IO1PIN ^ 0xFFFFFFFF;}else{IO1SET =0XFFFFFFFF;}if((key1&IO0PIN)==0){nn=nn+1;RTCInit();}else if((key2&IO0PIN)==0){yy=yy+1;RTCInit();}else if((key3&IO0PIN)==0){rr=rr+1;RTCInit();}else if((key4&IO0PIN)==0){zz=zz+1;RTCInit();}else if((key5&IO0PIN)==0){ss=ss+1;RTCInit();}else if((key6&IO0PIN)==0){ff=ff+1;RTCInit();}while (0 == (ILR & 0x01)); // 等待RTC增量中断ILR = 0x01; // 清除中断标志SendTimeRtc();}}版权申明本文部分内容,包括文字、图片、以及设计等在网上搜集整理。
DS18B20数字温度计地设计与实现一、实验目地1.了解DS18B20数字式温度传感器地工作原理.2.利用DS18B20数字式温度传感器和微机实验平台实现数字温度计.二、实验内容与要求采用数字式温度传感器为检测器件,进行单点温度检测.用数码管直接显示温度值,微机系统作为数字温度计地控制系统.b5E2RGbCAP1.基本要求:(1>检测地温度范围:0℃~100℃,检测分辨率0.5℃.(2>用4位数码管来显示温度值.(3>超过警戒值<自己定义)要报警提示.2.提高要求(1>扩展温度范围.(2>增加检测点地个数,实现多点温度检测.三、设计报告要求1.设计目地和内容2.总体设计3.硬件设计:原理图<接线图)及简要说明4.软件设计框图及程序清单5.设计结果和体会<包括遇到地问题及解决地方法)四、数字温度传感器DS18B20由DALLAS半导体公司生产地DS18B20型单线智能温度传感器,属于新一代适配微处理器地智能温度传感器,可广泛用于工业、民用、军事等领域地温度测量及控制仪器、测控系统和大型设备中.它具有体积小,接口方便,传输距离远等特点.p1EanqFDPw1.DS18B20性能特点DS18B20地性能特点:①采用单总线专用技术,既可通过串行口线,也可通过其它I/O口线与微机接口,无须经过其它变换电路,直接输出被测温度值<9位二进制数,含符号位),②测温范围为-55℃-+125℃,测量分辨率为0.0625℃,③内含64位经过激光修正地只读存储器ROM,④适配各种单片机或系统机,⑤用户可分别设定各路温度地上、下限,⑥内含寄生电源.DXDiTa9E3d2.DS18B20内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM,温度传感器,非挥发地温度报警触发器TH和TL,高速暂存器.64位光刻ROM是出厂前被光刻好地,它可以看作是该DS18B20地地址序列号.64位ROM结构图如图2所示.不同地器件地址序列号不同. DS18B20地管脚排列如图1所示.RTCrpUDGiT图1 DS18B20引脚分布图5PCzVD7HxA图2 64位ROM 结构图 DS18B20高速暂存器共9个存储单元,如表所示:以12位转化为例说明温度高低字节存放形式及计算:12位转化后得到地12位数据,存储在18B20地两个高低两个8位地RAM 中,二进制中地前面5位是符号位.如果测得地温度大于0,这5位为0,LSBMSB 8位检验CRC 48位序列号 8位工厂代码<10H )只要将测到地数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到地数值需要取反加1再乘于0.0625才能得到实际温度.jLBHrnAILg3.DS18B20控制方法DS18B20有六条控制命令,如表所示:4.DS18B20地通信协议DS18B20器件要求采用严格地通信协议,以保证数据地完整性.该协议定义了几种信号类型:复位脉冲,应答脉冲时隙;写0,写1时隙;读0,读1时隙.与DS18B20地通信,是通过操作时隙完成单总线上地数据传输.发送所有地命令和数据时,都是字节地低位在前,高位在后.xHAQX74J0Xa)复位和应答脉冲时隙每个通信周期起始于微控制器发出地复位脉冲,其后紧跟DS18B20发出地应答脉冲,在写时隙期间,主机向DS18B20器件写入数据,而在读时隙期间,主机读入来自DS18B20地数据.在每一个时隙,总线只能传输一位数据.时序图见图3.LDAYtRyKfEb)写时隙当主机将单总线DQ从逻辑高拉到逻辑低时,即启动一个写时隙,所有地写时隙必须在60~120us完成,且在每个循环之间至少需要1us地恢复时间.写0和写1时隙如图所示.在写0时隙期间,微控制器在整个时隙中将总线拉低;而写1时隙期间,微控制器将总线拉低,然后在时隙起始后15us之释放总线.时序图见图4.Zzz6ZB2Ltkc)读时隙DS18B20器件仅在主机发出读时隙时,才向主机传输数据.所以在主机发出读数据命令后,必须马上产生读时隙,以便DS18B20能够传输数据.所有地读时隙至少需要60us,且在两次独立地读时隙之间,至少需要1us地恢复时间.每个读时隙都由主机发起,至少拉低总线1us.在主机发起读时隙之后,DS18B20器件才开始在总线上发送0或1,若DS18B20发送1,则保持总线为高电平.若发送为0,则拉低总线当发送0时,DS18B20在该时隙结束后,释放总线,由上拉电阻将总线拉回至高电平状态.DS18B20发出地数据,在起始时隙之后保持有效时间为15us.因而主机在读时隙期间,必须释放总线.并且在时隙起始后地15us之内采样总线地状态.时序图见图4.dvzfvkwMI1图3 复位和应答脉冲时隙图4 读写时序五、硬件电路设计按照系统设计功能地要求,确定系统由3个模块组成:主控制器、测温电路和显示电路.数字温度计总体电路结构框图如图5所示.rqyn14ZNXI图5 电路结构框图在硬件上,DS18B20与单片机地连接有两种方法,一种是Vcc接外部电源,GND接地,I/O与单片机地I/O线相连;另一种是用寄生电源供电,此时UDD、GND接地,I/O接单片机I/O.无论是内部寄生电源还是外部供电,I/O口线要接5KΩ左右地上拉电阻.EmxvxOtOco六、软件设计系统程序主要包括主程序、读出温度子程序、温度转换子程序、计算温度子程序、显示数据刷新子程序等等.1.主程序主程序地主要功能是负责温度地实时显示、读出并处理DS18B20地测量温度值,温度测量每1s进行一次,其程序流程图如图6.SixE2yXPq5图6 主程序流程图2.读出温度子程序读出温度子程序地主要功能是读出RAM中地9字节,在读出时需要进行CRC校验,校验有错时不进行温度数据地改写.其程序流程图如图7所示.6ewMyirQFL图7 读出温度子程序流程图3.温度转换命令子程序温度转换命令子程序主要是发温度转换开始命令,当采用12位分辩率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换地完成.温度转换命令子程序流程图如图8所示.kavU42VRUs4.计算温度子程序计算温度子程序将RAM中读取值进行BCD码地转换运算,并进行温度值正负地判定,其流程图如图9所示.图8 温度转换命令子程序流程图图9 计算温度子程序流程图显示数据刷新子程序显示数据刷新子程序主要是对显示缓冲区中地显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位.程序流程图如图10所示.y6v3ALoS89个人收集整理资料,仅供交流学习,勿作商业用途图10 显示数据刷新子程序流程图11 / 11。
使用DS18B20温度传感器设计温度控制系统设计设计说明:1.1使用DS18B20温度传感器设计温度控制系统1. 在数码管上可显示采集到的温度(0~999C)2. 当温度低于27C 时,蜂鸣器开始以慢地“滴”声报警,P1.0 口发光二极管闪 烁,当温度继续降低并低于25 C 时,蜂鸣器开始以快地“滴”声报警, P1.0和 P1.1 口发光二极管闪烁。
3. 当温度高于30C 时,蜂鸣器开始以慢地“滴”声报警,P1.2 口发光二极管闪 烁,当温度继续升高并高于32 C 时,蜂鸣器开始以快地“滴”声报警,P1.2和 P1.3 口发光二极管闪烁。
1.2元件说明:(1)使用的元器件(2)DS18B20器件说明DS18B20:电压范围3.0~5.5V ;温度可测范围-55~+125C ;可编程分辨率 为9~12位,对应的可分辨温度为:0.5C 、0.25C 、0.125C 和0.0625C ;测量 结果直接输出数字温度信号,以“一线总线”串行传送给 CPU ,同时可传送 CRC 校验码,具有极强的抗干扰纠错能力。
其引脚定义图如下图:(3)硬件连接图也3沟pniLAlii•IWNPD.UBI I■-ru配A帕rdJnfeTrmizurz.iA«irzj.s.inrziPAiiFS^AIZPZfAl] i煜 3 bl?7/AiCPJ1lTB:fcFJJfipTHJfrianp*!PJSifTlFl^wKF37INRi±J±l隹円X-.KHZI L-INC 1 :1吐B'lMTiriff*1Pd? IQ.-EE1R1硬件连接图如上图:1.3工作原理首先看控制原理:经过温度转数字信号,再AT89C52 控制9声器的工作,DS18B20的指令,只列举此设计用到的,如下表:CCH 跳过ROM44H 温度转换BEH 读暂存器DS18B20测量外部温度,换,将温度物理量转换成传送数据到AT89C52,数码管显示及二极管、扬从而实现了温度在数码管上显示,还有温度范围的亮灯与报警1.4 C语言编程见附录1.5实验结果可将环境温度经过DS18B20温度传感器,在数码管上显示,显示准确附录#include<reg51.h>#include<stdio.h>#define uchar unsigned char#define uint unsigned intsbit ds=P2A2。
DS-18B20 数字温度传感器本公司最新推出TS-18B20数字温度传感器,该产品采用美国DALLAS公司生产的DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
1: 技术性能描述1.1 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
1.2 测温范围-55℃~+125℃,固有测温分辨率0.5℃。
1.3 支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定,实现多点测温1.4 工作电源: 3~5V/DC1.5 在使用中不需要任何外围元件1.6 测量结果以9~12位数字量方式串行传送1.7 不锈钢保护管直径Φ61.8 适用于DN15~25, DN40~DN250各种介质工业管道和狭小空间设备测温1.9 标准安装螺纹M10X1, M12X1.5, G1/2”任选1.10 PVC电缆直接出线或德式球型接线盒出线,便于与其它电器设备连接。
2:应用范围2.1 该产品适用于冷冻库,粮仓,储罐,电讯机房,电力机房,电缆线槽等测温和控制领域2.2 轴瓦,缸体,纺机,空调,等狭小空间工业设备测温和控制。
2.3 汽车空调、冰箱、冷柜、以及中低温干燥箱等。
2.5 供热/制冷管道热量计量,中央空调分户热能计量和工业领域测温和控制3:产品型号与规格型号测温范围安装螺纹电缆长度适用管道TS-18B20 -55~125 无 1.5 mTS-18B20A -55~125 M10X1 1.5m DN15~25TS-18B20B -55~125 1/2”G 接线盒DN40~ 604:接线说明特点独特的一线接口,只需要一条口线通信多点能力,简化了分布式温度传感应用无需外部元件可用数据总线供电,电压范围为3.0 V至5.5 V 无需备用电源测量温度范围为-55 ° C至+125 ℃。
信息与通信工程学院课程设计项目:基于单片机的DS18B20数字温度计设计指导老师:湛腾西设计人:尹世强彭娇礼班级:电实11-1BF2018年 06月 18 日1 设计要求1.1 基本要求1、测量精度0.5℃2、范围:-50℃-110℃3、可测多点温度,演示两点以上4、LED直读显示5、可任意设计温度报警的上限与下限6、可上传通信<RS232口),也可以相互对通(485口>1.2 扩展功能温度报警,能任意设定温度范围实现声光报警;每隔10分钟记录一次温度数据,至少能查询过去10个时刻的温度情况。
2元器件清单3 总体方案设计2.1 方案论证2.1.1 方案一由于本设计是测温电路,可以使用热敏电阻之类的器件,将随被测温度变化的电压或电流采样,进行A/D转换后就可以用单片机进行数据处理,实现温度显示。
这种设计需要用到A/D转换电路,增大了电路的复杂性,而且要做到高精度也比较困难。
2.1.2 方案二考虑到在单片机属于数字系统,容易想到数字温度传感器,可选用DS18B20数字温度传感器,此传感器为单总线数字温度传感器,起体积小、构成的系统结构简单,它可直接将温度转化成串行数字信号给单片机处理,即可实现温度显示。
另外DS18B20具有3引脚的小体积封装,测温范围为-55~+125摄氏度,测温分辨率可达0.0625摄氏度,其测量范围与精度都能符合设计要求。
以上两种方案相比较,第二种方案的电路、软件设计更简单,此方案设计的系统在功耗、测量精度、范围等方面都能很好地达到要求,故本设计采用方案二。
图1 系统总体方框图2.2 总体设计框图本方案设计的系统由单片机系统、数字温度传感器、LED显示模块、按键控制模块、温度报警模块组成,其总体架构如图1。
3 硬件设计3.1 单片机系统1.本设计采用STC89C52单片机作为控制器,完成所有功能的控制,包括:●DS18B20数字温度传感器的初始化和读取温度值●LED数码管显示驱动与控制●按键识别和响应控制●温度设置和报警●温度值的存储和读取2.单片机系统电路原理图:图2 单片机系统原理图4.1 数字温度传感器模块4.1.1 DS18B20性能●独特的单线接口仅需一个端口引脚进行通信●简单的多点分布应用●无需外部器件●可通过数据线供电●零待机功耗●测温范围-55~+125℃,以0.5℃递增●可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃●温度数字量转换时间200ms,12位分辨率时最多在750ms内把温度转换为数字●应用包括温度控制、工业系统、消费品、温度计和任何热感测系统●负压特性:电源极性接反时,传感器不会因发热而烧毁,但不能正常工作4.1.2 DS18B20外形及引脚说明图3DS18B20外形及引脚●GND:地●DQ:单线运用的数据输入/输出引脚●VD:可选的电源引脚4.1.3 DS18B20接线原理图单总线通常要求接一个约 4.7K左右的上拉电阻,这样,当总线空闲时,其状态为高电平。
题目:基于89C51和DS18B20的数字温度计设计一、设计要求数字式温度计要求测温范围为—55〜125°C,精度误差在0.1 °以内,LED 数码管直读显示。
二、方案论证根据系统的设计要求,选择DS18B20作为本系统的温度传感器,选择单片机AT89C51为测控系统的核心来完成数据采集、处理、显示、报警等功能。
选用数字温度传感器DS18B20,省却了采样/保持电路、运放、数/模转换电路以及进行长距离传输时的串/并转换电路,简化了电路,缩短了系统的工作时间,降低了系统的硬件成本。
该系统的总体设计思路如下:温度传感器DS18B20把所测得的温度发送到AT89C51单片机上,经过51单片机处理,将把温度在显示电路上显示,本系统显示器用4位共阳LED数码管以动态扫描法实现。
检测范围-55摄氏度到125 摄氏度。
按照系统设计功能的要求,确定系统由3个模块组成:主控制器、测温电路和显示电路。
数字温度计总体电路结构框图如图1所示。
图1数字温度计总体电路结构框图三、系统硬件电路的设计温度计电路设计原理图如图2所示,控制器使用单片机AT89C51,温度传感器使用DS18B20,用4位共阳LED数码管实现温度显示图2数字温度计设计电路原理图1、主控制器AT89C51是一种带4K 字节闪烁可编程可擦除只读存储器的低电压,高性 能CMOS8位微处理器。
该器件采用 ATMEL 高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能 8位CPU 和闪烁存储器组合在单个芯片中, ATMEL 的AT89C51是一种高效微控制器, 为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
2、 显示电路显示电路采用 4位共阳LED 数码管,从 P0 口输出段码,列扫描用P3.0~P3.3 口来实现,列驱动用8550三极管。
3、 温度传感器工作原理DS18B20温度传感器是美国DALLAS 半导体公司最新推出的一种改进型智 能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度, 并且可根据实际要求通过简单的编程实现 9〜12位的数字值读数方式。
基于51单片机及DS18B20温度传感器的数字温度计设计摘要本设计采用的主控芯片是ATMEL公司的AT89S52单片机,数字温度传感器是DALLAS公司的DS18B20。
本设计用数字传感器DS18B20测量温度,测量精度高,传感器体积小,使用方便。
所以本次设计的数字温度计在工业、农业、日常生活中都有广泛的应用。
单片机技术已经广泛应用社会生活的各个领域,已经成为一种非常实用的技术。
51单片机是最常用的一种单片机,而且在高校中都以51单片机教材为蓝本,这使得51单片机成为初学单片机技术人员的首选。
本次设计采用的AT89S52是一种flash型单片机,可以直接在线编程,向单片机中写程序变得更加容易。
本次设计的数字温度计采用的是DS18B20数字温度传感器,DS18B20是一种可组网的高精度数字式温度传感器,由于其具有单总线的独特优点,可以使用户轻松地组建起传感器网络,并可使多点温度测量电路变得简单、可靠。
本设计根据设计要求,首先设计了硬件电路,然后绘制软件流程图及编写程序。
本设计属于一种多功能温度计,温度测量范围是-55℃到125℃。
温度值的分辨率可以被用户设定为9-12位,可以设置上下限报警温度,当温度不在设定的范围内时,就会启动报警程序报警。
本设计的显示模块是用四位一体的数码管动态扫描显示实现的。
在显示实时测量温度的模式下还可以通过查询按键查看设定的上下限报警温度。
关键词:单片机、数字温度计、DS18B20、AT89S52目录1 概述- 1 -1.1系统概述- 1 -2 系统总体方案及硬件设计- 2 -2.1 系统总体方案- 2 -2.1.1系统总体设计框图- 2 -2.1.2各模块简介- 2 -2.2 系统硬件设计- 5 -2.2.1 单片机电路设计- 5 -2.2.2 DS18B20温度传感器电路设计- 6 -2.2.3 显示电路设计- 6 -2.2.4 按键电路设计- 7 -2.2.5 报警电路设计- 8 -3 软件设计- 9 -3.1 DS18B20程序设计- 9 -3.1.1 DS18B20传感器操作流程- 9 -3.1.2 DS18B20传感器的指令表- 9 -3.1.3 DS18B20传感器的初始化时序- 10 -3.1.4 DS18B20传感器的读写时序- 10 -3.1.5 DS18B20获取温度程序流程图- 11 -3.2 显示程序设计- 12 -3.3 按键程序设计- 13 -4实物制作及调试- 14 -5电子综合设计体会- 15 -参考文献- 15 -附1 源程序代码- 17 -附2 系统原理图- 32 -1 概述1.1系统概述本系统所设计的数字温度计采用的是DS18B20数字温度传感器测温,DS18B20直接输出的就是数字信号,与传统的温度计相比,具有读数方便,测温范围广,测温准确,上下限报警功能。
课程设计题目DS18B20温度传感器的设计与制作学院计算机科学与信息工程学院专业测控技术与仪器班级一班学生姓名指导教师王子康李昔华2013 年12 月25 日DS18B20温度传感器的设计与制作一、选题背景温度是一种在生产、科研、生活中需要测量和控制的重要物理量,是国际单位制七个基本量之一。
其测量控制一般采用各式各样形态的温度传感器。
根据它们在讯号输出方式上的不同可以分为模拟温度传感器和数字温度传感器。
单片机技术的出现则是为现代工业测控领域带来了一次新的技术革命。
目前温度报警器的发展已经比较成熟了,它能帮助我们实现想要的温度控制,解决身边的很多问题。
二.设计任务和要求(1)设计一个采用DS18B20数字温度传感器的巡回检测报警仪,量程为0℃~60℃(也可以选择其它(2)具有连接10个以上检测通道的能力,采用至少4位LED显示,其中1位显示通道号,3位显示实时温度(保留1位小数)。
(3)能设定10个通道的报警温度(精确到±1℃),具备超温声光报警功能。
(4)设计必要的操作按键。
(5)拓展部分:具有RS232或RS485总线接口,能和PC机通信传送温度数据。
(6)安装、调试电路,采用水银温度计进行校对,记录测试数据,并对漂移、重复性、线性度等参数进行测试、分析。
(6)写出总结报告。
报告中应包括原理框图、参数曲线分析、操作方法、测控流程、实物照片等,调试过程中遇到的问题,改进方法和总结体会。
三.设计与分析本设计是一个基于单片机的温度测量电路,传统的温度检测系统采用热敏电阻等温度敏感元件,热敏电阻虽然成本低,但是需要后续信号处理、A/D转换处理等才能将温度转换成数字信号,不但电路复杂,可靠性和精度也相对较低,在应用中还需要解决引线误差补偿、干扰等问题,故传统方案不可取。
进而非常容易考虑到使用温度传感器,在单片机电路设计中,单片机除了可以测量电信号外,还可以用于温度、湿度等非电信号的测量,能独立工作的单片机温度检测、温度控制系统已经广泛的应用于很多领域。
数字温度传感器DS18B20控制接口设计摘要:DS18B20是一款经典的单总线数字温度传感器芯片,较传统的温度传感器具有结构简单、体积小、功耗小、抗干扰能力强、使用简单、可组网实现多点温度测量等优点。
本设计简要介绍了数字温度传感器DS18B20 的结构与性能,着重论述了用FPGA实现对此传感器的控制,并将测到的温度在LED数码管上显示出来。
关键词:DS18B20;温度传感器;FPGA;LED数码管Abstract:DS18B20 is a classic single-bus digital temperature sensor chip, the more traditional temperature sensor has a simple structure, small size, low power consumption, and anti-interference ability, easy to use networking to achieve multi-point temperature measurement. This design provides an overview of the structure and properties of a digital temperature sensor DS18B20, focuses on the control of this sensor using FPGA, and the measured temperature is displayed on the LED digital tube.Keywords: DS18B20; temperature sensor; FPGA; LED digital tube1 引言随着科技的发展 ,温度的实时显示系统应用越来越广泛 ,比如空调遥控器上当前室温的显示、热水器温度的显示等等。
实现温度的实时采集与显示系统有很多种解决方案 ,本文使用全数字温度传感器DS18B20来实现温度的实时采集FPGA作为控制中心与数据桥梁; LED数码管作为温度实时显示器件。
其中DS18B20作为FPGA的外部信号源,把所采集到的温度转换为数字信号,通过接口(113脚)传给FPGA,FPGA启动ROM内的控制程序驱动液晶模块,通过IO口和数据线把数据传送给LED数码管,将采集到的温度实时显示出来。
该设计结构简单、测温准确,成本低,工作稳定可靠,具有一定的实际应用价值。
2 DS18B20温度传感器介绍DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点如下:2.1 DS18B20的性能特点○1独特的单线接口仅需要一个端口引脚进行通信;○2多个DS18B20可以并联在惟一的三线上,实现多点组网功能;○3无须外部器件;○4可通过数据线供电,电压范围为3.0~5.5V;○5零待机功耗;○6温度以9或12位数字;○7用户可定义报警设置;○8报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;○9负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;2.2 DS18B20的内部结构图DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图2-1所示。
图2-1 DS18B20内部结构框图图2-2 DS18B20字节定义64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。
温度报警触发器TH和TL,可通过软件写入户报警上下限。
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。
高速暂存RAM的结构为8字节的存储器,结构如图2-2所示。
头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。
第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。
DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。
该字节各位的定义如图3-4所示。
低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分率。
2.3 DS18B20供电方式DS18B20有两种供电方式,一种是寄生电源强上拉供电方式,一种是外部供电方式,如下图:图2-3 寄生电源强上拉供电方式电路图在寄生电源供电方式下,DS18B20 从单线信号线上汲取能量:在信号线 DQ 处于高电平期间把能量储存在内部电容里,在信号线处于低电平期间消耗电容上的电能工作,直到高电平到来再给寄生电源(电容)充电。
为了使 DS18B20 在动态转换周期中获得足够的电流供应,当进行温度转换或拷贝到 E2 存储器操作时,用 MOSFET 把 I/O 线直接拉到 VCC 就可提供足够的电流,在发出任何涉及到拷贝到 E2 存储器或启动温度转换的指令后,必须在最多 10μS 内把 I/O 线转换到强上拉状态。
在强上拉方式下可以解决电流供应不走的问题,因此也适合于多点测温应用,缺点就是要多占用一根 I/O 口线进行强上拉切换。
图2-4 外部电源供电方式电路图在外部电源供电方式下,DS18B20 工作电源由 VDD 引脚接入,此时 I/O 线不需要强上拉,不存在电源电流不足的问题,可以保证转换精度,同时在总线上理论可以挂接任意多个 DS18B20 传感器,组成多点测温系统。
在外部供电的方式下,DS18B20的GND引脚不能悬空,否则不能转换温度,读取的温度总是 85℃。
3 设计需求○1温度测量范围:-55℃~+125℃○2可编程为9位~12位A/D转换精度○3测温分辨率可达0.0625℃○4 LED数码管直读显示4 设计方案4.1 硬件设计将[DF2C8]FPGA 核心板和[EB-F2]基础实验板连接在一起,同时使能DS18B20 模块和数码管模块:数码管使能:用“短路帽”将实验板上的JP4和JP5全部短接。
DS18B20 温度传感器使能跳线JP10 全部短接,元件安装示意如下图4-1和4-2(注意方向,半圆形的一边朝板子内部,平面朝外,和板上的图示一致)。
图 4-1:数码管使能图示图 4-2:温度传感器安装和使能图示4.2 程序设计DS18B20的工作遵循严格的单总线协议。
主机首先发一复位脉冲,使信号线上所有的DS18B20芯片都被复位,接着发送ROM操作命令,使序列号编码匹配的DS18B20被激活,准备接收下面的内存访问命令。
内存访问命令控制选中的DS18B 20的工作状态,完成整个温度转换、读取等工作(单总线在ROM命令发送之前存储命令和控制命令不起作用)。
在对DS18B20进行操作的整个过程中,主要包括三个关键过程:主机搜索 DS18B20序列号、启动在线DS18B20作温度转换、读取在线DS18B20温度值。
工作中系统对DS18B20的操作以ROM命令和存储器命令形式出现。
其中ROM操作命令均为8位长,命令代码分别为:读 ROM(33H)、匹配ROM(55H)、跳过ROM(C CH)、搜索ROM(FOH)和告警搜索(ECH)命令。
存储器操作命令为:写暂存存储器(4E H)、读暂存存储器(BEH)、复制暂存存储器(48H)、温度变换(44H)、重新调出EE RAM(BSH)和读电源供电方式(B4H)命令。
本设计通过FPGA上的核心芯片控制温度传感器进行温度到电量到数字量的转换,并通过数码管显示接口显示出来,其中最主要的温度传感器的控制模块的Verilog HDL 代码见附件DS18B20_CTL.v。
5 设计说明LED_CTL.v 是数码管显示功能模块,DS18B20_CTL.v 是温度传感器的控制模块,TEMP.v为顶层模块,实例化了前面两个模块,并将采集的温度值送至数码管迚行显示。
6 仿真测试结果下载配置文件后,可在数码管上观察到带一位小数的温度数值。
如果用手捏住传感器,会収现显示的温度在升高。
如下图:图6-1 测温效果图示参考文献:[1] 沙占友集成传感器的应用[M]. 中国电力出版社.[2] 罗钧,童景琳. 智能传感器数据采集与信号处理[M]. 化学工业出版社[3] 周月霞,孙传友. DS18B20硬件连接及软件编程[J]. 传感器世界,2001,12.[4] 王晓娟,张海燕,梁延兴.基于DS18B20的温度实时采集与显示系统的设计与实现[J]. ,2007:38-41.[5] 党峰, 王敬农, 高国旺. 基于DS18B20 的数字式温度计的实现[ J] . 山西电子技术, 2007( 3)[6] 金伟正. 单线数字温度传感器的原理与应用[ J] . 仪表技术与传感器, 2000( 7) : 42- 43.附件:DS18B20_CTL.v:`define UD #1`define ALL_CLEAR_T 16'h0 //0 at start, set to 0`define INIT_SETZ_T 16'h61A8 //500us @ 50MHz`define INIT_SAMP_T 16'h7148 //580us @ 50MHz`define INIT_END_T 16'hC350 //1ms @ 50MHz`define WR_SETVAL_T 16'hFA //5us @ 50MHz`define WR_SETZ_T 16'hEA6 //75us @ 50MHz`define WR_END_T 16'hFA0 //80us @ 50MHz`define RD_SETZ_T 16'h64 //2us @ 50MHz`define RD_SAMP_T 16'h28A //13us @ 50MHz`define RD_END_T 16'hFA0 //80us @ 50MHz`define BIT_DELAY 16'hDAC //70us @ 50MHz`define BYTE_DELAY 16'h618A //500us @ 50MHzmodule DS18B20_CTL(//Global input ports.SYSCLK,RST_B,//TEMP ports.TEMP_IO,//Output ports.TEMP_D1,TEMP_D2,TEMP_D3,TEMP_D4,TEMP_D5,TEMP_D6,TEMP_D7,TEMP_D8,TEMP_D9);//=========================================================================== //Input and output declaration.//===========================================================================input SYSCLK;input RST_B;inout TEMP_IO;output [7:0] TEMP_D1;output [7:0] TEMP_D2;output [7:0] TEMP_D3;output [7:0] TEMP_D4;output [7:0] TEMP_D5;output [7:0] TEMP_D6;output [7:0] TEMP_D7;output [7:0] TEMP_D8;output [7:0] TEMP_D9;//=========================================================================== //Wire and reg declaration.//===========================================================================wire SYSCLK;wire RST_B;wire TEMP_IO;reg [7:0] TEMP_D1;reg [7:0] TEMP_D2;reg [7:0] TEMP_D3;reg [7:0] TEMP_D4;reg [7:0] TEMP_D5;reg [7:0] TEMP_D6;reg [7:0] TEMP_D7;reg [7:0] TEMP_D8;reg [7:0] TEMP_D9;//=========================================================================== //Wire and reg in the module.//===========================================================================//Used for bit control.reg [3:0] BIT_CS;reg [3:0] BIT_NS;parameter BIT_IDLE = 4'h0;parameter BIT_INIT = 4'h1;parameter BIT_READ = 4'h2;parameter BIT_WRITE = 4'h3;parameter BIT_DELAY = 4'h4;parameter BIT_END = 4'h5;reg [15:0] TIME_CNT;reg [15:0] TIME_CNT_N;reg [1:0] TEMP_IOREG;reg [1:0] TEMP_IOREG_N;reg TEMP_IO_FLAG;parameter SET0 = 2'h0;parameter SET1 = 2'h1;parameter SETZ = 2'h2;parameter NSET = 2'h3;wire CMD_INIT;wire CMD_READ;wire CMD_WRITE;//Used for byte control.parameter BYTE_IDLE = 4'h0;parameter BYTE_INIT = 4'h1;parameter BYTE_READ = 4'h2;parameter BYTE_WRITE = 4'h3;parameter BYTE_DELAY = 4'h4;parameter BYTE_END = 4'h5;reg [3:0] BYTE_CS;reg [3:0] BYTE_NS;reg [2:0] CTL_FLAG;reg [2:0] CTL_FLAG_N;reg [3:0] BIT_CNT;reg [3:0] BIT_CNT_N;reg [7:0] SHIFT_REG_IO;reg [7:0] SHIFT_REG_IO_N;//Used for flow control.parameter FLOW_IDLE = 4'h0;parameter FLOW_INIT = 4'h1;parameter FLOW_START = 4'h2;parameter FLOW_POLL = 4'h3;parameter FLAG_IDLE = 3'h0;parameter FLAG_INIT = 3'h1;parameter FLAG_READ = 3'h2;parameter FLAG_WRITE = 3'h3;parameter FLAG_DELAY = 3'h4;reg [3:0] FLOW_CS;reg [3:0] FLOW_NS;reg [4:0] BYTE_CNT;reg [4:0] BYTE_CNT_N;reg [7:0] TEMP_DI;reg [7:0] TEMP_D1_N;reg [7:0] TEMP_D2_N;reg [7:0] TEMP_D3_N;reg [7:0] TEMP_D4_N;reg [7:0] TEMP_D5_N;reg [7:0] TEMP_D6_N;reg [7:0] TEMP_D7_N;reg [7:0] TEMP_D8_N;reg [7:0] TEMP_D9_N;//=========================================================================== //Bit Control Logic.//=========================================================================== //----------------------------------------------------------------------------//Some control single of Bit control logic.//----------------------------------------------------------------------------//Command of input by outside.assign CMD_INIT = (BYTE_CS == BYTE_INIT);assign CMD_READ = (BYTE_CS == BYTE_READ);assign CMD_WRITE = (BYTE_CS == BYTE_WRITE);//TIME_CNT, time count for timing of TEMP.always @ (posedge SYSCLK or negedge RST_B)beginif(!RST_B)TIME_CNT <= `UD 16'h0;elseTIME_CNT <= `UD TIME_CNT_N;endalways @ (*)beginif((BIT_CS != BIT_NS) || (BYTE_CS != BYTE_NS))TIME_CNT_N = 16'h0;elseTIME_CNT_N = TIME_CNT + 16'h1;end//---------------------------------------------------------------------------- //State machine of Bit control logic.//----------------------------------------------------------------------------//Bit control state machine.always @ (posedge SYSCLK or negedge RST_B)beginif(!RST_B)BIT_CS <= `UD BIT_IDLE;elseBIT_CS <= `UD BIT_NS;endalways @ (*)begincase(BIT_CS)BIT_IDLE : if(CMD_INIT)BIT_NS = BIT_INIT;else if(CMD_READ)BIT_NS = BIT_READ;else if(CMD_WRITE)BIT_NS = BIT_WRITE;elseBIT_NS = BIT_CS;BIT_INIT : if(TIME_CNT == `INIT_END_T)BIT_NS = BIT_DELAY;elseBIT_NS = BIT_CS;BIT_READ: if(TIME_CNT == `RD_END_T)BIT_NS = BIT_DELAY;elseBIT_NS = BIT_CS;BIT_WRITE : if(TIME_CNT == `WR_END_T)BIT_NS = BIT_DELAY;elseBIT_NS = BIT_CS;BIT_DELAY : if(TIME_CNT == `BIT_DELAY)BIT_NS = BIT_END;elseBIT_NS = BIT_CS;BIT_END : BIT_NS = BIT_IDLE;default : BIT_NS = BIT_IDLE;endcaseend//---------------------------------------------------------------------------//18B20 output bit control.//---------------------------------------------------------------------------//TEMP_IO, this is a tri-state io connect to 18B20.//But it need a register for save the current time, otherwise latch. //First, Register is 2bit , 2'h0 for 0 , 2'h1 for 1, 2'h2 for z.always @ (posedge SYSCLK or negedge RST_B)beginif(!RST_B)TEMP_IOREG <= `UD SETZ;elseTEMP_IOREG <= `UD TEMP_IOREG_N;always @ (*)begincase(BIT_CS)BIT_IDLE : TEMP_IOREG_N = SETZ;BIT_INIT : if(TIME_CNT == `ALL_CLEAR_T)TEMP_IOREG_N = SET0;else if(TIME_CNT == `INIT_SETZ_T)TEMP_IOREG_N = SETZ;elseTEMP_IOREG_N = TEMP_IOREG;BIT_READ: if(TIME_CNT == `ALL_CLEAR_T)TEMP_IOREG_N = SET0;else if(TIME_CNT == `RD_SETZ_T)TEMP_IOREG_N = SETZ;elseTEMP_IOREG_N = TEMP_IOREG;BIT_WRITE : if(TIME_CNT == `ALL_CLEAR_T)TEMP_IOREG_N = SET0;else if(TIME_CNT == `WR_SETVAL_T)TEMP_IOREG_N = NSET;else if(TIME_CNT == `WR_SETZ_T)TEMP_IOREG_N = SETZ;elseTEMP_IOREG_N = TEMP_IOREG;default : TEMP_IOREG_N = TEMP_IOREG; endcaseend//Second, set the value of 18B20_I0.always @ (*)begincase(TEMP_IOREG)SET0 :TEMP_IO_FLAG = 1'h0;SET1 :TEMP_IO_FLAG = 1'h1;SETZ :TEMP_IO_FLAG = 1'hz;NSET : TEMP_IO_FLAG = SHIFT_REG_IO[0];default : TEMP_IO_FLAG = 1'hz;endcaseassign TEMP_IO = (TEMP_IOREG == SETZ) ? 1'hz : TEMP_IO_FLAG;//Bit control, count when every bit end.always @ (posedge SYSCLK or negedge RST_B)beginif(!RST_B)BIT_CNT <= `UD 4'h0;elseBIT_CNT <= `UD BIT_CNT_N;endalways @ (*)beginif(BYTE_CS == BYTE_IDLE)BIT_CNT_N = 4'h0;else if(BIT_CS == BIT_END)BIT_CNT_N = BIT_CNT + 4'h1;elseBIT_CNT_N = BIT_CNT;end//Shift reg for read/write the TEMP.always @ (posedge SYSCLK or negedge RST_B)beginif(!RST_B)SHIFT_REG_IO <= `UD 8'h0;elseSHIFT_REG_IO <= `UD SHIFT_REG_IO_N;endalways @ (*)beginif((BYTE_CS == BYTE_IDLE) && (BYTE_NS == BYTE_READ))SHIFT_REG_IO_N = 8'h0;else if((BYTE_CS == BYTE_READ) && (BIT_CS == BIT_READ) && (TIME_CNT == `RD_SAMP_T)) SHIFT_REG_IO_N = {TEMP_IO /*1'h1*/ , SHIFT_REG_IO[7:1]};else if((BYTE_CS == BYTE_IDLE) && (BYTE_NS == BYTE_WRITE))SHIFT_REG_IO_N = TEMP_DI;else if((BYTE_CS == BYTE_WRITE) && (BIT_CS == BIT_END))SHIFT_REG_IO_N = {1'h0,SHIFT_REG_IO[7:1]};elseSHIFT_REG_IO_N = SHIFT_REG_IO;end//---------------------------------------------------------------------------//Byte control state machine.//---------------------------------------------------------------------------//State machine.always @ (posedge SYSCLK or negedge RST_B)beginif(!RST_B)BYTE_CS <= `UD BYTE_IDLE;elseBYTE_CS <= `UD BYTE_NS;endalways @ (*)begincase(BYTE_CS)BYTE_IDLE : if(CTL_FLAG == FLAG_INIT)BYTE_NS = BYTE_INIT;else if(CTL_FLAG == FLAG_READ)BYTE_NS = BYTE_READ;else if(CTL_FLAG == FLAG_WRITE)BYTE_NS = BYTE_WRITE;else if(CTL_FLAG == FLAG_DELAY)BYTE_NS = BYTE_DELAY;elseBYTE_NS = BYTE_CS;BYTE_INIT : if(BIT_CS == BIT_END)BYTE_NS = BYTE_END;elseBYTE_NS = BYTE_CS;BYTE_READ : if((BIT_CNT == 4'h7) && (BIT_CS == BIT_END))BYTE_NS = BYTE_DELAY;elseBYTE_NS = BYTE_CS;BYTE_WRITE : if((BIT_CNT == 4'h7) && (BIT_CS == BIT_END))BYTE_NS = BYTE_END;elseBYTE_NS = BYTE_CS;BYTE_DELAY : if(TIME_CNT == `BYTE_DELAY)BYTE_NS = BYTE_END;elseBYTE_NS = BYTE_CS;BYTE_END : BYTE_NS = BYTE_IDLE;default : BYTE_NS = BYTE_IDLE;endcaseend//============================================================================ //Flow control.//============================================================================//----------------------------------------------------------------------------//Some control single for flow control.//----------------------------------------------------------------------------//Byte count, count when every byte end.always @ (posedge SYSCLK or negedge RST_B)beginif(!RST_B)BYTE_CNT <= `UD 5'h0;elseBYTE_CNT <= `UD BYTE_CNT_N;endalways @ (*)beginif(FLOW_CS != FLOW_NS)BYTE_CNT_N = 5'h0;else if(BYTE_CS == BYTE_END)BYTE_CNT_N = BYTE_CNT + 5'h1;elseBYTE_CNT_N = BYTE_CNT;end//---------------------------------------------------------------------------//Flow control state machine.//---------------------------------------------------------------------------//State machine.always @ (posedge SYSCLK or negedge RST_B)beginif(!RST_B)FLOW_CS <= `UD FLOW_IDLE;elseFLOW_CS <= `UD FLOW_NS;endalways @ (*)begincase(FLOW_CS)FLOW_IDLE : FLOW_NS = FLOW_INIT;FLOW_INIT : if((BYTE_CNT == 5'hC) && (BYTE_CS == BYTE_IDLE))FLOW_NS = FLOW_START;elseFLOW_NS = FLOW_CS;FLOW_START : if((BYTE_CNT == 5'h9) && (BYTE_CS == BYTE_IDLE))FLOW_NS = FLOW_POLL;elseFLOW_NS = FLOW_CS;FLOW_POLL : if((BYTE_CNT == 5'h12) && (BYTE_CS == BYTE_IDLE))FLOW_NS = FLOW_INIT;elseFLOW_NS = FLOW_CS;default : FLOW_NS = FLOW_IDLE;endcaseend//---------------------------------------------------------------------------//State control output, only delay/read/write/init for states.//---------------------------------------------------------------------------//parameter FLAG_IDLE = 3'h0;//parameter FLAG_INIT = 3'h1;//parameter FLAG_READ = 3'h2;//parameter FLAG_WRITE = 3'h3;//parameter FLAG_DELAY = 3'h4;always @ (*)begincase(FLOW_CS)FLOW_INIT : begincase(BYTE_CNT)5'h0 : CTL_FLAG = FLAG_INIT;5'h1 : CTL_FLAG = FLAG_WRITE;5'h2 : CTL_FLAG = FLAG_WRITE;5'h3 : CTL_FLAG = FLAG_WRITE;5'h4 : CTL_FLAG = FLAG_WRITE;5'h5 : CTL_FLAG = FLAG_WRITE;5'h6 : CTL_FLAG = FLAG_INIT;5'h7 : CTL_FLAG = FLAG_WRITE;5'h8 : CTL_FLAG = FLAG_WRITE;5'h9 : CTL_FLAG = FLAG_INIT;5'hA : CTL_FLAG = FLAG_WRITE;5'hB : CTL_FLAG = FLAG_WRITE;default: CTL_FLAG = FLAG_IDLE;endcaseendFLOW_START : begincase(BYTE_CNT)5'h0 : CTL_FLAG = FLAG_INIT;5'h1 : CTL_FLAG = FLAG_WRITE;5'h2 : CTL_FLAG = FLAG_DELAY;5'h3 : CTL_FLAG = FLAG_WRITE;5'h4 : CTL_FLAG = FLAG_INIT;5'h5 : CTL_FLAG = FLAG_WRITE;5'h6 : CTL_FLAG = FLAG_DELAY;5'h7 : CTL_FLAG = FLAG_WRITE;5'h8 : CTL_FLAG = FLAG_DELAY;default: CTL_FLAG = FLAG_IDLE;endcaseendFLOW_POLL : if(!BYTE_CNT[0])CTL_FLAG = FLAG_READ;elseCTL_FLAG = FLAG_DELAY;default : CTL_FLAG = FLAG_IDLE;endcaseend//---------------------------------------------------------------------------//Date output to controller.//---------------------------------------------------------------------------always @ (*)begincase(FLOW_CS)FLOW_INIT : begincase(BYTE_CNT)5'h1 : TEMP_DI = 8'hCC;5'h2 : TEMP_DI = 8'h4E;5'h3 : TEMP_DI = 8'h19;5'h4 : TEMP_DI = 8'h1A;5'h5 : TEMP_DI = 8'h1F;5'h7 : TEMP_DI = 8'hCC;5'h8 : TEMP_DI = 8'h48;5'hA : TEMP_DI = 8'hCC;5'hB : TEMP_DI = 8'hB8;default: TEMP_DI = 8'h0;endcaseendFLOW_START : begincase(BYTE_CNT)5'h1 : TEMP_DI = 8'hCC;5'h3 : TEMP_DI = 8'h44;5'h5 : TEMP_DI = 8'hCC;5'h7 : TEMP_DI = 8'hBE;default: TEMP_DI = 8'h0;endcaseenddefault : TEMP_DI = 8'h0;endcaseend//=========================================================================== //Output control, 9 data in the 18B20//===========================================================================//Ram data 1, TEMP_D1.always @ (posedge SYSCLK or negedge RST_B)beginif(!RST_B)TEMP_D1 <= `UD 8'h0;elseTEMP_D1 <= `UD TEMP_D1_N;endalways @ (*)beginif((FLOW_CS == FLOW_POLL) && (BYTE_CNT == 5'h1) && (BYTE_CS == BYTE_IDLE)) TEMP_D1_N = SHIFT_REG_IO;elseTEMP_D1_N = TEMP_D1;end//Ram data 2, TEMP_D2.always @ (posedge SYSCLK or negedge RST_B)beginif(!RST_B)TEMP_D2 <= `UD 8'h0;elseTEMP_D2 <= `UD TEMP_D2_N;endalways @ (*)beginif((FLOW_CS == FLOW_POLL) && (BYTE_CNT == 5'h3) && (BYTE_CS == BYTE_IDLE)) TEMP_D2_N = SHIFT_REG_IO;elseTEMP_D2_N = TEMP_D2;end//Ram data 3, TEMP_D3.always @ (posedge SYSCLK or negedge RST_B)beginif(!RST_B)TEMP_D3 <= `UD 8'h0;elseTEMP_D3 <= `UD TEMP_D3_N;endalways @ (*)beginif((FLOW_CS == FLOW_POLL) && (BYTE_CNT == 5'h5) && (BYTE_CS == BYTE_IDLE)) TEMP_D3_N = SHIFT_REG_IO;elseTEMP_D3_N = TEMP_D3;end//Ram data 4, TEMP_D4.always @ (posedge SYSCLK or negedge RST_B)beginif(!RST_B)TEMP_D4 <= `UD 8'h0;elseTEMP_D4 <= `UD TEMP_D4_N;endalways @ (*)beginif((FLOW_CS == FLOW_POLL) && (BYTE_CNT == 5'h7) && (BYTE_CS == BYTE_IDLE)) TEMP_D4_N = SHIFT_REG_IO;elseTEMP_D4_N = TEMP_D4;end//Ram data 5, TEMP_D5.always @ (posedge SYSCLK or negedge RST_B)beginif(!RST_B)TEMP_D5 <= `UD 8'h0;elseTEMP_D5 <= `UD TEMP_D5_N;endalways @ (*)beginif((FLOW_CS == FLOW_POLL) && (BYTE_CNT == 5'h9) && (BYTE_CS == BYTE_IDLE)) TEMP_D5_N = SHIFT_REG_IO;elseTEMP_D5_N = TEMP_D5;end//Ram data 6, TEMP_D6.always @ (posedge SYSCLK or negedge RST_B)beginif(!RST_B)TEMP_D6 <= `UD 8'h0;elseTEMP_D6 <= `UD TEMP_D6_N;endalways @ (*)beginif((FLOW_CS == FLOW_POLL) && (BYTE_CNT == 5'hB) && (BYTE_CS == BYTE_IDLE)) TEMP_D6_N = SHIFT_REG_IO;elseTEMP_D6_N = TEMP_D6;end//Ram data 7, TEMP_D7.always @ (posedge SYSCLK or negedge RST_B)beginif(!RST_B)TEMP_D7 <= `UD 8'h0;elseTEMP_D7 <= `UD TEMP_D7_N;endalways @ (*)beginif((FLOW_CS == FLOW_POLL) && (BYTE_CNT == 5'hD) && (BYTE_CS == BYTE_IDLE)) TEMP_D7_N = SHIFT_REG_IO;elseTEMP_D7_N = TEMP_D7;end//Ram data 8, TEMP_D8.always @ (posedge SYSCLK or negedge RST_B)beginif(!RST_B)TEMP_D8 <= `UD 8'h0;elseTEMP_D8 <= `UD TEMP_D8_N;endalways @ (*)beginif((FLOW_CS == FLOW_POLL) && (BYTE_CNT == 5'hF) && (BYTE_CS == BYTE_IDLE)) TEMP_D8_N = SHIFT_REG_IO;elseTEMP_D8_N = TEMP_D8;end//Ram data 9, TEMP_D9.always @ (posedge SYSCLK or negedge RST_B)beginif(!RST_B)TEMP_D9 <= `UD 8'h0;elseTEMP_D9 <= `UD TEMP_D9_N;endalways @ (*)beginif((FLOW_CS == FLOW_POLL) && (BYTE_CNT == 5'h11) && (BYTE_CS == BYTE_IDLE)) TEMP_D9_N = SHIFT_REG_IO;elseTEMP_D9_N = TEMP_D9;endendmodule。