基于单片机的空调温度控制器设计(1)--毕设论文.doc

上传人:红**** 文档编号:91480408 上传时间:2023-05-27 格式:DOC 页数:42 大小:672KB
返回 下载 相关 举报
基于单片机的空调温度控制器设计(1)--毕设论文.doc_第1页
第1页 / 共42页
基于单片机的空调温度控制器设计(1)--毕设论文.doc_第2页
第2页 / 共42页
点击查看更多>>
资源描述

《基于单片机的空调温度控制器设计(1)--毕设论文.doc》由会员分享,可在线阅读,更多相关《基于单片机的空调温度控制器设计(1)--毕设论文.doc(42页珍藏版)》请在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图391 设计目的及要求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

8、 可编程全双工串行通讯。l 空闲维持低功耗和掉电状态保护存储数据。 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的时

10、钟信号,驱动CPU产生执行指令功能的机器周期。引脚XTAL1和XTAL2是此放大器的输人端和输出端。这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起可构成一个自激振荡器, 振荡电路的连接如图所示图8所示,外接石英晶体或陶瓷谐振器以及电容C1和C2构成并联谐振电路, 接在放大器的反馈回路中。对外接电容C1和C2的值虽然没有严格的要求, 但电容的大小多少会影响振荡器频率的高低、振荡器的稳定性、起振圈内部振荡的接法的快速性和温度稳定性。外接石英晶体时, C1和C2一般取(40pF-10pF),外接的是石英晶体, 所以,C1、C2选择标称值30pF。系统振荡电路如图3所示。图3 振荡电路2.2.

11、3 复位电路设计单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态, 并从这个状态开始工作。无论是在单片机刚开始接上电源时, 还是断电后或者发生故障后都要复位。89系列单片机的复位信号是从RST引脚输人到芯片的施密特触发器中的。当系统处于正常工作状态时, 且振荡器稳定后, 如果RST引脚有一个高电平并维持2个机器周期(24个振荡周期), 则CPU就可响应并且将系统复位。复位分为手动复位和上电复位。本设计系统采用的是上电自动复位。系统复位电路如图4所示。图4 复位电路2.2.4 键盘接口电路设计独立键盘与单片机连接时,每个按键都需要单片机的一个I/O口,若单片机系统需要较多按键,

12、如果用独立按键会占用过多的I/O口资源。单片机系统中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 测量结果直接输出数字温度信号,以“一线总线”串行传送给

14、CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。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:

15、使能信号。l 脚:数据口。l 15脚BL1:背光电源正极。l 16脚BL2:背光电源负极。系统显示电路如图7所示。图7 系统显示电路2.2.7 输出控制电路设计系统要求在当前室温低于设定温度时,能够自动驱动加热系统工作 ;在当前室温高于设定温度时能够自动驱动制冷系统工作。本系统在复位后即置P26脚和P27脚为低电平,在当前室温低于设定温度时,通过置P27脚为高电平来驱动后级加热系统,本系统采用红色LED来代替加热系统;在当前室温高于设定温度时,通过置P26脚高电平来驱动后级制冷系统,本系统采用蓝色LED来代替制冷系统。输出控制电路如图8所示。图8 输出控制电路2.3 总电路设计系统总电路图如图

16、9所示。图9 系统总电路图2.4 系统所用元器件本系统所用的元器件清单如表1所示。 表1 系统所用元器件元器件名称数量点触式开关1630pF瓷片电容210uF电解电容1蓝色LED1红色RED15V电源插座1自锁开关1LCD160211/4W10K电阻310K可调电阻1AT89C521DS18B20112MHz晶振13 软件系统设计3.1 软件系统总体方案设计 系统软件由主程序模块、测温程序模块、键盘扫描程序模块以及液晶驱动程序模块组成。3.2 软件流程图设计系统软件流程图如图10所示。图10 系统软件流程图4 系统调试程序在Keil uVision4环境下编写,编译通过后生成.hex文件加载到

17、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 本系统存在的问题及改进措施本系统所设计的空调温度控制器仅对温度部分实现了控制

18、,但对于实际空调中的模式选择以及定时运行等工作过程还无法实现,希望在以后的学习研究中能够解决这些问题。5.2 心得体会 本次课程设计从获得题目开始便着手准备,首先分析系统要求,在Protuse里完成硬件原理图的搭建,然后开始在Keil环境下着手编写各部分程序,调试相应的程序,在调试通过后再下载到Protuse里进行仿真,发现问题后再返回Keil下修改相应程序,直到最后仿真通过,最后在Altium Designer 6中画出电路原理图。在本次课程设计过程中得到了老师以及许多同学的帮助,感谢那些提供过帮助的老师和同学。参考文献1 郭文川主编. 单片机原理与接口技术. 北京:中国农业出版社,2007

19、.2 郭天祥主编. 51单片机C语言教程. 北京:电子工业出版社,2009.附录1:系统的源程序清单global.h:ifndef _global_H#define _global_H#include#define uchar unsigned char/宏定义#define uint unsigned int#defineK_UP 0X20/定义键值#defineK_DOWN 0X21#defineK_CLEAR 0X24#defineK_OK 0X25#defineK_ONE 0X30#defineK_FOUR 0X31#defineK_SEVEN 0X32#defineK_POINT 0

20、X33#defineK_TWO 0X34#defineK_FIVE 0X43#defineK_EIGHT0X36#defineK_ZERO0X37#defineK_THREE0X38#defineK_SIX 0X40#defineK_NINE0X41#defineK_SET 0X42extern 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 C

21、urrent_Temp_Display_Buffer;extern uchar set_Temp_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 TE

22、MP_NOW=0.0;float TEMP_SET=21.0;uint T_Count=0;uint 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;/单片机晶振

23、为12MHz,机器周期为1us,t=5ms, /N=5000/1=5000TL0 = (8192-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_DS18B

24、20();timer0_init();while(1)Print();set_num();Comparison();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_T

25、emperature();#endif18B20.c:#includeglobal.h#include 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

26、=0,0,0,0;bit DS18B20_IS_OK = 1;void Delay_INI(uint 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 =

27、 1;return status;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=0;i= 1;void Read_Temperature() if(Init_DS18B20()=1)DS18B20_IS_OK=0;elseWriteOneByte(0xcc);WriteOneByte(0x44);

28、Init_DS18B20();WriteOneByte(0xcc);WriteOneByte(0xbe);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;Displ

29、ay_Digit0 = df_TableTemp_Value0&0x0f;CurrentT = (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 =

30、Display_Digit1 + 0;Current_Temp_Display_Buffer8 = 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_Buffe

31、r8 = ;if(ng)TEMP_NOW=-(Display_Digit2*10+Display_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#includee

32、xtern unsigned char Keys_Scan();extern void set_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 sCo

33、de,kCode,k;P3 = 0xf0;if(P3&0xf0)!=0xf0) Delay_key();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;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁