《毕业设计基于单片机温度控制系统的设计.doc》由会员分享,可在线阅读,更多相关《毕业设计基于单片机温度控制系统的设计.doc(47页珍藏版)》请在三一办公上搜索。
1、基于单片机温度控制系统的设计中文摘要随着微机测量和控制技术的迅速发展与广泛应用,以单片机为核心的温度采集与控制系统的研发与应用在很大程度上提高了生产生活中对温度的控制水平。本设计论述了一种以STC89C52单片机为主控制单元,以DS18B20为温度传感器的温度控制系统。该控制系统可以实时存储相关的温度数据并记录当前的时间。系统设计了相关的硬件电路和相关应用程序。硬件电路主要包括STC89C52单片机最小系统,测温电路、实时时钟电路、LCD液晶显示电路以及通讯模块电路等。系统程序主要包括主程序,读出温度子程序,计算温度子程序、按键处理程序、LCD显示程序以及数据存储程序等。关键词 STC89C5
2、2单片机;DS18B20;显示电路Based on single chip microcomputer temperature control system designAbstractAlong with the computer measurement and control technology of the rapid development and wide application, based on singlechip temperature gathering and control system development and application greatly impr
3、ove the production of temperature in life level of control. This design STC89C52 describes a kind of mainly by MCU control unit, for temperature sensor DS18B20 temperature control system. The control system can real-time storage temperature data and record related to the current time. System design
4、related hardware circuit and related applications. STC89C52 microcontroller hardware circuit include temperature detection circuit smallest system, and real-time clock circuit, LCD display circuit, communication module circuit, etc. System programming mainly include main program, read temperature su
5、broutine, the calculation of temperature subroutines, key processing procedures, LCD display procedures and data storage procedures, etc. Keywords STC89C52 microcontroller;DS18B20;display circuit目 录一、引言4(一)课题研究的背景4(二)课题研究的目的和意义5二、硬件电路的设计5(一)系统设计的框架5(二)单片机最小系统电路6(三)单片机的选型61.STC89C52单片机简介62.STC89C52单片
6、机时序73.STC89C52单片机引脚介绍7(四)温度传感器电路9(五)系统电源电路的设计10(六)LCD显示电路11(七)串口通讯电路12(八)按键接口电路13(九)DS1302时钟电路13(十)存储器接口电路13三、系统软件设计14(一)计算温度子程序15(二)按键处理子程序15(三)计算温度子程序16(四)显示数据刷新子程序17四、结束语18参考文献19致谢20附件1:系统原理图21附件2:系统相关程序22一、DS18B20底层驱动程序22二、DS1302时钟底层驱动程序27三、数据存储底层驱动程序33一、引言(一)课题研究的背景工业控制是计算机的一个重要应用领域,计算机控制系统正是为了
7、适应这一领域的需要而发展起来的一门专业技术,它主要研究如何将计算机技术、通过信息技术和自动控制理论应用于工业生产过程,并设计出所需要的计算机控制系统。随着微机测量和控制技术的迅速发展与广泛应用,以单片机为核心的温度采集与控制系统的研发与应用在很大程度上提高了生产生活中对温度的控制水平。本设计就是基于单片机STC89C52温度控制系统的设计,通过本次课程实践,我们更加的明确了单片机的广泛用途和使用方法,以及其工作的原理。(二)课题研究的目的和意义随着社会的发展,温度的测量及控制变得越来越重要。本文采用单片机STC89C52设计了温度实时测量及控制系统。单片机STC89C52 能够根据温度传感器D
8、S18B20 所采集的温度在液晶屏上实时显示,通过控制从而把温度控制在设定的范围之内。所有温度数据均通过液晶显示器LCD显示出来。系统可以根据时钟存储相关的数据。通过该课程的学习使我们对计算机控制系统有一个全面的了解、掌握常规控制算法的使用方法、掌握简单微型计算机应用系统软硬的设计方法,进一步锻炼同学们在微型计算机应用方面的实际工作能力。二、硬件电路的设计(一)系统设计的框架本课题设计的是一种以STC89C52单片机为主控制单元,以DS18B20为温度传感器的温度控制系统。该控制系统可以实时存储相关的温度数据并记录当前的时间。其主要包括:电源模块、温度采集模块、按键处理模块、实时时钟模块、数据
9、存储模块、LCD显示模块、通讯模块以及单片机最小系统。图1 系统设计框架(二)单片机最小系统电路在课题设计的温度控制系统设计中,控制核心是STC89C52单片机,该单片机为51系列增强型8位单片机,它有32个I/O口,片内含4K FLASH工艺的程序存储器,便于用电的方式瞬间擦除和改写,而且价格便宜,其外部晶振为12MHz,一个指令周期为1S。使用该单片机完全可以完成设计任务,其最小系统主要包括:复位电路、震荡电路以及存储器选择模式(EA脚的高低电平选择),电路如下图2所示:图2 单片机最小系统(三)单片机的选型本课题设计的温度控制系统主控制芯片选型为STC89C52单片机,其特点如下:1.S
10、TC89C52单片机简介目前,51系列单片机在工业检测领域中得到了广泛的应用,因此我们可以在许多单片机应用领域中,配接各种类型的语音接口,构成具有合成语音输出能力的综合应用系统,以增强人机对话的功能。STC89C52单片机是深圳宏晶科技有限公司生产的一种单片机,在一小块芯片上集成了一个微型计算机的各个组成部分。每一个单片机包括:一个8位的微型处理器CPU;一个512K的片内数据存储器RAM;4K片内程序存储器;四个8位并行的I/O接口P0-P3,每个接口既可以输入,也可以输出;两个定时器/记数器;五个中断源的中断控制系统;一个全双工UART的串行I/O口;片内振荡器和时钟产生电路,但石英晶体和
11、微调电容需要外接。最高允许振荡频率是12MHZ。以上各个部分通过内部总线相连接。2.STC89C52单片机时序 STC89C52单片机的一个执器周期由6个状态(s1s6)组成,每个状态又持续2个震荡周期,分为P1和P2两个节拍。这样,一个机器周期由12个振荡周期组成。若采用12MHz的晶体振荡器,则每个机器周期为1us,每个状态周期为16us;在一数情况下,算术和逻辑操作发生在N期间,而内部寄存器到寄存器的传输发生在P2期间。对于单周期指令,当指令操作码读人指令寄存器时,使从S1P2开始执行指令。如果是双字节指令,则在同一机器周期的s4读人第二字节。若为单字节指令,则在51期间仍进行读,但所读
12、入的字节操作码被忽略,且程序计数据也不加1。在加结束时完成指令操作。多数STC89C52指令周期为12个机器周期,只有乘法和除法指令需要两个以上机器周期的指令,它们需4个机器周期。 对于双字节单机器指令,通常是在一个机器周期内从程序存储器中读人两个字节,但Movx指令例外,Movx指令是访问外部数据存储器的单字节双机器周期指令,在执行Movx指令期间,外部数据存储器被访问且被选通时跳过两次取指操作。3.STC89C52单片机引脚介绍STC89C52单片机的40个引脚中有2个专用于主电源引脚,2个外接晶振的引脚,4个控制或与其它电源复用的引脚,以及32条输入输出I/O引脚。下面按引脚功能分为4个
13、部分叙述个引脚的功能。(1)电源引脚Vcc和VssVcc(40脚):接+5V电源正端;Vss(20脚):接+5V电源正端。(2)外接晶振引脚XTAL1和XTAL2XTAL1(19脚):接外部石英晶体的一端。在单片机内部,它是一个反相放大器的输入端,这个放大器构成采用外部时钟时,对于HMOS单片机,该引脚接地;对于CHOMS单片机,该引脚作为外部振荡信号的输入端。XTAL2(18脚):接外部晶体的另一端。在单片机内部,接至片内振荡器的反相放大器的输出端。当采用外部时钟时,对于HMOS单片机,该引脚作为外部振荡信号的输入端。对于CHMOS芯片,该引脚悬空不接。(3)控制信号或与其它电源复用引脚 控
14、制信号或与其它电源复用引脚有RST/VPD、ALE/P、PSEN和EA/VPP等4种形式。(A)RST/VPD(9脚):RST即为RESET,VPD为备用电源,所以该引脚为单片机的上电复位或掉电保护端。当单片机振荡器工作时,该引脚上出现持续两个机器周期的高电平,就可实现复位操作,使单片机复位到初始状态。当VCC发生故障,降低到低电平规定值或掉电时,该引脚可接上备用电源VPD(+5V)为内部RAM供电,以保证RAM中的数据不丢失。(B)ALE/ P (30脚):当访问外部存储器时,ALE(允许地址锁存信号)以每机器周期两次的信号输出,用于锁存出现在P0口的低(C)PSEN(29脚):片外程序存储
15、器读选通输出端,低电平有效。当从外部程序存储器读取指令或常数期间,每个机器周期PESN两次有效,以通过数据总线口读回指令或常数。当访问外部数据存储器期间,PESN信号将不出现。(D)EA/Vpp(31脚):EA为访问外部程序储器控制信号,低电平有效。当EA端保持高电平时,单片机访问片内程序存储器4KB(MS52子系列为8KB)。若超出该范围时,自动转去执行外部程序存储器的程序。当EA端保持低电平时,无论片内有无程序存储器,均只访问外部程序存储器。对于片内含有EPROM的单片机,在EPROM编程期间,该引脚用于接21V的编程电源Vpp。 (4)输入/输出(I/O)引脚P0口、P1口、P2口及P3
16、口(A).P0口(39脚22脚):P0.0P0.7统称为P0口。当不接外部存储器与不扩展I/O接口时,它可作为准双向8位输入/输出接口。当接有外部程序存储器或扩展I/O口时,P0口为地址/数据分时复用口。它分时提供8位双向数据总线。对于片内含有EPROM的单片机,当EPROM编程时,从P0口输入指令字节,而当检验程序时,则输出指令字节。(B).P1口(1脚8脚):P1.0P1.7统称为P1口,可作为准双向I/O接口使用。对于MCS52子系列单片机,P1.0和P1.1还有第2功能:P1.0口用作定时器/计数器2的计数脉冲输入端T2;P1.1用作定时器/计数器2的外部控制端T2EX。对于EPROM
17、编程和进行程序校验时,P0口接收输入的低8位地址。(C).P2口(21脚28脚):P2.0P2.7统称为P2口,一般可作为准双向I/O接口。当接有外部程序存储器或扩展I/O接口且寻址范围超过256个字节时,P2口用于高8位地址总线送出高8位地址。对于EPROM编程和进行程序校验时,P2口接收输入的8位地址。(D).P3口(10脚17脚):P3.0P3.7统称为P3口。它为双功能口,可以作为一般的准双向I/O接口,也可以将每1位用于第2功能,而且P3口的每一条引脚均可独立定义为第1功能的输入输出或第2功能。P3口的第2功能见下表 表1 单片机P3.0管脚含义引脚第2功能P3.0RXD(串行口输入
18、端0)P3.1TXD(串行口输出端)P3.2INT0(部中断0请求输入端,低电平有效)P3.3INT1(中断1请求输入端,低电平有效)P3.4T0(时器/计数器0计数脉冲端)P3.5T1(时器/计数器1数脉冲端)P3.6WR(部数据存储器写选通信号输出端,低电平有效)P3.7RD(部数据存储器读选通信号输出端,低电平有效)综上所述,MCS51系列单片机的引脚作用可归纳为以下两点:1).单片机功能多,引脚数少,因而许多引脚具有第2功能;2).单片机对外呈3总线形式,由P2、P0口组成16位地址总线;由P0口分时复用作为数据总线。(四)温度传感器电路采用一线制数字温度传感器DS18B20来作为本课
19、题的温度传感器。传感器输出信号进4.7K的上拉电阻直接接到单片机的P1.0引脚上。DS18B20温度传感器是美国达拉斯(DALLAS)半导体公司推出的应用单总线技术的数字温度传感器。该器件将半导体温敏器件、A/D转换器、存储器等做在一个很小的集成电路芯片上。本设计中温度传感器之所以选择单线数字器件DS18B20,是在经过多方面比较和考虑后决定的,主要有以下几方面的原因:(1)系统的特性:测温范围为-55+125 ,测温精度为士0.5;温度转换精度912位可变,能够直接将温度转换值以16位二进制数码的方式串行输出;12位精度转换的最大时间为750ms;可以通过数据线供电,具有超低功耗工作方式。(
20、2)系统成本:由于计算机技术和微电子技术的发展,新型大规模集成电路功能越来越强大,体积越来越小,而价格也越来越低。一支DS18B20的体积与普通三极管相差无几,价格只有十元人民币左右。(3)系统复杂度:由于DS18B20是单总线器件,微处理器与其接口时仅需占用1个I/O端口且一条总线上可以挂接几十个DS18B20,测温时无需任何外部元件,因此,与模拟传感器相比,可以大大减少接线的数量,降低系统的复杂度,减少工程的施工量。(4)系统的调试和维护:由于引线的减少,使得系统接口大为简化,给系统的调试带来方便。同时因为DS18B20是全数字元器件,故障率很低,抗干扰性强,因此,减少了系统的日常维护工作
21、。DS18B20温度传感器只有三根外引线:单线数据传输总线端口DQ ,外供电源线VDD,共用地线GND。DS18B20有两种供电方式:一种为数据线供电方式,此时VDD接地,它是通过内部电容在空闲时从数据线获取能量,来完成温度转换,相应的完成温度转换的时间较长。这种情况下,用单片机的一个I/O口来完成对DS18B20总线的上拉。另一种是外部供电方式(VDD接+5V),相应的完成温度测量的时间较短。在本设计中采用外部供电方式实现DS18B20传感器与单片机的连接,其接口电路如图4所示。图4 温度传感器接口(五)系统电源电路的设计本系统采用电源稳压芯片是LM2596,该开关电压调节器是降压型电源管理
22、单片集成电路,能够输出3A的驱动电流,输入电压是+5v,输入电压是+24v,同时具有很好的线性和负载调节特性。该器件内部集成频率补偿和固定频率发生器,开关频率为150KHz,与低频开关调节器相比较,可以使用更小规格的滤波元件。 该器件还有其他一些特点:在特定的输入电压和输出负载的条件下,输出电压的误差可以保证在4%的范围内,振荡频率误差在15%的范围内;可以用仅80A的待机电流,实现外部断电;具有自我保护电路(一个两级降频限流保护和一个在异常情况下断电的过温完全保护电路)在该温度控制系统中,其电源电路设计如下图10所示。图5 系统电源模块(六)LCD显示电路本课题设计的温度控制系统是采用液晶屏
23、128*64作为显示模块,其接口原理图如下图6所示:图6 液晶显示接口电路(七)串口通讯电路本课题设计的通讯采用的是常见的串口通讯,协议转换芯片是采用MAX232A,其接口原理图如下图7所示:图6 串口通讯接口电路(八)按键接口电路本课题设计采用的键盘模块,其接口原理图如下图8所示:图8 键盘模块电路(九)DS1302时钟电路本课题设计的时钟是采用时钟芯片DS1302,其接口原理图如下图9所示:图9 时钟接口电路(十)存储器接口电路本课题设计的存储器采用的是AT24C256,其接口原理图如下图十所示:图10 存储器电路三、系统软件设计系统的软件主要是采用C语言,对单片机进行变成实现各项功能。主
24、程序对模块进行初始化,而后调用读温度、处理温度、显示、键盘等模块。用的是循环查询方式,来显示和控制温度,主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值并负责调用各子程序,其程序流程如图10系统程序流程图。开始初始化启动DB18B20读温度计算温度LCD显示图10系统程序流程图(一)计算温度子程序 读出温度子程序的主要功能包括初始化,判断DS18B20是否存在,若存在则进行一系列的读操,作若不存在则返回。其程序流程图如图11所示。图11 读温度流程图 (二)按键处理子程序 按键处理子程序主要是负责参数的设置,主程序每循环一次都要对按键进行扫描,判断是否有输入键按
25、下则进行一系列的按键输入操作。其程序流程框图如图12所示。图12 温度转换流程图(三)计算温度子程序计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图13所示。 开始温度零下?温度值取补码置“”标志计算小数位温度BCD值计算整数位温度BCD值 结束置“+”标志NY图13 计算温度子程序(四)显示数据刷新子程序显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。程序流程图如图14。温度数据移入显示寄存器十位数0?百位数0?十位数显示符号百位数不显示百位数显示数据(不显示符号) 结束NNYY图14 数据
26、刷新子程序四、结束语通过此次毕业论文的课题设计,我们学会了怎样把所学的书本知识应用于实践中去,并学会了如何去思考整个控制系统的软硬件设计。实践过程中我们遇到了一些困难,但在解决问题的过程中,我们学会了团队合作精神和怎样发现问题、分析问题,进而解决问题。此次课程设计不仅增强了我们学习专业课的兴趣,而且给了我们勇气和信心,更重要的是它为我们以后的学习指明了方向。参考文献1 李广弟,朱月秀,王秀山.单片机基础北京航空航天大学出版社,2001(07).2 蔡美琴,张为民等.MCS-51系列单片机系统及其应用高等教育出版社,2004(06).3 张毅刚,等.MCS-51单片机应用设计M.哈尔滨工业大学出
27、版社,1997.4 刘瑞星,胡健等.Protel DXP 实用教程机械工业出版社,2003(04).5 于海生. 计算机控制技术 机械工业出版社 2007(05).6 谭浩强. C程序设计 清华大学出版社.7 康华光. 电子技术基础 模拟部分 高等教育出版社 1998(08).8 余锡存. 单片机原理与接口技术 西安电子科技大学出版社,2003.致谢本论文是在我的指导老师密切关心和悉心指导下完成的。老师在课题开题期间和论文写作的过程中给予了我许多指导,导师总是以认真负责、一丝不苟的工作态度阅读并修改文章中不足的地方,他优良的作风和严谨治学的态度深深影响着我,至此,向恩师致以最真挚的感谢和最崇高
28、的敬意!同时我要感谢我的同学,特别是我的室友们,正是他们在这几年里陪我一起成长,一起学习,才让我有了今天的成绩。他们在平时的学习和生活中他们给予了我无私的关怀和帮助,在此表示我最诚挚的谢意。附件1:系统原理图附件2:系统相关程序一、DS18B20底层驱动程序/延时 N ms/DS1820引脚定义sbit TMDAT =P10;void DS1820_DelayCount (unsigned char Coun) data unsigned char Count; Count=Coun; while(Count0) Count-; Count=Coun; while(Count0) Count-
29、;/复位DS18B20void DS1820_Reset(void) TMDAT=0; DS1820_DelayCount(412); TMDAT=1; DS1820_DelayCount(16); /等待DS18B20应答unsigned char DS1820_Answer(void)data unsigned int i;data unsigned char j; i=0xc000; while(TMDAT) i-;if (i=0)return(aban_return); i=0xffff; j=3; while(TMDAT) i-;if (i=0) if(j=0) return(aba
30、n_return); else j-; i=0xffff; DS1820_DelayCount(16); return(done_return);/等待DS18B20应答/读取位bit DS1820_Readbit(void) data int i=0; bit dat; TMDAT=0;i+;i+;i+;i+; TMDAT=1;i+;i+;i+;i+;i+;i+;i+;i+; dat = TMDAT;/ DS1820_DelayCount(8); DS1820_DelayCount(32); return dat;/读取字节unsigned char DS1820_Readbyte(void
31、)data unsigned char i,j,dat=0; for(i=1;i=8;i+) j=DS1820_Readbit(); dat=(j1); return dat;/写一个字节void DS1820_Writebyte(unsigned char dat) data signed char i=0; data unsigned char j; bit testb; for(j=1;j1; if(testb) TMDAT=0; i+;i+;i+;i+;i+;i+;i+;i+; TMDAT=1; /DS1820_DelayCount(8); DS1820_DelayCount(32);
32、 else TMDAT=0; /DS1820_DelayCount(8); DS1820_DelayCount(32); TMDAT=1; i+;i+;i+;i+;i+;i+;i+;i+; /读操作开始unsigned char DS1820_StartTem(void) EA=0; DS1820_Reset(); if(DS1820_Answer()=aban_return) EA=Ea; return(aban_return); / DS1820_Delayms(1); DS1820_Delayms(4); DS1820_Writebyte(0xcc); / DS1820_Writebyt
33、e(0x55); / for(i=0;i8;i+) /DS1820_Writebyte(DS1820_tempi); DS1820_Writebyte(0x44); EA=Ea; return(done_return);/读所有传感器int DS1820_ReadTem(void)data unsigned char a,b;data int y3;data float y4;data unsigned char i; EA=0; DS1820_Reset(); if(DS1820_Answer()=aban_return) EA=Ea; return(0xffff); DS1820_Dela
34、yms(4); DS1820_Writebyte(0xcc); /跳过匹配传感器 /DS1820_Writebyte(0x55); /匹配传感器 / for(i=0;i8;i+) /DS1820_Writebyte(run_inf.system_index.DS1820_tempi); DS1820_Writebyte(0xbe); /读取温度 for(i=0;i9;i+) run_inf.system_index.DS1820_tempi=DS1820_Readbyte(); if(CRC(9)!=0) EA=1; return(0xffff); /计算CRC a = run_inf.sys
35、tem_index.DS1820_temp0; b = run_inf.system_index.DS1820_temp1; DS1820_Reset(); y3 = (b0; i-)rtc_io = temp_0; /*相当于汇编中的 RRC */rtc_sc = 1;rtc_sc = 0;temp = temp 1; /功能: 从DS1302读取1Byte数据unsigned char uc_RTOutputByte(void) unsigned char i;rtc_io=1;for(i=8; i0; i-) temp = temp 1; /*相当于汇编中的 RRC */ temp_7
36、= rtc_io; rtc_sc = 1; rtc_sc = 0; return(temp); /功能: 往DS1302写入数据void write1302(unsigned char ucAddr,unsigned char ucDa) bit ea; ea=EA; EA=0;rtc_rs_port&=(rtc_rs_bit);rtc_sc = 0;rtc_rs_port|=rtc_rs_bit;v_RTInputByte(ucAddr); /* 地址,命令 */v_RTInputByte(ucDa); /* 写1Byte数据*/rtc_sc = 1;rtc_rs_port&=(rtc_rs
37、_bit);EA = ea; /功能: 读取DS1302某地址的数据unsigned char read1302(unsigned char ucAddr)unsigned char ucDa; bit ea; ea=EA; EA=0;rtc_rs_port&=(rtc_rs_bit);rtc_sc = 0;rtc_rs_port|=rtc_rs_bit;v_RTInputByte(ucAddr); /* 地址,命令 */ucDa = uc_RTOutputByte(); /* 读1Byte数据 */rtc_sc = 1;rtc_rs_port&=(rtc_rs_bit);EA = ea;re
38、turn(ucDa);/功能: 设置初始时间void Set1302(pTime_S time_temp) unsigned char i= 0x80; write1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/ write1302(i,time_temp-sec); i +=2; write1302(i,time_temp-min); i +=2; write1302(i,time_temp-hou); i +=2; write1302(i,time_temp-day); i +=2; write1302(i,time_temp-mon); i +=2; write13
39、02(i,0x02); i +=2; write1302(i,time_temp-yea); i +=2; write1302(0x8e,0x80); /* 控制命令,WP=1,写保护*/功能: 读取DS1302当前时间void get1302(void) unsigned char i,time_bcd_temp6;unsigned char ucAddr = 0x81;for (i=0;i7;i+) time_bcd_tempi = read1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */ ucAddr += 2; sec=time_bcd_temp0;min=t
40、ime_bcd_temp1;hou=time_bcd_temp2;day=time_bcd_temp3;mon=time_bcd_temp4;yea=time_bcd_temp6; /连续6字节读出程序void ds1302_read(unsigned char *ptr,unsigned char addr) unsigned char i;addr=addr*2+0x0c1;for(i=0;i6;i+) *(ptr+i)=read1302(addr); addr+=2; /连续6字节写入程序void ds1302_write(unsigned char *ptr,unsigned char addr)unsigned char i;addr=addr*2+0x0c0;write1302(0x8e,0x00); /写保护置低(关闭)for(i=0;i