找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5941|回复: 0
打印 上一主题 下一主题
收起左侧

单片机DS18B20温度测控系统仿真设计详解 LCD1602显示

[复制链接]
跳转到指定楼层
楼主
ID:708562 发表于 2020-8-4 16:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用单片机开发一个温度测量控制系统,显示用16*2的液晶,实时显示测量温度,加热输出采用通断控制,用发光二极管来模拟,能设置目标温度,能设置报警温度阈值,超过了进行报警,报警采用液晶屏幕显示。
                        
                        
  • 方案分析和设计
                        
看到设计任务的时候,因为主要是进行温度测量,所以必然会用到温度传感器。那么什么是温度传感器呢。温度传感器(temperature transducer)是指能感受温度并转换成可用输出信号的传感器。温度传感器是温度测量仪表的核心部分,品种繁多。按测量方式可分为接触式和非接触式两大类,按照传感器材料及电子元件特性分为热电阻和热电偶两类。在经过一番选择后,最终确定用DS18B20作为需要的温度传感器,原因如下。1.DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。 2.因为之前用过热敏电阻代替,精度不够高,也想尝试下新的传感器。
                        
其次就是16*2的液晶显示模块,因为要求中不需要显示中文,所有就采用LCD1602模块为所需的液晶显示屏。加热部分用发光二极管模拟,并采用通断控制,那么就可以利用定时器中断发出PWM波达到需要的要求即可。其次是设置目标温度和警报温度。显然,需要加至少两个按键来控制。进行报警的部分就可以使用简单的蜂鸣器即可。当温度达到警报温度的时候,蜂鸣器就响。
                        
因为是LCD屏,所有发挥部分加了一个万年历的模块,采用DS1302时钟模块。本可以加个计算器模块,但是估计IO口设计完上面的一系列模块后就不够用了,所以不打算加上计算器模块。
                        
                        
                        
  • 硬件设计
                        
主要元器件的选择:MCU 芯片选择的是AT89C51,LCD显示屏采用的是LCD1602,在仿真电路中用的是LM016L,和LCD1602性质相同。温度传感器用的是DS18B20。发挥部分用的是DS1302时钟模块。
                        
模块设计
                        
最小系统:这个部分的设计相对比较简单,首先是系统时钟电路,需要一个12M的外部晶振,其次需要两个30pf电容。搭配起来就是一个系统时钟了。接下来就是复位电路了,需要一个10K电阻,一个10μf的电解电容,还有一个开关。设计好后的最小系统如图所示:
                        
                                                        
                        
液晶显示:LCD1602
                        
                                                        
                        
                        
                                                        
                        
按照LCD1602手册连接好电路如图所示:
                        
                                                        
                        
                        
DS18B20温度模块: 单线数字温度传感器,所以操作的要求比较高,读取数据的时候需要控制在微秒量级。
                        
                                                        
                        
初始化:主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。
                        
做为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。
                        
                        
                                                        
                        
写操作:写周期最少为60微秒,最长不超过120微秒。写周期一开始做为主机先把总线拉低1微秒表示写周期开始。随后若主机想写0,则继续拉低电平最少60微秒直至写周期结束,然后释放总线为高电平。若主机想写1,在一开始拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束。而做为从机的DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。
                        
                                                        
                        
读操作:对于读数据操作时序也分为读0时序和读1时序两个过程。读时隙是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为1。完成一个读时序过程,至少需要60us才能完成。
                        
                                                        
                        
                        
DS1302模块:
                        
                                                        
                        
DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),后面有详细说明。SCLK始终是输入端。
                        
                        
加热模块:用的LED代替,在加热的时候LED在PWM波的作用下会出现周期为4s的亮灭,代表加热的进行。在停止加热的时候,会灭掉。
                        
                                                        
按键功能:按键1是万年历按键,按键2是设置目标温度和警报温度按键,按一下进入目标温度设置,按两下进入警报温度设置。按键3是加温度按键,按键4是减温度按键。按键5是温度显示按键。

                        
                                                        
                        
  
硬件电路图:
                        
                        
                                                        
                        
                        
硬件PCB板图:
                        
                                                        
                        
                                                        
                        
                        
  • 软件设计
                        LCD显示模块部分代码编写:
                        LCD硬件部分介绍的时候,介绍了LCD1602读写的步骤和时序。按步骤可以编写出以下的初始化和读写代码。其中的清屏(LcdWriteCom(0x01))这一步在主函数里面的用处很多。
                                                                                
                                                                                
                        DS18B20温度显示模块:
                        DS18B20对时序的要求很高,要控制在微秒量级之间,初始化、读、写中的任何一步有误差就会显示不出温度。按照硬件部分的介绍可以写出DS18B20部分的代码如下:
                        初始化:
                                                                                
                        写操作:
                                                                                
                        
                        
                        
                        
读操作:
                        
                                                        
                        
                                                        
                        
                                      DS1302模块代码:
                        
根据硬件部分对DS1302的解释,也可以写出如下的代码
                                                                                                                
                        
                                                                                
                        
                        
                        
                        
                        PWM波代码:通过定时器中断1输出周期为4s的方波,实现两秒亮,两秒灭。
                                                                                
                        
                        目标温度和警报温度设定:
                                                                                
                        
                        达到目标温度后LED灭和未达到目标温度LED周期性亮灭:
                                                                                
                        
                        达到警报温度后蜂鸣器响:
                                                                                
                        
                        
                        
  • 软件仿真
                        按下温度显示按键,显示当前温度:
                                                                                
                        按下目标温度设置键,出现Aim_temp设置。此时按下加和减键可以实现目标温度设置。
                                                                                
                                                                                
                                                                                
                        继续按下温度设置键,跳转到警报温度设置页面,按下加和减号键可以设置警报温度。
                                                                                
                        
                        此时,按下温度显示键:如果目标温度高于当前温度,LED灯会周期性亮灭,模拟加热环节。如果目标温度低于当前温度,则LED灭。模拟停止加热环节。如果当前温度高于设定的警报温度,蜂鸣器响。
                        目标温度(52)高于当前温度(48),LED亮。
                                                                                
                        目标温度(52)低于当前温度(55),LED灭:
                                                                                
                        
                        当前温度高于警报温度,蜂鸣器响:
                                                                                
                                                                                
                        
                        按下万年历显示模块,显示日期(初始化值):
                                                                                
                        
                        
                        
  • 总结体会
                        
通过本次的设计,让我学会了如何通过元器件手册编写相应的初始化等程序。尤其是DS18B20这个温度传感器模块。稍有延迟误差就读不出具体的温度数据,会一直显示-0.006℃。调了很久,才把延迟范围控制在要求的范围内。
                        
此外,对于LCD1602的部分,要是想显示单独一个变量数字,需要在末尾加上’0’。例如:要在LCD上显示目标温度Aim_temp,需要拆分成高位和地位,分别用Aim_h和Aim_l来表示,那么要显示出来就需要Aim_h+’0’才可以显示出来。总之,这次综合设计让我更加意识到了单片机的强大和有趣,希望未来能在这条路上越走越远。
                        
  • 参考资料
                        1.      DS1302时钟芯片介绍                        2.      DS18B20模块介绍                        3.      LCD1602显示屏模块介绍

所有资料51hei下载地址:
http://www.51hei.com/bbs/dpj-149956-1.html

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表