恒温控制系统设计毕业设计论文_第1页
恒温控制系统设计毕业设计论文_第2页
恒温控制系统设计毕业设计论文_第3页
恒温控制系统设计毕业设计论文_第4页
恒温控制系统设计毕业设计论文_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGEPAGE26毕业设计说明书题目:恒温控制系统产品设计工艺设计方案设计√类型:学生姓名:学号:学院:电子信息工程学院专业:应用电子技术班级:学校指导教师:企业指导教师:2015年11月25日摘要随着时代的进步和发展,温度的测试已经影响到我们的生活、工作、科研、各个领域,已经成为了一种非常重要的事情,因此设计一个温度测试的系统势在必行。本文主要介绍了一个基于STC89C52单片机的数字温度报警器系统。详细描述了利用数字温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,对各部分的电路也一一进行了介绍,该系统可以方便的实现温度的采集和报警,并可以根据需要任意上下限报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当做温度处理模块潜入其他系统中,作为其他主系统的辅助扩展。DS18B20与STC89C52结合实现最简温度报警系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。关键词:单片机;温度检测;STC89C52;DS18B20目录TOC\o"1-2"\h\z\u1、设计要求与方案论证 41.1设计要求 41.2系统基本方案选择和论证 41.3温度传感器设计方案论证 51.4电路设计最终方案决定 62、元器件简介 62.1单片机介绍 62.2、DS18B20概述 72.3、数码管介绍 73、电路(硬件)设计 83.1、设计原理 83.2、原理图 93.3、原件清单 103.4、作品实物图 104、程序(软件)设计 115、装配与调试 116、总结 11致谢 13参考文献 13附:源程序 141设计要求与方案论证首先明确设计要求,再讨论方案,一一攻破设计的难点。1.1设计要求基本范围0℃-99℃;精度误差小于0.1℃;数码管直读显示;扩展功能:可以任意设定温度的上下限报警功能。1.2系统基本方案选择和论证由于单片机具有以下的很多优点,被我们选定为制作该作品的首选芯片单片机特点:(1)高集成度,体积小,高可靠性单片机将各功能部件集成在一块晶体芯片上,集成度很高,体积自然也是最小的。芯片本身是按工业测控环境要求设计的,内部布线很短,其抗工业噪音性能优于一般通用的CPU。单片机程序指令,常数及表格等固化在ROM中不易破坏,许多信号通道均在一个芯片内,故可靠性高。(2)控制功能强为了满足对对象的控制要求,单片机的指令系统均有极丰富的条件:分支转移能力,I/O口的逻辑操作及位处理能力,非常适用于专门的控制功能。(3)低电压,低功耗,便于生产便携式产品为了满足广泛使用于便携式系统,许多单片机内的工作电压仅为1.8V~3.6V,而工作电流仅为数百微安。(4)易扩展片内具有计算机正常运行所必需的部件。芯片外部有许多供扩展用的三总线及并行、串行输入/输出管脚,很容易构成各种规模的计算机应用系统。(5)优异的性能价格比单片机的性能极高。为了提高速度和运行效率,单片机已开始使用RISC流水线和DSP等技术。单片机的寻址能力也已突破64KB的限制,有的已可达到1MB和16MB,片内的ROM容量可达62MB,RAM容量则可达2MB。由于单片机的广泛使用,因而销量极大,各大公司的商业竞争更使其价格十分低廉,其性能价格比极高。方案一:采用STC89C52芯片作为硬件核心。STC89C52内部具有16KBROM存储空间,512字节数据存储空间,带有2K字节的EEPROM存储空间,与MCS-51系列单片机完全兼容,STC89C52可以通过串口下载。方案二:采用AT89S51。AT89S51片内具有8K字节程序存储空间,256字节的数据存储空间没有EEPROM存储空间,也与MCS-51系列单片机完全兼容,具有在线编程可擦除技术。两种单片机都完全能够满足设计需要,STC89C52相对AT89S51价格便宜,且抗干扰能力强。考虑到成本因素,因此选用STC89C52。1.3温度传感器设计方案论证利用物质各种物理性质随温度变化的规律把温度转换为电量的传感器。这些呈现规律性变化的物理性质主要有体。温度传感器是温度测量仪表的核心部分,品种繁多。按测量方式可分为接触式和非接触式两大类,按照传感器材料及电子元件特性分为热电阻和热电偶两类。现代信息技术的三大基础是信息采集(即传感器技术)、信息传输(通信技术)和信息处理(计算机技术)。温度传感器的发展大致经历了以下三个阶段;(1)传统的分立式温度传感器(含敏感元件);(2)模拟集成温度传感器/控制器;(3)智能温度传感器。国际上新型温度传感器正从模拟式向数字式、由集成化向智能化、网络化的方向发展。在20世纪90年代中期最早推出的智能温度传感器,采用的是8位A/D转换器,其测温精度较低,分辨力只能达到1°C。国外已相继推出多种高精度、高分辨力的智能温度传感器,所用的是9~12位A/D转换器,分辨力一般可达0.5~0.0625°C。由美国DALLAS半导体公司新研制的DS1624型高分辨力智能温度传感器,能输出13位二进制数据,其分辨力高达0.03125°C,测温精度为±0.2°C。为了提高多通道智能温度传感器的转换速率,也有的芯片采用高速逐次逼近式A/D转换器。目前,智能温度传感器的总线技术也实现了标准化、规范化,所采用的总线主要有单线(1-Wire)总线、I2C总线、SMBus总线和spI总线。温度传感器作为从机可通过专用总线接口与主机进行通信。方案一:由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。方案二:进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。从以上两种方案,两种都完全能够满足设计需要,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。1.4电路设计最终方案决定综上各方案所述,对此次作品的方案选定:采用STC89C52单片机作为主控制系统;采用DS18B20为传感器;采用数码管作为显示器件。2元器件简介2.1单片机介绍STC89C52是一种低损耗、高性能、CMOS八位微处理器,片内有4k字节的在线可重复编程、快速擦除快速写入程序的存储器,能重复写入/擦除1000次,数据保存时间为十年。它与MCA-51系列单片机在指令系统和引脚上完全兼容,不仅可完全代替MCS-51系列单片机,而且能使系统具有许多MCS-51系列产品没有的功能。STC89C52可构成真正的单片机最小应用系统,缩小系统体积,增加系统的可靠性,降低系统的成本。只要程序长度小于4K,四个I/O口全部提供给用户。可用5V电压编程,而且擦写时间仅需10毫秒,仅为8751/87C51的擦除时间的百分之一,与8751/87C51的12V电压擦写相比,不易损坏器件,没有两种电源的要求,改写时不拔下芯片,适合许多嵌入式控制领域。工作电压范围宽(2.7V~6V),全静态工作,工作频率宽在0Hz~24MHz之间,比8751/87C51等51系列的6MHz~12MHz更具有灵活性,系统能快能慢。STC89C52芯片提供三级程序存储器加密,提供了方便灵活而可靠的硬加密手段,能完全保证程序或系统不被仿制。P0口是三态双向口,通称数据总线口,因为只有该口能直接用于对外部存储器的读/写操作。2.2DS18B20概述DS18B20是Dallas公司继DS1820后推出的一种改进型智能数字温度传感器,与传统的热敏电阻相比,只需一根线就能直接读出被测温度值,并可根据实际需求来编程实现9~12位数字值的读数方式[3]。DS18B20封装形式及引脚功能图2.1DS18B20封装形式和引脚功能如图2.1所示,DS18B20的外形如一只三极管,引脚名称及作用如下:GND:接地端。DQ:数据输入/输出脚,与TTL电平兼容。VDD:可接电源,也可接地。因为每只DS18B20都可以设置成两种供电方式,即数据总线供电方式和外部供电方式。采用数据总线供电方式时VDD接地,可以节省一根传输线,但完成数据测量的时间较长;采用外部供电方式则VDD接+5V,多用一根导线,但测量速度较快。2.3数码管介绍数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。数码显示器是一种由LED发光二极管组合显示字符的显示器件,它使用了8个Led发光二极管,其中七个用于显示字符,一个显示小数点,所以通称为七段发光二极管数码显示器。4位一体数码管,其内部段已连接好,引脚如图所示(数码管的正面朝自己,小数点在下方)。a、b、c、d、e、f、g、dp为段引脚,S1、S2、S3、S4分别表示四个数码管的位。图2。2四位一体数码管3电路(硬件)设计STC89C52单片机数字温度传感器Led闪烁、蜂鸣器报警数码管显示STC89C52单片机数字温度传感器Led闪烁、蜂鸣器报警数码管显示图3.1方框图本温度报警器以STC89C52单片机为控制核心,由一数字温度传感器DS18B20测量被控温度,结合8段数码管组合而成。当被测量值超出或者低于预设范围则发出警报,且精度高,适用于大多数工业生产以及教育教学领域。3.2原理图图3.2原理图及PCB图 本电路主要由单片机电路、温度传感器电路、蜂鸣器驱动电路、LED电路组成发挥其功能。(在设计过程解决了在焊接时,尽量避免少走跳线,合理利用单片机的I/O口)3.3元件清单表3.1元件清单3.4作品实物图4程序(软件)设计 5装配与调试在装配前,主要对温度传感器DS18B20、数码管的引脚进行理解再进行正确的焊接,调试中对程序内容编写的理解。出现的问题:数码管显示乱码解决的结果:是由于数码管的段码与单片机的引脚的接法和程序中数码管的段码编码不同导致的数码管显示乱码。6总结本设计是以温度采集及控制过程设计为总目标,以STC89C52单片机最小应用系统为总控制中心,辅助设计有温度采样电路、A/D转换接口、加热电路、LED数码管动态串行显示器等。本设计的重点、难点是:(1)要掌握温度传感器的原理、结构、应用等;(2)考虑从非电量信号到电量信号的电路实现原理以及与单片机的接口;(3)熟悉MCS-51编程的技术,实现单片机对温度的调节控制;(4)整体电路的仿真调试。本次设计优点:采用的单片机STC89C52性价比高;热敏电阻温度传感器转化温度的方法非常简洁且精度高、测试范围较广。由于时间及精力所限,对温度控制系统做了整体设计,具体实现了其中的温度报警部分设计,即温度控制系统的采集、显示及报警模块。致谢在论文完成之际,我首先要向张艳阳老师表示最真挚的谢意。张老师老师时常督促我抓紧时间做毕业设计,并经常讨论,给我提出好的建议。张老师不仅工作认真,她严谨的治学态度令我受益匪浅,相信在我以后的生活学习带来深远的影响。在此衷心的向张老师表达我的感激之心。我还要特别感谢各位同学给予了我无私的帮助,他们帮我解决了很多设计中遇到的难题,并帮我测试程序。由于本人学识有限,加之时间仓促,文中不免有错误和待改进之处,真诚欢迎各位师长、同学提出宝贵意见。参考文献[1]钟晓伟,宋哲存,基于单片机的实验是温湿度控制系统设计[A]林业机械与木工设备[2]叶景,基于单片机的温度控制系统的设计经验与交流,2008[3]杨光友.单片机微型计算机原理及接口技术[M].北京:中国水利水电出版社,2002[4]李丹妮,单片机温度控制系统设计[J]九江学院报2005[5]ATMLECorporation,8-BitMicrocontrollerAT89C51DATESHEET.0265F-A-12/97[6]胡寿松,自动控制原理[M]北京:科学出版社,2007[7]刘笃仁,韩保君,传感器原理及应用技术西安电子科技大学出版社,2008[8]梅丽凤,王艳秋,汪毓铎,张军,单片机原理及接口技术清华大学出版社2006[9]深圳市计算机行业协会,2005年全国单片机与嵌入式系统学术交流会,北京航空航天大学出版社,2005[10]张义和,陈敌北,例说8051[M]北京:人民邮电出版社,2006[11]张开生,郭国法,MCS-51单片机温度控制系统的设计[J]微型计算机信息,2005[12]DallasSemiconductor,ProgrammableResolution1-WIREDigitalThermometerDS18B20DATESHEET.附录:源程序/***********51单片机温控上下限报警设计**********************测量范围-55℃-+125℃*********************上下限温度报警设定范围-55℃-+125℃********************************************************/#include<REGX52.H>#defineucharunsignedchar //uchar代替unsignedchar#defineuintunsignedint //uint代替unsignedintuchardisplay[4]={0x00,0x00,0x00,0x00};//定义显示缓冲区(初始化为0x00表示显示0000)ucharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0x89,0xC7}; //共阳数码管 0 123456789- H L//引脚定义: #defineSMG_XS P0 //定义数码管显示#defineSpeak P3_7 //定义蜂鸣器接口#defineLED_H P2_0 //上限报警指示灯#defineLED_L P3_6 //下限报警指示灯#defineq_kz P2_1 //(千位)数码管位选控制(第1个数码管)#defineb_kz P2_3 //(白位)数码管位选控制(第2个数码管)#defines_kz P2_5 //(十位)数码管位选控制(第3个数码管)#defineg_kz P2_7 //(个位)数码管位选控制(第4个数码管)#defineIO_18b20 P1_0//定义DS18B20接口#defineKey1 P1_1 //温度上下限报警设置按键#defineKey2 P1_6 //上下限温度加按键#defineKey3 P3_2 //上下限温度减按键#defineKey4 P3_5 //实物/仿真运行切换按键(上电默认为:实物运行参数)floatwendu; //定义真实的十进制温度变量intbig_wendu; //放大10倍后的十进制温度变量(主要方便温度显示精确到小数点后一位)inthigh=35; //定义上限温度变量intlow=25; //定义下限温度变量ucharflag=0; //定义按键温度设置标志位(0:正常显示温度1:显示上限温度值2:显示下限温度值)bitbj_flag; //定义报警标志位(0:下限报警指示灯闪烁1:上限报警指示灯闪烁)intnum=0; //定义上下限报警指示灯闪烁频率变量uintt=2; //数码管动态扫描基数为2(t=2为实物运行参数),另外(t=300为仿真运行参数)bitts=0; //定义临时调试标志位为0(0:实物运行参数1:仿真运行参数)/********************DS18B20部分******************/voiddelay_ms(uintcount) //延时函数(keil软件测试此函数运行时间约1ms){ uinti; while(count) { i=125; while(i>0){i--;} //当i>0,执行i自减1,达到延时效果 count--; }}voidds18b20_init() //DS18B20初始化(根据DS18B20初始化时序编写){ uinti; IO_18b20=0; //先将IO_18b20拉低 i=100; while(i>0){i--;} //延时一段时间803us(延时持续时间在480-960us之间即可) IO_18b20=1; //再将IO_18b20拉高 i=7; //由于DS18B20需要等待15-60US之后会自动响应拉低这个引脚 while(i>0){i--;} //所以这边需要延时一小段时间(程序中延时59us)等待DS18B20响应}bitds18b20_read_bit() //读一位函数并返回"dat"(根据DS18B20读一位字节时序编写){ uinti; bitdat; //定义位变量dat EA=0; //要操作DS18b20时先关闭定时器中断(防止定时器中断对操作DS18b20有影响,导致出错) IO_18b20=0; //先将IO_18b20拉低***(从IO_18b20拉低到读取IO_18b20上的数据状态,过程不能超过15us) i++; //小延时一下 ↑ IO_18b20=1; //再将IO_18b20拉高(释放改引脚) 不能超过15us i++; //小延时一下 EA=1; //再打开定时器中断 ↓ dat=IO_18b20; //读到的数据送到dat**(从IO_18b20拉低到读取IO_18b20上的数据状态,过程不能超过15us) i=8; while(i>0){i--;} //延时一下 return(dat); //返回读出来的数据dat}uchards18b20_read_byte() //读一个字节{ uchari,j,dat; //定义i,j,dat变量 dat=0; //dat初始化为0 for(i=0;i<8;i++) //for循环传递8位数据(即一个字节) { j=ds18b20_read_bit(); //将读一位函数并返回"dat",传送到j dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在dat里 } return(dat);//将一个字节数据返回}voidds18b20_write_byte(uchardat)//写一个字节{ uinti; ucharj; bittest; //定义临时位变量test for(j=0;j<8;j++) //for循环传递8位数据(即一个字节) { test=dat&0x01; //将dat的最低位取出来放在test dat=dat>>1; //再将dat向右移一位 if(test) //如果test为1,"写1部分(根据DS18B20写"1"时序编写)" { EA=0; //要操作DS18b20时先关闭定时器中断(防止定时器中断对操作DS18b20有影响,导致出错) IO_18b20=0; //先将IO_18b20拉低 i++; //小延时一下,(时序时间要求大于1us) EA=1; //再打开定时器中断 IO_18b20=1; //再将IO_18b20拉高(释放总线) i=8; while(i>0){i--;}//延时一下69us(时序时间要求大于60us) } else //否则test为0,"写0部分(根据DS18B20写"0"时序编写)" { EA=0; //要操作DS18b20时先关闭定时器中断(防止定时器中断对操作DS18b20有影响,导致出错) IO_18b20=0; //先将IO_18b20拉低 i=8; EA=1; //再打开定时器中断 while(i>0){i--;}//延时一下69us(时序时间要求大于60us小于120us即可) IO_18b20=1; //再将IO_18b20拉高 i++;i++; //小延时一下 } }}/**********************************************************/voidtemp_change() //发送温度转换命令函数{ ds18b20_init(); //初始化DS18B20 delay_ms(1); //延时等待1ms,时间上留有一些余地,因为DS18B20器件响应后会主动 //拉低60-240us,然后DS18B20自己会主动释放总线,即主动拉高IO口 ds18b20_write_byte(0xcc);//跳过序列号命令 ds18b20_write_byte(0x44);//发送温度转换命令}/******************************************************************/inttemperature() //获得温度函数{ inttemp; //定义温度值变量(整型变量) uchara,b; //定义变量a,b用来存放温度值的低8位和高8位 ds18b20_init(); //初始化DS18B20 delay_ms(1); //延时等待1ms,时间上留有一些余地,因为DS18B20器件响应后会主动 //拉低60-240us,然后DS18B20自己会主动释放总线,即主动拉高IO口 ds18b20_write_byte(0xcc);//跳过序列号命令 ds18b20_write_byte(0xbe);//发送读取数据命令 a=ds18b20_read_byte();//连续读两个字节数据(a为低8位数据) b=ds18b20_read_byte(); //b为高8位数据 temp=b; //将高8位数据送到temp中 temp<<=8; //再将temp左移8位,这样高8位数据就存在temp的高8位上了 temp=temp|a;//两字节合成一个整型变量(temp是高8位"按位或"a是低8位) returntemp;//返回温度值}/****************以上为DS18B20部分****************/voiddelay(uinttime) //数码管扫描延时函数{ uinti,j; for(i=time;i>0;i--) for(j=3;j>0;j--);}voiddelay_anjian(uinttime) //按键延时去抖函数{ uinti,j; for(i=time;i>0;i--) for(j=110;j>0;j--); }voiddelay_fmq(uinttime) //延时函数(蜂鸣器){ uinti,j; for(i=time;i>0;i--) for(j=5;j>0;j--);}voidfmq() //蜂鸣器函数(按键提示){ uinti; for(i=0;i<100;i++) { Speak=0; delay_fmq(10); Speak=1; delay_fmq(10); }}voiddisp0() //正常显示当前温度函数(显示缓冲区内容){ if(wendu>0) //如果温度大于0,为正数 { SMG_XS=table[display[0]]; //显示温度数据百位值 q_kz=0;b_kz=s_kz=g_kz=1; //允许(千位)数码管位(第1个数码管)点亮 delay(t); //延时一下(消隐) q_kz=1; } else //否则温度小于0,为负数 { SMG_XS=table[10]; //显示负号"-" q_kz=0;b_kz=s_kz=g_kz=1; //允许(千位)数码管位(第1个数码管)点亮 delay(t); //延时一下(消隐) q_kz=1; } SMG_XS=table[display[1]]; //显示温度数据十位值 b_kz=0;q_kz=s_kz=g_kz=1; //允许(百位)数码管位(第2个数码管)点亮 delay(t); //延时一下(消隐) b_kz=1; SMG_XS=table[display[2]]&0x7f; //显示温度数据个位值,并加入小数点 s_kz=0;q_kz=b_kz=g_kz=1; //允许(十位)数码管位(第3个数码管)点亮 delay(t); //延时一下(消隐) s_kz=1; SMG_XS=table[display[3]]; //显示温度数据小数点后一位 g_kz=0;q_kz=b_kz=s_kz=1; //允许(个位)数码管位(第4个数码管)点亮 delay(t); //延时一下(消隐) g_kz=1; } voiddisp1(high) //显示上限温度函数 { SMG_XS=table[11]; //显示"H" q_kz=0;b_kz=s_kz=g_kz=1; //允许(千位)数码管位(第1个数码管)点亮 delay(t); //延时一下(消隐) q_kz=1; if(high/100!=0) //如果上限温度百位不为0(表示上限温度值超过100) { SMG_XS=table[high/100]; //显示上限温度的百位 b_kz=0;q_kz=s_kz=g_kz=1; //允许(百位)数码管位(第2个数码管)点亮 delay(t); //延时一下(消隐) b_kz=1; SMG_XS=table[high%100/10]; //显示上限温度的十位 s_kz=0;q_kz=b_kz=g_kz=1; //允许(十位)数码管位(第3个数码管)点亮 delay(t); //延时一下(消隐) s_kz=1; SMG_XS=table[high%10]; //显示上限温度的个位 g_kz=0;q_kz=b_kz=s_kz=1; //允许(个位)数码管位(第4个数码管)点亮 delay(t); //延时一下(消隐) g_kz=1; } elseif(high>=0) //再如果上限温度值大于等于0(说明温度值是正数) { SMG_XS=table[high/10]; //显示上限温度的十位 s_kz=0;q_kz=b_kz=g_kz=1; //允许(十位)数码管位(第3个数码管)点亮 delay(t); //延时一下(消隐) s_kz=1; SMG_XS=table[high%10]; //显示上限温度的个位 g_kz=0;q_kz=b_kz=s_kz=1; //允许(个位)数码管位(第4个数码管)点亮 delay(t); //延时一下(消隐) g_kz=1; } else //否则上限温度值是负数(即零下温度值) { SMG_XS=table[10]; //显示"-"(因为是负数,所以要加"-"号) b_kz=0;q_kz=s_kz=g_kz=1; //允许(百位)数码管位(第2个数码管)点亮 delay(t); //延时一下(消隐) b_kz=1; high=0-high; //把上限温度值取正 SMG_XS=table[high/10]; //显示上限温度的十位 s_kz=0;q_kz=b_kz=g_kz=1; //允许(十位)数码管位(第3个数码管)点亮 delay(t); //延时一下(消隐) s_kz=1; SMG_XS=table[high%10]; //显示上限温度的个位 g_kz=0;q_kz=b_kz=s_kz=1; //允许(个位)数码管位(第4个数码管)点亮 delay(t); //延时一下(消隐) g_kz=1; } }voiddisp2(low) //显示下限温度函数{ SMG_XS=table[12]; //显示"L" q_kz=0;b_kz=s_kz=g_kz=1; //允许(千位)数码管位(第1个数码管)点亮 delay(t); //延时一下(消隐) q_kz=1; if(low/100!=0) //如果下限温度百位不为0(表示上限温度值超过100) { SMG_XS=table[low/100]; //显示下限温度的百位 b_kz=0;q_kz=s_kz=g_kz=1; //允许(百位)数码管位(第2个数码管)点亮 delay(t); //延时一下(消隐) b_kz=1; SMG_XS=table[low%100/10]; //显示下限温度的十位 s_kz=0;q_kz=b_kz=g_kz=1; //允许(十位)数码管位(第3个数码管)点亮 delay(t); //延时一下(消隐) s_kz=1; SMG_XS=table[low%10]; //显示下限温度的个位 g_kz=0;q_kz=b_kz=s_kz=1; //允许(个位)数码管位(第4个数码管)点亮 delay(t); //延时一下(消隐) g_kz=1; } elseif(low>=0) //再如果下限温度值大于等于0(说明温度值是正数) { SMG_XS=table[low/10]; //显示下限温度的十位 s_kz=0;q_kz=b_kz=g_kz=1; //允许(十位)数码管位(第3个数码管)点亮 delay(t); //延时一下(消隐) s_kz=1; SMG_XS=table[low%10]; //显示下限温度的个位 g_kz=0;q_kz=b_kz=s_kz=1; //允许(个位)数码管位(第4个数码管)点亮 delay(t); //延时一下(消隐) g_kz=1; } else //否则下限温度值是负数(即零下温度值) { SMG_XS=table[10]; //显示"-"(因为是负数,所以要加"-"号) b_kz=0;q_kz=s_kz=g_kz=1; //允许(百位)数码管位(第2个数码管)点亮 delay(t); //延时一下(消隐) b_kz=1; low=0-low; //把下限温度值取正 SMG_XS=table[low/10]; //显示下限温度的十位 s_kz=0;q_kz=b_kz=g_kz=1; //允许(十位)数码管位(第3个数码管)点亮 delay(t); //延时一下(消隐) s_kz=1; SMG_XS=table[low%10]; //显示下限温度的个位 g_kz=0;q_kz=b_kz=s_kz=1; //允许(个位)数码管位(第4个数码管)点亮 delay(t); //延时一下(消隐) g_kz=1; } }voidSMG_disp() //数码管显示函数 { if(flag==0) //如果flag=0 { disp0(); //正常显示当前温度函数(显示缓冲区内容) } if(flag==1) //如果flag=1 { disp1(high); //显示上限温度函数 } if(flag==2) //如果flag=2 { disp2(low); //显示下限温度函数 } }voidxitong_init() //系统初始化等待DS18b20彻底转换完成,未完成之前数码管显示""{ EA=1; //开总中断 TMOD=0x01; //定时器0为方式1 TH0=0xff; //12M晶振定时时间0.25ms0xff06 TL0=0x06; ET0=1; //开定时器0中断 TR0=0; //先不启动定时器0 SMG_XS=table[10]; //数码管显示"" q_kz=b_kz=s_kz=g_kz=0; //允许4位数码管显示 temp_change(); //发送温度转换命令函数 delay_ms(980); //等待延时980ms>750ms,时间上留有一些余地; //(因为DS18b20出厂默认最大的温度转换时间为750ms, //为了防止第一次读出来的温度值是错误的值(典型错误值一般是85℃ //程序中的延时时间需要至少为750ms)*/}voidwendu_data_cl() //温度数据处理{ staticuinti=0; //定义循环变量 i++; //i自加1(i开始从零开始自加1) if(ts==0) //0:实物运行参数 { if(i==3000){i=0;}//如果i=3000,i清0(使i控制在0-3000之间),i的范围决定温度数据刷新的快慢 } else //1:仿真运行参数 { if(i>=400) {i=0;} } if(i==0) //如果i=0,执行温度转换 { temp_change();//发送温度转换命令函数 } if(i==100) //如果i=100,处理DS18B20送过来的数据,同时加以处理 { //为了显示精确小数点后一位的温度值 wendu=temperature()*0.0625;//得到真实十进制温度值,因为DS18B20 //可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度 if(wendu<=low) //温度值低于下限温度 { bj_flag=0; //0:下限报警指示灯闪烁 TR0=1; //打开TR0 } elseif(wendu>=high)//温度值高于上限温度 { bj_flag=1; //1:上限报警指示灯闪烁 TR0=1; //打开TR0 } else //否则温度在正常温度范围 { TR0=0; //关闭TR0 LED_H=LED_L=1; //上下限报警LED都不亮 } big_wendu=wendu*10; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字 if(wendu<0) //(如果温度数据是负数)判断第一位显示正数还是负数 { big_wendu=0-big_wendu;//再把数据转换成正数,方便数据显示 } else //否则温度数据是正数 { display[0]=big_wendu/1000;//显示温度数据百位值 } big_wendu=big_wendu%1000; display[1]=big_wendu/100; //显示温度数据十位值 big_wendu=big_wendu%100; display[2]=big_wendu/10; //显示温度数据个位值 display[3]=big_wendu%10; //显示温度数据小数点后一位 } }voidanjian_cl() //按键处理函数{ if(Key1==0) //温度上下限报警设置按键按下 { delay_anjian(5); //延时去抖 if(Key1==0) //再判断温度上下限报警设置按键是否按下 { flag++; //按键温度设置标志位加1 while(flag==3){flag=0;}//当flag=3.flag清0(让0<=flag<=2) q_kz=b_kz=s_kz=g_kz=1; //关闭数码管显示 TR0=0; //关闭TR0(关闭定时器0) LED_H=LED_L=1; //上下限LED灯关闭 fmq(); //按键提示音 } while(Key1==0); //等待按键松开 } if(flag==1) //允许调整上限温度值 { if(Key2==0) //上下限温度加按键按下 { delay_anjian(5); //延时去抖 if(Key2==0) //再判断上下限温度加按键是否按下 { if(high>low) //如果上限温度>下限温度 { high++; //上限温度自加1 while(high==126){high=low+1;}//当上限温度加到126℃时,上限温度设定为比下限温度高1℃ //原因是上限温度值一定需要比下限温度值高。 q_kz=b_kz=s_kz=g_kz=1; //关闭数码管显示 fmq(); //按键提示音 } } while(Key2==0); //等待按键松开 } if(Key3==0) //上下限温度减按键按下 { delay_anjian(5); //延时去抖 if(Key3==0) //再判断上下限温度减按键是否按下 { if(high-low>1) //如果上限温度值减去下限温度值大于1 { //(这个条件判断确保上限温度不能低于下限温度) high--; //上限温度自减1 while(high==-56){high=low+1;}//当上限温度自减到-56℃时,上限温度设定为比下限温度高1℃ //原因是上限温度值一定需要比下限温度值高。 q_kz=b_kz=s_kz=g_kz=1; //关闭数码管显示 fmq(); //按键提示音 } else //否则上限温度不能再自减1 { high=high; //上限温度保持不变 q_kz=b_kz=s_kz=g_kz=1; //关闭数码管显示 fmq(); //按键提示音 } } while(Key3==0); //等待按键松开 } } if(flag==2) //允许调整下限温度值 { if(Key2==0) //上下限温度加按键按下 { delay_anjian(5); //延时去抖 if

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论