基于AT89C2051单片机的温度测控器_第1页
基于AT89C2051单片机的温度测控器_第2页
基于AT89C2051单片机的温度测控器_第3页
基于AT89C2051单片机的温度测控器_第4页
基于AT89C2051单片机的温度测控器_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

PAGEPAGE64郑州科技学院《单片机原理及应用》课程设计摘要 3引言 31.方案论证 51.1系统功能定义 51.2总体方案 52.系统硬件电路设计 62.1系统硬件框图 62.2测温模块 72.2.1DS18B20的主要特征有以下几点 72.2.2DS18B20的工作原理 92.3主控模块 122.3.1主控模块功能分析 122.3.2AT89C2051芯片的功能特性 122.4显示模块 142.5报警模块 152.6电路原理图的绘制和电路的焊接 172.6.1PROTEL简介 172.6.2电路的焊接 183.系统软件设计 183.1主控程序设计 183.2温度信息的采集 193.3温度的显示操作 204.调试与总结 21致谢 22参考文献 24附录 24附录一电路原理图 24附录二实物图 26附录三系统主程序 27

摘要:本次实习中选择了单片机89C2051并和DS18B20传感器搭建硬件电路,最终实现了基于89C2051的单片机温度控制器的设计。DS18B20是新型数字温度传感器,采用它与单片机连接测量温度可简化温度控制器的电路,提高可靠性。关键词:89C2051单片机;DS18B20温度控制器引言计算机的发展日新月异,其技术也突飞猛进,而嵌入式计算机这种专用计算机在当今科学的发展过程中更是不可或缺的。嵌入式系统是近年来发展很快的计算机方面的学科方向,并迅速渗透到控制、自动化、仪器仪表等学科。嵌入式方向包括了软硬件协同设计、嵌入式体系结构、实时操作系统、嵌入式产品设计等方面的知识,需要掌握嵌入式系统设计的典型开发工具,培训学生具备嵌入式系统软、硬件的开发能力,对于特定行业领域(如移动终端、数字家庭、信息家电以及对传统产业信息化改造)已经逐步形成了特定的嵌入式开发方法与手段。随着现代化信息技术的飞速发展,能独立工作的温度检测系统已广泛应用与诸多的领域。传统的温度检测大多以热敏电阻为传感器,但热敏电阻可靠性差、测量温度准确率低,且必须经过专门的接口电路转换成数字信号后才能进行处理。它具有微型化、低功耗、高性能、抗干扰能力强等优点,特别适合于构成温度检测系统,可直接将温度转化成串行数字信号进行处理。DS18B20的单片机温度控制器具有电路简单、可靠性高的优点。本温度控制器对温度进行实时测量并显示,用户可设定最高限报警温度值和最低限报警温度值,有一定的温度控制功能。温度是农业生产中常见的工艺参数之一,任何物理变化和化学反应过程都与温度密切相关,因此温度控制是工业现代化的重要任务。对于不同生产情况和工艺要求下的温度控制,所采用的加热方式、燃料、控制方案也有所不同。单片机又称单片微控制器,是把一个计算机系统集成到一个芯片上,它的体积小、质量轻、价格便宜,应用和开发十分便利。本文选用AT89C2051芯片做为控制器,并采用ds18b20数码管显示及12M晶振产生时钟信号,分析了系统硬件各组成之间的通讯协议。1.方案论证1.1系统功能定义根据设计要求,可以先大致勾勒出要完成设计,需要几个模块具有如下图所示的的功能,图1.1功能模块框图1.2总体方案通过对系统功能的定义,可以将基于单片机的数字温度计采用温度传感器DS18B20作为测温元件用来满足温度测量,并将温度信号经由其本身所具有的A/D转换功能,转换成数字信号经单片机处理显示于数码管显示器,从而完成温度的测量和显示。整个系统控制将由AT89C2051单片机芯片为核心构成。选用DS18B20作为测温元件,数码管作为显示器件,各个检测信号、显示信号可由单片机的I/O口进行。设计任务:用单片机设计一个测温范围在—55~125℃的数字温度计。设计要求:完成该系统的软硬件设计,学习掌握单片机采集温度的设计方法提高学习新知识、新技能的能力,培养独立设计的能力2.系统硬件电路设计2.1系统硬件框图根据系统功能要求,可以先大致勾勒出完成任务所需的系统硬件框图如下:图2.1硬件结构框图主控模块采用性价比较高的单片机芯片,在其内部将预设好的程序储存,可通过程序的运行控制测温模块进行测温,测温模块主要是由DS18B20构成,将其与所测对象进行接触即可获取被测对象的温度数据,报警模块只有当温度超出预定值时才会工作,而所测得的温度将通过显示模块的液晶显示器以数字形式显示。2.2测温模块本设计的测温元件采用的是DS18B20测温元件,DS18B20是由DALLAS(达拉斯)公司生产的一种温度传感器。超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强,使得DS18B20很受欢迎。这是世界上第一片支持“一线总线”接口的温度传感器。DS18B20数字温度计提供9位(二进制)温度读数,指示器件的温度。信息经过单线接口送入DS18B20或从DS18B20送出,因此从单片机到DS18B20仅需一条线连接即可。它可在1秒钟(典型值)内把温度变换成数字。2.2.1DS18B20的主要特征有以下几点全数字温度转换及输出;先进的单总线数据通信;最高12位分辨率,精度可达土0.5℃;12位分辨率时的最大工作周期为750毫秒;可选择寄生工作方式;检测温度范围为–55℃——+125℃;内置EEPROM,限温报警功能;64位光刻ROM,内置产品序列号,方便多机挂接;多样封装形式,适应不同硬件系统。图2.2DS18B20管脚排列及封装结构图图2.3DS18B20实物图由其引脚可看出,其3个引脚:GND为电压地直接接地;DQ为单数据总线用来与单片机相连接,本系统中DQ与单片机P3.5接口连接,仅此一个连接就能保证DS18B20与单片机之间的数据交换;VDD引脚接电源电压[12]。图2.4DS18B20寄生电源工作方式图2.5DS18B20外接电源工作方式2.2.2DS18B20的工作原理DS18B20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。一个工作周期可分为两个部分,即温度检测和数据处理。18B20共有三种形态的存储器资源,分别是:ROM只读存储器,用于存放DS18B20ID编码,其前8位是单线系列编码(DS18B20的编码是19H),后面48位是芯片唯一的序列号,最后8位是以上56的位的CRC码(冗余校验)。数据在出产时设置不由用户更改。DS18B20共64位ROM,RAM数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。第1、2个字节是温度转换后的数据值信息,第3、4个字节是用户EEPROM(常用于温度报警值储存)的镜像。在上电复位时其值将被刷新。第5个字节则是用户第3个EEPROM的镜像。第6、7、8个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第9个字节为前8个字节的CRC码。EEPROM非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据,DS18B20共3位EEPROM,并在RAM都存在镜像,以方便用户操作。我们在每一次读温度之前都必须进行复杂的且精准时序的处理,因为DS18B20的硬件简单结果就会导致软件的巨大开消。图2.6DS18B20的内部结构框图低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1,为计数器提供一频率稳定的计数脉冲。高温度系数晶振随温度变化其震荡频率明显改变,很敏感的振荡器,所产生的信号作为减法计数器2的脉冲输入,为计数器2提供一个频率随温度变化的计数脉冲。图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值。图2.7DS18B20的内部测温电路框图2.3主控模块2.3.1主控模块功能分析在本系统中,主控模块居于非常重要的地位。它是整个系统的中枢,系统运行所需的每个操作指令都要由其发出。它一方面控制着测温模块进行温度信息的采集,另一方面也控制着显示模块的工作。最重要的是,由测温模块所采集到的温度信息必须经由主控模块的处理才能在显示模块上显示,从而使整个系统进行正常的运转和工作。针对以上分析本系统主控模块中的单片机芯片采用了AT89C2051芯片,此芯片功能强大,能够完全满足系统运行的需求。2.3.2AT89C2051芯片的功能特性AT89C2051是美国Atmel公司生产的低电压、高性能CMOS8位单片机[6-7],片内含有2KB的反复擦写的只读程序存储器和128B的随机存取数据存储器(RAM)。美国DALLAS半导体公司生产的DS18B20型单线智能温度传感器,属于新一代适配微处理器的智能传感器。数字温度计是以DS18B20为检测元件,由AT89C2051作为主控制器的温度计,具有功耗低、结构简单、读数方便、测温范围广、测温准确的特点。AT89C2051是MCS-51产品的兼容型,它具有2k的FLASHROM、128字ROM,15根I/O引线、两个16位定时/计数器、一个五向量两级中断结构、一个全双工串行口、一个精密模拟比较器以及片内振荡电路和时钟电路。它的P1口和P3口是双向I/O口,其中P1.2~P1.7、P3.0~P3.5和P3.7带有内部上拉电阻。在AT89C2051用作输入端时,将首先向引脚写“1”而使内部MOS管截止以便引脚处于悬浮状态,从而可获得高阻抗输入。

其主要性能如下:与MCS-51单片机产品兼容2K字节在系统可编程Flash存储器1000次擦写周期全静态操作:0Hz~24Hz两级加密程序存储器15个可编程I/O口线两个16位定时器/计数器六个中断源可编串行UART通道128×8位内部RAM直接LED驱动输出低功耗空载和掉电方式片内模拟比较器2.7V~6V的操作范围图2.8AT89C2051的引脚结构2.4显示模块本系统最突出的特点就是能方便直观地对所测温度进行读取,因此显示模块的选取极为重要,由三位共阳数码管(温度值显示)作为显示模块。采用动态扫描的方法,其中P3.0,P3.1,P3.2,P3.3控制位选,P1控制段选。由P3.0,P3.1,P3.2,P3.3向各位轮流输出扫描信号,使每一瞬间只有一个数码管被选通,然后由P1送入该位所要显示的字形码,点亮该位字形段显示的字形。在P1送出的码段和P3.0,P3.1,P3.2,P3.3送出的位段的配合控制下,使各个数码管轮流点亮显示各自的字形。注:下为三位共阳数码管图,显示摄氏度符号的一位共阳数码管倒置焊接即可。图2.9三位共阳数码管图图2.10七段数码管引脚图2.5报警模块本系统采用3mm的发光二极管作为报警装置,发光二极管简称为LED。由镓(Ga)与砷(AS)、磷(P)的化合物制成的二极管,当电子与空穴复合时能辐射出可见光,因而可以用来制成发光二极管。在电路及仪器中作为指示灯,或者组成文字或数字显示。磷砷化镓二极管发红光,磷化镓二极管发绿光,碳化硅二极管发黄光。发光二极管的核心部分是由P型半导体和N型半导体组成的晶片,在P型半导体和N型半导体之间有一个过渡层,称为PN结。在某些半导体材料的PN结中,注入的少数载流子与多数载流子复合时会把多余的能量以光的形式释放出来,从而把电能直接转换为光能。PN结加反向电压,少数载流子难以注入,故不发光。这种利用注入式电致发光原理制作的二极管叫发光二极管,通称LED。当它处于正向工作状态时(即两端加上正向电压),电流从LED阳极流向阴极时,半导体晶体就发出从紫外到红外不同颜色的光线,光的强弱与电流有关。图2.11发光二极管的构造图选用发光二极管的好处:1.效能:消耗能量较同光效的白炽灯减少80%2.适用性:体积很小,每个单元LED小片是3-5mm的正方形,所以可以制备成各种形状的器件,并且适合于易变的环境3.稳定性:10万小时,光衰为初始的50%4.响应时间:其白炽灯的响应时间为毫秒级,LED灯的响应时间为纳秒级对环境污染无有害金属汞2.6电路原理图的绘制和电路的焊接在硬件的设计前期,根据框图对电路中可能出现的电路,进行了模拟实验,并根据实验结果对后期的硬件设计进行了合理化的修改完善。在第一章中已分析了系统并绘制了框图,并根据框图分别设计了各部分电路。由于温度传感器DS18B20集成度较高,所以在硬件电路设计时不需要太多其他元件即可实现预期功能。因此在PROTEL上对原理图进行了绘制,从而得出了最终的完整电路原理图[附录一]。2.6.1PROTEL简介PROTEL是PORTEL公司在80年代末推出的EDA软件,在电子行业的CAD软件中,它当之无愧地排在众多EDA软件的前面,是电子设计者的首选软件,它包含了电原理图绘制、模拟电路与数字电路混合信号仿真、多层印制电路板设计(包含印制电路板自动布线)、可编程逻辑器件设计、图表生成、电子表格生成、支持宏操作等功能,并具有Client/Server(客户/服务器)体系结构,同时还兼容一些其它设计软件的文件格式,如ORCAD,PSPICE,EXCEL等,其多层印制线路板的自动布线可实现高密度PCB的100%布通率。Protel99SE采用数据库的管理方式。该软件沿袭了Protel以前版本方便易学的特点,内部界面与Protel99大体相同,新增加了一些功能模块,功能更加强大。新增的层堆栈管理功能,可以设计32个信号层,16个地电层,16个机械层。新增的3D功能在加工印制版之前可以看到板的三维效果。其具有的打印功能,可以轻松修改打印设置控制打印结果。Protel99SE容易使用的特性还体现在其帮助功能,按下右上角的小问号,然后输入你所要的信息,可以很快地看到特性的功能,然后用到设计中,按下状态栏末端的按钮,使用帮助顾问。2.6.2电路的焊接当通过PROTEL绘制出完整的电路原理图后,就可以按照绘制好的原理图进行电路的焊接,焊接时要注意虚焊和短路情况出现。焊接是要先焊单片机的主电路,以便于对各部分电路的测试。当焊完一部分子电路后,要先输入子程序进行检测,看是否有输入或输出。焊完后,就可以进行电路总体性能测试了。在测试之前,一定要先对电路检测,看是否有短路情况出现,以免芯片损坏。电源输入电压也是关键因素,在供电之前先量量。3.系统软件设计3.1主控程序设计通过对系统工作原理的了解,我们可以大致知道系统软件运行工作的流程图如下:图3.1系统运行流程图当接通电源开始工作后,单片机中的程序开始运行,将对DS18B20进行初始化,以便单片机芯片和DS18B20达成通信协议。完成初始化后,由于本系统只有一个测温元件,单片机会向其发出跳过ROM指令,接下来便可向其发送操作指令,设定温度上下限,启动测温程序。测温过程完成后,发出温度转换指令,从而便可将温度转化成数字模式进行显示读取。3.2温度信息的采集通过DS18B20单线总线的所有执行处理都从一个初始化序列开始。初始化序列包括一个由总线控制器发出的复位脉冲和随后由从机发出的存在脉冲:1、复位:首先我们必须对DS18B20芯片进行复位,复位就是由控制器(单片机)给DS18B20单总线至少480uS的低电平信号。当18B20接到此复位信号后则会在15~60uS后回发一个芯片的存在脉冲。2、存在脉冲:在复位电平结束之后,控制器应该将数据单总线拉高,以便于在15~60uS后接收存在脉冲,存在脉冲为一个60~240uS的低电平信号。至此,通信双方已经达成了基本的协议,接下来将会是控制器与18B20间的数据通信。3、控制器发送ROM指令:双方打完了招呼之后最要将进行交流了,ROM指令共有5条,每一个工作周期只能发一条,ROM指令分别是读ROM数据、指定匹配芯片、跳跃ROM、芯片搜索、报警芯片搜索。4、控制器发送存储器操作指令:在ROM指令发送给18B20之后,紧接着(不间断)就是发送存储器操作指令了。操作指令同样为8位,共6条,存储器操作指令分别是写RAM数据、读RAM数据、将RAM数据复制到EEPROM、温度转换、将EEPROM中的报警值复制到RAM、工作方式切换。5、执行或数据读写:一个存储器操作指令结束后则将进行指令执行或数据的读写,这个操作要视存储器操作指令而定。3.3温度的显示操作①如电路正常,接通电源后,只显示“ºC”符号,无温度值;②按下AN3,先显示上次存贮下来的设定温度(报警控制)值,然后再显示环境温度值,并随环境温度的变化而变化;③再按一下AN3,温度数字闪烁,待调节;④接着按AN1或AN2:按AN1为报警温度值变大,最大为125ºC;按AN2为报警温度值变小,最小为-55ºC;⑤调好后再按一下AN3,调好的报警温度值被存贮,数码管又显示环境温度。当温度达到存贮的报警值时,电路发出报警信号和动作。4.调试与总结在硬件电路焊接和软件程序设计分别完成的基础之上,进行软硬件的结合与调试。通过下载将在电脑上已完成的程序下载到单片机芯片中。在调试中发现软件中存在的问题,及时解决问题,确保系统能正常工作并达到设计要求。通过反复的调试与实验,可以证明该系统能够较好地完成设计所需的基本要求。即能够方便准确的对被测对象进行温度测量。同时在完成设计要求的前提下,充分考虑到了外观,成本等问题,在性能和价格之间作了比较好的平衡。虽然整体性能良好,但尚存在些许不足,系统稳定性不够,需要增强自己的焊接水平以便以后避免出现类似问题。本温度采集系统实用性强,结构较为简单,成本低,外接元件少。在实际应用中工作性能稳定,测量温度准确,精度较高。系统在硬件设计上充分考虑到了可扩展性,经过一定的添加或改造,很容易增加功能。本系统适用范围广泛,可以单独使用作为监控仪,应用于农业温室大棚监测植物生长的环境变化,工业厂房测量各部分的工作温度等等。也可以作为智能控制系统的一部分,与其它设备协同工作。系统移植性强,只需改变前端测量用的传感器类型,可在此基础上修改为其他非电量参数的测量系统。致谢通过此次毕业设计,我学到了很多知识。在实物的设计和论文的写作过程中,通过查资料和搜集有关的文献,培养了自学能力。通过对硬件电路的设计和焊接,增强了自己的动手能力。并且由原来的被动接受知识转换为主动的寻求知识,学会了更好地让所学知识与实践相结合,让书本上的知识与实际生活中的具体应用相结合。让自己切实感觉到了学有所用。并在此期间巩固复习了在大学4年内学过的知识,尤其是单片机和模电,数电方面的知识。同时通过这次毕业设计提高了自己的单片机编程的能力,尤其是获得的软件调试经验,同时也让自己知道了自己不足和缺陷,从而为自己能更好的改进提供了帮助。在此,首先感谢我的老师,感谢各位老师这四年中在学习中、生活上的关心和照顾;其次感谢各位同学,同学们在生活中给予很大的帮助,在学习上也给极大的鼓舞。指导老师项仕标教授和葛明涛讲师治学严谨,学识渊博,平易近人,在我做设计和论文期间对我的教诲和指导将使我终生受益。无论是在平时的阶段,还是在论文的选题、资料查询、开题、研究、设计和撰写的每一个环节,都得到导师的悉心指导和帮助。借此机会向项仕标教授和葛明涛讲师表示衷心的感谢!在毕业设计的这段时间里,其他老师们也都言传身教,以他们广博的知识,敏锐的洞察力,多年的教学和实际工作经验,在毕业设计上给予我很大的帮助。在本次设计中我学到的不仅是科学知识和工作方法,更学到了作为一个研究人员应有的治学态度以及为人处世的道理,这一切都将使我终身受益。谨在此向各位老师致以崇高的敬意和衷心的感谢!感谢几年来传授我知识的老师们,更要感谢我的家人对我学业上的支持和鼓励,感谢所有关心帮助过我的人。参考文献[1]谭浩强《C程序设计》清华大学出版社1999.12[2]李群芳肖看《单片机原理,接口及应用》清华大学出版社2005.3[3]张义和王敏男《例说51单片机》人民邮电出版社2008.4[4]蔡美琴张为民《MCS-51系列单片机系统及其应用》高等教育出版社1992[5]高峰《单片微机应用系统设计及实用技术》机械工程出版社2004[6]杨全胜《现代微机原理与接口技术》电子工业出版社2004[7]全国大学生电子设计竞赛组委会《全国大学生电子设计竞赛获奖作品精选(1994——1999)》北京理工大学出版社2003.[8]谢淑如郑光钦杨渝生《ProtelPCB99SE电路版设计》清华大学出版社[9]何立民《单片机应用技术选编》北京航空航天大学出版社,1993.2[10]段九洲《放大电路实用设计手册》辽宁科学技术出版社,2002.5[11]李炎清《毕业论文写作与范例》厦门大学出版社2006.10附录附录一电路原理图附录二实物图附录三系统主程序/*温度控制器V1.5显示为三个共阳极LED温度传感器用单总线DS18B20CPU为2051,三个按键,分别为UP,DOWN,SET温度调节上限为125度,下限为-55度只能用于单只18B20*/#include<AT89X051.H>#include<intrins.h>#defineKey_UPP3_0//上调温度#defineKey_DOWNP3_1//下调温度#defineKey_SETP1_7//设定键(温度设定,长按开电源)#defineRelayOutPortP3_5//继电器输出#defineLEDPortP1//LED控制口#defineLEDOneCP3_2//LEDDS1控制(百位)#defineLEDTwoCP3_3//LEDDS2控制(十位)#defineLEDThreeCP3_4//LEDDS3控制(个位)#defineTMPort P3_7 //DS1820DataPortunsignedcharcodeLEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF};//0-9的LED笔划,0xFF为空,0xF7为负号staticunsignedcharbdataStateREG; //可位寻址的状态寄存器sbitDS1820ON=StateREG^0; //DS1820是否存在sbitSetTF=StateREG^1;//是否是在温度设置状态sbitKeySETDown=StateREG^2;//是否已按过SET键标识sbitPowTF=StateREG^3;//电源电源标识sbitKeyTF=StateREG^4; //键盘是否允许//sbitKeySETDowning=StateREG^5; //SET是否正在按下staticunsignedcharbdataTLV_at_0x0029;//温度变量高低位staticunsignedcharbdataTHV_at_0x0028;staticsignedcharTMV;//转换后的温度值staticunsignedcharKeyV,TempKeyV;//键值staticsignedcharTMRomV_at_0x0027;//高温限制staticsignedcharTMSetV_at_0x0026;//温度设定值staticunsignedcharKSDNum;//SET键连按时的采集次数staticunsignedcharIntNum,IntNum2,IntNum3;//中断发生次数,IntNum用于SET长按检测,IntNum2用于设定状态时LED闪烁staticsignedcharLED_One,LED_Two,LED_Three;//LED的显示位LED_One为十位,LED_Two为个位staticunsignedcharSign;//负号标识voidmain(void){ voidInitDS1820(void);//定义函数 voidROMDS1820(void); voidTMVDS1820(void); voidTMRDS1820(void); voidTMWDS1820(void); voidTMREDS1820(void); voidTMERDS1820(void); voidReadDS1820(void); voidWriteDS1820(void); voidDelay_510(void); voidDelay_110(void); voidDelay_10ms(void); voidDelay_4s(void); voidV2ToV(void); StateREG=0;//初始化变量 SetTF=1; PowTF=1; //关电源 THV=0; TLV=0; TMV=0; KeyV=0; TempKeyV=0; KSDNum=0; IntNum=0; IntNum2=0; IntNum3=0; LED_One=0; LED_Two =0; InitDS1820();//初始化 ROMDS1820(); //跳过ROM TMERDS1820();//E2PRAM中温度上限值调入RAM InitDS1820();//初始化 ROMDS1820(); //跳过ROM TMRDS1820(); //读出温度指令 ReadDS1820();//读出温度值和上限值 TMSetV=TMRomV;//拷贝保存在DS18B20ROM里的上限值到TMSetV EA=1; //允许CPU中断 ET0=1; //定时器0中断打开 TMOD=0x1; //设定时器0为模式1,16位模式 TH0=0xB1; TL0=0xDF; //设定时值为20000us(20ms) TR0=1; //开始定时 while(1);}//定时器0中断外理中键扫描和显示voidKeyAndDis_Time0(void)interrupt1using2{TH0=0xB1; TL0=0xDF; //设定时值为20000us(20ms) LEDPort=0xFF;if(!Key_UP)KeyV=1;if(!Key_DOWN)KeyV=2;if(!Key_SET)KeyV=3; //KeySETDowning=0;//清除if(KeyV!=0)//有键按下{Delay_10ms();//延时防抖按下10ms再测if(!Key_UP)TempKeyV=1;if(!Key_DOWN)TempKeyV=2;if(!Key_SET)TempKeyV=3;if(KeyV==TempKeyV)//两次值相等为确定接下了键{if(KeyV==3)//按下SET键,如在SET状态就退出,否则进入{ //KeySETDowning=1;//表明SET正在按下PowTF=0;//电源标识开 if(!KeyTF) if(SetTF) { SetTF=0;//标识位标识退出设定 InitDS1820();//初始化 ROMDS1820(); //跳过ROM TMWDS1820(); //写温度上限指令 WriteDS1820(); //写温度上限到DS18B20ROM WriteDS1820(); //写温度上限到DS18B20ROM WriteDS1820(); //写温度上限到DS18B20ROM InitDS1820();//初始化 ROMDS1820(); //跳过ROM TMREDS1820(); //温度上限值COPY回E2PRAM } else SetTF=1;if(!KeySETDown)//没有第一次按下SET时,KeySETDown标识置1KeySETDown=1;elseKSDNum=KSDNum+1;//前一秒内有按过SET则开始计数}if(SetTF)//在SET状态下{if((KeyV==1)&&(!KeyTF))TMSetV=TMSetV+1;//上调温度if((KeyV==2)&&(!KeyTF))TMSetV=TMSetV-1;//下调温度if(TMSetV<=-55)//限制温度上下限TMSetV=-55;if(TMSetV>=125)TMSetV=125;} if((!KeyTF)&&(IntNum3==0))KeyTF=1;//当键盘处于可用时,锁定}if(KeySETDown)//在2秒内按下了SET则计中断发生次数用于长按SET时计时用IntNum=IntNum+1;if(IntNum>55)//中断发生了55次时(大约1.2秒)75为1.5秒左右{IntNum=0; KeySETDown=0;if(KSDNum==55)//如一直长按了SET1.2秒左右{RelayOutPort=1;//关闭继电器输出PowTF=1;//电源标识关LEDOneC=0;LEDTwoC=0;LEDThreeC=0;LEDPort=0xBF;//显示"--"Delay_4s();//延时LEDOneC=1;LEDTwoC=1;//关显示LEDThreeC=1;Delay_4s(); IntNum=0; IntNum2=0; IntNum3=0;}KSDNum=0;}}KeyV=0;TempKeyV=0;//清空变量准备下次键扫描if(!PowTF){InitDS1820(); //初始化ROMDS1820(); //跳过ROMTMVDS1820();//温度转换指令Delay_510();Delay_510();//延时等待转换完成InitDS1820();//初始化ROMDS1820(); //跳过ROMTMRDS1820(); //读出温度指令ReadDS1820();//读出温度值V2ToV();//转换显示值if(TMV>TMSetV)//根据采集到的温度值控制继电器{RelayOutPort=0; }else {RelayOutPort=1; }if(SetTF)IntNum2=IntNum2+1;//用于闪烁计数if(IntNum2>50)IntNum2=0; if(KeyTF)IntNum3=IntNum3+1;//用于防止按键连按 if(IntNum3>25) { IntNum3=0; KeyTF=0; }if((SetTF)&&(IntNum2<25))gotoInitEnd;//计数在后半段时显示LEDPort=LED_One;LEDOneC=0;Delay_510();LEDOneC=1;//显示百位数LEDPort=LED_Two;LEDTwoC=0;Delay_510();LEDTwoC=1;//显示十位数LEDPort=LED_Three;LEDThreeC=0;Delay_510();LEDThreeC=1;//显示个位数}InitEnd:;}voidV2ToV(void) //数值转换{TLV=TLV>>4; THV=THV<<4; //读出的高低位数值移位TMV=TLV|THV; //合并高低位放入TM为实际温度值 Sign=0;if(SetTF||!Key_SET)Sign=TMSetV>>7;//取符号elseSign=TMV>>7; if(Sign) { if(SetTF||!Key_SET) { LED_One=(~(TMSetV-1))/100;//SET状态下显示设定值 LED_Two=((~(TMSetV-1))-LED_One*100)/10; LED_Three=(~(TMSetV-1))-LED_One*100-LED_Two*10; } else { LED_One=(~TMV)/100; //转换百位值 LED_Two=((~TMV)-LED_One*100)/10; LED_Three=(~TMV)-LED_One*100-LED_Two*10; } } else { if(SetTF||!Key_SET) { LED_One=(TMSetV)/100;//SET状态下显示设定值 LED_Two=(TMSetV-LED_One*100)/10; LED_Three=TMSetV-LED_One*100-LED_Two*10; } else { LED_One=(TMV)/100; //转换百位值 LED_Two=(TMV-LED_One*100)/10; LED_Three=TMV-LED_One*100-LED_Two*10; } }//转LED字段 if(LED_One)//超过百时十位的处理 LED_Two=LEDDis[LED_Two]; else { if(LED_Two==0) LED_Two=LEDDis[10]; else LED_Two=LEDDis[LED_Two]; } if(Sign) LED_One=LEDDis[11]; else { if(LED_One==0) LED_One=LEDDis[10]; else LED_One=LEDDis[LED_One]; } LED_Three=LEDDis[LED_Three];}voidInitDS1820(void) //初始化DS1820{ TMPort=1; //拉高TMPort _nop_();//保持一个周期 TMPort=0; //拉低TMPortDelay_510();//延时DS1820复位时间要500us的低电平TMPort=1;//拉高TMPort _nop_();//保持 _nop_(); _nop_();Delay_110();//延时110us等待DS1820回应if(!TMPort)//回应信号为低电平DS1820ON=1;elseDS1820ON=0;Delay_110();//延时Delay_110();TMPort=1;//拉高TMPort}voidROMDS1820(void)//跳过ROM匹配{#pragmaasmMOVA,#0CCHMOVR2,#8CLRCWR1:CLRP3_7MOVR3,#6DJNZR3,$RRCAMOVP3_7,CMOVR3,#23DJNZR3,$SETBP3_7NOPDJNZR

温馨提示

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

最新文档

评论

0/150

提交评论