电冰箱控制系统设计
设计题目:系 别:专业班级:指导老师:姓名学号:HEFEI UNIVERSITY
自动化综合设计
冰箱温度控制设计 11 电 子 系 自动化2班
摘 要
近年来随着计算机在社会领域的渗透, 单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
电冰箱温度控制系统是利用温度传感器DS18B20采集电冰箱冷藏室和冷冻室的温度以及蒸发表面温度。通过INTEL 公司的高效微控制器MCS-C51单片机进行数字信号处理,从而达到智能控制的目的。本系统可实现电冰箱冷藏室和冷冻室的温度设置、电冰箱自动除霜、开门报警等功能。
通过对直冷式电冰箱制冷系统的改进和采用模糊控制技术,实现了电冰箱的双温双控,使电冰箱能根据使用条件的变化迅速合理地调节制冷量,且节能效果良好。
关键词:单片机;温度传感器;电冰箱;温度控制
一、设计内容
家用电冰箱一般是双门冰箱,分为冷冻室和冷藏室两个部分。 冷冻室用于冷冻食品和制冰。长时间存放,食品中的水份也会凝结成冰。冷冻室的温度为-6~-18℃。为保证冷冻室良好的制冷效果。当霜厚达3mm 时,能自动检测霜厚并进行除霜。
冷藏室用于在较低的温度中存放食品。要求有一定的保鲜而不冻伤食物的功能。冷藏室的温度一般为 0~10℃。
对家用电冰箱的要求是:较高的温度控制精度和最优的节能效果。 系统结构框图:
二、硬件设计
直冷式电冰箱的控制原理是根据蒸发器的温度控制制冷压缩机的启动与停止,使冰箱内的温度保持在设定的温度范围内。本电冰箱控制系统要完成冷冻室及冷藏室的温度检测和动态显示的功能,霜厚检测及除霜的功能,温度设置功能,。控制系统硬件结构如图所示,主要由电源电路,AT89C52最小系统,温度传感器,功能按键, ADC0809转换电路,时钟电路,键盘电路,显示电路,复位电路,测霜、除霜装置。
系统总体设计硬件方框图
三.各部分电路作用及介绍
1. AT89C52单片机简介
AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes
的可反复擦写的Flash 只读程序存储器和256 bytes的随机存取数据存储器(RAM ),器件采用ATMEL 公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash 存储单元,AT89C52单片机在电子行业中有着广泛的应用。
MCS-51系列单片机是美国Inter 公司在1980年推出的高性能8位单片微型计算机,较原来的MCS-48系列更为先进,功能更强。
2. 时钟电路
时钟电路用于产生单片机工作所需的时钟信号,时序是指令执行中各
信号之间的相互关系。单片机本身就如同一个复杂的同步时序电路,为了
保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。
在单片机内部带有时钟电路,因此,只需要在片外通过XTAL1和XTAL2引脚接入定时控制元件(晶体振荡器和电容),即可构成一个稳定的自激振荡器。XTAL1和XTAL2之间跨接晶体振荡器和微调电容。晶体呈感性,与C1、C2构成并联谐振电路。振荡器的振荡频率主要取决于晶体;电容的值则有微调作用,通常取30pF 左右。电容的安装装置应尽量靠近单片机芯片。
MCS8051的时钟电路如图所示:
C1
3 复位电路
复位是单片机的初始化操作,其主要功能是使单片机从0000H 单元开
始执行程序。除了进入系统的正常初始化以外,当由于程序运行出错或操作错误使系统处于死锁状态时,本单片机系统采用自动复位方式复位。
Vcc
+5V
R 10kΩ
1
+C 3
RST
C 1
100pF
+C 2
10μF
10μF
MCS-805
4 温度检测
我们选用DS18B20单线数字温度传感器。
1.DS18B20单线数字温度传感器的主要技术指标:
(1)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。(2)测温范围 -55℃~+125℃,固有测温分辨率0.5℃。(3)支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定,实现多点测温。(4)工作电源: 3~5V/DC。(5)在使用中不需要任何外围元件。(6)测量结果以9~12位数字量方式串行传送。
2.DS18B20外形和内部结构
DS18B20内部结构如图所示,主要由4部分组成:64位ROM 、温度传感器、非挥发的温度报警触发器TH 和TL 、配置寄存器。DS18B20的外形及管脚排列如图和表所.
DS18B20的内部结构
DS18B20
的管脚排列
DS18B20引脚定义:
3、DS18B20接口设计
下图为DS18B20接入电路的两种方法:
(a )寄生电源工作方式 (b )外接电源工作方式
5. 键盘与显示电路
键盘是人与MCS8051联系的重要手段,用于向CPU 输入运行参数,控制系统的运行状态。键盘电路形式分为直接编码输入键盘和矩阵键盘。前者接口电路简单,一般应用于需要少量按键的控制系统。后者因占用I/O引脚数少,常被按键较多的控制系统所采用。本课程设计采用直接编码输
入键盘,系统采用了5个按键,分别设置为加一键、减一键、正常键、冷藏室温度显示键、冷冻室温度显示键。
显示器是常用的输出器件。显示器件种类很多,有LED 发光二极管、LED 数码管、液晶显示器LCD 、阴极射线管CRT 等。本电冰箱的电控系统使用的液晶显示器LCD 。
端读入键盘信号,若读得“0”表示有键按下,转入处理键功能程序。
6. 制冷与除霜控制电路
用机械方法来增加气体压力的设备称为压缩机。在电冰箱制冷系统
中,用于压缩制冷剂蒸气,并使制冷剂在系统中循环的设备称为制冷压缩机。
电冰箱制冷系统所选用的压缩机属于容积型压缩机。容积型压缩机
是指气缸内制冷剂蒸气直接受到压缩,使其容积变小,压力增高的压缩机。所以,在整个电冰箱的制冷系统中,压缩机的正常有序的运行是非常重要的,因此,需恰当的设计制冷压缩机的启动与停止控制电路。
本设计中的电冰箱的电控系统中,含有自动除霜的功能,所以,也需要设计自动控制除霜电热丝的启动与停止的控制驱动电路。
7. 驱动控制电路的设计
(1)制冷压缩机和除霜电热丝的启动和停止控制驱动电路如图所示:
1
2
5K Ω
制冷压缩机和除霜电热丝的启动和停止控制驱动电路
四. 软件设计
本电冰箱的软件设计是在硬件电路设计的基础上,此电冰箱电控系统控制设计过程中主要完成以下几个功能:冷冻室及冷藏室温度采样并进行模拟到数字的转换,自动除霜功能,键盘扫描和Lcd 显示。
本系统软件主要由主程序、功能子程序、中断服务程序组成。采用主程序调用功能子程序,子程序尽可能少的调用其它子程序,以保证系统的稳定运行。
主程序
主程序是整个电冰箱的总控制程序,如控制各单元初始化、控制中断、定时、显示、键盘程序的启动与重复等,为系统软件的主干部分。本电冰箱的电控系统的核心部分是冷冻室和冷藏室的温度检测及控制电路。主程序中对是否为冷冻室和冷藏室的温度键进行了逐步的判断,通过判断
调用不同的子程序来实现对冷冻室和冷藏室的温度的控制。 主程序框图如图所示:
主程序流程图
2 打开、关闭压缩机子程序
程序流程图如下图如示:
开始
启动/停车?
初始化1
调启动子程序
有无反应
无调停车子程序
回复
1结束
接收数据
压缩机子程序调用框图
总程序附表
#include
#include
#define uchar unsigned char
#define uint unsigned int
/*定义按键-------------------------------------------------------------------*/ sbit K1 = P1^4; //K1-设置
sbit K2 = P1^5; //K2-确认、返回
sbit K3 = P1^6; //K3-加
sbit K4 = P1^7; //K4-减
sbit K5 = P3^2; //电机开关
sbit beep=P3^6;
sbit jdq=P2^5;
sbit LED=P3^1;
sbit fan=P2^6;
bit f_low=0;
uchar flag,shan;
int beep_tmp=40,shu,beep_jdq=-20,shu_j;
/**************************************************/ void delay1ms(uint ms)//延时1毫秒
for(i=0;i
for(j=0;j
}
void delaynms(uint ms)//延时1毫秒
uint i;
for(i=0;i
delay1ms(1);
}
#include "1602.h"
#include "18b20.h"
void init()
{
beep=1;
jdq=1;
fan=1;
}
void beep_scan()
{
WriteAddress(0xc0+0);//设定屏幕上的显示位置
delaynms(5);
WriteData('B');
WriteData(':');
if(beep_tmp>=0)
{
}
else
{
shu=~beep_tmp+1; WriteData('-'); if((shu%1000/100)==0) {WriteData(' '); }
WriteData(' '); if((beep_tmp%1000/100)==0) {WriteData(' ');} else {WriteData(beep_tmp%1000/100+0x30);delaynms(5);} WriteData(beep_tmp%100/10+0x30);delaynms(5); WriteData('.');delaynms(5); WriteData(beep_tmp%10+0x30);delaynms(5);
} {WriteData(shu%1000/100+0x30);delaynms(5);} WriteData(shu%100/10+0x30);delaynms(5); WriteData('.');delaynms(5); WriteData(shu%10+0x30); delaynms(5);
tmp(0xc0+7);
WriteAddress(0xc0+8);//设定屏幕上的显示位置
delaynms(5);
WriteData('J');delaynms(5);
WriteData(':');delaynms(5);
if(beep_jdq>=0)
{
}
else
WriteData(' '); if((beep_jdq%1000/100)==0) {WriteData(' ');} else {WriteData(beep_jdq%1000/100+0x30);delaynms(5);} WriteData(beep_jdq%100/10+0x30);delaynms(5); WriteData('.');delaynms(5); WriteData(beep_jdq%10+0x30);delaynms(5);
}
tmp(0xc0+15);
}
/********************主程序
***********************************/
void main()
{
LcdInt();//液晶初始化
for(;;)
{
read_temp(); ds1820disp(); beep_scan();
shu_j=~beep_jdq+1; WriteData('-'); if((shu_j%1000/100)==0) {WriteData(' '); } else {WriteData(shu_j%1000/100+0x30);delay1ms(10);} WriteData(shu_j%100/10+0x30);delay1ms(10); WriteData('.');delay1ms(10); WriteData(shu_j%10+0x30);delay1ms(10);
if(tvalue>beep_tmp) { jdq=0; f_low=1; { } } else { if((tvalue
/*设置时间------------------------------------------------------------------*/
if (K1 == 0) { beep=1; delaynms(20); //按键消抖 if(K1 == 0) //当是调时状态 本键用于调整下一项 { shan++;
shan=1; switch(shan) { case 1: WriteAddress(0xc0+4); Write_com(0x0f); break; case 2: WriteAddress(0xc0+6); Write_com(0x0f);break; case 3: WriteAddress(0xc0+12); Write_com(0x0f); break; case 4: WriteAddress(0xc0+14); } Write_com(0x0f);break; } while(K1 == 0); //等待键松开 }
/*--------------------------------------------------------------------------*/
while(shan!=0) { if (K1 == 0) { delaynms(20); //按键消抖 if(K1 == 0) //当是调时状态 本键用于调整下一项
调时
shan++; if(shan==5) shan=1; switch(shan) { case 1: WriteAddress(0xc0+4); Write_com(0x0f); break; case 2: WriteAddress(0xc0+6); Write_com(0x0f);break; case 3: WriteAddress(0xc0+12); Write_com(0x0f); break; case 4: WriteAddress(0xc0+14); } Write_com(0x0f);break; } while(K1 == 0); //等待键松开 } if (K2 == 0) // 当在调时状态时就退出 { delaynms(20); if(K2 == 0)
调时
shan=0; Write_com(0x0c); } } while(K2 == 0); if (K3 == 0) // 当在调时状态时就退出 { delaynms(20); if(K3 == 0) { switch(shan) { case 1: beep_tmp+=10; beep_scan(); WriteAddress(0xc0+4); Write_com(0x0f); break; case 2: beep_tmp+=1; beep_scan(); WriteAddress(0xc0+6);
调时
} case 3: beep_jdq+=10; if(beep_tmp
{ switch(shan) { case 1: beep_tmp-=10; if(beep_tmp
21
} } } beep_jdq-=1; beep_scan(); WriteAddress(0xc0+14); Write_com(0x0f);break; } while(K4 == 0);
/**************电机开关********************************/
}
}
22 if (K5 == 0) { delaynms(20); //按键消抖 if(K5 == 0) { fan=~fan; } while(K5 == 0); //等待键松开 } fan=1;
总结: 在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合作,也学会了做人与处世。课程设计是我们专业课程知识综合应用的实践训练,这是我们迈向社会,从事职业工作前一个必不少的过程.”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础.
23