找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 24706|回复: 21
收起左侧

基于单片机的智能饮水机的设计论文

  [复制链接]
852935939 发表于 2017-11-30 19:32 | 显示全部楼层 |阅读模式
本科毕业设计(论文)

题目 基于单片机的智能饮水机的设计

摘 要

目前,大多数家庭所使用的饮水机都只有一些基本的功能,例如加热、保温。然而,随着人们物质生活的不断提高,对饮水机的性能要求也不断提高。为了满足人们对饮水机的性能要求,本课题研究智能饮水机,它主要功能是在温度达到100°沸腾,并能在0-100℃之间以5℃为最小温差进行温度设定,从而得到任意想要的水温,非常人性化。它还具有过热保护及防干烧功能等。

随着计算机技术的发展,单片机技术已成为计算机技术中的一个独特的分支,单片机的应用领域也越来越广泛,特别是在工业控制和仪器仪表智能化中扮演着极其重要的角色。过去经常采用模拟电路、数字电路实现的电路系统,现在相当大一部分可以用单片机予以实现,传统的电路设计方法已演变成软件和硬件相结合的设计方法。在实际应用中,单片机经常要与各种传感器相结合组成一定的应用系统,以实现系统的自动检测与控制。

本文所设计的智能饮水机就是单片机结合传感器的一个简单应用。该系统设计综合单片机以及电子技术理论,从生活实际出发,完善了饮水机的功能。整个设计系统实现三个功能,即加热、对温度上下限的控制和定时加热。与传统的饮水机相比,由于采用了自动检测和控制的电子设计技术,可较好地实现对水温的测量和控制,具有较广泛的应用前景。


目录


前  言
1绪  论
1.1 课题研究的背景
1.2 市场饮水机现状
1.3 课题研究的目的和意义
1.4 智能饮水机的主体功能
1.5 课题设计的主体内容
2 智能饮水机的硬件结构设计
2.1 智能饮水机的总体设计
2.2 元器件选择
2.3 AT89S52的主要性能
2.3.1 AT89S52功能特性描述
2.3.2 AT89S52晶振电路的设计
2.4 测温电路的设计
2.4.1 DS18B20的引脚图及方框图
2.4.2 DS18B20主要性能
2.4.3 DS18B20功能特性描述
2.4.4 DS18B20供电方式
2.5 主控系统
2.6 输入控制
2.7 显示部分
2.8 其他功能部分
3 智能饮水机的软件设计
3.1 系统分配方式
3.2 主程序设计
3.3 各模块程序设计
3.3.1 温度检测程序设计
3.3.2 显示程序设计
3.3.3 键盘扫描程序
3.3.4 延时程序
4 调试及性能分析
4.1 软件调试
4.1.1 新建工程
4.1.2 新建文本
4.1.3 添加文本
4.1.4 程序编译
4.2 硬件调试
4.2.1 电源电路的仿真
4.2.2 出水电路模块的仿真
4.2.3 加热模块电路的仿真
4.2.4 显示模块电路的仿真
4.2.5 报警电路的仿真
4.3 性能分析
结  论
致 谢
参考文献
参考文献
附录1
附录2
附录3

前  言

随着“信息时代”的到来,作为获取信息的手段——传感器技术得到了显著的进步,其应用领域越来越广泛,对其要求越来越高,需求越来越迫切。传感器技术已成为衡量一个国家科学技术发展水平的重要标志之一。因此,了解并掌握各类传感器的基本结构、工作原理及特性是非常重要的。

由于传感器能将各种物理量、化学量和生物量等信号转变为电信号,使得人们可以利用计算机实现自动测量、信息处理和自动控制,但是它们都不同程度地存在温漂和非线性等影响因素。传感器主要用于测量和控制系统,它的性能好坏直接影响系统的性能。因此,不仅必须掌握各类传感器的结构、原理及其性能指标,还必须懂得传感器经过适当的接口电路调整才能满足信号的处理、显示和控制的要求,而且只有通过对传感器应用实例的原理和智能传感器实例的分析了解,才能将传感器和信息通信和信息处理结合起来,适应传感器的生产、研制、开发和应用。另一方面,传感器的被测信号来自于各个应用领域,每个领域都为了改革生产力、提高工效和时效,各自都在开发研制适合应用的传感器,于是种类繁多的新型传感器及传感器系统不断涌现。温度传感器是其中重要的一类传感器。其发展速度之快,以及其应用之广,并且还有很大潜力。

为了提高对传感器的认识和了解,尤其是对温度传感器的深入研究以及其用法与用途,基于实用、广泛和典型的原则而设计了本系统。本文利用单片机结合温度传感器加以简单的按键控制及显示等功能实现了对智能饮水机的控制,为我们对单片机系统的学习提供了很好的真实素材。

本设计实用性及综合性比较强,设计系统不仅可以作为智能饮水机的控制系统,如果稍微改装可以做环境温度检测系统、实验室温度监控系统等等。课题主要任务是完成水温检测并利用单片机实现温度调节并加以显示、报警、锁定等功能。该系统具有操作方便,控制灵活、实用等优点。

本设计系统包括温度传感器,键盘输入模块,输出控制模块,数据传输模块,温度显示模块和出水驱动电路等部分。文中对每个部分功能、实现过程作了详细介绍。整个系统的核心是进行温度监控及调节,完成了课题所有要求。



11.1 课题研究的背景

从饮水机问世以来,在中国的发展趋势逐年增加。饮水机的使用量逐年增长,随着人们生活水平的提高,人们对其功能的要求也越来越高,所以,对智能饮水机的需求就逐渐显现了出来。 

饮水机是采用瓶装水或者自来水经净水器净化作为水源,利用电能对其进行加热,一年四季提供常温水或热水的饮水电器。饮水机基本能满足人们日常的饮水、泡茶、冲咖啡、即食食品以及调制冷饮的各种需要。饮水机具有饮水时尚、结构简单、操作方便、清洁卫生、价廉物美等优点。  

在饮水机进入高潮的今天,市场十分活跃,然而,消费者对饮水机的选择不是停留在过去的眼光,而是高标准,不仅实用而且要求外形脱俗,跟上时代潮流步伐,尤其在其功能方面要有更高的要求。

当前绝大多数厂家生产的饮水机都采用智能化控制。因此,智能饮水机已是饮水机发展的必然趋势。


1.2 市场饮水机现状

可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭煲、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤设备,五花八门,无所不在。饮水机也不例外。

单片机按其应用范围可分为通用型和专用型两类。家用电器多采用专用型单片机,如日本NEC公司开发的7500系列和75X00系列4位单片机、美国国家半导体公司的COP400系列4位单片机,以及日本松下公司的MN1400系列、美国Zilog公司的Z8系列以及日本富士通公司的MB88系列等专用型单片机。家用电器所采用的通用型单片机,主要是Intel公司的MCS系列产品。

目前饮水机基本上都采用单片机控制,但各厂家生产的饮水机单片机控制所达到的功能各不相同。智能化,多功能必定是发展趋势。


1.3 课题研究的目的和意义

单片机在电子产品中的应用已经越来越广泛, 在很多电子产品中也用到了温度检测和温度控制。

目前广泛使用的饮水机,具有价格低廉,制造简便等优点。但是随着用户长时间使用,这些饮水机功能单一、能耗较大、长时间饮用饮水机的水对健康不利等缺点逐渐暴露出来。

传统的饮水机的局限性一般体现在以下几个方面:第一,功能相对简单。只有简单的温度控制,而且用户还不能自己根据自己的喜好设定温控参数。第二,能耗较大。在没有人使用的时候饮水机也处在开机状态无疑会造成能源的大量浪费,在能源紧缺的今天这个方面亟待解决。第三, 长期饮用饮水机里的水会对健康不利。由于广泛使用的饮水机烧水不能完全沸腾,长期饮用这种水会对身体造成较大的伤害。

本此设计的基于AT89S52的多功能饮水机, 采用DS18B20实现温度采集,经过LED显示, 读数直观、准确。并且程序存储器E2PROM可以很容易的实现软件升级, 从软件方面提高仪器精度。同时可以对加热温度进行控制,从而防止了每次加热都使水沸腾,既节能又能更好的满足人们的需求。


1.4 智能饮水机的主功能

(1)智能饮水机的主体功能:

本课题设计的智能饮水机具有过热保护防干烧、加热至沸腾、设置温度加热、超温报警提示、安全锁定、电动机出水功能等。

(2)智能饮水机的按键功能:

①出水键:控制饮水机出水和停止出水;②加热键:负责控制开始加热和停止加热;③锁定键:按下锁定键,其他按键无效;④切换健:按下后开始设定用户想要的温度;⑤温度设定键:按一下温度增加5℃,温度可在0℃到100℃之间循环。

(3)智能饮水机的显示功能:

①电源灯(绿色):接通电源,电源灯点亮;②加热指示灯(黄色):按下加热键,加热指示灯点亮,表示烧水开始工作。再次按下加热键,指示灯熄灭,表示烧水停止;③锁定键指示灯(蓝色):锁定其他按键功能,灯亮表示其他按键均不可用;④超温报警灯(红色):灯点亮表示水已经达到设定的加热温度或已沸腾并停止加热;⑤数码管:显示当前水温或用户设定的温度。⑥蜂鸣器:响起后说明水以沸腾并停止加热。


1.5 课题设计的主内容

该设计的主要内容主要包括设计方向的选择、设计题目的确定、设计方法的研究与比较,选择最优方案后开始进行硬件设计和软件设计以及最终的仿真调试。其中硬件设计包括器件的选定,各模块功能的设计与实现,以及最终各功能模块与单片机的连接构成一个整体系统并能满足设计要求;软件设计主要是通过编写C语言程序对单片机进行控制使其按照程序运行从而实现各模块的功能满足设计的要求;最终通过Keil uVision2编译软件将写好的程序编译成为16进制文件,使之能够在proteus仿真软件中和硬件电路一起进行仿真调试,从而确保设计的正确性。

2 智能饮水机的硬件结构设计2.1 智能饮水机的总体设计

整个硬件系统由主控制系统、输入输出模块、传感器、其他功能电路和电源部分组成。主控系统使用单片机控制,包括对键盘的信息的接收和控制,对其他功能电路的控制等,通过软件编程实现预定功能;传感器部分即检测子系统,主要是进行饮水机中水的温度检测和控制,采用智能温度传感器DS18B20;其他功能电路部分包括恒温,防干烧,出水等电路,达到功能多样化;电源部分为智能饮水机提供必要的电能,保证饮水机能够正常的工作。整体框图如图2-1所示。以下详细讨论每个功能模块的设计思想和硬件电路的实现。


   

图2-1 智能饮水机电路框图

2.2 元器件选择

主机单元由AT89S52单片机和相关的存储器组成,是仪表的核心。关键部分期间名称及其在电路中的主要功能如下:

(1)AT89S52:完成监控系统数据采集过程、采集方式和报警过程的控制。是整个系统的核心处理器,单片机首先把通过传感器测到的现场温度与预先设置的温度进行比较,如果大于或小于预先设置值,就输出信号去控制加热器的工作,从而实现温度控制。

(2)数码管:用于显示当前水温及设定的水温。

(3)DS18B20:单线数字温度传感器,可直接将被测温度转化为串行数字信号,以供单片机处理。

(4)各色LED及蜂鸣器:用于提示用户饮水机的各种状态。

(5)按键:输入模块,用于控制单片机完成各项功能。


2.3 AT89S52的主要性能

AT89S52具有8k字节Flash闪速存储器,256字节内部RAM,32个I/O口线,3个16位定时/计数器,一个6向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89S52可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作指导下一个硬件复位。

2.3.1 AT89S52功能特性描述

(1)AT89S52是一种低功耗,高性能CMOS工艺的8位微控制器,具有8K在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统提供高灵活,超有效的解决方案。

(2)AT89S52具有以下标准功能:8K字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0KHZ静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机停止工作,直到一个中断或硬件复位为止。

(3)AT89S52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含8个中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线。AT89S52可以按照常规方法进行编程,也可以在线编程。其通用的微处理器和Flash存储器结合在一起,可反复擦写的Flash存储器可有效地降低开发成本。

2.3.2 AT89S52晶振电路的设计

每个单片机系统里都有晶振,全称是叫晶体震荡器,在单片机系统里晶振的作用非常大,它结合单片机内部的电路,产生单片机所必须的时钟频率,单片机的一切指令的执行都是建立在这个基础上的,晶振的提供的时钟频率越高,那单片机的运行速度也就越快。晶振用一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。在通常工作条件下,普通的晶振频率绝对精度可达百万分之五十,高级的精度更高。

晶振电路中的两个电容叫做负载电容。一般单片机的晶振工作于并联谐振状态,也可以理解为谐振电容的一部分。它是根据晶振厂家提供的晶振要求负载电容选值的,换句话说,晶振的频率就是在它提供的负载电容下测得的,能最大限度的保证频率值的误差。也能保证温漂等误差。两个电容的取值都是相同的,或者说相差不大,如果相差太大,容易造成谐振的不平衡,容易造成停振或者干脆不起振。

在本设计中XTAL1和XTAL2端外接石英晶体作为定时元件,内部反向放大器自激振荡,产生时钟。所用石英晶体的振荡频率为12MHZ,电容C1,C2常为20pF~40pF内,如图2-2所示。

图2-2 晶振电路

2.4 测温电路的设计
2.4.1
DS18B20的引脚图及方框图

DS18B20的外形及管脚排列图如下图2-3所示。

(1)GND  地信号

(2)DQ    数据输入/输出引脚。用在寄生电源下,可以向器件提供电源。

(3)VDD   可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。

图2-3 DS18B20外形及引脚排列

2.4.2 DS18B20主要性能

(1)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯;

(2)测温范围 -55℃~+125℃,固有测温分辨率0.5℃;

(3)支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定,实现多点测温;

(4)工作电源: 直流3~5V;

(5)在使用中不需要任何外围元件;

(6)测量结果以9~12位数字量方式串行传送;

(7)不锈钢保护管直径 Φ6 ;

(8)适用于DN15~25, DN40~DN250各种介质工业管道和狭小空间设备测温;

(9)标准安装螺纹 M10X1, M12X1.5, G1/2”任选;

(10)PVC电缆直接出线或德式球型接线盒出线,便于与其它电器设备连接。

2.4.3 DS18B20功能特性描述

DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为9字节的存储器,结构如表2-1所示。前两个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。第5字节为配置寄存器,见表2-3,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如表2-3所示。低5位都为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS--18B20出厂时该位被设置为0,用户可改动,R1和R0决定温度转换的精度位数,来设置分辨率。

表2-1  高速暂存RAM
字节数
1
2
3
4
5
6
7
8
9
存储信息
LSB
MSB
TH 1
TL 2
配置寄存器
保留
保留
保留
CRC


表2-2 DS18B20  温度转换时间表
R1
R0
分辨率/位
温度最大转换时间/ms
0
0
9
93.75
0
1
10
187.5
1
0
11
375
1
1
12
750


表2-3 配置寄存器
TM
R1
R0
1
1
1
1
1

由表2-2可见,DS18B20分辨率越高,所需要的温度数据转换时间越长。当DS18B20接收到温度转换命令后,开始启动转换。转换后,温度值就以16位带符号的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。DS18B20中的温度传感器可完成对温度的测量,以12位转化为例。其中S为符号位。DS18B20的温度值格式如表2-4所示。

表2-4 DS18B20温度值格式表
LSByte
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
MSByte
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
S
S
S
S
S

当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值。表2-5是部分温度值对应的二进制度数据。

表2-5 部分温度对应值表
温度℃
二进制表示
十六进制表示
+125
0000011111010000
07D0H
+85
0000010101010000
0550H
+25.0625
0000000110010000
0191H
+10.125
0000000010100001
00A2H
+0.5
0000000000000010
0008H
0
0000000000001000
0000H
-0.5
1111111111110000
FFF8H
-10.125
1111111101011110
FF5EH
-25.025
1111111001101111
FE6FH

2.4.4 DS18B20供电方式

(1)DS18B20寄生电源供电方式电路

DS18B20采用寄生电源供电时,要想使DS18B20进行精确的温度转换,I/O线必须保证在温度转换期间提供足够的能量,由于每个DS18B20在温度转换期间工作电流达到1mA,当几个温度传感器挂在同一根I/O线上进行多点测温时,靠上拉电阻是无法提供足够的能量,会造成无法转换温度或温度误差极大。因此,只适用于单一温度传感器测温,也不宜采用电池供电系统,并且电源电压必须保证是5V。当电源电压下降时,会使测量的误差变大。

(2)DS18B20的外部电源供电方式

DS18B20采用外部供电时,I/O线不需要强上拉电压,同时在总线上可以挂接多个DS18B20传感器,组成多点测温系统。但要注意在外部供电的方式下,DS18B20的GND引脚不能悬空,否则读取的温度总是85℃。但在proteus仿真中VCC和GND均悬空,否则仿真错误。

比较上述两种供电方式后认为外部电源供电方式对电源要求比电源供电方式优越些且稳定性好,故在此设计中采用外部电源供电方式供电电路。

仿真电路如下图2-4:

图2-4  采用外部供电的测温电路

2.5 主控系统

主控系统采用单片机控制。

单片机的晶振与复位电路如图2-5所示,单片机选用的是ATMEL公司的AT89S52的8 位单片机,晶体振荡器选12MHZ,C5,C6为22pF石英电容,与晶体振荡器构成时钟电路。电容C7,电阻R7、R8和按键S1构成上电复位和手动复位电路。


图2-5 晶振与复位电路

AT89S52是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4KB的可反复擦写的只读程序存储器(PEROM)和128B的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度,非易失性存储技术生产,兼容MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89S52单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。


2.6 输入控制

输入控制如图2-6所示,采用的按键控制,这样不仅减少的制作成本而且便于做。通过74LS373的通断进行按键信号的传输,当74LS373被锁定时,按键信号不能传入单片机,从而达到按键的锁定作用。

图2-6 输入电路

2.7 显示部分

LED数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a、b、c、d、e、f、g、p来表示。当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的字样了。如:显示一个“2”字,那么应当是a亮b亮g亮e亮d亮f不亮c不亮p不亮。LED数码管有微亮亮和超亮等不同之分,也有0.5寸、1寸等不同的尺寸。小尺寸数码管的显示笔画常用一个发光二极管组成,而大尺寸数码管是由二个或多个发光二极管组成,一般情况下,单个发光二极管的管压降为1.8V左右,电流不超过30mA。发光二极管的阳极连接到一起连接到电源正极称为共阳极数码管,发光二极管的阴极连接到一起连接到电源负极称为共阴极数码管。

常用LED数码管所显示的数字和字符是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。 显示电路见图2-7。

图2-7  显示电路

LED数码管引脚共阴和共阳两种方式:

电源VCC通过1个1K的排阻与LED相连,VCC串接个电阻后和GND接在任意2个脚上,组合有很多,但总有一个LED会发光的,找到一个就够了,然后GND不动,VCC(串电阻)逐个碰剩下的脚,如果有多个LED(一般是8个),那它就是共阴。相反用VCC不动,GND逐个碰剩下的脚,如果有多个LED(一般是8个),那它就是共阳。也可以直接用数字万用表,将档位拨到二极管通断性测试档,这时红表笔代表电源的正极,黑表笔代表电源的负极,然后在引脚上进行逐个测试,以确定是共阳还是共阴。一般十个引脚分别为7个段加2个公共加一个小数点。公共端一般在中间或在两边,两排,一排一个对称。至于其他引脚的排序你可以自己量出来。

先假设是共阴极或共阳极,假设中间那个就是公共端,用数字万用表逐个判断即可,如果判断错误不亮,就更改假设,继续判断。直到假设正确,也就是说判断正确,那么引脚的顺序和位置就出来。

数码管所使用的电流与电压

(1)电流:静态时,推荐使用10-15mA;动态时,16/1动态扫描时,平均电流为4-5mA,峰值电流50-60mA。

(2)电压:查引脚排布图,看一下每段的芯片数量是多少?当红色时,使用1.9V乘以每段的芯片串联的个数;当绿色时,使用2.1V乘以每段的芯片串联的个数。

2.8 其他功能部分

(1)出水控制

当MOT输出低电平时,三极管处于截至区,集电极和发射极导通,接触器常开触点闭合,出水管道导通。如图2-8所示。

图2-8  出水控制

(2)加热控制

当HOT输出低电平时,三极管处于截至区,集电极和发射极导通,接触器常开触点闭合,线圈通电加热。见图2-9。

图2-9 加热控制

3 智能饮水机的软件设计
3
.1 系统分配方式

在进行微机控制系统设计时,除了系统硬件设计外,大量的工作就是如何根据每个生产对象的实际需要设计应用程序。因此,软件设计在微机控制系统设计中占重要地位。对于本系统,软件更为重要。

在单片机控制系统中,大体上可分为数据处理、过程控制两个基本类型。数据处理包括:数据的采集、标度变换等。过程控制程序主要是使单片机按一定的方法进行计算,然后再输出,以控制其工作。

为了完成上述任务,在进行软件设计时,通常把整个过程分成若干个部分,每一部分叫做一个模块。所谓“模块”,实质上就是所完成一定功能,相对独立的程序段,这种程序设计方法叫模块程序设计法。

模块程序设计法的主要优点是:

(1)单个模块比起一个完整的程序易编写及调试;

(2)模块可以共存,一个模块可以被多个任务在不同条件下调用;

(3)模块程序允许设计者分割任务和利用已有程序,为设计者提供方便。

本系统软件采用模块化结构,由主程序、温度检测程序、显示子程序、延时程序和其他相关程序等组成。


3.2 主程序设计

程序的初始化主要包括三个环节:

(1)实现各种设置堆栈指针、定时器/计数器0初始化、以及开中断、定时器/计数器启动;

(2)实现LED显示当前水温并能显示预设的水温;

(3)不断的进行按键扫描,判断是否有按键按下,如没有按键按下,则返回显示;如有按键按下,则根据所按键实现相应的操作。

人机对话功能键设置如下:

(1)“出水”键:控制其出水和停止出水;

(2)“加热”键:控制其加热和停止加热;

(3)“锁定”键:用于锁定其他所有按键;

(4)“切换”键:用于将显示器切换至温度设定界面并开始设定温度;

(5)“设置温度”键:以5℃为间隔在0℃至100℃之间以递增方式设定水温。

主程序如下:

void main()
{
  T=100;
  while(1)
  {
       Lock_key();
       if(Lock==0)
       keyscan();
       if(flag2==0)
       temp_display();
       if(flag2==1)
       SEG_display(T,0);
       if(temp>=T*10)  {Temp_led=0;Hot=1;Hot_led=1;}
       if(temp< T*10)  Temp_led=1;
       if(temp>=1000){Beep=0;Hot=1;Hot_led=1;}
       if(temp<1000) Beep=1;   
   }

}

主程序程序框图如图3-1所示:


3.3 各模块程序设计
3.3.1 温度检测程序设计

温度检测运用DS18B20芯片,因为其功能全面且精度高,完全可以满足设计要求,它将检测到的水温送给单片机,再由单片机输出给显示电路将实时水温显示出来。其程序流程图如下:

图3-2 温度检测程序流程图

其程序段如下:

void init_ds18b20()
{
uchar x=0;
DQ = 1;                                       //DQ复位
delay_us(10);                               //稍做延时
DQ = 0;                               //单片机将DQ拉低
delay_us(100);                   //精确延时 大于 480us
DQ = 1;                                      //拉高总线
delay_us(10);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_us(20);
}
uchar ReadOneChar()
     {
                uchar i;
                uchar dat=0;
                for (i=8;i>0;i--)
                {
                DQ = 0;              
                dat>>=1;
                DQ = 1;                           
                if(DQ)
                dat|=0x80;
                  delay_us(10);
      }
                return(dat);
      }
void WriteOneChar(uchar dat)
      {
      uchar i;
      for (i=8; i>0; i--)
      {
      DQ = 0;
      DQ = dat&0x01;
      delay_us(10);
      DQ = 1;
      dat>>=1;
      }
      }
int ReadTem()
{
      int t;
      uchar a,b;
     init_ds18b20();
      WriteOneChar(0xcc);       // 跳过读序号列号的操作
      WriteOneChar(0x44);                // 启动温度转换
      delay_us(200);
      init_ds18b20();
      WriteOneChar(0xcc);         //跳过读序号列号的操作
      WriteOneChar(0xbe);             //读取温度寄存器等
      a=ReadOneChar();
     b=ReadOneChar();
     t=b;
     t<<=8;
     t=t|a;
     return t;
}
void temp_display()
     {
              uint  temp_point;
temp=ReadTem()*0.625;           //将温度的高位与低位合并
     temp_point=temp%10;                   //取出小数位
     SEG_display(temp/10,temp_point);
     }
3.3.2 显示程序设计

显示程序是负责点亮4支数码管,并根据单片机送出的数据及时更新显示的数据,其程序流程图如下:

图3-3 显示程序流程图

其程序段如下:

void SEG_display(uchar dat1,uchar dat2)
{
    P23=1;
   P0=table[dat1/100];
   P20=0;
   delay_us(80);

    P20=1;
    P0=table[dat1/10%10];
    P21=0;
    delay_us(80);

   P21=1;
    P0=table[dat1%10]|0x80;
    P22=0;
    delay_us(80);

   P22=1;
   P0=table[dat2];
   P23=0;
    delay_us(80);
}
3.3.3 键盘扫描程序

键盘扫描程序的任务是在程序运行过程中始终不停的检测是否有按键被按下,如果检测到有按键被按下,则进入与该按键对应的程序运行;若该按键没有被按下,则继续检测下一个按键,如此循环,从而完成每一个按键所对应的功能。该设计中第四个按键为锁定键,当检测到锁定键被按下时,其他按键均无效,只有当检测到锁定键再次被按下,其他按键的功能才恢复正常。其程序流程图如下:



图3-4 键盘扫描程序流程图

其程序段如下:

void keyscan()
{
                if(key1==0)
  {
                delay_ms(2);
                if(key1==0)
              {
    flag=~flag;
              if(flag==1)
    Out=0;
              if(flag==0)
   Out=1;
              }
              while(!key1);
}
              if(key2==0)
              {
              delay_ms(2);
              if(key2==0)
              {
   flag1=~flag1;
if(flag1==1)
   {Hot=0;Hot_led=0;}
if(flag1==0)
{Hot=1;Hot_led=1;}
}
              while(!key2);
}
              if(key3==0)
              {
              delay_ms(2);
              if(key3==0)
              {
   if(flag2==1) T+=5;
   if(T>=101)T=0;
}
              while(!key3);
  }
              if(key5==0)
{
              delay_ms(2);
              if(key5==0)
{
flag2=~flag2;
              }
              while(!key5);
    }
}
void Lock_key()                           // 锁定键盘
    {
                if(key4==0)
   {
              delay_ms(2);
              if(key4==0)
              {
              Lock=~Lock;
  if(Lock==1)
Lock_led=0;
                if(Lock==0)
    Lock_led=1;
                }
                while(!key4);
  }
}
3.3.4 延时程序
void delay_us(uchar i)                                // us延时函数
     {
                while(i--);
     }

void delay_ms(uchar n)                           //延时10×n毫秒程序
     {
     uint i,j;
     for(i=0;i<n;i++)
     for(j=0;j<2000;j++);
}
4 调试及性能分析4.1 软件调试

软件调试用Keil uVision2软件,将写好的程序编译成16进制文件,然后才可以在proteus中将编译好的程序放入单片机进行仿真,使用Keil uVision2对程序编译的过程如下。

4.1.1 新建工程

在Keil uVision2中新建一个工程,使用AT89C52系列,如图4-1所示。

图4-1 新建工程
4.1.2 新建文本

在Keil uVision2中新建一个文本并保存,扩展名为.c,如图4-2所示。

图4-2 新建文本
4.1.3 添加文本

将新建的文本添加到所建工程中,如图4-3所示。

图4-3 添加文本
4.1.4 程序编译

在添加进去的文本中输入写好的程序后编译,显示无误后自动生成16进制文件,此文件才可放入proteus中进行仿真,如图4-4所示。

图4-4 程序编译
4.2 硬件调试

使用proteus仿真软件对硬件电路进行仿真,将编译好的程序放入单片机中开始运行程序。并通过按键检验各个功能的实现,从而完成设计中所有要求的仿真。

以下演示各模块电路的proteus仿真。

4.2.1 电源电路的仿真

当饮水机通电后,电源指示灯亮,此时各模块均通电,才能保证饮水机的正常工作。如图4-5所示。

图4-5 电源电路的仿真
4.2.2 出水电路模块的仿真

在通电状态下按下出水键,电动机开始转动,表示饮水机开始出水,如图4-6所示。

图4-6 出水模块的仿真
4.2.3 加热模块电路的仿真

在通电状态下按下加热键,饮水开始加热,加热指示灯(黄色)亮,再次按下加热键则停止加热,指示灯灭,如图4-7所示。

图4-7 加热模块的仿真
4.2.4 显示模块电路的仿真

本设计采用4个LED来显示当前的水温或设定的水温,当前水温由DS18B20检测到的温度决定,如图4-8所示。此时显示温度为55℃。

图4-8 显示电路的方针
4.2.5 报警电路的仿真

(1)当水加热至沸腾后,饮水机报警电路工作,使其自动停止加热并蜂鸣器响起、红灯亮表示报警,如图4-9;

图4-9 水沸腾时报警

(2)当水加热至设定温度时,报警电路工作,使其自动停止加热并红灯亮报警,如图4-10。此时设定温度为35℃。

图4-10 水加热至设定温度时报警(35℃)
4.3 性能分析

DS18B20的测温精度为0.5℃,其精度完全能满足饮水机的测温需求,其测温范围是-55℃~+125℃,但在此次设计中只要求显示的水温范围是0℃~100℃,因为水温达到100℃时沸腾自动停止加热。

通过软件和硬件的仿真,各部分电路均能按照设计要求运行,实现了设计的所有要求,说明本设计完全符合设计要求,实现了预期的目的,设计成功。


本次智能饮水机的控制系统改良设计,主要是针对目前市面上饮水机某些方面的不足进行改良设计。本文主要是针对目前绝大多数饮水机只具有一般的加热、保温功能,已经很难满足消费者不断提高的要求,所以我们有必要对其进行改良设计,使他能够满足人们生活水平不断提高的要求。

本文主要介绍了按键控制饮水机的总体设计、硬件系统设计、软件系统设计以及调试方法。通过不断的设计调试及改良,选出最优方案,所选方案具有功能强、精度高、可靠性好、稳定性高、抗干扰性强等特点。设计的饮水机除按键控制之外,还具有防干烧、设定温度、故障报警等功能。

在这次毕业设计的过程中,我发现自己许多不足的地方。不过通过边学习边做毕业设计使我掌握了单片机的软、硬件基础知识,全面的提高了使用proteus软件进行硬件仿真的能力以及使用Keil uVision2软件进行程序编译的能力。在不断提高我的自学能力,分析问题、解决问题的能力的同时也考验了我们借助互联网络搜集、查阅相关书籍资料,和组织材料的综合能力;在学习新知识时,从基础学起。在这次设计的学习、设计、制作与调试过程中,遇到了不少麻烦和困难,通过不断的查阅资料分析解决,另外自己解决不了的问题向指导老师请教, 使我能顺利完成这次毕业设计!



致 谢

毕业设计是对我们知识运用能力的一次全面的考核, 也是对我们进行科学研究基本功的训练, 培养我们综合运用所学知识独立地分析问题和解决问题的能力, 为以后撰写专业学术论文和工作打下良好的基础。

本篇论文虽然凝聚着自己的汗水,但却不是个人智慧的产品,没有导师的指引和帮助,没有父母和朋友的帮助和支持,我在大学的学术成长肯定会大打折扣。本次设计能够顺利完成,首先我要感谢我的母校——河南理工大学万方科技学院,是他为我们提供了学习知识的沃土,使我们在这里茁壮成长;其次我要感谢电气工程及其自动化学院的老师们,他们不仅教会我们专业方面的知识,而且教会我们做人做事的道理;尤其要感谢在本次设计中给与我大力支持和帮助的李辉老师,每有问题,老师总是耐心的解答,使我能够充满热情的投入到毕业设计中去;还要感谢我的同学们,他们热心的帮助,使我感到了来自兄弟姐妹的情谊; 最后还要感谢相关资料的编著者和给予我们支持的社会各界人士, 感谢您们为我们提供一个良好的环境,使本次设计圆满完成。

再次由衷感谢答辩组的各位老师对学生的指导和教诲,我也在努力的积蓄着力量,尽自己的微薄之力回报母校的培育之情,争取使自己的人生对社会产生些许积极的价值!



附录1

图附-1  电路原理图




附录2
表附-1  元件明细表
元件名
型号
数量
电阻
7WATT3R9
若干
数码管
7SEG-MPX2-CA
1
二极管
1N914
6
稳压器
7805
1
单片机
AT89S52
1
按键
BUTTON
5
蜂鸣器
BUZZER
1
电容
CAP
5
晶振
CRYSTAL
1
继电器
RLY-SPNO
2
发光二极管(红)
LED-RED
1
发光二极管(黄)
LED-YELLOW
1
发光二极管(绿)
LED-GREEN
1
发光二极管(蓝)
LED-BLUE
1
三极管
FZT790A
3
电阻排
RESPACK-8
2
变压器
TRAN-2P2S
1
导线
2.5平方厘米
若干
电机

1


附录3
控制程序:
单片机源程序如下:
  1. #include<reg52.h>

  2. #define uchar unsigned char
  3. #define uint  unsigned int

  4. sbit   key1=P3^0;                                    //按键定义
  5. sbit   key2=P3^1;
  6. sbit   key3=P3^2;
  7. sbit   key4=P3^3;
  8. sbit   key5=P3^4;

  9. sbit   Out =P1^3;                                 //控制端口定义
  10. sbit   Hot =P1^5;
  11. sbit   Hot_led =P1^1;
  12. sbit   Temp_led=P1^2;
  13. sbit   Beep=P1^4;
  14. sbit   Lock_led=P1^0;

  15. sbit   P20=P2^0;                                //数码管位选定义
  16. sbit   P21=P2^1;
  17. sbit   P22=P2^2;
  18. sbit   P23=P2^3;
  19. sbit   P24=P2^4;

  20. sbit   DQ  =P1^7;                           //ds18b20 端口定义


  21. uchar code table[]={
  22. 0x3f,0x06,0x5b,0x4f,0x66,
  23. 0x6d,0x7d,0x07,0x7f,0x6f
  24. };
  25. uchar code table1[]={
  26. 0x00,0x01,0x03,0x07,0x0f
  27. };

  28. bit   Lock,flag,flag1,flag2;
  29. uint  temp,T;

  30. //***************************延时函数***************************
  31. void delay_us(uchar i)                                              // us延时函数
  32.    {
  33.               while(i--);
  34.   }

  35. void delay_ms(uchar n)                           //延时10×n毫秒程序
  36.   {
  37.     uint i,j;
  38.     for(i=0;i<n;i++)
  39.     for(j=0;j<2000;j++);
  40.   }

  41. //***************************数码管显示*************************
  42. void SEG_display(uchar dat1,uchar dat2)
  43. {
  44.    P23=1;
  45.    P0=table[dat1/100];
  46.    P20=0;
  47.    delay_us(80);

  48.    P20=1;
  49.    P0=table[dat1/10%10];
  50.    P21=0;
  51.    delay_us(80);

  52.    P21=1;
  53.    P0=table[dat1%10]|0x80;
  54.    P22=0;
  55.    delay_us(80);

  56.    P22=1;
  57.    P0=table[dat2];
  58.    P23=0;
  59.    delay_us(80);

  60. }

  61. //***************************18b20测温***********************//

  62. //*********18B20初始化
  63. void init_ds18b20()
  64. {
  65. uchar x=0;
  66. DQ = 1;                                             //DQ复位
  67. delay_us(10);                                        //稍做延时
  68. DQ = 0;                                    //单片机将DQ拉低
  69. delay_us(100);                            //精确延时 大于 480us
  70. DQ = 1;                                            //拉高总线
  71. delay_us(10);
  72. x=DQ;     //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  73. delay_us(20);
  74. }

  75. //*********读一个字节
  76. uchar ReadOneChar()
  77. {
  78. uchar i;
  79. uchar dat=0;
  80. for (i=8;i>0;i--)
  81. {
  82.   DQ = 0;              
  83.   dat>>=1;
  84.   DQ = 1;                           
  85.   if(DQ)
  86. dat|=0x80;
  87.   delay_us(10);
  88.   }
  89. return(dat);
  90.   }


  91. //*********写一个字节
  92. void WriteOneChar(uchar dat)
  93.    {
  94.     uchar i;
  95.     for (i=8; i>0; i--)
  96.     {
  97.    DQ = 0;
  98.    DQ = dat&0x01;
  99.     delay_us(10);
  100.     DQ = 1;
  101.     dat>>=1;
  102.     }
  103.    }

  104. //*********读取温度
  105. int ReadTem()
  106. {
  107.     int t;
  108.     uchar a,b;
  109.     init_ds18b20();
  110.     WriteOneChar(0xcc);                   // 跳过读序号列号的操作
  111.     WriteOneChar(0x44);                          // 启动温度转换
  112.     delay_us(200);
  113.     init_ds18b20();
  114.     WriteOneChar(0xcc);                     / /跳过读序号列号的操作
  115.     WriteOneChar(0xbe);                         //读取温度寄存器等
  116.     a=ReadOneChar();
  117.     b=ReadOneChar();
  118.     t=b;
  119.     t<<=8;
  120.     t=t|a;
  121.     return t;
  122. }

  123. //*********显示温度
  124. void temp_display()
  125.     {
  126.               uint  temp_point;
  127.     temp=ReadTem()*0.625;              //将温度的高位与低位合并
  128.     temp_point=temp%10;                             //取出小数位
  129.     SEG_display(temp/10,temp_point);
  130.    }
  131. //************************键盘扫描程序************************//
  132. void keyscan()
  133. {
  134.               if(key1==0)
  135.               {
  136.               delay_ms(2);
  137.               if(key1==0)
  138.    {
  139.     flag=~flag;
  140.               if(flag==1)
  141.     Out=0;
  142.               if(flag==0)
  143.     Out=1;
  144.               }
  145.               while(!key1);
  146.                 }
  147.               if(key2==0)
  148.               {
  149.               delay_ms(2);
  150.               if(key2==0)
  151.               {
  152.     flag1=~flag1;
  153.               if(flag1==1)
  154.     {Hot=0;Hot_led=0;}
  155.               if(flag1==0)
  156.     {Hot=1;Hot_led=1;}
  157.               }
  158.               while(!key2);
  159.                 }
  160.               if(key3==0)
  161.               {
  162.               delay_ms(2);
  163.               if(key3==0)
  164.               {
  165.     if(flag2==1) T+=5;
  166.     if(T>=101)T=0;
  167.               }
  168.               while(!key3);
  169.                 }
  170.               if(key5==0)
  171.               {
  172.               delay_ms(2);
  173.               if(key5==0)
  174.               {
  175.               flag2=~flag2;
  176.               }
  177.               while(!key5);
  178.                 }
  179. }
  180. void Lock_key()                                       // 锁定键盘
  181.     {

  182. ……………………

  183. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

完整的Word格式文档51黑下载地址:
毕业设计(论文)-基于单片机的智能饮水机的设计.doc (844.5 KB, 下载次数: 275)

评分

参与人数 2黑币 +10 收起 理由
the-sunset + 5 很给力!
韵律泳 + 5 很给力!

查看全部评分

回复

使用道具 举报

火云邪神X 发表于 2018-4-11 15:09 | 显示全部楼层
好帖子呀,学习了

评分

参与人数 1黑币 +5 收起 理由
韵律泳 + 5 很给力!

查看全部评分

回复

使用道具 举报

韵律泳 发表于 2018-4-18 15:02 | 显示全部楼层
学习了
回复

使用道具 举报

0407cy 发表于 2018-5-2 19:59 | 显示全部楼层
好帖子
回复

使用道具 举报

陈树嘉 发表于 2019-2-26 16:14 | 显示全部楼层
烧录没现象,,
回复

使用道具 举报

NDD 发表于 2019-4-6 21:05 | 显示全部楼层
你好,源文件可否给一份看看
回复

使用道具 举报

tigerlyt 发表于 2019-4-26 18:33 | 显示全部楼层
很好的作品,支持。
回复

使用道具 举报

yyhlsf 发表于 2019-4-26 22:27 来自手机 | 显示全部楼层
tigerlyt 发表于 2019-4-26 18:33
很好的作品,支持。

是的呢
回复

使用道具 举报

zealous 发表于 2019-4-28 17:39 | 显示全部楼层
请问有人做出来了吗 我照着楼主的代码和仿真图做 没有现象 不知道是哪个地方出问题了
回复

使用道具 举报

1722448571 发表于 2019-5-10 15:11 | 显示全部楼层
学习了
回复

使用道具 举报

宋小宝宝 发表于 2019-5-22 02:46 来自手机 | 显示全部楼层
zealous 发表于 2019-4-28 17:39
请问有人做出来了吗 我照着楼主的代码和仿真图做 没有现象 不知道是哪个地方出问题了

程序不够吧
回复

使用道具 举报

15296034534 发表于 2019-7-26 15:28 | 显示全部楼层
还不错 挺详细的
回复

使用道具 举报

风枫丶丶 发表于 2019-10-27 22:37 | 显示全部楼层
感谢分享
回复

使用道具 举报

gchq521 发表于 2019-10-31 21:44 | 显示全部楼层
太好了 感谢分享~
回复

使用道具 举报

钱茹意 发表于 2019-11-17 11:46 来自手机 | 显示全部楼层
AD原理图有吗?能发一下吗?
回复

使用道具 举报

lele5211314 发表于 2019-11-17 15:52 | 显示全部楼层
没有一点实际意义,这类的文档,应该被砍掉
回复

使用道具 举报

你哥哥 发表于 2019-12-3 00:20 | 显示全部楼层
很给力
回复

使用道具 举报

shutong13 发表于 2019-12-12 12:10 | 显示全部楼层
谢谢大佬分享 给了
回复

使用道具 举报

bzmjj 发表于 2020-3-5 14:56 | 显示全部楼层
文档很好
回复

使用道具 举报

123HT 发表于 2020-3-7 14:57 | 显示全部楼层
牛逼,非常好
回复

使用道具 举报

ltk990814 发表于 2021-1-5 15:27 | 显示全部楼层
有没有做出实物的好兄弟康康
回复

使用道具 举报

zhangleixbyl 发表于 2021-1-14 18:23 来自手机 | 显示全部楼层
好文章,写的真详细。我这初学者太需要了。万分感谢!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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