《1—Wire数字温度的测量及LCD显示,课程设计论文.doc》由会员分享,可在线阅读,更多相关《1—Wire数字温度的测量及LCD显示,课程设计论文.doc(26页珍藏版)》请在课桌文档上搜索。
1、1Wire数字温度的测量及LCD显示目录1、引言. 22、方案设计及工作原理 . 2 2.1 方案设计及论证 . 2 2.2 工作原理 . 3 2.2.1DS18B20工作原理. 3 2.2.2 LCD工作原理 . 53、各功能模块设计和仿真. 8 3.1 DS18B20温度传感器电路 . 8 3.2时钟及显示控制电路. 113.3LCD显示的实现电路. 124、结果分析和调试. 135、体会. 146、参考文献. 147、附录. 15 7.1仿真图. 15 7.2实物图. 16 7.3 DS18B20控制程序及LED数码管显示程序代码. 16 7.4时钟控制程序. 21 7.5 LCD显示驱
2、动程序 . 23 11Wire数字温度的测量及LCD显示摘要:根据我们所学过的电子技术、EDA术、电子测量和计算机技术等知识设计具有一定功能和规模的数字信号处理、电子设备系统项目。完成该项目的方案设计、硬件电路设计、应用软件系统设计及系统调试。主要是利用EDA/SOPC实验开发工具,设计DS18B20测量LCD显示和其它控制系统,并进行演示。关键词:EDA,温度传感器,ds18b20,时序,lcd1602一、引言:随着人们生活水平的不断提高, EDA技术无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、
3、生活、提供更好的更方便的设施就需要从EDA技术入手,一切向着数字化控制,智能化控制方向发展。本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,该设计控制器使用EDA技术,测温传感器使用DS18B20,用LCD实现温度显示,能准确达到以上要求。 随着时代的进步和发展,EDA技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,本文将介绍一种基于EDA技术的数字温度计,本温度计属于多功能温度计,可以设置上下报警温度,当温度不在设置范围内时,可以报警。二、方案设计及工作原理:1、方案设计论证: 方案一:用温度传感器测量温度,使
4、用51单片机作为主芯片控制及显示。在电路设计中,温度测量大多都是使用传感器,所以这是非常容易想到的,可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,使用89C51单片机处理传输的信号进行控制及显示,就可以满足设计要求。方案二: 基于FPGA温度测量及显示,使用EP1C12实验开发板以实现所要求的温度测量及显示功能。EP1C12实验开发板,其EDA开发平台上自带DS18B20温度传感器和LCD1602显示和LED数码管显示,使用QuartusII软件和VHDL语言编程即可实现设计所要求功能。从以上两种方案,很容易看出,采用方案二,电路在开发板上实现比较简单
5、,软件设计也比较简单,故采用了方案二。2、工作原理:1、DS18B20工作原理DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现912位的数字值读数方式。 TO92封装的DS18B20的引脚排列见下图,其引脚功能描述见表1。 (底视图) 图1 DS18B20表1DS18B20详细引脚功能描述序号名称引脚功能描述1GND地信号2DQ数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源。3VDD可选择的VDD引脚。当工作于寄生电源时,此引脚必
6、须接地。DS18B20采用3脚PR35封装或8脚SOIC封装,其内部结构框图如图2所示。 I/OC64 位ROM和单线接口高速缓存存储器与控制逻辑温度传感器高温触发器TH低温触发器TL配置寄存器8位CRC发生器Vdd 图2 DS18B20内部结构64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。温度报警触发器和,可通过软件写入户报警上下限。DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为8字节的存储器,
7、结构如图3所示。头2个字节包含测得的温度信息,第3和第4字节和的拷贝,是易失的,每次上电复位时被刷新。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图3所示。低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。图3 DS18B20字节定义由表1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。因此,在实际应用中要将分辨率和转换时间权
8、衡考虑。表1 DS18B20温度转换时间表 高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625LSB形式表示。当符号位0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表2是一部分温度值对应的二进制
9、温度数据。DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。若TH或TTL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。因此,可用多只DS18B20同时测量温度并进行报警搜索。在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。主机ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计
10、数器2的脉冲输入。器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将55所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在55所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。其输出
11、用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作按协议进行。操作协议为:初使化DS18B20(发复位脉冲)发ROM功能命令发存储器操作命令处理数据。2、LCD工作原理LCD 显示模块是一种既简便又省电的方法。文字型 LCD 显示模块已被广泛的应用于事务机、电子仪表及相关高级产品上。常见文字型LCD 模块有16字x1行、16字x2行、20字x1行、20字x2行、20字x4行等多种规格可供选择。 EDA开发平台配置了文字型 LCD
12、模块,其内部是由 LCD 显示器、LCD 驱动器、LCD 控制器三部份所组成如图4所示 。目前市售 LCD 模块其控制方法均相同,LCD 模块内部所使用的LCD控制器均与HITACHI的HD44780兼容,此背光 LCD 模块具有16根脚位 ( 不含背光 )。不同厂牌的模块模块亦可互换,其应用方式亦均相同。具体的参数请参照此液晶的数据手册。 LCD文字型模块,每个字符可显示 5 * 7 或 5 * 10点字图形,包含标准之 ASCII 码 ( 含大小写英文字母、阿拉伯数字及特殊符号等 )。 图4 文字型LCD模块的结构图控制器驱动器显示器一、LCD 控制指令及功能:1. 清除显示( Clear
13、 Display ): 将ASCII码20H填入DDRAM,并设定地址计数AC=0,由标将回至地址00H。RS RW DB7 DB6DB5DB4DB3DB2DB1DB0 0 0 0 0 0 0 0 0 0 1 2. 游标归位( Returm Home ): 设定由标地址回归至00h,但不清除DDRAM的内容。AC设为0。RS RW DB7 DB6DB5DB4DB3DB2DB1DB0 0 0 0 0 0 0 0 0 1 * 3. 进入模式( Entry Mode ): 设定输入一个字符后,光标予显示字符的位移方向。 I/D=0,游标向左移,AC减1; I/D=1,游标向右移,AC加1; SH=0
14、,显示字符不移动; SH=1,I/D=0,显示字符向左移; SH=1,I/D=1,显示字符向右移;RS RW DB7 DB6 DB5DB4DB3DB2DB1DB00 0 0 0 0 0 0 1 I/D SH 4. 显示开关控制( Display on/off Control ) 设定显示器、光标及是否闪烁光标控制D=0,显示器关闭;D=1,显示器开启C=0,光标不显示;D=1,光标显示B=0,游标不闪烁;D=1,游标闪烁RS RW DB7 DB6 DB5DB4DB3DB2DB1DB00 0 0 0 0 0 1 D C B 5. 光标及显示器移动( Cursor or Display Shift
15、 ) 设定光标或显示器移动方向(DDRAM内容不变) S/C=0,字符不移动; R/L=0,游标向左移; R/L=1,游标向右移; S/C=1,R/L=0,字符及光标向左移;S/C=1,R/L=1,字符及光标向右移RS RW DB7 DB6 DB5DB4DB3DB2DB1DB00 0 0 0 0 1 S/C R/L * * 6. 功能设定( Function Set ) 设定接口位长度(DL)、显示列数(N)与显示字符类型(F)功能。DL=0,接口位长度8位;DL=1,接口位长度4位; N=0,只显示一列字符;N=1,可显示两列字符; F=0,显示5x8字型;F=1,显示5x11字型;RS R
16、W DB7 DB6DB5DB4DB3DB2DB1DB0 0 0 0 0 1 DL N F * * 7. 设定CGRAM地址( Set CGRAM Address ) 设定CGRAM的地址计数器ACRS RW DB7 DB6DB5DB4DB3DB2DB1DB0 0 0 0 1 AC5AC4AC3AC2AC1AC0 8. 设定DDRAM地址( Set DDRAM Address ) 设定DDRAM的地址计数器ACRS RW DB7 DB6DB5DB4DB3DB2DB1DB0 0 0 1 AC6AC5AC4AC3AC2AC1AC0 9. 读取忙碌旗号及地址( Read Busy and Addres
17、s ) 设定从CGRAM或DDRAM地址读取忙碌旗号(BF,Busy Flag)及地址计数器AC的数据。RS RW DB7 DB6DB5DB4DB3DB2DB1DB0 0 1 BF AC6AC5AC4AC3AC2AC1AC0 10.内存数据写入( Write Data to RAM ) 将D0-D7的数据写入CGRAM或DDRAM内部。(依前一笔写入地址而定)RS RW DB7 DB6DB5DB4DB3DB2DB1DB0 1 0 Data 二、LCD时序LCD显示同样对时序要求严格,其时序主要分为读时序和写时序如下图。1、LCD写时序2、LCD读时序三、各功能模块设计和仿真:1、DS18B20
18、温度传感器电路DS18B20可以采用两种方式供电,在这采用电源供电方式,DS18B20的1脚接地,2脚作为信号线,3脚接电源。当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。采用寄生电源供电方式时VDD端接地。由于单线制只有一根线,因此发送接口必须是三态的。由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输
19、都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。DS18B20模块生成如图5。 图5 DS18B20功能模块在该模块中inclk为时钟输入端,DQ为ds18b20的数据总线的输入端,sel3.0为数码管位选输出端,seg7.0为数码管段选输出,templlreture10.0为当前温度的输出端,baojing为报警信号的输出端。2、DS18B20的复位时序 3、DS18B20的读时序对于DS18B20的读时序分为读0时序和读1时序两个过程。对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释
20、放单总线,以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60us才能完成。4、DS18B20的写时序对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。5、温度转换命令子程序 温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完
21、成。温度转换命令子程序流程图如上图,图9所示,具体程序见附录。 开始温度零下?温度值取补码置“”标志计算小数位温度BCD值 计算整数位温度BCD值 结束置“+”标志NY发DS18B20复位命令发跳过ROM命令发温度转换开始命令 结束图9 温度转换流程图 图10计算温度流程图6、计算温度子程序计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图10所示。 2、时钟及显示控制电路 多功能数字钟应该具有的功能有:显示时分秒、整点报时、小时和分钟可调等基本功能。首先要知道钟表的工作机理,整个钟表的工作应该是在1Hz信号的作用下进行,这样每来一个时钟信号,秒增加
22、1秒,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转到00分时,小时增加1小时,但是需要注意的是,小时的范围是从023时。在实验中为了显示的方便,由于分钟和秒钟显示的范围都是从059,所以可以用一个3位的二进制码显示十位,用一个四位的二进制码(BCD码)显示个位,对于小时因为它的范围是从023,所以可以用一个2位的二进制码显示十位,用4位二进制码(BCD码)显示个位。开发板提供50Mhz的时钟频率,而时钟需要的是1Hz时钟信号,因此为了得到准确的1Hz信号,必须对输入的系统时钟进行分频。其封装见附件总电路图的shizhong模块。3、LCD显示的实现电路1、LCD显示电路组成
23、LCD显示包括时钟分频(图6)、和LCD控制(图7)模块。其中时钟分频顾名思义是对整个LCD显示提供频率脉冲,计数器对LCD控制器控制,LCD控制模块实现对LCD的初始化,指令写入及内容的编码显示。 LCD显示控制模块,其中M5.0为计数器位数输入端,clk1为时钟输入端,s110.0为温度数据输入端,h13.0和h103.0分别为时钟的小时的个位和十位输入端,m13.0和m103.0分别为时钟的分的个位和十位输入端,se13.0和se103.0分别为时钟的秒的个位和十位输入端,D0D7为输出端作为8位二进制码传输给LCD,rs为LCD的数据或命令的选择端。2、LCD程序设计流程图如图8部分命
24、令设置程序(具体程序见附录LCD显示驱动程序)when 0 = Q =x01; RS Q =x38; RS Q =x06; RS Q =X0f; RS Q =x40; RS Q =xc0; RS Q =x80; RS Q =x0c; RS Q =xA0; RS=1;开始显示控制显示开关输入方式清屏设置CGRAM地址并自定义符号编码设置DDRAM地址输入数据是否需要移动是否显示第二行移动操作否否否是是 图8 程序流程图四、结果分析及调试:本次课程设计在达到设计基本功能的同时,还加入了其他多项辅助功能,使设计项目更加人性化、更加完善。主要功能有DS18B20温度读取LED数码管显示、LCD1602
25、温度显示、LCD1602当前时间显示和时间调接以及温度设定报警等功能。在整个设计调试过程中,也出现了一些错误和难关,但经过小组的探讨,查阅相关资料以及询问指导老师等方法,最终还是逐步的解决了所遇到的问题。在下面列举几个主要的问题。首先遇到的第一个问题就是LED数码管的编码转换上出现了错误。在DS18B20中传输出来的温度数据是两字节的二进制数据,在将温度数值转换成驱动LED显示的八位二进制数时,没有注意开发板上的数码管是共阴极还是共阳极,显示出错。编码取反后恢复正常。第二是LCD显示时显示乱码,在编程时开始是在LCD驱动外部编码然后传输进入LCD驱动,驱动内部直接读取编好后传输过来的两位十六进
26、制数,但LCD显示出错,显示为乱码,出错原因可能是编码传输和显示时间不够等等。最后将编码转换程序放入LCD显示驱动中,将DS18B20读取的两字节数据,直接传输入驱动中再进行码字转换成LCD显示所需的数码。在设计中还有很多小问题,比如说计数器位数不够,LCD显示出现延迟等等。总体来说,所遇到的问题都得到了有效地解决,有的是原有基础上找出错误修改,有的是换一种方法实现,解决问题实现目标方法多种多样,但只要目的达到都是一种成功。五、体会:经过为期三周的时间的课程设计,掌握了电子技术、EDA技术、电子测量和计算机接口等综合性应用技术;熟悉控制系统、嵌入式系统和可编程片上系统的设计方法;能设计出具有一
27、定功能和规模的电子应用电路。对以后相关工作的设计有了一定的帮助。六、参考文献:1 EDA技术 郭勇 高等教育出版社 2004-07出版2 何宾 EDA原理及应用 清华大学出版社 2009-06出版3 赵刚 EDA技术简明教程 四川大学出版社 2004-07出版4 江国强 EDA技术与应用(第3版) 电子工业出版社 2010-04出版5 周立功 EDA实验与实践 北京航空航天大学出版社 2007-09出版6 郭振武、丛红侠 EDA实验教程 南开大学出版社 2011-08出版7 潘松、 黄继EDA技术与VHDL(第3版) 清华大学出版社 2009-09出版8 罗力凡、 常春藤 基于VHDL的FPG
28、A开发快速入门技巧实例 人民邮电出版社 2009-05出版9 潘松、黄继业、 潘明 EDA技术实用教程:Verilog HDL版(第4版) 科学出版社 2010-07出版10 谭会生、 张昌凡 EDA技术及应用:Verilog HDL版(第3版) 西安电子科技大学出版社 2011-07出版11 周润景、 苏良碧 基于Quartus II的数字系统Verilog HDL设计实例详解 电子工业出版社 2010-05出版七、附录:1、模块电路图2、实物图3、程序清单1、DS18B20控制程序及LED数码管显示驱动程序代码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL
29、;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY BO ISPORT(DQ:inOUT STD_LOGIC; -DS18B20的单数据总线-DQ2:IN STD_LOGIC;inclk:in std_logic;-k1,k2,k3,k4,k5:in std_logic;-sel:out std_logic_vector(3 downto 0);-数码管位选seg:out std_logic_vector(7 downto 0);-数码管段选templlreture:out std_logic_vector(
30、10 downto 0); -当前温度baojing:out std_logic -报警信号);END;ARCHITECTURE bhv OF BO ISconstant ml1:std_logic_vector(15 downto 0):=0011001100100010; -命令1,即前一字节忽略读DS18B20的ROM 后一字节开始转换温度constant ml2:std_logic_vector(15 downto 0):=0011001101111101; -命令2,前一字节忽略读DS18B20的ROM 后一字节开始读暂存器signal templ1,templ2:std_logic
31、_vector(7 downto 0); -从DS18b20读出的两字节温度signal d,c,b,a:std_logic_vector(7 downto 0);-十进制数后的个位、小数点第一位、第二位对应的数码管的段数值signal var1,var2,var3,var4:integer;-分别对应将二进制数据转化为十进制数后的个位、小数点第一位、第二位signal current_templ:std_logic_vector(10 downto 0); -当前温度signal cur:std_logic_vector(7 downto 0); -当前温度signal ng:std_log
32、ic; -负数标志位signal clk:std_logic;signal count_48:std_logic_vector(4 downto 0);beginprocess(inclk)beginif rising_edge(inclk) thencount_48=count_48+1;if count_48=11000 thenclk=not clk;count_48sel=0001;segsel=0010;segsel=0011;segsel=0100;segsel=0000;end case;end if;if state=0 thenif init=1 then -若初始化完成,开
33、始写命令1count2:=count2+1;if count2=0000000001 then -将总线拉低DQ=0;elsif count2=0000001100 then -在15us内向总线写一比特数值DQ=ml1(i);elsif count2=0001011010 then -在写时序的15us60us内,DS18B20对总线采样,所以取90usDQ=1;elsif count2=1010110100 then -在大于1us之后,总线拉低,产生下一写时序-DQ=0;count2:=0000000000; -计数器归零i:=i-1; -写下1比特命令if i=-1 then -写完命
34、令,命令计数值归零,初始化标志归零,以产生下次初始化,状态转为1,即将写命令2i:=15;init:=0;state:=1;end if;end if;else -init=0时进行初始化count1:=count1+1;if count1=000000000001 then DQ=1;elsif count1=000000000011 then -拉低DQ=0;elsif count1=01010111100 then -初始化时要求,低电平至少保持480us,这里取500usDQ=1;elsif count1=01011011010 then -要求15us60us,拉高,这里取30us(
35、530),再释放总线,以让DS18B20发出存在脉冲DQ=Z;elsif count1=01111001010 then -存在脉冲为60us240us,830,再拉高DQ=1;elsif count1=10000000000 then -整个时序要求960us,这里取1024usinit:=1;count1:=00000000000; -总线拉低(也可以不拉低),初始化标志置1,即下次不进行初始化,计数器归零end if;end if;elsif state=1 then -state=1,写命令2if init=1 thencount2:=count2+1;if count2=0000000001 thenDQ=0;elsif count2=0000001100 thenDQ=ml2(i);elsif count2=0001011010 thenDQ=1;elsif count2=0001011100 thencount2:=0000000000