摘要
本系统的设计可以用于热水器温度控制系统和饮水机等各种电器电路中。它以单片机at89s52为核心,通过3个数码管显示温度和4个按键实现人机对话,使用单总线温度转换芯片ds18b20实时采集温度并通过数码管显示,并提供各种运行指示灯用来指示系统现在所处状态,如:温度设置、加热、停止加热等,整个系统通过四个按键来设置加热温度和控制运行模式。
目 录
1绪论... - 1 -
2系统总体设计... - 2 -
2.1硬件总体设计... - 2 -
2.1.1硬件系统子模块... - 2 -
2.2软件总体设计... - 2 -
3硬件系统设计... - 4 -
3.1硬件电路分析和设计报告... - 4 -
3.1.1单片机最小系统电路... - 4 -
3.1.2键盘电路... - 5 -
3.1.3数码管及指示灯显示电路... - 5 -
3.1.4温度采集电路... - 7 -
3.1.5电源电路... - 11 -
3.1.6报警电路设计... - 12 -
3.1.7加热管控制电路设计... - 12 -
4系统软件设计... - 14 -
4.1主程序流程图... - 14 -
4.2各个模块的流程图... - 16 -
4.2.1读取温度ds18b20模块的流程... - 16 -
4.2.2键盘扫描处理流程... - 18 -
4.2.3报警处理流程... - 18 -
5系统调试... - 20 -
5.1硬件电路调试... - 20 -
5.2软件调试... - 20 -
5.3系统操作说明... - 21 -
5.4数据测试... - 21 -
总 结... - 23 -
致 谢... - 24 -
参考文献... - 25 -
附录一:系统源程序... - 26 -
附录二:系统硬件总图... - 35 -
基于单片机的水温控制器的设计
1绪论
本系统的设计可以用于水温控制系统和电饭煲等各种电器电路中。它以单片机at89s52为核心,通过数码管显示温度和语音提示实现人机对话,使用温度转换芯片ds18b20实时采集温度并通过数码管显示,并提供各种运行指示灯用来指示系统现在所处状态,如:温度设置、加热、停止加热等,整个系统通过四个按键来设置加热温度和控制运行模式。
温度控制系统可以说是无所不在,热水器系统、空调系统、冰箱、电饭煲、电风扇等家电产品以至手持式高速高效的计算机和电子设备,均需要提供温度控制功能。以计算机为例,当中的中央处理器的运行速度愈快,所耗散的热量便愈多,为免计算机系统过热而受损,有关系统必须加强温度过高保护功能。
传统的温度采集电路相当复杂,需要经过温度采集、信号放大、滤波、ad转换等一系列工作才能得到温度的数字量,并且这种方式不仅电路复杂,元器件个数多,而且线性度和准确度都不理想,抗干扰能力弱。现在常用的温度传感器芯片不但功率消耗低、准确率高,而且比传统的温度传感器有更好的线性表现,最重要的一点是使用起来方便。
自动控制仪器仪表总的发展趋势是高性能、数字化、集成化、智能化和网络化。智能温度控制系统的设计是为了满足市场对成本低、性能稳定、可远程监测、控制现场温度的需求而做的课题,具有较为广阔的市场前景。
本系统的核心控制芯片选用的是51系列单片机at89s52,单片机在各个技术领域中的迅猛发展,与单片机所构成的计算机应用系统的特点有关:
· 单片机构成的应用系统有较大的可靠性。
· 系统构建简洁、易行,能方便的实现系统功能。
· 由于构成的系统是一个计算机系统,相当多的功能由软件实现,故具有柔性特点。
· 有优异的性能价格比。
2系统总体设计
2.1硬件总体设计
设计并制作一个基于单片机的热水器温度控制系统的电路,其结构框图如图2-1:
图2-1系统结构框图
2.1.1硬件系统子模块
(1)单片机最小系统电路部分
(2)键盘扫描电路部分
(3)数码管温度显示和运行指示灯电路部分
(4)温度采集电路部分
(5)继电器控制部分
(6)报警部分
2.2软件总体设计
良好的设计方案可以减少软件设计的工作量,提高软件的通用性,扩展性和可读性。
本系统的设计方案和步骤如下:
(1)根据需求按照系统的功能要求,逐级划分模块。
(2)明确各模块之间的数据流传递关系,力求数据传递少,以增强各模块的独立性,便于软件编制和调试。
(3)确定软件开发环境,选择设计语言,完成模块功能设计,并分别调试通过。
(4)按照开发式软件设计结构,将各模块有机的结合起来,即成一个较完善的系统。
首先接通电源系统开始工作,系统开始工作后,通过按键设定温度值的上限值和下限值,确定按键将设定的温度值存储到指定的地址空间,温度传感器开始实时检测,调用显示子程序显示检测结果,调用比较当前显示温度值与开始设定的温度值比较,如果当前显示值低于设定值就通过继电器起动加热装置,直到达到设定值停止加热,之后进行保温,如果温度高于上限进行报警。
3硬件系统设计
3.1硬件电路分析和设计报告
本次设计主要思路是通过对单片机编程将由温度传感器ds18b20采集的温度外加驱动电路显示出来,包括对继电器的控制,进行升温,当温度达到上下限蜂鸣器进行报警。p1.7开关按钮是用于确认设定温度的,初始按下表示开始进入温度设定状态,然后通过p1.5和p1.6设置温度的升降,再次按下p1.7时,表示确认所设定的温度,然后转入升温或降温。p2.3所接的发光二极管用于表示加热状态,p2.5所接的发光二极管用于表示保温状态。p2.3接继电器。p3.1是温度信号线。整个电路都是通过软件控制实现设计要求。
3.1.1单片机最小系统电路
因为89s52单片机内部自带8k的rom和256字节的ram,因此不必构建单片机系统的扩展电路。如图3-1,单片机最小系统有复位电路和振荡器电路。值得注意的一点是单片机的31脚必须接高电平,否则系统将不能运行。因为该脚不接时为低电平,单片机将直接读取外部程序存储器,而系统没有外部程序存储器,所以必须接vcc。在按键两端并联一个电解电容,滤除交流干扰,增加系统抗干扰能力。
图3-1单片机最小系统图
3.1.2键盘电路
键盘是单片机应用系统中的主要输入设备,单片机使用的键盘分为编码键盘和非编码键盘。编码键盘采用硬件线路来实现键盘的编码,每按下一个键,键盘能够自动生成按键代码,并有去抖功能。因此使用方便,但硬件较复杂。非编码键盘仅仅提供键开关状态,由程序来识别闭合键,消除抖动,产生相应的代码,转入执行该键的功能程序。非编码键盘中键的数量较少,硬件简单,在单片机中应用非常广泛。
图为按键和at89s52的接线图,检测仪共设有4个按键,每个按键由软件来决定其功能,4个按键功能分别为:
(1) sw1:设定按键(设定按键)
(2) sw2:加法按键(当前位加5)
(3) sw3:减法按键(当前位减5)
(4) sw4:退出设置键(系统初始化)
图3-2单片机最小系统
3.1.3数码管及指示灯显示电路
(1)数码管显示说明
各个数码管的段码都是单片机的数据口输出,即各个数码管输入的段码都是一样的,为了使其分别显示不同的数字,可采用动态显示的方式,即先只让最低位显示0(含点),经过一段延时,再只让次低位显示1,如此类推。由视觉暂留,只要我们的延时时间足够短,就能够使得数码的显示看起来非常的稳定清楚,过程如表3-1。
表3-1数码管编码表
段码 位码 显示器状态
08h 01h □□□□□□□0
abh 02h □□□□□□1□
12h 04h □□□□□2□□
22h 08h □□□□3□□□
a1h 10h □□□4□□□□
24h 20h □□5□□□□□
04h 40h □6□□□□□□
aah 80h 7□□□□□□□
本论文中使用了3个数码管,其中前两位使用动态扫描显示实测温度,在设置加热温度的时候,两个数码管是闪烁,以提示目前处在温度设置状态。第三位数码管静态显示符号“℃”。
(2)运行指示灯说明
本热水器温度控制系统中共使用到3个led指示灯和3个数码管。
右上角的红色led是电源指示灯;
数码管右边的红色led是加热指示灯,当刚开机或温度降到设定温度5℃以下时,该灯会亮,表示目前处于加热状态;当温度上升到设定温度时,该led灭,同时数码管右边的绿色led亮,表示目前处于保温状态,用户可以使用热水器;当温度再次下降到设定温度5℃以下时,绿色led灭,红色加热的led灯亮,不断循环。
图3-3 led数码管显示电路图
3.1.4温度采集电路
(1)ds18b20介绍
dallas最新单线数字温度传感器ds18b20简介新的“一线器件”体积更小、适用电压更宽、更经济。dallas半导体公司的数字化温度传感器ds1820是世界上第一片支持“一线总线”接口的温度传感器。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。ds18b20、ds1822“一线总线”数字化温度传感器同ds18b20一样,ds18b20也支持“一线总线”接口,测量温度范围为-55℃~+125℃,在-10℃~+85℃范围内,精度为±0.5℃。ds1822的精度较差为±2℃。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。其ds18b20的管脚配置和封装结构如图3-4所示。
图3-4 ds18b20封装
引脚定义:
①dq为数字信号输入/输出端;
②gnd为电源地;
③vdd为外接供电电源输入端(在寄生电源接线方式时接地)。
(2)ds18b20的单线(1-wire bus)系统
单线总线结构是ds18b20的突出特点,也是理解和编程的难点。从两个角度来理解单线总线:第一,单线总线只定义了一个信号线,而且ds18b20智能程度较低(这点可以与微控制器和spi器件间的通信做一个比较),所以ds18b20和处理器之间的通信必然要通过严格的时序控制来完成。第二,ds18b20的输出口是漏级开路输出,这里给出一个微控制器和ds18b20连接原理图。这种设计使总线上的器件在合适的时间驱动它。显然,总线上的器件与(wired and)关系。这就决定:(1)微控制器不能单方面控制总线状态。之所以提出这点,是因为相当多的文献资料上认为,微控制器在读取总线上数据之前的i/o口的置1操作是为了给ds18b20一个发送数据的信号。这是一个错误的观点。如果当前ds18b20发送0,即使微控制器i/o口置1,总线状态还是0;置1操作是为了是i/o口截止(cut off),以确保微控制器正确读取数据。(2)除了ds18b20发送0的时间段,其他时间其输出口自动截止。自动截止是为确保:1时,在总线操作的间隙总线处于空闲状态,即高态。2时,确保微控制器在写1的时候ds18b20可以正确读入。
由于ds18b20采用的是1-wire总线协议方式,即在一根数据线实现数据的双向传输,而对at89s52单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对ds18b20芯片的访问。
①ds18b20的复位时序,如图3-5
图3-5 ds18b20的复位时序图
②ds18b20的读时序
对于ds18b20的读时序分为读0时序和读1时序两个过程。
对于ds18b20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让ds18b20把数据传输到单总线上。ds18b20在完成一个读时序过程,至少需要60us才能完成。ds18b20的读时序图如图3-6所示。
图3-6 ds18b20的读时序
③ds18b20的写时序
对于ds18b20的写时序仍然分为写0时序和写1时序两个过程。
对于ds18b20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证ds18b20能够在15us到45us之间能够正确地采样io总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。如图3-7所示。
图3-7 ds18b20的写时序图
(3)ds18b20的供电方式
在图3-8中示出了ds18b20的寄生电源电路。当dq或vdd引脚为高电平时,这个电路便“取”的电源。寄生电路的优点是双重的,远程温度控制监测无需本地电源,缺少正常电源条件下也可以读rom。为了使ds18b20能完成准确的温度变换,当温度变换发生时,dq线上必须提供足够的功率。
有两种方法确保ds18b20在其有效变换期内得到足够的电源电流。第一种方法是发生温度变换时,在dq线上提供一强的上拉,这期间单总线上不能有其它的动作发生。如图3-8所示,通过使用一个mosfet把dq线直接接到电源可实现这一点,这时ds18b20工作在寄生电源工作方式,在该方式下vdd引脚必须连接到地。
图3-8 ds18b20供电方式1
另一种方法是ds18b20工作在外部电源工作方式,如图3-9所示。这种方法的优点是在dq线上不要求强的上拉,总线上主机不需要连接其它的外围器件便在温度变换期间使总线保持高电平,这样也允许在变换期间其它数据在单总线上传送。此外,在单总线上可以并联多个ds18b20,而且如果它们全部采用外部电源工作方式,那么通过发出相应的命令便可以同时完成温度变换。
图3-9 ds18b20供电方式2
(4)ds18b20设计中应注意的几个问题
ds18b20具有测温系统简单、测温精度高、连接方便、占用接口线少等优点,但在实际应用中也应注意以下几方面的问题:较小的硬件开销需要相对复杂的软件进行补偿,由于ds18b20与微处理器间采用串行数据传送。因此,在对ds18b20进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。在ds18b20有关资料中均未提及1wire上所挂ds18b20数量问题,容易使人误认为可以挂任意多个ds18b20,在实际应用中并非如此。当1wire上所挂ds18b20超过8个时,就需要考虑微处理器的总线驱动问题,这一点在进行多点测温系统设计时要加以注意。连接ds18b20的总线电缆是有长度限制的。实际应用中,测温电缆线建议采用屏蔽4芯双绞线,其中一对线接地线与信号线,另一组接vcc和地线,屏蔽层在源端单点接地。
本文以广泛应用的数字温度传感器ds18b20为例,说明了1wire总线的操作过程和基本原理。事实上,基于1wire总线的产品还有很多种,如1wire总线的e2prom、实时时钟、电子标签等。他们都具有节省i/o资源、结构简单、开发快捷、成本低廉、便于总线扩展等优点,因此有广阔的应用空间,具有较大的推广价值。
本设计将温度传感器ds18b20与单片机txd引脚相连,读取温度传感器的数值。ds18b20与单片机连接图如图所示3-10所示。
图3-10 ds18b20与单片机连接图
3.1.5电源电路
采用l7805稳压块,输出为5v。电子组件要正常运作都需要电源电压供电,一般常用的电源电压为+5v或+12v,因为数字ic(ingegrated circuit:集成电路)所供给的电压为+5v,而cmos ic所供给的电压为+12v,7805是一个稳压块。7805稳压管把高电压转换到低电压,7805稳压管具有保护单片机的作用。l7805输出端要并联上一个电解电容,滤除交流电干扰,防止损坏单片机系统。本设计采用两种供电方式,一种为dc7~18v直流稳压电源变换成5v的直流电;另一种为四节干电池共6v经二极管加压后得到将近5v的直流电源,电源配以开关和指示灯,以方便使用。黄色发光二极管表示保温,红色的表示加热状态。
图3-11系统电源设计图
3.1.6报警电路设计
同时可以在系统里设定温度上限值,由于加热停止后,加热管还有余热当采集到的外界温度高于当前所设定温度上限值时,程序就会进入报警子程序,触发蜂鸣器进行报警。报警电路原理图如图所示。
图3-12 报警电路图
图中的三极管8550的作用是增加驱动能力,比9012的驱动电流还大些,因此选用8550。当程序进入报警子程序时,把p2.7置0,就会触发蜂鸣器,为了使报警声音效果更好,对p2.7取反,发出报警嘟噜声音。
3.1.7加热管控制电路设计
继电器是常用的输出控制接口,可以做交直流信号的输出切换。它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。继电器控制接点操作说明如下:
●com:common,共同点。输出控制接点的共同接点。
●nc:normalclose常闭点。以com为共同点,nc与com在平时是呈导通状态的。
●no:normal open常开点。no与com在平时是呈开路状态的,当继电器动作时,no与com导通,nc与com则呈开路状态。
当89s52的p2.5输出高电平时,继电器不导通,反之当输出低电平时,继电器导通,这样就激活了连接回路。
图3-13 单片机控制继电器电路图
4系统软件设计
本系统采用的是循环查询方式,来显示和控制温度的。主要包括四段程序的设计:ds18b20读温度程序,数码管的驱动程序,键盘扫描程序,以及抱经处理程序。
4.1主程序流程图
图4-1主程序流程图
4.2各个模块的流程图
4.2.1读取温度ds18b20模块的流程
由于ds18b20采用的是一根数据线实现数据的双向传输,而对at89s52单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对ds18b20芯片的访问。
ds18b20单线通信功能是分时完成的,它有严格的时隙概念。因此系统对ds18b20的各种操作必须按协议进行。操作协议为:初始化ds18b20(发复位脉冲)→发rom功能命令→发存储器操作命令→处理数据ds18b20虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,
ds18b20必须首先调用启动温度转换函数,根据数据手册上对应转换时间来超作,如为12位转换,则应该是最大750ms,另外在对ds18b20超作时,时序要求非常严格,因此最好禁止系统中断。
由于ds18b20是在一根i/o线上读写数据,因此,对读写的数据位有着严格的时序要求。ds18b20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。
ds18b20的读时序:
(1)对于ds18b20的读时序分为读0时序和读1时序两个过程。
(2)对于ds18b20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让ds18b20把数据传输到单总线上。ds18b20在完成一个读时序过程,至少需要60us才能完成。
ds18b20的写时序:
(1)对于ds18b20的写时序仍然分为写0时序和写1时序两个过程。
(2)对于ds18b20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证ds18b20能够在15us到45us之间能够正确地采样io总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。
系统程序设计主要包括三部分:读出温度子程序、温度转换命令子程序、显示温度子程序。
图4-2读取温度ds18b20模块的流程图
程序代码为:
get_temper: setb dq ;读出转换后的温度值
lcall init_1820 ;先复位ds18b20
jb flag1,tss2
ret ;判断ds1820是否存在?若ds18b20不存在则返回
tss2: mov a,#0cch ;ds18b20已经被检测到!!!!!!!!!!!!!!!跳过rom匹配
lcall write_1820
mov a,#44h ;发出温度转换命令
lcall write_1820
lcall display ;这里通过调用显示子程序实现延时一段时间,等待ad转换结束,12位的话750微秒
lcall init_1820 ;准备读温度前先复位
mov a,#0cch ;跳过rom匹配
lcall write_1820
mov a,#0beh ;发出读温度命令
lcall write_1820
lcall read_18200 ;将读出的温度数据保存到35h/36h
ret
4.2.2键盘扫描处理流程
此流程为键盘扫描处理,cpu通过检测各数据线的状态(0或1)就能知道是否有按键闭合以及哪个按键闭合。键盘管理程序的功能是检测是否有按键闭合,如果有按键闭合,消除抖动,根据键号转到相应的键处理程序,按键流程图如图4-3所示。
图4-3键盘扫描子程序流程图
4.2.3报警处理流程
运行程序后,温度传感器ds18b20即可对环境进行温度采集,并送led数码管显示。我们可以在程序里设定温度上限值,当采集到的外界温度高于当前所设定温度上限值时,程序就会进入报警子程序,触发蜂鸣器进行报警。其程序流程图如图4-4所示。
图4-4 报警子程序流程图
5系统调试
5.1硬件电路调试
仔细检查所接电路,按照硬件原理图接线,理论上是能实现的,如果数码管不显示,则应该检查线路是否正确,或是因为单片机没有工作,还有集电极和发射极是否接对。如果只显示两个八,则可能是ds18b20没有接正确,检查上拉电路是否接好。另外要注意的是,由单片机输出的控制信号比较小,需要进行放大才能驱动继电器工作,否则就不能实现升温过程,通常选用8550三极管来进行放大。还有220v交流电绿色接头和加热管黄色接头必须接正确,否则导致电路烧坏。蜂鸣器是低电平有效。如果能注意这些问题,电路基本不会出错。
5.2软件调试
如果硬件电路检查后,没有问题却实现不了设计要求,则可能是软件编程的问题,首先应检查初始化程序,然后是读温度程序,显示程序,以及继电器控制程序,对这些分段程序,要注意逻辑顺序,调用关系,以及涉及到了标号,有时会因为一个标号而影响程序的执行,除此之外,还要熟悉各指令的用法,以免出错。还有一个容易忽略的问题就是,源程序生成的代码是否烧入到单片机中,如果这一过程出错,那不能实现设计要求也是情理之中的事。本人在设计的时候在伟福仿真软件进行调试,通过此软件进行调试可以很方便的观察单片机内部各个寄存器及内部存储器变化情况,以方便进行调试。图为单片机功能调试图。
图5-1单片机功能调试图
硬件与软件调试相结合,仔细检查各个模块的设计,旧能顺利完成任务,实现设计要求,在调试过程中必须认真耐心,不能有一点马虎,否则遗漏一个小的问题就会导致整个设计的失败。
5.3系统操作说明
本系统上电后数码管显示当前测量温度,此时加热指示灯和保温指示灯均不点亮;若此时按“自动加热”键,则单片机自动将预加热温度设置为80℃并开始加热,送出一个加热信号,并点亮加热指示灯;若按“温度设置”键,则进入预加热温度设置界面,此时数码管闪烁显示预设置温度,此时通过按键“+”和“-”进行设置温度,预设置温度按“5”递增或递减,设置好温度后再按一次“温度设置”键确定,单片机保存预设置温度,并开始加热。此时单片机通过数码管显示实时检测的温度并和预设置温度进行对比,如果实测温度大于或等于预设置温度,则单片机发出停止加热信号并熄灭加热指示灯,点亮保温指示灯,且当超过预设温度时发出报警;当温度下降到预设置温度以下5度时,单片机再次发出加热信号,同时熄灭保温指示灯,点亮加热指示灯,依次循环控制。
5.4数据测试
1.静态数据测试
取一桶净水,改变它的温度,观察数码管上显示的温度值,并用温度计进行测温,记录两组数据,比较差异。记录表如下:
表5-1静态温度数据测试表
温度℃ 1 2 3 4 5 6
显示温度 23 47 63 77 84 90
测量温度 24 47 63 80 84 91
有测试数据可知,本系统测温结果与温度计测温基本一致,能满足设计,证明了设计的合理性。
2.动态数据测试
进行温度设定,通过设定温度值(75℃),观察加热管的加热情况,以及数码管的显示值,再用温度计测量水温,每隔一段时间记录一次数据,将两组值进行比较。记录表如下:(设定前温度为25℃)
表5-2静态温度数据测试表
组数
分组 1 2 3 4 5 6 7 8 9 10 11 12 13
显示温度 25 29 34 39 42 48 53 58 62 67 70 73 75
测量温度 25 28 34 38 42 49 53 59 63 67 71 74 75
通过上表可看出在加热的过程中,显示的温度与实测的温度近似一样,说明系统的设计达到精度要求,但还是略有偏差,基本不影响设计结果。
整个测试过程表明设计达到了任务书的要求,证明了该方案是合理可行的,顺利完成了设计,达到了预想结果。
总 结
通过本次的设计,使我们不仅对单片机这门课程有了更深刻的认识,懂得了如何运用课本知识结合实际来完成定时器的显示和编程方法以及数码显示电路的驱动方法,使我们能够很快的适应现代控制技术发展的需求,同时也提高了我们的思维能力和实际操作能力,为以后更好的走上工作岗位奠定了坚实的基础。
另外,这次的设计还让我更进一步的认识了关于at89s52等芯片的引脚功能以及使用方法,使我学会了应用不同的芯片来配合完成整个设计的操作。
在做硬件电路的这段时间里,从思考设计到对电路的调试经过了许多困难。同样在对软件进行设计时,也可为一路坎坷。但是通过对软硬件不断撞墙,不断思考解决问题的过程中,我学会了很多东西,同时对单片机也有了更深的认识。在做设计的时候,很需要耐心和对事物的细心,很多时候一个简单问题的一个简单的疏忽就会导致整个电路的不工作,只有不断的检查不断的调试,才能真正完成一个设计的制作。只有不断的发现问题解决问题,才能从问题中改变自己,提升自己对单片机的能力。
此设计虽然能够完成温度的显示和控制,但功能和精度有待于进一步提高。以后可以通过加入pid算法优化控制功能,并通过液晶显示屏实时显示温度。
参考文献
[l]乐建波编著《温度控制系统》化学工业出版社
[2] [美]ken c.pohlmann《数字音频原理及应用》.苏菲.第4版.北京:电子工业出版社,2005,2
[3]谢自美编著《电子线路设计·实验·测试(第二版)》 华中科技大学出版社 2000
[4]陈东光编著《单片微型计算机原理及c语言程序设计》华中科技大学出版社 2004.4
[5]武庆生仇梅编著《单片机原理与应用》电子科技大学出版社 1998.2
[6]谭浩强编著《c程序设计》.北京:清华大学出版社1999年
[7]华中理工大学电子学教研室编《电子技术基础模拟部分(第四版)》高等教育出版社 1999.6
[8]华中理工大学电子学教研室编《电子技术基础数字部分(第四版)》高等教育出版社 2000.6
[9]赵晶编著《电路设计与制版——protel 99se的高级应用》人民邮电出版社 2000.1
[10]《电子制作》2004.10
[11]王彬任艳颖编著《digital ic system design》西安电子科技大学出版社2005.9
[12]赵丽娟邵欣编著《基于单片机的温度监控系统的设计与实现》机械制造
[13]郭炳坤简单的恒温箱温控电路[j].仪器与未来,1991
[14]guiyuntian《foundationand application of microcontraller》高等教育出版社2004.11
[15](美)bjarne stroustrup《the c++ programming language,special edition》addison wesley 1997
附录一:系统源程序
emper_l equ 29h ;用于保存读出温度的低8位
temper_h equ 28h ;用于保存读出温度的高8位
flag1 equ 38h ;是否检测到ds18b20标志位
a_bit equ 20h ;数码管个位数存放内存位置
b_bit equ 21h ;数码管十位数存放内存位置
b1 equ 70h ;温度小数点位
a1 equ 71h ;设定温度值
dq equ p3.1 ;dq为ds18b20数据位
bell equ p2.7 ;//蜂鸣报警
org 0000h ;单片机内存分配申明!
ajmp main0
;///////////////////////////////////前面的都是定义
main: mov r0,#10
m1: cpl p2.3
acall delay125
djnz r0,m1 ;//此段为灯闪5次,无实际意义
;///////////////////////////////////////////////
main0: mov a1,#80 ;默认加热为80度
main1: lcall d1820 ;调用读温度子程序
lcall display ;调用数码管显示子程序
mov a,29h
clr c
cjne a,a1,main1_1
setb bell ;//温度相等,关闭蜂鸣器
ajmp main1_1_a ;//下等不用叫蜂鸣器
main1_1: jc main1_2 ;为1转移,表示小于设定温度
cpl bell ;蜂鸣器断续鸣叫
main1_1_a: clr p2.3 ;//下面是表示没达到温度
setb p2.5
ajmp main2
;/////////////////////////////////////主要是检测温度是否小于设定的温度,小于,则开发热管clr p2.3
main1_2: setb bell ;//关闭蜂鸣器
clr p2.5 ;//开发热管
setb p2.3
;///////////////////////////////上面的是大于,关发热管
main2: jb p1.0,main1 ;//看p1.0有否按下
acall delay125 ;//延时防抖动,常用的手法,网上很多介绍的
jb p1.0,main1 ;//再次查看
clr p2.3
jnb p1.0,$ ;//等按键完全松手才进入!
setb p2.3
setb p2.5
;///检测到p1.0按键后后进入设定温度
main2_1: acall display1
jb p1.2,main2_2
acall delay125
jb p1.2,main2_2
jnb p1.2,$
mov a,#5
add a,a1
clr c
cjne a,#100,main2_1_1
mov a,#99
ajmp main2_1_3
;////////////////上面这一段是+5度按键,按下+5度
main2_1_1: jc main2_1_3
main2_1_2: clr c
mov a,#99
main2_1_3: mov a1,a
main2_2: jb p1.4,main2_3
acall delay125
jb p1.4,main2_3
jnb p1.4,$
mov a,a1
cjne a,#99,zy1
mov b,#4
ajmp zy2
zy1: mov b,#5
zy2: clr c
mov a,a1
subb a,b
main2_2_1: jnc main2_2_2
mov a1,#0
ajmp main2_3
;////////////////上面这一段是-5度按键,按下-5度
main2_2_2: mov a1,a
main2_3: jb p1.6,main2_1
acall delay125
jb p1.6,main2_1
clr p2.3
jnb p1.6,$
setb p2.3
ajmp main1
;/////////////上面这一段是退出的意思的!
d1820: lcall get_temper ;调用读温度子程序
mov b1,29h
mov a,29h
mov c,40h ;将28h中的最低位移入c
rrc a
mov c,41h
rrc a
mov c,42h
rrc a
mov c,43h
rrc a
mov 29h,a
mov a,b1
mov b,#10h
mul ab
mov b,#10h
div ab
mov b,#10
mul ab
mov b,#10h
div ab
mov b1,a
ret
;//////////上面这一段是读取温度后进行转换的意思!
;/////////////////////////////////
;////////////////////////////////
;///////////////////////////////
init_1820: setb dq ;这是ds18b20复位初始化子程序
nop
clr dq ;主机发出延时537微秒的复位低脉冲
mov r1,#3
tsr1: mov r0,#107
djnz r0,$
djnz r1,tsr1
setb dq ;然后拉高数据线
nop
nop
nop
nop
mov r0,#25h
tsr2: jnb dq,tsr3 ;等待ds18b20回应
djnz r0,tsr2
ljmp tsr4 ;延时
tsr3: setb flag1 ;置标志位,表示ds1820存在
ljmp tsr5
tsr4: clr flag1 ;清标志位,表示ds1820不存在
ljmp tsr7
tsr5: mov r0,#117
tsr6: djnz r0,tsr6 ;时序要求延时一段时间
tsr7: setb dq
ret
get_temper: setb dq ;读出转换后的温度值
lcall init_1820 ;先复位ds18b20
jb flag1,tss2
ret ;判断ds1820是否存在?若ds18b20不存在则返回
tss2: mov a,#0cch ;ds18b20已经被检测到!!!!!!!!!!!!!!!跳过rom匹配
lcall write_1820
mov a,#44h ;发出温度转换命令
lcall write_1820
lcall display ;这里通过调用显示子程序实现延时一段时间,等待ad转换结束,12位的话750微秒
lcall init_1820 ;准备读温度前先复位
mov a,#0cch ;跳过rom匹配
lcall write_1820
mov a,#0beh ;发出读温度命令
lcall write_1820
lcall read_18200 ;将读出的温度数据保存到35h/36h
ret
write_1820: mov r2,#8 ;一共8位数据
clr c ;写ds18b20的子程序(有具体的时序要求)
wr1: clr dq
mov r3,#6
djnz r3,$
rrc a
mov dq,c
mov r3,#23
djnz r3,$
setb dq
nop
djnz r2,wr1
setb dq
ret
read_18200: mov r4,#2 ;将温度高位和低位从ds18b20中读出
mov r1,#29h ;低位存入29h(temper_l),高位存入28h(temper_h)
re00: mov r2,#8 ;数据一共有8位
re01: clr c ;读ds18b20的程序,从ds18b20中读出两个字节的温度数据
setb dq
nop
nop
clr dq
nop
nop
nop
setb dq
mov r3,#9
re10: djnz r3,re10
mov c,dq
mov r3,#23
re20: djnz r3,re20
rrc a
djnz r2,re01
mov @r1,a
dec r1
djnz r4,re00
ret
;/////////////////////////////////////////上面的这些都是温度采集的!
display: mov a,29h ;将29h中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div ab ;显示子程序
mov a_bit,a ;十位在a
mov b_bit,b ;个位在b
mov dptr,#numtab ;指定查表启始地址
mov r0,#1
dpl1: mov r1,#25 ;显示1000次
dplop: mov a,b_bit ;取个位数
movc a,@a+dptr ;查个位数的7段代码
mov p0,a ;送出个位的7段代码
clr p2.2 ;开个位显示
acall d1ms ;显示1ms
setb p2.2
mov a,a_bit ;取十位数
movc a,@a+dptr ;查十位数的7段代码
mov p0,a ;送出十位的7段代码
clr p2.1 ;开十位显示
acall d1ms ;显示1ms
setb p2.1
mov p0,#0ffh
djnz r1,dplop ;100次没完循环
djnz r0,dpl1 ;4个100次没完循环
ret
;/////////////////////////////////////上面这段显示实时温度
;//////////////////////////////////////
display1: mov a,a1 ;将29h中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div ab ;显示子程序
mov a_bit,a ;十位在a
mov b_bit,b ;个位在b
mov dptr,#numtab ;指定查表启始地址
mov r0,#1
dpl11: mov r1,#25 ;显示1000次
dplop1: mov a,b_bit ;取个位数
movc a,@a+dptr ;查个位数的7段代码
mov p0,a ;送出个位的7段代码
clr p2.2 ;开个位显示
acall d1ms ;显示1ms
setb p2.2
mov a,a_bit ;取十位数
movc a,@a+dptr ;查十位数的7段代码
mov p0,a ;送出十位的7段代码
clr p2.1 ;开十位显示
acall d1ms ;显示1ms
setb p2.1
mov p0,#0ffh
djnz r1,dplop1 ;100次没完循环
djnz r0,dpl11 ;4个100次没完循环
ret
;/////////////////////////////上面这段显示设置温度
d1ms: mov r7,#50 ;1ms延时
djnz r7,$
ret
delay10: mov r6,#20 ;10ms延时
d3: mov r5,#255
djnz r5,$
djnz r6,d3
ret
delay125: mov r6,#255 ;125ms延时
d1: mov r5,#255
djnz r5,$
djnz r6,d1
ret
delay1s: mov r7,#8 ;1s延时
d2: lcall delay125
djnz r7,d2
ret
;///////////////////////这些都是延时,长短而已
numtab: db 0c0h,0f9h,0a4h,0b0h
db 99h,92h,82h,0f8h
db 80h,90h,88h,83h
db 0c6h,0a1h,86h,8eh
;////////////////////数码管的具体值
end
附录二:系统硬件总图
原文标题:基于单片机的水温控制器的设计
文章出处:【微信公众号:multisim】欢迎添加关注!文章转载请注明出处。
工业生产安全保障—可燃气体探测器的使用场景和作用!
基于银行业的智慧消防预警系统实践研究
小型立体声调频发射机电路图
2019集微半导体峰会上老杳出席会议并致辞
Mentor Graphics新版 HyperLynx 集信号和电源完整性、3D电磁解析和 快速规则检查于一个统一的环境中
基于单片机的水温控制器的设计
小米上市 人民日报点评雷军公开信
磷酸锰铁锂规模投产步伐加快
SiC-SBD的正向特性,与正向电流及温度的依赖关系
关于无人机飞控系统
意法半导体正式推出了一系列新的S-Touch触摸传感器
MAX1455 Diagnostic Clip Boost
华为MATE60是5G网络吗 华为MATE60是麒麟芯片吗
人脸识别一体机在景区管理中的应用
新岸线第三代移动芯片问世
新基建为数字化转型提供基础技术支撑,是最重要且必要的驱动力
Spring赌上未来的一击,响应式的WebFlux框架更优雅
用户与内核空间数据交换的方式之一:内核启动参数
手机通讯录丢了怎么恢复?教你如何快速找回苹果手机联系人
MPEG-2编码复用器中的FPGA逻辑设计