基于单片机的空调温度控制器设计.docx

上传人:b****6 文档编号:13813217 上传时间:2023-06-17 格式:DOCX 页数:47 大小:472.22KB
下载 相关 举报
基于单片机的空调温度控制器设计.docx_第1页
第1页 / 共47页
基于单片机的空调温度控制器设计.docx_第2页
第2页 / 共47页
基于单片机的空调温度控制器设计.docx_第3页
第3页 / 共47页
基于单片机的空调温度控制器设计.docx_第4页
第4页 / 共47页
基于单片机的空调温度控制器设计.docx_第5页
第5页 / 共47页
基于单片机的空调温度控制器设计.docx_第6页
第6页 / 共47页
基于单片机的空调温度控制器设计.docx_第7页
第7页 / 共47页
基于单片机的空调温度控制器设计.docx_第8页
第8页 / 共47页
基于单片机的空调温度控制器设计.docx_第9页
第9页 / 共47页
基于单片机的空调温度控制器设计.docx_第10页
第10页 / 共47页
基于单片机的空调温度控制器设计.docx_第11页
第11页 / 共47页
基于单片机的空调温度控制器设计.docx_第12页
第12页 / 共47页
基于单片机的空调温度控制器设计.docx_第13页
第13页 / 共47页
基于单片机的空调温度控制器设计.docx_第14页
第14页 / 共47页
基于单片机的空调温度控制器设计.docx_第15页
第15页 / 共47页
基于单片机的空调温度控制器设计.docx_第16页
第16页 / 共47页
基于单片机的空调温度控制器设计.docx_第17页
第17页 / 共47页
基于单片机的空调温度控制器设计.docx_第18页
第18页 / 共47页
基于单片机的空调温度控制器设计.docx_第19页
第19页 / 共47页
基于单片机的空调温度控制器设计.docx_第20页
第20页 / 共47页
亲,该文档总共47页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于单片机的空调温度控制器设计.docx

《基于单片机的空调温度控制器设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的空调温度控制器设计.docx(47页珍藏版)》请在冰点文库上搜索。

基于单片机的空调温度控制器设计.docx

基于单片机的空调温度控制器设计

基于单片机的空调温度控制器设计

 

摘要

设计了基于AT89C52的高精度家用空调温度控制系统,系统硬件主要由电源电路、温度采集电路(DS18B20)、键盘、显示电路、输出控制电路及其他辅助电路组成;软件采用8051C语言编程;该系统可以完成温度的显示、温度的设定、空调的控制等多项功能。

关键词:

单片机;DS18B20;温度检测;显示

 

 

1设计目的及要求

1.1设计目的和意义

21世纪的人们生活质量不断提高,同时也对高科技电子产业提出了更高的要求,为了使人们生活更人性化、智能化。

我设计了这一基于单片机的空调温度控制系统,人们只有生活在一定的温度环境内才能长期感觉舒服,才能保证不中暑不受冻,所以对室内温度要求要高。

对于不同地区空调要求不同,有的需要升温,有的需要降温。

一般都要维持在21~26°C。

目前,虽然我国大量生产空调制冷产品,但由于我国人口众多,需求量过盛,在我国的北方地区,还有好多家庭还没有安装有效地室内温控系统。

温度不能很好的控制在一定的范围内,夏天室内温度过高,冬天温度过低,这些均对人们正常生活带来不利的影响,温度、湿度均达不到人们的要求。

以前温度控制主要利用机械通风设备进行室内、外空气的交换来达到降低室内温度,实现室内温度适宜人们生活。

以前通风设备的开启和关停,均是由人手动控制的,即由人们定时查看室内外的温度、湿度情况,按要求开关通风设备,这样人们的劳动强度大,可靠性差,而且消耗人们体力,劳累成本过高。

为此,需要有一种符合机械温控要求的低成本的控制器,在温差和湿度超过用户设定值范围时,启动制冷通风设备,否则自动关闭制冷通风设备。

鉴于目前大多数制冷设备现在状况,我设计了一款基于MCS51单片机的空调温度控制系统。

1.2设计任务与要求

系统要求利用单片机设计一空调温度控制器,能够实时检测并显示室温,能够利用键盘设定温度,并且和室温进行比较,当室温低于设定温度时,系统能够驱动加热系统工作,当室温高于设定温度时,系统能够驱动制冷系统工作,当两者温度相等时,不做动作。

 

2硬件电路设计

2.1总体方案设计

空调温度控制系统,主要要完成对温度的采集、显示以及设定等工作,从而实现对空调的控制。

传统采用铂电阻充当测温器件的方案,虽然其中段测量线性度好,精度较高,但是测量电路的设计难度高,且测量电路系统庞大,难于调试,而且成本相对较高。

鉴于上述原因,本系统采用DS18B20充当测温器件。

外部温度信号经DS18B20将输入的模拟信号转换成8位的数字信号,通过并口传送到单片机系统(AT89C52)。

单片机系统将接收的数字信号译码处理,通过LCD1602将温度显示出来,同时单片机系统还将完成键盘扫描、按键温度设定、超温报警等程序的处理,将处理的温度信号与系统设定温度值比较,形成可以控制空调制冷、制热与停止工作三种工作状态,从而实现空调的智能化。

另外,键盘输入方面,采用了软件来修正误操作输入,即输入的温度范围必须在系统硬件所确定的范围内,直接降低由于误操作带来的风险,提高了系统的可靠性,体现了人性化的系统设计原则。

系统的整体框图如图1所示:

 

图1系统整体框图

2.2功能模块电路设计

2.2.1单片机的选型

由于本系统只需要单片机完成矩阵键盘检测以及处理DS18B20送来的温度数据并送LCD1602进行显示对于I/O资源以及处理速度无特殊要求,故选择ATMEL公司生产的AT89C52单片机,AT89C52增加了在线调试功能,即程序可以通过JTAG接口下载,调试和固化,因而该芯片的开发不再需要昂贵的硬件仿真器,可实现实时仿真,所有的资源都可以为用户所使用,可以在线编程或在系统编程,更进一步地说,在线编程或在系统编程是开发的系统具有了通过网络进行升级、维护的潜在功能。

AT89C52的性能及特点[1]:

●与MCS-51系列单片机兼容。

●片内有8K可在线重复编程的快速内

存可擦写存储器(FlashMemory)。

●存储器可循环写入/擦写10000次以上。

●存储器数据保存时间为10年以上。

●宽工作电压范围:

Vcc可为2.7V-6.5V。

●全静态工作:

可从0Hz-24MHz。

●程序存储器具有三级加密保护。

●256字节的内部RAM。

●32条可编程I/O口线。

●三个16位定时器/计数器。

●中断结构具有5级(6级)中断源和两个优下级。

●可编程全双工串行通讯。

●空闲维持低功耗和掉电状态保护存储数据。

AT89C52引脚图如图2所示。

图2AT89C52引脚图

VCC:

+5V电源输入

GND:

接地

P0口是一个双向8位三态I/O口,每个口可独立控制。

使用时需外接上拉电阻。

P1口是一个准双向8位I/O口,它的功能是单一的,只能用作数据的输入或者输出。

P2口是一个准双向8位I/O口,输出时,从P2.x端口可输出CPU写到锁存器上的信号。

当该接口用做数据输入接口是,应先向该位写1,然后,读该位即可读入输入数据。

P3口是具有第二功能的准双向8位I/O口。

ALE/PROG:

地址所存/编程信号线。

当P0口工作在第二功能时从该端口可复用工作,某时刻该端口可以送出地址信号A0~A7,而另外的时刻该端口传送的是数据信号D0~D7。

利用ALE可以将地址信号A0~A7锁存到地址锁存器。

/VPP:

该控制信号线也具有双重功能,是允许访问片外ROM/编程高电压引线。

程序存储器允许输出控制端,常用作片外ROM的读控制信号,低电平有效。

RESET:

复位引脚,当该端加上超过24个时钟周期的高电平时,可是8051复位。

系统复位电路如图2.3所示。

X1、X2:

外接时钟引脚。

X1为片内振荡电路的输入端,X2为片内振荡电路的输出端。

2.2.2振荡电路设计

AT89C52内部有一个用于构成片内振荡器的高增益反相放大器,振荡器产生的信号送到CPU,作为CPU的时钟信号,驱动CPU产生执行指令功能的机器周期。

引脚XTAL1和XTAL2是此放大器的输人端和输出端。

这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起可构成一个自激振荡器,振荡电路的连接如图所示图8所示,外接石英晶体或陶瓷谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。

对外接电容C1和C2的值虽然没有严格的要求,但电容的大小多少会影响振荡器频率的高低、振荡器的稳定性、起振圈内部振荡的接法的快速性和温度稳定性。

外接石英晶体时,C1和C2一般取(40pF-10pF),外接的是石英晶体,所以,C1、C2选择标称值30pF。

系统振荡电路如图3所示。

图3振荡电路

2.2.3复位电路设计

单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作。

无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。

89系列单片机的复位信号是从RST引脚输人到芯片的施密特触发器中的。

当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚有一个高电平并维持2个机器周期(24个振荡周期),则CPU就可响应并且将系统复位。

复位分为手动复位和上电复位。

本设计系统采用的是上电自动复位。

系统复位电路如图4所示。

图4复位电路

2.2.4键盘接口电路设计

独立键盘与单片机连接时,每个按键都需要单片机的一个I/O口,若单片机系统需要较多按键,如果用独立按键会占用过多的I/O口资源。

单片机系统中I/O口资源往往比较宝贵,当用到多个按键时,为了节省I/O口线,一般需使用矩阵键盘。

本系统共需使用16个按键,故选择

的矩阵键盘。

键盘接口电路如图5所示。

图5键盘接口电路

2.2.5温度测量电路设计

本系统的温度测量电路采用DS18B20来实现。

DS18B20是美国DALLAS半导体公司推出的第一片采用“一线总线”接口的温度传感器,它具有微型化、低功耗、高性能、抗干扰、能力强、易配微处理器等优点,可直接将温度转化成串行数字信号供处理器处理。

DS18B20的性能及特点[2]:

●适应电压范围宽,电压范围在

,在寄生电源方式下可由数据线供电。

●独特的单线接口方式,它与微处理器连接时仅需一条口线即可实现微处理器与DS18B20的双向通信。

●支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。

●在使用中不需要任何外接元件,全部传感元件及转换电路集成在形如一只三极管的集成电路里。

●测温范围-55℃

+125℃,在-10℃

+85℃时精度为±0.5℃。

●可编程分辨率为9

12位,对应的可分辨温度分别为0.5℃,0.25℃,0.125℃和0.0625℃,可实现高精度测温。

●在9位分辨率时,最多在93.75ms内把温度转换为数字;12位分辨率时,最多在750ms内把温度值转换为数字。

●测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。

●负压特性。

电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。

系统温度测量电路如图6所示。

图6温度测量电路

2.2.6系统显示电路设计

本系统采用LCD1602作为系统的显示器件,1602字符型液晶是一种专门用来显示字母、数字、符号等的点阵型液晶模块,能分两行显示,它有若干个

或者

等点阵字符位组成,每个点阵字符位都可以显示一个字符。

1602型液晶接口信号如下:

●1脚VSS:

电源地。

●2脚VDD:

电源正极。

●3脚VO:

液晶显示对比度调节端。

●4脚RS:

数据/命令选择端(H/L)。

●5脚R/

读写选择端(H/L)。

●6脚E:

使能信号。

数据口。

●15脚BL1:

背光电源正极。

●16脚BL2:

背光电源负极。

系统显示电路如图7所示。

图7系统显示电路

2.2.7输出控制电路设计

系统要求在当前室温低于设定温度时,能够自动驱动加热系统工作;在当前室温高于设定温度时能够自动驱动制冷系统工作。

本系统在复位后即置P2^6脚和P2^7脚为低电平,在当前室温低于设定温度时,通过置P2^7脚为高电平来驱动后级加热系统,本系统采用红色LED来代替加热系统;在当前室温高于设定温度时,通过置P2^6脚高电平来驱动后级制冷系统,本系统采用蓝色LED来代替制冷系统。

输出控制电路如图8所示。

图8输出控制电路

2.3总电路设计

系统总电路图如图9所示。

图9系统总电路图

2.4系统所用元器件

本系统所用的元器件清单如表1所示。

表1系统所用元器件

元器件名称

数量

点触式开关

16

30pF瓷片电容

2

10uF电解电容

1

蓝色LED

1

红色RED

1

5V电源插座

1

自锁开关

1

LCD1602

1

1/4W10K电阻

3

10K可调电阻

1

AT89C52

1

DS18B20

1

12MHz晶振

1

3软件系统设计

3.1软件系统总体方案设计

系统软件由主程序模块、测温程序模块、键盘扫描程序模块以及液晶驱动程序模块组成。

3.2软件流程图设计

系统软件流程图如图10所示。

图10系统软件流程图

 

4系统调试

程序在KeiluVision4环境下编写,编译通过后生成.hex文件加载到Protuse下可正常运行。

程序默认温度为21.0℃,Protuse下设定DS18B20的温度也为21.0℃,故开始运行时两路LED灯都不点亮。

当利用键盘设定的温度高于DS18B20默认的21.0℃时,红色LED灯被点亮;当设定的温度低于DS18B20默认的21.0℃时,蓝色LED灯被点亮。

当设定的温度高于DS18B20默认的21.0℃时,红色LED灯被点亮,如图11所示。

图11红色LED灯点亮

当设定的温度低于DS18B20默认的21.0℃时,蓝色LED灯被点亮。

如图12所示。

图12蓝色LED灯点亮

 

5总结

5.1本系统存在的问题及改进措施

本系统所设计的空调温度控制器仅对温度部分实现了控制,但对于实际空调中的模式选择以及定时运行等工作过程还无法实现,希望在以后的学习研究中能够解决这些问题。

5.2心得体会

本次课程设计从获得题目开始便着手准备,首先分析系统要求,在Protuse里完成硬件原理图的搭建,然后开始在Keil环境下着手编写各部分程序,调试相应的程序,在调试通过后再下载到Protuse里进行仿真,发现问题后再返回Keil下修改相应程序,直到最后仿真通过,最后在AltiumDesigner6中画出电路原理图。

在本次课程设计过程中得到了老师以及许多同学的帮助,感谢那些提供过帮助的老师和同学。

 

参考文献

[1]郭文川主编.单片机原理与接口技术.北京:

中国农业出版社,2007.

[2]郭天祥主编.51单片机C语言教程.北京:

电子工业出版社,2009.

 

附录1:

系统的源程序清单

global.h:

ifndef_global_H

#define_global_H

#include

#defineucharunsignedchar//宏定义

#defineuintunsignedint

#defineK_UP0X20//定义键值

#defineK_DOWN0X21

#defineK_CLEAR0X24

#defineK_OK0X25

#defineK_ONE0X30

#defineK_FOUR0X31

#defineK_SEVEN0X32

#defineK_POINT0X33

#defineK_TWO0X34

#defineK_FIVE0X43

#defineK_EIGHT0X36

#defineK_ZERO0X37

#defineK_THREE0X38

#defineK_SIX0X40

#defineK_NINE0X41

#defineK_SET0X42

externfloatTEMP_NOW;

externfloatTEMP_SET;

externuintT_Count;

externuintS_Count;

externuintP_Count;

externuintN_Count;

externuintM_Count;

externucharCurrent_Temp_Display_Buffer[];

externucharset_Temp_Display_Buffer[];

externintsel;

sbitlcden=P2^1;//液晶使能

sbitlcdrs=P2^0;//液晶数据/命令选择端

sbitDQ=P2^2;//DS18B20数据端

sbitXX=P2^5;//读写选择端

sbitcold=P2^6;//输出信号

sbitwarm=P2^7;//输出信号

#endif

main.c:

#include

#include"global.h"

#include"key.h"

#include"18B20.h"

#include"LCD.h"

////////////////////全局变量/////////////////////////////

floatTEMP_NOW=0.0;

floatTEMP_SET=21.0;

uintT_Count=0;

uintS_Count=0;

uintP_Count=0;

uintN_Count=0;

uintM_Count=1;

ucharCurrent_Temp_Display_Buffer[]={"NOW:

-23.5"};

ucharset_Temp_Display_Buffer[]={"SET:

21.0"};

intsel=0;

voidComparison();

//////////////////////定时///////////////////////////////

voidtimer0_init(void)

{

TMOD=0x00;//设置定时器0的工作方式

TH0=(8192-5000)/32;//单片机晶振为12MHz,机器周期为1us,t=5ms,

//N=5000/1=5000

TL0=(8192-5000)%32;

IE=0x82;

TR0=1;

}

voidtimer0()interrupt1

{

TH0=(8192-5000)/32;

TL0=(8192-5000)%32;

if(++T_Count==100)//////100为0.5s

{

TR0=0;

Read_Temperature();

Display_Temperature();

T_Count=0;

if(++P_Count==6)

{

N_Count=1;

}

TR0=1;

}

}

////////////////////主程序///////////////////////////////

voidmain()

{

init_lcd();

Init_DS18B20();

timer0_init();

while

(1)

{

Print();

set_num();

Comparison();

}

}

voidComparison()

{

if(N_Count&&M_Count)

{

if(TEMP_NOW

{

warm=1;

cold=0;

}

if(TEMP_NOW>TEMP_SET)

{

cold=1;

warm=0;

}

if(TEMP_NOW==TEMP_SET)

{

cold=0;

warm=0;

}

}

}

18B20.h:

#ifndef_18B20_H

#define_18B20_H

#include"global.h"

externucharInit_DS18B20();

externvoidRead_Temperature();

externvoidDisplay_Temperature();

#endif

18B20.c:

#include"global.h"

#include"intrins.h"

#definedelayNOP(){_nop_();_nop_();_nop_();_nop_();}

ucharcodeTemperature_Char[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};

ucharcodedf_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};

ucharCurrentT=0;

ucharTemp_Value[]={0x00,0x00};

ucharDisplay_Digit[]={0,0,0,0};

bitDS18B20_IS_OK=1;

voidDelay_INI(uintx)

{

while(--x);

}

voidDelay(unsignedintn)

{

do

{

_nop_();_nop_();

_nop_();_nop_();

_nop_();_nop_();

_nop_();_nop_();

_nop_();

n--;

}while(n);

}

 

ucharInit_DS18B20()

{

ucharstatus;

DQ=1;

Delay_INI(8);

DQ=0;

Delay_INI(90);

DQ=1;

Delay_INI(8);

status=DQ;

Delay_INI(100);

DQ=1;

returnstatus;

}

ucharReadOneByte()

{

uchari,dat=0;

DQ=1;

_nop_();

for(i=0;i<8;i++)

{

DQ=0;

dat>>=1;

DQ=1;

_nop_();

_nop_();

if(DQ)

dat|=0X80;

Delay(30);

DQ=1;

}

returndat;

}

voidWriteOneByte(uchardat)

{

uchari;

for(i=0;i<8;i++)

{

DQ=0;

DQ=dat&0x01;

Delay(5);

DQ=1;

dat>>=1;

}

}

voidRead_Temperature()

{

if(Init_DS18B20()==1)

DS18B20_IS_OK=0;

else

{

WriteOneByte(0xcc);

WriteOneByte(0x44);

Init_DS18B20();

WriteOneByte(0xcc);

WriteOneByte(0xbe);

Temp_Value[0]=ReadOneByte();

Temp_Value[1]=ReadOneByte();

DS18B20_IS_OK=1;

}

}

voidDisplay_Temperature()

{

uchart=150,ng=0;

if((Temp_Value[1]&0xf8)==0xf8)

{

Temp_Value[1]=~Temp_Value[1];

Temp_Value[0]=~Temp_Value[0]+1;

if(Temp_Value[0]==0x00)

Temp_Value[1]++;

ng=1;

}

Display_Digit[0]=df_Table[Temp_Value[0]&0x0f];

CurrentT=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);

Display_Digit[3]=CurrentT/100;

Display_Digit[2]=CurrentT%100/10;

Display_Digit[1]=CurrentT%10;

Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0';

Current_Temp_Display_Buffer[10]='.';

Current_Temp_Display_Buffer[9]=Display_Dig

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2