《基于单片机的空调温度控制器设计说明.doc》由会员分享,可在线阅读,更多相关《基于单片机的空调温度控制器设计说明.doc(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、接口技术课程设计报告基于单片机的空调温度控制器设计摘 要设计了基于AT89C52的高精度家用空调温度控制系统,系统硬件主要由电源电路、温度采集电路(DS18B20)、键盘、显示电路、输出控制电路与其他辅助电路组成;软件采用8051C语言编程;该系统可以完成温度的显示、温度的设定、空调的控制等多项功能。关键词:单片机;DS18B20;温度检测;显示目录1 设计目的与要求11.1 设计目的和意义11.2 设计任务与要求12 硬件电路设计22.1 总体方案设计22.2 功能模块电路设计32.2.1 单片机的选型32.2.2 振荡电路设计52.2.3 复位电路设计52.2.4 键盘接口电路设计62.2
2、.5 温度测量电路设计62.2.6 系统显示电路设计72.2.7 输出控制电路设计82.3 总电路设计82.4 系统所用元器件93 软件系统设计103.1 软件系统总体方案设计103.2 软件流程图设计104 系统调试125 总结135.1 本系统存在的问题与改进措施13参考文献14附录1:系统的源程序清单15附录2:系统的PCB图3940 / 431设计目的与要求1.1 设计目的和意义21世纪的人们生活质量不断提高,同时也对高科技电子产业提出了更高的要求,为了使人们生活更人性化、智能化。我设计了这一基于单片机的空调温度控制系统,人们只有生活在一定的温度环境才能长期感觉舒服,才能保证不中暑不受
3、冻,所以对室温度要求要高。对于不同地区空调要求不同,有的需要升温,有的需要降温。一般都要维持在2126C。目前,虽然我国大量生产空调制冷产品,但由于我国人口众多,需求量过盛,在我国的北方地区,还有好多家庭还没有安装有效地室温控系统。温度不能很好的控制在一定的围,夏天室温度过高,冬天温度过低,这些均对人们正常生活带来不利的影响,温度、湿度均达不到人们的要求。以前温度控制主要利用机械通风设备进行室、外空气的交换来达到降低室温度,实现室温度适宜人们生活。以前通风设备的开启和关停,均是由人手动控制的,即由人们定时查看室外的温度、湿度情况,按要求开关通风设备,这样人们的劳动强度大,可靠性差,而且消耗人们
4、体力,劳累成本过高。为此,需要有一种符合机械温控要求的低成本的控制器,在温差和湿度超过用户设定值围时,启动制冷通风设备,否则自动关闭制冷通风设备。鉴于目前大多数制冷设备现在状况,我设计了一款基于MCS51单片机的空调温度控制系统。1.2 设计任务与要求系统要求利用单片机设计一空调温度控制器,能够实时检测并显示室温,能够利用键盘设定温度,并且和室温进行比较,当室温低于设定温度时,系统能够驱动加热系统工作,当室温高于设定温度时,系统能够驱动制冷系统工作,当两者温度相等时,不做动作。2 硬件电路设计2.1 总体方案设计空调温度控制系统,主要要完成对温度的采集、显示以与设定等工作,从而实现对空调的控制
5、。传统采用铂电阻充当测温器件的方案,虽然其中段测量线性度好,精度较高,但是测量电路的设计难度高 ,且测量电路系统庞大,难于调试 ,而且成本相对较高。鉴于上述原因,本系统采用DS18B20充当测温器件。外部温度信号经 DS18B20将输入的模拟信号转换成8位的数字信号, 通过并 口传送到单片机系统( AT89C52) 。单片机系统将接收的数字信号译码处理,通过LCD1602将温度显示出来,同时单片机系统还将完成键盘扫描 、按键温度设定、超温报警等程序的处理 ,将处理的温度信号与系统设定温度值比较,形成可以控制空调制冷、制热与停止工作三种工作状态,从而实现空调的智能化。另外,键盘输入方面,采用了软
6、件来修正误操作输入 ,即输入的温度围必须在系统硬件所确定的围,直接降低由于误操作带来的风险,提高了系统的可靠性 ,体现了人性化的系统设计原则。系统的整体框图如图1所示:图1 系统整体框图2.2 功能模块电路设计2.2.1 单片机的选型由于本系统只需要单片机完成矩阵键盘检测以与处理DS18B20送来的温度数据并送LCD1602进行显示对于I/O资源以与处理速度无特殊要求,故选择ATMEL公司生产的AT89C52单片机,AT89C52增加了在线调试功能,即程序可以通过JTAG接口下载,调试和固化,因而该芯片的开发不再需要昂贵的硬件仿真器,可实现实时仿真,所有的资源都可以为用户所使用,可以在线编程或
7、在系统编程,更进一步地说,在线编程或在系统编程是开发的系统具有了通过网络进行升级、维护的潜在功能。AT89C52的性能与特点1:l 与MCS-51系列单片机兼容。l 片有8K可在线重复编程的快速 存可擦写存储器(Flash Memory)。l 存储器可循环写入/擦写10000次以上。l 存储器数据保存时间为10年以上。l 宽工作电压围:Vcc可为2.7V-6.5V。l 全静态工作:可从0Hz-24MHz。l 程序存储器具有三级加密保护。l 256字节的部RAM。l 32条可编程I/O口线。l 三个16位定时器/计数器。l 中断结构具有5级(6级)中断源和两个优下级。l 可编程全双工串行通讯。l
8、 空闲维持低功耗和掉电状态保护存储数据。 AT89C52引脚图如图2所示。图2 AT89C52引脚图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口工作在第二功能时从该端口可复用工作,某时刻该端口可以送出地址信
9、号A0A7,而另外的时刻该端口传送的是数据信号D0D7。利用ALE可以将地址信号A0A7锁存到地址锁存器。/VPP:该控制信号线也具有双重功能,是允许访问片外ROM/编程高电压引线。:程序存储器允许输出控制端,常用作片外ROM的读控制信号,低电平有效。RESET:复位引脚,当该端加上超过24个时钟周期的高电平时,可是8051复位。系统复位电路如图2.3所示。X1、X2:外接时钟引脚。X1为片振荡电路的输入端,X2为片振荡电路的输出端。2.2.2 振荡电路设计AT89C52部有一个用于构成片振荡器的高增益反相放大器, 振荡器产生的信号送到CPU, 作为CPU的时钟信号,驱动CPU产生执行指令功能
10、的机器周期。引脚XTAL1和XTAL2是此放大器的输人端和输出端。这个放大器与作为反馈元件的片外石英晶体或瓷谐振器一起可构成一个自激振荡器, 振荡电路的连接如图所示图8所示,外接石英晶体或瓷谐振器以与电容C1和C2构成并联谐振电路, 接在放大器的反馈回路中。对外接电容C1和C2的值虽然没有严格的要求, 但电容的大小多少会影响振荡器频率的高低、振荡器的稳定性、起振圈部振荡的接法的快速性和温度稳定性。外接石英晶体时, C1和C2一般取(40pF-10pF),外接的是石英晶体, 所以,C1、C2选择标称值30pF。系统振荡电路如图3所示。图3 振荡电路2.2.3 复位电路设计单片机复位是使CPU和系
11、统中的其他功能部件都处在一个确定的初始状态, 并从这个状态开始工作。无论是在单片机刚开始接上电源时, 还是断电后或者发生故障后都要复位。89系列单片机的复位信号是从RST引脚输人到芯片的施密特触发器中的。当系统处于正常工作状态时, 且振荡器稳定后, 如果RST引脚有一个高电平并维持2个机器周期(24个振荡周期), 则CPU就可响应并且将系统复位。复位分为手动复位和上电复位。本设计系统采用的是上电自动复位。系统复位电路如图4所示。图4 复位电路2.2.4 键盘接口电路设计独立键盘与单片机连接时,每个按键都需要单片机的一个I/O口,若单片机系统需要较多按键,如果用独立按键会占用过多的I/O口资源。
12、单片机系统中I/O口资源往往比较宝贵,当用到多个按键时,为了节省I/O口线,一般需使用矩阵键盘。本系统共需使用16个按键,故选择的矩阵键盘。键盘接口电路如图5所示。图5 键盘接口电路2.2.5 温度测量电路设计 本系统的温度测量电路采用DS18B20来实现。DS18B20是美国DALLAS半导体公司推出的第一片采用“一线总线”接口的温度传感器,它具有微型化、低功耗、高性能、抗干扰、能力强、易配微处理器等优点,可直接将温度转化成串行数字信号供处理器处理。DS18B20的性能与特点2:l 适应电压围宽,电压围在,在寄生电源方式下可由数据线供电。l 独特的单线接口方式,它与微处理器连接时仅需一条口线
13、即可实现微处理器与DS18B20的双向通信。l 支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。l 在使用中不需要任何外接元件,全部传感元件与转换电路集成在形如一只三极管的集成电路里。l 测温围-55+125,在-10+85时精度为0.5。l 可编程分辨率为912位,对应的可分辨温度分别为0.5,0.25,0.125和0.0625,可实现高精度测温。l 在9位分辨率时,最多在93.75ms把温度转换为数字;12位分辨率时,最多在750ms把温度值转换为数字。l 测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠
14、错能力。l 负压特性。电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。系统温度测量电路如图6所示。图6 温度测量电路2.2.6 系统显示电路设计本系统采用LCD1602作为系统的显示器件,1602字符型液晶是一种专门用来显示字母、数字、符号等的点阵型液晶模块,能分两行显示,它有若干个或者等点阵字符位组成,每个点阵字符位都可以显示一个字符。1602型液晶接口信号如下:l 1脚VSS:电源地。l 2脚VDD:电源正极。l 3脚VO:液晶显示对比度调节端。l 4脚RS:数据/命令选择端(H/L)。l 5脚R/:读写选择端(H/L)。l 6脚E:使能信号。l 脚:数据口。l 15脚BL1:背光电
15、源正极。l 16脚BL2:背光电源负极。系统显示电路如图7所示。图7 系统显示电路2.2.7 输出控制电路设计系统要求在当前室温低于设定温度时,能够自动驱动加热系统工作 ;在当前室温高于设定温度时能够自动驱动制冷系统工作。本系统在复位后即置P26脚和P27脚为低电平,在当前室温低于设定温度时,通过置P27脚为高电平来驱动后级加热系统,本系统采用红色LED来代替加热系统;在当前室温高于设定温度时,通过置P26脚高电平来驱动后级制冷系统,本系统采用蓝色LED来代替制冷系统。输出控制电路如图8所示。图8 输出控制电路2.3 总电路设计系统总电路图如图9所示。图9 系统总电路图2.4 系统所用元器件本
16、系统所用的元器件清单如表1所示。表1 系统所用元器件元器件名称数量点触式开关1630pF瓷片电容210uF电解电容1蓝色LED1红色RED15V电源插座1自锁开关1LCD160211/4W10K电阻310K可调电阻1AT89C521DS18B20112MHz晶振13 软件系统设计3.1 软件系统总体方案设计 系统软件由主程序模块、测温程序模块、键盘扫描程序模块以与液晶驱动程序模块组成。3.2 软件流程图设计系统软件流程图如图10所示。图10 系统软件流程图4 系统调试程序在Keil uVision4环境下编写,编译通过后生成.hex文件加载到Protuse下可正常运行。程序默认温度为21.0,
17、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 本系统存在的问题与改进措施本系统所设计的空调温度控制器仅对温度部分实现了控制,但对于实际空调中的模式选择以与定时运行等工作过程还无
18、法实现,希望在以后的学习研究中能够解决这些问题。5.2 心得体会 本次课程设计从获得题目开始便着手准备,首先分析系统要求,在Protuse里完成硬件原理图的搭建,然后开始在Keil环境下着手编写各部分程序,调试相应的程序,在调试通过后再下载到Protuse里进行仿真,发现问题后再返回Keil下修改相应程序,直到最后仿真通过,最后在Altium Designer 6中画出电路原理图。在本次课程设计过程中得到了老师以与许多同学的帮助,感那些提供过帮助的老师和同学。参考文献1 郭文川主编. 单片机原理与接口技术. :中国农业,2007.2 郭天祥主编. 51单片机C语言教程. :电子工业,2009.
19、附录1:系统的源程序清单global.h:ifndef _global_H#define _global_H#include#define uchar unsigned char/宏定义#define uint unsigned int#defineK_UP0X20/定义键值#defineK_DOWN0X21#defineK_CLEAR 0X24#defineK_OK0X25#defineK_ONE0X30#defineK_FOUR0X31#defineK_SEVEN 0X32#defineK_POINT0X33#defineK_TWO0X34#defineK_FIVE0X43#defineK
20、_EIGHT0X36#defineK_ZERO0X37#defineK_THREE0X38#defineK_SIX0X40#defineK_NINE0X41#defineK_SET0X42extern float TEMP_NOW;extern float TEMP_SET;extern uint T_Count;extern uint S_Count;extern uint P_Count;extern uint N_Count;extern uint M_Count;extern uchar Current_Temp_Display_Buffer;extern uchar set_Temp
21、_Display_Buffer;extern int sel;sbit lcden=P21;/液晶使能sbit lcdrs=P20;/液晶数据/命令选择端sbit DQ =P22;/DS18B20数据端sbit XX =P25;/读写选择端sbit cold =P26;/输出信号sbit warm =P27;/输出信号#endifmain.c:#include#includeglobal.h#includekey.h#include18B20.h#includeLCD.h/全局变量/float TEMP_NOW=0.0;float TEMP_SET=21.0;uint T_Count=0;ui
22、nt S_Count=0;uint P_Count=0;uint N_Count=0;uint M_Count=1;uchar Current_Temp_Display_Buffer= NOW:-23.5 ;uchar set_Temp_Display_Buffer= SET: 21.0 ;int sel=0;void Comparison();/定时/void timer0_init(void)TMOD =0x00 ; /设置定时器0的工作方式TH0 = (8192-5000)/32;/单片机晶振为12MHz,机器周期为1us,t=5ms, /N=5000/1=5000TL0 = (8192
23、-5000)%32;IE =0x82;TR0=1;void timer0() interrupt 1 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;/主程序/void main()init_lcd();Init_DS18B20();timer0_init();while(1)Print();set_num();Com
24、parison();void Comparison()if(N_Count&M_Count)if(TEMP_NOWTEMP_SET)cold=1;warm=0;if(TEMP_NOW=TEMP_SET)cold=0;warm=0;18B20.h:#ifndef _18B20_H#define _18B20_H#includeglobal.hextern uchar Init_DS18B20(); extern void Read_Temperature();extern void Display_Temperature();#endif18B20.c:#includeglobal.h#incl
25、ude intrins.h#define delayNOP() _nop_();_nop_();_nop_();_nop_();uchar code Temperature_Char8 = 0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00;uchar code df_Table=0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9;uchar CurrentT = 0;uchar Temp_Value=0x00,0x00;uchar Display_Digit=0,0,0,0;bit DS18B20_IS_OK = 1;void Delay_INI(ui
26、nt x) while(-x);void Delay(unsigned int n)do_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();n-;while(n);uchar Init_DS18B20() uchar status;DQ = 1;Delay_INI(8);DQ = 0;Delay_INI(90);DQ = 1;Delay_INI(8);status=DQ;Delay_INI(100);DQ = 1;return status;uchar ReadOneByte() uchar i,dat
27、=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=0;i= 1;void Read_Temperature() if(Init_DS18B20()=1)DS18B20_IS_OK=0;elseWriteOneByte(0xcc);WriteOneByte(0x44);Init_DS18B20();WriteOneByte(0xcc);WriteOneByte(0
28、xbe);Temp_Value0 = ReadOneByte(); Temp_Value1 = ReadOneByte();DS18B20_IS_OK=1;void Display_Temperature()uchar t = 150, ng = 0;if(Temp_Value1&0xf8)=0xf8) Temp_Value1 = Temp_Value1;Temp_Value0 = Temp_Value0+1;if(Temp_Value0=0x00)Temp_Value1+;ng = 1;Display_Digit0 = df_TableTemp_Value0&0x0f;CurrentT =
29、(Temp_Value0&0xf0)4) | (Temp_Value1&0x07)4);Display_Digit3 = CurrentT/100;Display_Digit2 = CurrentT%100/10;Display_Digit1 = CurrentT%10;Current_Temp_Display_Buffer11 = Display_Digit0 + 0;Current_Temp_Display_Buffer10 = .;Current_Temp_Display_Buffer9 = Display_Digit1 + 0;Current_Temp_Display_Buffer8
30、= Display_Digit2 + 0;Current_Temp_Display_Buffer7 = Display_Digit3 + 0;TEMP_NOW=Display_Digit2*10+Display_Digit1+Display_Digit0*0.1 ;if(Display_Digit3 = 0)Current_Temp_Display_Buffer7 = ;if(Display_Digit2 = 0&Display_Digit3=0)Current_Temp_Display_Buffer8 = ;if(ng)TEMP_NOW=-(Display_Digit2*10+Display
31、_Digit1+Display_Digit0*0.1); if(Current_Temp_Display_Buffer8 = )Current_Temp_Display_Buffer8 = -;else if(Current_Temp_Display_Buffer7 = )Current_Temp_Display_Buffer7 = -;else Current_Temp_Display_Buffer6 = -; KEY.h:#ifndef _KEY_H#define _KEY_H#includeextern unsigned char Keys_Scan();extern void set_
32、num();extern void set();#endifKEY.c:#include #include #include #include18B20.huchar code KeyCodeTable= 0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88;void Delay_key() uchar i;for(i=0;i200;i+);uchar Keys_Scan() uchar sCode,kCode,k;P3 = 0xf0;if(P3&0xf0)!=0xf0) Delay_ke
33、y();if(P3&0xf0)!=0xf0) sCode = 0xfe;for(k=0;k47)&(set_Temp_Display_Buffer1147)&(set_Temp_Display_Buffer947)&(set_Temp_Display_Buffer848)&(set_Temp_Display_Buffer1148)&(set_Temp_Display_Buffer948)&(set_Temp_Display_Buffer858) set_Temp_Display_Buffer8-=1;else if(set_Temp_Display_Buffer8=48) set_Temp_Display_Buffer8=57; if(K_ONE = key)while(Keys_S