基于单片机的电冰箱温度控制系统设计与模拟
基于单片机的电冰箱温度控制系统设计与模拟,基于,单片机,电冰箱,温度,控制系统,设计,模拟,摹拟
摘 要随着家庭生活质量的提高,现在市场需要智能控制的电冰箱。单片机的发展正好迎合了这种需求,本次设计中将使用单片机控制电冰箱的温度。本文设计的基于单片机的电冰箱温度控制系统是主要使用温度传感器DS18B20和STC89C51单片机,从而达到模拟控制电冰箱温度的目的。本设计可实现电冰箱温度设置并由LCD1602显示、4位集成式七段共阴极数码管显示电冰箱温度、快速冷冻、开门超过3min报警等功能。本文对用到的器件和程序的设计做了详细的介绍。经由Proteus软件仿真和实物模拟,验证了此次设计的可行性。关键词:单片机;电冰箱;温度控制IABSTRACTWith the improvement of the quality of family life, the market needs intelligent refrigerator. The development of single-chip microcomputer just caters to this demand. This design will use single-chip microcomputer to control the temperature of refrigerator.In the paper, the temperature control system of refrigerator based on MCU is designed mainly by the temperature sensor DS18B20 and STC89C51 MCU, so as to achieve the purpose of simulating the temperature of the refrigerator. This design can realize refrigerator temperature setting and display by LCD1602, 7SEG-MPX4-CC display refrigerator temperature, fast freezing, open over 3min alarm and so on. This paper introduces the design of the device and program used in detail.The feasibility of the design is verified by Proteus software simulation and physical simulation.Key Words:MCU; Refrigerator; Temperature control- 55 -目 录摘 要I1 绪论- 1 -1.1课题研究背景及目的- 1 -1.2 电冰箱的基本介绍- 1 -1.3 本设计研究内容- 2 -2 总体设计方案- 3 -2.1 功能要求- 3 -2.2 设计方案- 3 -3 系统硬件设计- 4 -3.1 8051系列单片机介绍- 4 -3.2 温度传感器DS18B20- 6 -3.3 1602字符型液晶- 7 -3.4 4位集成式七段共阴极数码管显示电路- 8 -3.5 IIC接口芯片PCF8574- 10 -3.6 报警电路- 11 -3.7 辅助功能电路- 12 -4 系统软件程序设计- 13 -4.1 程序设计思路- 13 -4.1 DS18B20子程序- 13 -4.2 数码管显示温度子程序- 15 -4.3 IIC总线通用驱动程序- 16 -4.4 LCD 1602显示设定温度子程序- 16 -4.5 报警程序- 19 -5 Proteus软件仿真和实物模拟- 20 -5.1 Proteus软件仿真- 20 -5.2 实物仿真- 25 -6 结论- 31 -参 考 文 献- 32 -致 谢- 33 -附录A IIC总线通用驱动程序- 34 -附录B 程序源代码- 36 -附录C 外文翻译- 48 -附录D 外文原文- 52 -基于单片机的电冰箱温度控制系统设计与模拟1 绪论1.1 课题研究背景及目的电冰箱是利用电能在箱体内形成低温环境,用于冷藏冷冻各种食品和其他物品的家用电器设备。电冰箱是每个家庭现代化厨房必备的家用电器,它的主要任务就是控制压缩机、化霜加热等来保持箱内食品的最佳温度,达到食品保鲜的目的,即保证所储存的食品在经过冷冻或冷藏之后,保持色、味、水分、营养基本不变。电冰箱是第一次家电革命浪潮的主导产品,是每个家庭必备的电器设备。从1918年世界上第一台电机压缩式电冰箱研制成功,至今已走过89个年头。这期间,随着科学技术的飞速发展,电冰箱也在不断的演变和更新,尤其是近年来高新技术的迅猛崛起,更使得电冰箱的发展日新月异。传统的机械式直冷式电冰箱的控制原理是根据蒸发器的温度控制制冷压缩机的启、停,使电冰箱内的温度保持在设定温度范围内。一般,当蒸发器温度升至35时启动压缩机制冷;当温度低于-10-20时停止制冷,关断压缩机。随着家用电冰箱的普及,人们对电冰箱的控制功能要求越来越高,这对电冰箱控制器提出了更高的要求,多功能、智能化是其发展方向之一,传统的机械式、简单的电子控制已经难以满足发展要求。家用电冰箱的主要发展趋势朝容量及功能两个方向发展,其中以大型化、多功能化、全自动化为主。其中,其功能的发展主要依靠电冰箱电控系统的不断发展和完善,传统的机械式、简单的电子控制已经难以满足发展要求,因此,这对电冰箱控制器提出了更高的要求,电冰箱的电控系统的发展也成为了电冰箱功能不断提高的关键。单片机的出现及应用使电冰箱电控系统的简化和完善有了很大的进步。如目前已经把电脑和数控技术相结合,开发出了数控冰箱,以及具有模糊逻辑思维功能的变频式空调等。电冰箱一般设有冷冻室和冷藏室。冷冻室的温度为:-16-24。冷藏室的温度为:28。电冰箱控制的主要任务就是保持箱内食品最佳温度,达到食品保鲜的目的。9而此次设计的目的则是熟悉单片机的开发过程,以电冰箱为背景,熟练应用单片机的内部资源和外围器件。1.2 电冰箱的基本介绍冰箱的基本原理很简单:冰箱利用液体蒸发吸收热量。冰箱中使用的液体(即制冷剂)会在极低的温度蒸发,使冰箱内部保持冰冻温度。所有冰箱都由五个基本部件组成:10压缩机热交换管,冰箱外部呈弯曲或盘曲状的管道安全阀冷交换管,冰箱内部呈弯曲或盘曲状的管道制冷剂,冰箱内蒸发以制造低温的液体很多工业冰箱使用纯氨作为制冷剂,纯氨在-32时蒸发。压缩机压缩制冷剂气体,这将升高制冷剂的压力和温度(橙色),而冰箱外部的热交换线圈帮助制冷剂散发加压产生的热量。当制冷剂冷却时,制冷剂化成液体(紫色),并流经安全阀。当制冷剂流经安全阀时,液态制冷剂从高压区流向低压区,因此她会膨胀并蒸发(浅蓝色)。在蒸发过程中,它会吸收热量,发挥制冷效果。冰箱内的线圈帮助制冷剂吸收热量,使冰箱内部保持低温。然后,重复该循环。1.3 本设计研究内容在本次课题研究中我将参考从各个方面收集到的文献,取其精华。研究方法则是采用51单片机开发板模拟电冰箱工作,以熟练单片机的开发过程。研究的内容主要包括以下方面:(1) 设定电冰箱温度并显示;(2) 显示当前电冰箱的温度;(3) 电冰箱有快速冷冻功能;(4) 电冰箱有开门超过3min自动报警功能。在本文中将介绍基于单片机的电冰箱温度控制系统总体设计思想和方案及用得到的部分芯片及硬件设计的原理,还有软件设计过程中的思想和方法,在附录中会给出C语言编写的源代码,在正文第五章会给出Proteus仿真电路图。2 总体设计方案2.1 功能要求1、 显示当前电冰箱的温度;2、 能够设定电冰箱温度,并显示;3、 电冰箱有快速冷冻功能;4、 电冰箱开门超过3min发出警报;5、 其他辅助功能,是为了更好的模拟电冰箱,如:用户使用快速冷冻功能时,会有相应的指示灯亮。2.2 设计方案本系统以STC89C52单片机为核心,利用其内部资源和外部设备完成模拟。为了能够采集温度,我们选用温度传感器DS18B20;为了显示当前电冰箱的温度,我们选用4位集成式七段共阴极数码管;为了能够设定电冰箱温度选用两个按键,一个用来升高温度,一个用来降低温度;选用LCD 1602显示设定的电冰箱温度,开门超过3min报警可以利用单片机的内部资源和蜂鸣器实现;压缩机的运转由直流电动机的运转表示;其他辅助功能,借助于LED小灯、按键、开关实现,如按下开门开关,开门灯亮,使用快速冷冻功能,快速冷冻指示灯亮,电机运转时,电机指示灯亮。设计方案结构框图如图2.1所示。图2.1 设计方案结构框图3 系统硬件设计3.1 8051系列单片机介绍8051系列单片机拥有64kB程序存储空间和64kB数据存储空间,共有111条指令。有5个中断源,分为2个优先级。同时8051单片机还有4个并行I/O口P0、P1、P2、P3都既能作输入口又能作输出口,其中P0和P2口可以作外部扩展。28051单片机内部有两个16位定时器/计数器,可进行定时或计数操作。采用40引脚双列直插DIP封装的8051单片机引脚分配图如图3.1所示。图3.1 8051单片机引脚分配图在本次设计中P0口、P1口、P2口未作特殊使用,现在只对P3口第二功能做介绍。P3.0和P3.1可用作串行口的收发,P3.2和P3.3可用作外部中断,P3.4和P3.5可用作定时器或计数器。其他引脚说明如下:表3.1 单片机特殊引脚说明RST复位脚XTAL2晶振脚(续表)XTAL1晶振脚GND电源负极,接地VCC电源正极内外存储器选择引脚ALE地址锁存允许信号输出引脚/编程脉冲输入引脚外部程序存储器选通信号输出引脚关于特殊功能寄存器,如:IE、IP、TOMD、TCON、T0(TH0,TL0)、T1(TH1,TL1)的应用,会在之后的软件程序设计中,定时器、中断的使用时再详细介绍。根据上述的介绍,我们可以设计出晶振电路和复位电路,如图3.2和图3.3所示。图3.2 晶振电路图3.3 复位电路3.2 温度传感器DS18B20DS18B20是一款温度传感器,单片机可以通过单总线协议与DS18B20进行通信,最终将温度读出。图3.4给出了DS18B20的外部引脚。其中GND接低电平,DQ为数据引脚,根据供电方式的不同,VDD的连接方式不同。3 图3.4 DS18B20温度传感器外部引脚单总线的硬件接口很简单,只需要把DS18B20的DQ引脚和单片机的一个IO口接上就可以了。在此次设计中,DS18B20与单片机的连接如图3.4所示。图3.5 DS18B20与单片机的连接硬件的简单,随之而来的,就是软件时序的复杂,1-Wire总线的时序比较复杂,现在给出DS18B20的复位、写/读操作时序,如图3.6、图3.7、图3.8所示。图3.6 复位时序图3.7 写时序图3.8 读时序时序图在硬件连接时没有太大的作用,在软件程序设计时才用得到,在对DS18B20程序设计时会有相应的初始化、写、读程序。3.3 1602字符型液晶1602字符型液晶也叫1602液晶,它是一种工业型点阵液晶显示,能够显示字母、数字、符号等。1显示容量,可以显示2行,每行16个字符。1602引脚如图3.9所示。图3.9 1602液晶引脚1602液晶各引脚功能如表3.2所示表3.2 1602液晶引脚功能2引脚号引脚名称引脚说明1VSS电源地2VCC电源正极3V0对比度调整4RS寄存器选择RS=0选择命令/状态寄存器,RS=1选择数据寄存器5R/W读写控制引脚(R/W=0写指令或数据,R/W=1读状态)6E液晶使能端E=1使能,E=0禁止714DB0DB7液晶数据/命令字节输入端口,状态寄存器字节输出端口15BLKA液晶背光源正极16BLKB液晶背光源负极控制1602液晶屏的显示,需要了解其命令集。1602液晶命令集如图所示。通过命令集,我们可以控制1602液晶屏初始化设置、写LCD命令、发送数据、在指定位置显示字符串。 本设计中会在液晶屏上显示特殊字符,如摄氏温度符号,此时需要用到字符编码表。3.4 4位集成式七段共阴极数码管显示电路4位集成式七段共阴极数码管(7SEG-MPX4-CC),CC表示共阴,MPX4表示4位复用。其管脚图如图3.10所示。图3.10 7SEG-MPX4-CC管脚图由于4位集成式数码管是共阴的,从“纵向”看,任意一个数码管内AG、DP各段的阴极连接在一起,4只数码管分别引出共阴极1、2、3、4。在本次设计中,7SEG-MPX4-CC与单片机的连接如图3.11所示。1图3.11 7SEG-MPX4-CC与单片机连接图图3.11中的74LS245是驱动器,当单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入总线驱动器。根据上述的构造可知,任何时候发送的段码都会传送给所有数码管的各段,管段是否被点亮决定于数码管的共阴极14是否连接高电平。如果它们同时连接高电平,则所发送的数字将同时显示在四只数码管上。如果各数码管要分别独立显示,显然不能让所有位引脚同时为高电平。对于如何使数码管同时显示不同的数字,将在软件设计部分做详细介绍。3.5 IIC接口芯片PCF8574在对上面的两个显示电路设计后,发现它们占用太多单片机的管脚,于是便考虑减少单片机管脚的使用。IIC接口只需要占用单片机2只管脚,符合设计的需求。PCF8574是CMOS电路。它通过两条双向总线(IIC)可使大多数MCU实现远程I/O口扩展。该器件包含一个8为准双向口和一个IIC总线接口。PCF8574电流消耗很低,其口输出锁存具有大电流驱动能力,可直接驱动LED。它还带有一条中断接线(INT)可与MCU的中断逻辑相连。通过INT发送中断信号,远端I/O口不必经过IIC总线通信就可通知MCU是否有数据从端口输入。这意味着PCF8574可以作为一个单被控器。5PCF8574管脚图如图3.12所示,管脚功能如表3.4所示。图3.12 PCF8574管脚图表3.4 PCF8574管脚功能表标号管脚功能A01地址输入0A12地址输入1A23地址输入2P04准双向I/O口0P15准双向I/O口1(续表)P26准双向I/O口2P37准双向I/O口3VSS8接地P49准双向I/O口4P510准双向I/O口5P611准双向I/O口6P712准双向I/O口7/INT13中断输入(低电平有效)SCL14串行时钟线SDA15串行数据线VDD16电源在本次设计中,PCF8574用于单片机和LCD 1602的连接,连接方式见图3.13。图3.13 单片机、PCF8574与LCD 1602连接图3.6 报警电路报警电路特别简单,只有一个蜂鸣器和一个警报灯组成。发出警报时蜂鸣器发出报警声,警报灯闪烁,直到冰箱门关闭。报警电路如图3.14所示。图3.14 报警电路3.7 辅助功能电路辅助电路主要是一些指示灯和一些功能键,用来设定温度的两个键,一个开/关开关,一个快速冷冻开关,一个电机开关,这些器件的连接如图3.15所示。另一电路,则是用直流电机的运行代替压缩机的运行,直流电机的电路连接如图3.16所示。图3.15 辅助功能电路图3.16 直流电机电路4 系统软件程序设计4.1 程序设计思路整个程序应该由多个子程序和一个主程序组成,子程序应该包括DS18B20子程序(用来采集温度)、数码管显示温度子程序、1602显示子程序。超过3min报警程序需要使用定时器中断,设定温度需要用到外部中断。主程序主要是控制指示灯和电动机的运转,在主程序中一定要注意延时,否则数码管显示不稳定。4.1 DS18B20子程序此程序的目的是将DS18B20测出的温度值存放在Temp_Value中,以供数码管显示。根据DS18B20温度传感器的初始化、写/读时序图,分别设计了对应的初始化函数、写一字节函数、读一字节函数以及读取温度值函数。下面给出这些函数的流程图。图4.1 初始化函数流程图图4.2 写一字节函数流程图图4.3 读一字节函数流程图图4.4 读取温度值函数流程图在写DS18B20程序时一定要注意延时,延时的时间不够会导致程序出错,根本无法读取温度。根据这4幅流程图我们可以看出,最后的读取温度值函数的编写是建立在前三个函数正确的基础上的,所以在写完函数后一定要测试,确保其正确性。本次设计中用到的这4个函数的详细内容,在附录D程序源代码中可以查看。4.2 数码管显示温度子程序对于集成式数码管,任何时候发送的段码会被所有数码管收到,如果电路中所有共阴极数码管的位码均为1,则所有数码管都会显示同一字符。为了使不同的数码管显示不同字符,在程序设计中集成式数码管显示常用的动态扫描显示技术,它利用人的视觉暂留。在选通第一只数码管时,发送第一个数字的段码,选通第二只数码管时发送第二个数字的段码,以此类推,每次仅选通一只数码管,发送对应的段码。切换选通下一数码管并发送相应段码的时间间隔非常短,视觉暂留使人感觉不到字符是一个接一个显示在不同数码管上,而会觉得到所有字符是很稳定地“同时”显示在不同数码管上。1数码管的显示需要借助DS18B20程序,程序设计流程图如图4.5所示。图4.5 数码管显示程序流程图数码管显示程序一定要注意数码管的刷新时间,刷新时间过长整个数码管会“跳动”显示,观察到的现象就是数码管一闪一闪的。数码管显示程序的具体内容见附录B程序源代码。4.3 IIC总线通用驱动程序IIC总线通用驱动程序提供了IIC总线所有的底层操作函数,包括起始、停止、字节写、字节读+应答、字节读+非应答。具体的程序见附录A。4.4 LCD 1602显示设定温度子程序LCD 1602程序的目的是在液晶屏上显示设定的温度,为了能在液晶屏上显示还需要液晶屏使能函数、写命令函数、写数据函数、设置显示位置函数、显示字符串函数,另外在使用LCD 1602时必须要对做初始化操作。具体的函数内容如下:/液晶屏使能 void Enable_LCD_write() LCD_data|=(1(3-1);/E=1; Write_Random_Address_Byte(0x40,LCD_data); delay_nus(2); LCD_data&=(1(3-1);/E=0; Write_Random_Address_Byte(0x40,LCD_data); /写命令 void LCD_write_command(uchar command) delay_nus(16); LCD_data&=(1(1-1);/RS=0; LCD_data&=(1(2-1);/RW=0; Write_Random_Address_Byte(0x40,LCD_data); LCD_data&=0X0f; /清高四位 LCD_data|=command & 0xf0; /写高四位 Write_Random_Address_Byte(0x40,LCD_data); Enable_LCD_write(); command=command4; /低四位移到高四位 LCD_data&=0x0f; /清高四位LCD_data|=command&0xf0; /写低四位 Write_Random_Address_Byte(0x40,LCD_data); Enable_LCD_write(); /写数据 void LCD_write_data(uchar value) delay_nus(16); LCD_data|=(1(1-1);/RS=1; LCD_data&=(1(2-1);/RW=0; Write_Random_Address_Byte(0x40,LCD_data); LCD_data&=0X0f; /清高四位 LCD_data|=value&0xf0; /写高四位 Write_Random_Address_Byte(0x40,LCD_data); Enable_LCD_write(); value=value4; /低四位移到高四位LCD_data&=0x0f; /清高四位 LCD_data|=value&0xf0; /写低四位 Write_Random_Address_Byte(0x40,LCD_data); Enable_LCD_write(); /设置显示位置 void set_position(uchar x,uchar y) uchar position; if (y = 0) position = 0x80 + x; else position = 0xc0 + x; LCD_write_command(position); /显示字符串 void display_string(uchar x,uchar y,uchar *s) set_position(x,y); while (*s) LCD_write_data(*s); s+; /液晶初始化void LCD_init(void) LCD_write_command(0x28); delay_nus(40); LCD_write_command(0x28); delay_nus(40); Enable_LCD_write(); delay_nus(40); LCD_write_command(0x28); /4位显示 LCD_write_command(0x0c); /显示开 LCD_write_command(0x01); /清屏 delay_nms(2); 4.5 报警程序报警程序使用了定时器中断,对于定时器的使用,需要了解TCON寄存器、TMOD寄存器和IE寄存器的作用。在本次设计中要求超时3min报警,为了尽可能减少中断次数,选择定时器0工作模式1,即TMOD = 0x01。在定时器0工作模式1时,最多计时大约73ms。我们选择70ms中断一次。现在计算定时器0初值:首先要明白,51单片机定时器属于加一定时器。加一定时器每经过一个机器周期,定时器值加一。当定时器加满时会产生溢出,定时器溢出后进入中断。由于51单片机是12分频,也就是说一个机器周期是振荡周期的十二倍。所以初值的计算方法应如公式4.1所示。初值=定时器最大值-振荡频率12计时时间 (4.1)公式4.1中振荡频率的单位是MHz,计时时间的单位是s,之所以不使用国际单位制是因为这样便于计算。将公式4.1运用到本次设计中,本次设计使用的11.0592MHz的晶振;定时器0工作在工作模式1,此时TH0和TL0组成一个16位定时器,也就是说定时器最大值为216即65536;计时时间选择70ms。那么初值应该为:初值=65536-11.0592127000065536-64512=1024 (4.2)初值1024是十进制数,在单片机的寄存器中,是以二进制数保存的。初值需要保存在THO和TL0寄存器中,TH0、TL0分别存放高八位和低八位,所以:TH0=65536-645128 (4.3) TL0=65536-64512&0xFF (4.4)公式4.3和公式4.4不能从十进制的角度理解它,在寄存器中数值是以二进制的方式保存的,所以括号内的1024在16位的寄存器中保存的形式是0000010000000000,公式4.3的含义1024左移8位的结果保存在8位寄存器TH0中,1024左移8位得到的是0000000000000100,由于寄存器TH0只有8位,所以只会保留左移后的低8位,即00000100,这恰好是1024的高8位;公式4.4的含义是1024与0000000011111111与的结果保存在8位寄存器TL0中,与运算的结果是0000000000000000,同样由于寄存器TL0只有8位,所以只保留运算结果的低8位,而这也恰好是1024的低8位。使定时器正常工作同时还需要开中断、开计时开关。定时器中断报警程序如下:void Alarm(uchar t)/发声子程序 uchar i,j;for(i=0;i200;i+)SPK = SPK;/由参数t形成不同的频率 for(j=0;j8;TL0 = (65536-64512)&0xFF;if(+t_count = 2572) t_count = 0;while(SW1 = 0)/门一直开着 Alarm(90);LED_ALARM = LED_ALARM;/发出报警声,并灯光闪烁 Alarm(120);LED_ALARM = LED_ALARM;5 Proteus软件仿真和实物模拟5.1 Proteus软件仿真结合之前的“系统硬件设计”和“系统软件程序设计”可以通过Proteus软件做出仿真,验证设计的合理性。在Proteus中硬件连接,如图5.1和图5.2所示。在图5.1中可以看到主要的器件是直流电机,直流电机的运转表示电冰箱压缩机的运转。在本设计中,直流电机只设定一个转动方向,直流电机旋转表示压缩机工作,直流电机停转表示压缩机处于等待工作状态。图5.1中,电机是在平衡桥电路中,控制它的运转,只需要控制两端的DIR口和PWM口的输入即可。DIR口和PWM口分别与单片机的P1.0和P1.1相连,当两个口输入的不是相同的电平时,电机就会运转。当DIR输入高电平,PWM输入高电平,此时电机不运转;当DIR输入低电平,PWM输入高电平时,电机正转;当DIR输入高电平,PWM输入低电平时,情况相反,电机反转;当DIR输入低电平,PWM输入低高电平,此时电机也不运转。特别注意的是,此次选用的直流电机正常工作需要+12V电压。图5.1 Proteus仿真电机连接图在图5.2中,给出了整个仿真电路图,里面的所有电路都是在第三章中提到过的。在晶振电路中使用的是12MHz的晶振,之所以未选择常用的11.0592MHz是因为在软件Proteus仿真中,延时并不准确,没有必要用非常精确,在电路中选用了两个22pF的普通电容。在复位电路中,有一端连接到电源,在此次仿真中未注明的电源均为+5V,需要注意的是,电路中选用的是10F的电解电容。在数码管显示电路中,有一条蓝色的线,这是总线,在使用总是时需要注意在连接到总线上各个器件是通过标号识别的,也就是说标号相同的两根线路才能被软件识别为真正连接到一起,在总线图5.2 Proteus仿真硬件连接图上即使两根线路搭在了一起,软件也不会认为两根线是真正的连在了一起。数码管选用的是4位7段集成式共阴极数码管,总共12根引脚,其中4根选择哪一位显示。剩余的8根管脚和驱动器74LS245相连,P0口的负载能力无法电路数码管,所以必须要有驱动器。1602和IIC接口的PCF8674相连节省了单片机引脚的个数,同时也未使程序的设计太过复杂,只需要加上IIC的底层函数同时对原来的1602显示程序稍作改动即可。DS18B20和单片机的连接极其简单,只有一根DQ脚和P2.4相连,DS18B20采用的是独立供电方式,VCC直接和电源相连。蜂鸣器未使用常用的三极管连接电路,使用的是由Proteus硬件库中提供的蜂鸣器。SW1和SW2都是自锁开关,选用自锁开关简化了软件的设计。Proteus硬件库中LED小灯有红色、黄色、蓝色、绿色,在设计中只选用了红色和蓝色的,LED小灯电路中一定要注意串联电阻的选择,电阻值过大,通过的电流太弱,小灯不会亮,电阻值过小,通过电流太强,小灯会烧毁。在图5.3中展示1602显示设定温度功能。图5.3 显示温度从图5.3中显示了3种条件下的温度,-4是随机设定的温度,-18是能设定的最低温度,4是能设定的最高温度。1602只能显示2行字符,每行最多显示16个字符,即使是这样的条件也已经满足设计的要求。温度的设定是通过两个按键实现的,按一下按键,设定温度会增加或者减少1。两个按键和P3.2、P3.3相连,只要按下就会进入外部中断。图5.3展示数码管显示储藏室温度功能。图5.4 数码管显示储藏室温度功能在图5.4中数码管显示了3种情况下储藏室的温度,从这3种情况我们可以看出选用4位数码管是满足我们要求的,显示的温度最多占到4位。储藏室温度的检测依靠DS18B20,在仿真中只能通过调节DS18B20来模拟储藏室温度的变化,在此次仿真中DS18B20只能读取整数值。其实数码管是可以显示符号的,不过再需要两位数码管显示,要占用单片机两根脚,这时可能要采用其他接口芯片才能满足要求。图5.5、图5.6、图5.7展示报警功能。图5.5 开门未超时图5.6 开门超时报警图5.7 听到报警后关门当冰箱门打开时开关SW1闭合,开门灯亮起。超过3min门未关闭,蜂鸣器响,报警灯闪烁(因为展示的是图片,未能表示出闪烁效果)。听到报警后,用户把冰箱门关上,蜂鸣器不再报警,报警灯熄灭,恢复到未开门的状态,在整个过程中,电机开关一直闭合,电机始终处在运行状态。图5.8 电机转速图5.8中的数字表示电机转速,3个数字分别对应3种情况。电机的转速是通过设定温度与储藏室温度差控制的,根据温度差不同形成不同比的PWM波,从而调节转速。转速100只是一个普通现象,转速145是快速冷冻时的转速,也是此次设计中电机的最高转速,当启动快速冷冻功能时,电机会以最高速度运转,此时电机转速不再用设定温度与储藏室温度差控制。当储藏室的温度等于或低于设定温度时,电机将不再工作,处于等待状态。5.2 实物仿真Proteus软件仿真虽然已经做出了我们想要的效果,但是软件本身是有缺陷的,特别是仿真延时时间是不准确的,对于时序要求高的器件,在现实使用中很有可能是错误的,所以必须进行实物仿真。本次实物仿真是建立在开发板的基础上的,开发板具体内容见图5.9所示。图5.9 开发板在这张图片中标出了这次仿真中用到器件,如STC89C52、驱动电机电路、4个按键S2S5、蜂鸣器、DS18B20电路、4位7段集成式数码管、数码管锁存器。下面依次介绍本次仿真使用但开发板上没有的器件。图5.10 直流电机和DS18B20如图5.10所示,直流电机需要和开发板的两个脚相连,一定要注意电机的一只脚一定要与电机驱动模块中的+脚相连,另一只脚与A、B、C、D脚中任意一只脚相连即可;DS18B20的3根脚插在开发板DS18B20模块的插槽内,注意标识不要将引脚插反,引脚插反DS18B20不工作。图5.11 LCD 1602其他使用到的杜邦线若干,USB线一条(用来供电)。在此次仿真中,指示灯的效果是没有的,开发板的P1口是和led小灯硬连接的,但是在此次仿真中P1口用来作为1602的数据口,所以在仿真中led小灯会亮,但不是按照我们的设计亮。P0口用来数码管送数据,蜂鸣器使用P2.3,DS18B2O使用P2.2,4个按键使用了P3.0-P3.3,1602的RS、RW、E使用了P3.5-P3.7,1602其他管脚或者接地或者接+5V(开发板上有),P2.0用来控制直流电机。开发板连接图如图5.13所示。图5.12 开发板连接下面展示对主要功能的模拟,如图5.13所示。图5.13 数码管显示储藏室温度虽然开发板上有两个四位七段共阴极数码管,但是我们只用了左边的一个,和仿真中不同的是数码管显示必须要有锁存器。图5.13中数码管显示了两次测温,一次是室温25.4,一次是手指捏在DS18B20上显示的30.4。在图5.14中展示的是直流电机的运转。直流电机的调速是通过设定温度和储藏室温度的温差实现,不同的温差转换成PWM波的不同占空比。所以通过按开发板按键S4、S5不仅是调节了设定温度,同时也使电机的转速发生了变化。但是由于在软件设计中,每升高或降低1占空比的变化不明显,观察到的现象是电动机转速并未有太大的变化,但是在仿真中,电机转速以数值的形式呈现,此时再观察电机转速确实发生了变化。图5.14 控制直流电机运转图5.15 1602显示设定温度在图5.15中分别显示了3个温度2、-11、-4,这里温度值是存储在专门的数组中,能够设定的温度范围同样也是-184。1602只能显示两行字符,每行不超过16字符,在图5.16中显示的都是特殊字符,这些字符的显示必须要借助于1602液晶字符编码表。和软件仿真不同的是我们从图5.15中可以看到有“灰影”,不如仿真时屏幕显示得干净,显示情况是大多数点阵显示屏都不会像仿真时只显示设定的内容,其他区域没有任何的显示。利用开发板模拟出了主要功能:数码管显示储藏室温度、能够设定温度并由1602显示、温度控制电动机运转、开门超过3min报警(实物模拟中因为只有蜂鸣器响,所以并没有图片展示)。6 结论基本按照指导老师的要求和计划完成了该设计。这是对大三课堂上学习的单片机理论的一次运用和延伸,完成了集成式数码管显示温度的要求,实现了对工业式液晶屏1602的字符显示控制,熟练了对51单片机定时器和外部中断的使用。使用Proteus完成了对硬件电路的设计,用C语言完成了软件部分的编写,比较好的达到了设计要求。鉴于本人还是初学者,对于单片机使用的了解程度比较浅,设计中的很多模块是可以改进的,包括软件的编写也是可以优化的。虽有不足,在设计中仍使用了IIC接口实现了单片机2只管脚控制液晶屏1602。参 考 文 献1 彭伟.单片机C语言程序设计实训100例基于8051+Proteus仿真M.北京:电子工业出版社,2012.2 徐爱钧.单片机C语言编程与Proteus仿真技术M.北京:电子工业出版社,2016.3 宋雪松.手把手教你学51单片机(C语言版)M.北京:清华大学出版社,2014.4 张毅刚.单片机原理与应用设计(C51编程+Proteus仿真)M. 北京:电子工业出版社,2015.5 陈明通.电冰箱现代控制系统的研究D.四川大学,2006.6 何爱军.系列产品测试平台的硬件和软件实现D.上海交通大学,2012.7 徐凤霞,赵成安.AT89C51单片机温度控制系统J.齐齐哈尔大学学报,2004,(01):64-66.8 徐守品,蒋晓刚,陈闽鄂.基于AT89C52单片机智能温控箱的设计与开发J.精密制造与自动化,2010,(02):41-42+60.9 李焕文.智能冰箱控制系统的研究D.沈阳工业大学,2004.10 王芳,李彦佼.新型智能冰箱温控器的研究J.现代电子技术,2011,34(01):133-134.11 禹斌.基于单片机的冰箱智能烧水监控系统设计A.中国制冷学会小型制冷机低温生物医学委员会、家电产业技术创新战略联盟.2014.10家电科技增刊第十二届全国电冰箱(柜)、空调器及压缩机学术交流大会论文集C.中国制冷学会小型制冷机低温生物医学委员会、家电产业技术创新战略联盟:,2014:4.12 杨庆文,崔海.基于AT89C51单片机的温度控制系统J.中国科技信息,2010,(23):153-154.13 黄凤娟.基于单片机的温度测控系统在温室大棚中的设计与实现D.安徽大学,2006.14 李恩章.基于单片机的半导体制冷智能控制D.华北电力大学;华北电力大学(北京),2015.15 Philips.PCF8574 Remote 8-bit I/O expander for I2C-busZ.2002.16 Mei Lin.A Hardware Design of Fish Tank Intelligent Purification System J. Applied Mechanics and Materials,2013,2202(273):.17 Ting Wang,Hao Wang.Design of Water Heating and Temperature Control System Basedon STC89C52J.Applied Mechanics and Materials,2015,3827(734):.18 Chun Lin Wang.The Design of Based on AT89C52 Automotive Air Conditioning Control SystemJ.Advanced Materials Research,2015,3716(1079):.致 谢 在次论文完成之际,我要特别地感谢我的指导老师。当初要求用Proteus做仿真特别不理解,在设计的过程中才逐渐明白用软件仿真的好处。刚开始设计时思路并不是特别的清晰,每天都在修改设计的模块,用软件仿真,使硬件电路的更改特别容易,设计方案的合理性更容易判断,更重要是的不需要成本。由于要用Proteus做仿真,我在图书馆找到的Proteus资料,极大地推动了本次设计的进程。感谢老师把实验箱给我,在对实验箱模块的熟悉中,我打开了我的思路,才有了数码管显示温度、液晶屏显示字符。附录A IIC总线通用驱动程序#define NOP4()_nop_();_nop_();_nop_();_nop_(); #define IIC_Start()/总线启动 SDA = 1;NOP4();SCL = 1;NOP4();SDA = 0;NOP4();SCL = 0;NOP4();#define IIC_Stop()/总线停止 SDA = 0;NOP4();SCL = 1;NOP4();SDA = 1;NOP4();SCL = 0;NOP4();/以下3个有关应答的宏定义均生成第9个时钟脉冲,读取应答或发送应答/非应答 #define IIC_Rd_Ack()/1.主机读从机应答 SDA = 1;NOP4();/SDA=1设为输入,准备读取应答位,要使用该位作出处理时引用F0 SCL = 1;NOP4();F0 = !SDA;NOP4();SCL = 0;#define IIC_Ack()/2.主机发送应答位 SDA = 0;NOP4();SCL = 1;NOP4();SCL = 0;NOP4();SDA = 1;#define IIC_NAck()/3.主机发送非应答位 SDA = 1;NOP4();SCL = 1;NOP4();SCL = 0;NOP4();SDA = 0;bit IIC_WriteByte(uchar dat)/主机向IIC总线写一字节 uchar i;for(i=0;i8;i+)/8个时钟脉冲 NOP4();dat = 1;SDA = CY;/高位优先输出 NOP4();SCL = 1;NOP4();SCL = 0;/串行时钟脉冲输出 IIC_Rd_Ack();/主机读从机应答 return F0;/返回从机应答状态 bit IIC_ReadByte(uchar dat)/主机向IIC总线读一字节uchar i,dat = 0x00;SDA = 1;/置数据线为输入 for(i=0;i8;i+)/8个时钟周期循环 SCL = 1;/时钟线置高电平 NOP4();dat = (dat1) | SDA;/住居读取1位 NOP4();SCL = 0;/时钟线置低电平 NOP4();return dat;/返回读取的字节 附录B 程序源代码#include #include#include#include#define uchar unsigned char#define uint unsigned intsbit DQ = P24;sbit xiaoshu = P23;sbit gewei = P22;sbit shiwei = P21;sbit baiwei = P20;sbit SCL = P25; sbit SDA = P26; bit ack; sbit SPK = P12;sbit LED_ALARM = P13;sbit LED_ON_OFF = P14;sbit LED_Q = P15;sbit LED_OPER = P16;sbit SW1 = P30;sbit SW2 = P31;sbit SW3 = P34;sbit M_DIR = P10; sbit M_PWM = P11;uchar code DSY_CODE = /共阴数码管段码及空白显示 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00;uchar code df_Table = /温度小数位对照表 0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9;uchar Temp_Disp_Buff17;uchar LCD_data; int code temp=4,3,2,1,0,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18;uint t_count = 0;uchar i = 8;uint speed = 1200;uchar CurrentT = 0;/当前读取的温度整数部分 uchar Temp_Value = 0x00,0x00;/从DS18B20读取的温度值 uchar Display_Digit = 0,0,0,0;/待显示的各温度数位 bit DS18B20_IS_OK = 1;/传感器正常标志 void Delay(uint x)/延时 while(-x);/*以下是DS18B20程序* uchar Init_DS18B20()/初始化DS18B20 uchar status;DQ = 1;Delay(8);DQ = 0;Delay(90);DQ = 1;Delay(8);status = DQ;Delay(100);DQ = 1;return status;/初始化成功时返回0 uchar ReadOneByte()/读一字节 uchar i,dat = 0;DQ = 1;_nop_();for(i=0;i= 1;DQ = 1;_nop_();_nop_();if(DQ)dat |= 0x80;Delay(30);DQ = 1;return dat;void WriteOneByte(uchar dat)/写一字节 uchar i;for(i=
收藏