版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGE基于单片机的数字温度计设计院系电气信息工程学院专业电子信息工程班级学号学生姓名联系方式指导教师职称助教(硕士)2021年5月独创性说明本人郑重声明:所呈交的毕业论文(设计)是本人在指导老师指导下取得的研究成果。除了文中特别加以注释和致谢的地方外,论文(设计)中不包含其他人已经发表或撰写的研究成果。与本研究成果相关的所有人所做出的任何贡献均已在论文(设计)中作了明确的说明并表示了谢意。签名:年月日授权声明本人完全了解许昌学院有关保留、使用本科生毕业论文(设计)的规定,即:有权保留并向国家有关部门或机构送交毕业论文(设计)的复印件和磁盘,允许毕业论文(设计)被查阅和借阅。本人授权许昌学院可以将毕业论文(设计)的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存、汇编论文(设计)。本人论文(设计)中有原创性数据需要保密的部分为(如没有,请填写“无”):签名:年月日指导教师签名:年月日摘要本设计介绍以AT89C51单片机作为控制器,以数字温度传感器DS18B20作为温度采集器的数字温度计。用户可自行设置温度的上下限,超出用户设置的上下限时可以进行报警。文中先对各个模块进行分析和设计,并进行流程图的绘制,根据流程图写出C语言程序,最后在KEIL软件上进行编译、链接,在Proteus软件环境中进行仿真,达到了预期效果。关键词:温度测量;单片机;DS18B20;数码管ABSTRACTThisdesignisintroducesadigitaltemperaturethermometerwhichusetheAT89C51SCMasthecontrollerandthedigitaltemperaturesensorDS18B20asthetemperaturecollector.Usercansettheupperandlowerlimitsbyhimself.Ifthetemperatureisbeyondtherestraint,itcanalarm.Firstly,thispaperanalysesanddesignseachsub-module.ThendesignflowchartandwriteClanguageprogramsaccordingtotheflowchart.Finally,linksandcompilesaremadeinKeil,meanwhile,simulationsaremadeontheProteus.Theexpectedeffectsareachieved.Keywords:Temperaturemeasurement;AT89C51SCM;DS18B20;Digitaltube 目录1绪论 11.1课题背景及研究意义 11.2课题设计主要工作 21.3温度传感器的发展背景 22总体设计方案 22.1设计方案 32.2设计原理及组成 43系统硬件电路的设计 43.1AT89C51单片机介绍 43.1.1AT89C51的基本特性 43.1.2AT89C51引脚说明 53.1.3芯片擦出 73.2液晶显示模块简介 73.2.1液晶模块功能介绍 73.2.2LM016L引脚介绍 83.3温度传感器的工作原理 93.3.1DS18B20概述 93.3.2温度的读取 113.3.3DS18B20的读写操作 123.3.4DS18B20测温原理 133.3.5高速暂存存储器 143.3.6DS18B20的单总线读/写时序 153.4系统硬件总电路 164数字温度计软件设计 164.1DS18B20模块 174.2程序总流程图 185系统的调试与仿真 185.1Proteus软件简介 185.2KEIL软件简介 195.3系统的调试与实现 195.4仿真结果 20 6总结 22参考文献 23附录 24致谢 31PAGE11绪论1.1课题背景及研究意义随着新技术的不断开发与应用,近年来单片机发展十分迅速,一个以微机应用为主的新技术革命浪潮正在蓬勃兴起,单片机的应用已经渗透到电力、冶金、化工、建材、机械、食品、石油等各个行业。传统的温度采集方法不仅费时费力,而且精度差,单片机的出现使得温度的采集和数据处理问题能够得到很好的解决。温度是工业对象中的一个重要的被控参数。然而所采用的测温元件和测量方法也不相同;产品的工艺不同,控制温度的精度也不相同。因此对数据采集的精度和采用的控制方法也不相同。温度控制系统在国内各行各业的应用虽然已经十分广泛,但从国内生产的温度控制器来讲,总体发展水平仍然不高,同日本、美国、德国等先进国家相比,仍然有着较大的差距。数字温度计采用温度敏感元件也就是温度传感器(如铂电阻,热电偶,半导体,热敏电阻等),将温度的变化转换成电信号的变化,如电压和电流的变化,温度变化和电信号的变化有一定的关系,如线性关系,一定的曲线关系等,这个电信号可以使用模数转换的电路即AD转换电路将模拟信号转换为数字信号,数字信号再送给处理单元,如单片机或者PC机等,处理单元经过内部的软件计算将这个数字信号和温度联系起来,成为可以显示出来的温度数值,如25.0摄氏度,然后通过显示单元,如LED,LCD或者电脑屏幕等显示出来给人观察。数字温度计根据使用的传感器的不同,AD转换电路,及处理单元的不同,它的精度,稳定性,测温范围等都有区别,这就要根据实际情况选择符合规格的数字温度计。本设计涉及两个方面的内容:一是单片机技术,二是数字化温度传感器技术。本设计选择Dallas半导体公司生产的DS18B20作为传感器进行温度测量,采用单片机对温度进行控制,不仅具有控制方便、简单和灵活等优点,而且可以大幅度的提高温度控制的技术指标。在数字、智能化方面有广泛的用途。1.2课题设计主要工作本课题的研究重点是设计一种基于单片机的数字温度计控制系统。利用数字温度传感器DS18B20,此传感器课读取被测量温度值,进行转换。主要工作如下:(1)温度测试基本范围0℃—100℃。精度误差小于1℃。LED液晶显示。可以设定温度的上下限报警功能。实现报警提示。本文是基于AT89C51单片机,采用数字温度传感器DS18B20,利用DS18B20不需要A/D转换,课直接进行温度采集显示,报警的数字温度计设计。包括传感器数据采集电路,温度显示电路,上下限报警调整电路,单片机主板电路等组成。1.3温度传感器的发展背景温度是一种最基本的环境参数,人们的生活与温度息息相关,因此研究温度的测量方法在人们的生活中起着不可缺少的作用。测量温度的关键是温度传感器,温度传感器的发展历程经历了三个阶段:(1)传统的分立式温度传感器,(2)模拟集成温度传感器,(3)智能温度传感器。国际上新型温度传感器正从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展。目前的智能温度传感器(亦称数字温度传感器)是在20世纪90年代中期问世的,它的特点是能输出温度数据及相关温度控制量,适配各种微控制器,并且它是在硬件的基础上通过软件来实现测试功能的,其智能化程度也取决于软件的开发水平。本文将介绍智能集成温度传感器DS18B20的结够特征及控制方法,与传统的温度计相比,其具有读数方便、测温范围广、测温准确、输出温度采用数字显示,主要用于对测温要求比较准确的场所或科研实验室使用。2总体设计方案2.1设计方案采用数字温度芯片DS18B20测量温度,输出信号全数字化。便于单片机处理及控制,省去传统的测温方法的很多外围电路。且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线形较好。在0—100摄氏度时,最大线形偏差小于1摄氏度。DS18B20的最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和微控制器AT89C52构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接。这样,测温系统的结构就比较简单,体积也不大。采用51单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。既可以单独对多DS18B20控制工作,还可以与PC机通信上传数据,另外AT89C52在工业控制上也有着广泛的应用,编程技术及外围功能电路的配合使用都很成熟。该系统利用AT89C51芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度。该系统扩展性非常强,它可以在设计中加入时钟芯片DS1302以获取时间数据,在数据处理同时显示时间,并可以利用AT24C16芯片作为存储器件,以此来对某些时间点的温度数据进行存储,利用键盘来进行调时和温度查询,获得的数据可以通过MAX232芯片与计算机的RS232接口进行串口通信,方便的采集和整理时间温度数据。2.2设计原理及系统组成利用温度传感器DS18B20可以直接读取被测温度值,进行转换的特性,模拟温度值经过DS18B20处理后转换为数字值,然后送到单片机中进行数据处理,并与设置的温度报警限比较,超过限度后通过扬声器报警。同时处理后的数据送到LED中显示。本课题以是89C52单片机为核心设计的一种数字温度控制系统,系统整体硬件电路包括,传感器数据采集电路,温度显示电路,上下限报警调整电路,单片机主板电路等组成。系统框图主要由主控制器、单片机复位、报警按键设置、时钟振荡、LED显示、温度传感器组成。系统框图如图2-1所示:图2-1系统基本方框图1.主控制器单片机AT89C52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。2.显示电路显示电路采用LED液晶显示数码管,从P3口RXD,TXD串口输出段码。显示电路是使用的串口显示,这种显示最大的优点就是使用口资源比较少,只用p3口的RXD,和TXD,串口的发送和接收,四只数码管采用74LS164右移寄存器驱动,显示比较清晰。温度传感器温度传感器采用美国DALLAS半导体公司生产的DS18B20温度传感器。DS18B20输出信号全数字化。便于单片机处理及控制,在0—100摄氏度时,最大线形偏差小于1摄氏度,采用单总线的数据传输,可直接与计算机连接。用AT89C51芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度。3系统硬件电路的设计3.1AT89C51单片机介绍3.1.1AAT89C51是一种低功耗,高性能CMOS8位单片机。片内带4K字节闪存可编程可擦除只读存储器,其可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和80C51引脚相兼容。由于将多功能8位中央CPU和闪烁存储器组合在单个芯片中,片上Flash允许程序存储器在系统可编程,也适用于常规编程器,ATMEL的AT89C51是一种高效微控制器。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。AT89C51具有以下特点:40个引脚(具体引脚见图2-2),4K字节可编程Flash片内程序存储器,128*8位内部RAM,32个可编程双向输入/输出(I/O)口,5个中断源,2个16位的可编程定时/计数器,三级程序存储器锁定,可编程的串行通道,片内振荡器和时钟电路。另外AT89C51还具有低功耗闲置和掉电模式,可通过软件设置省电模式,在空闲模式下,CPU暂停工作,而RAM计算器和串行口以及外中断系统可以继续工作掉电模式会冻结振荡器进而保持RAM数据,停止单片机的其它功能直到外中断激活或者硬件复位动作。图3-1AT89C51实物图、管脚图3.1.2管脚说明:VCC:+5V电源。GND:接地。P0口:P0口是一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,如下表所示(括号内为第二功能):P3.0RXD(串行输入口)P3.1TXD(串行输出口)P3.2/INT0(外部中断0)P3.3/INT1(外部中断1)P3.4T0(记时器0外部输入)P3.5T1(记时器1外部输入)P3.6/WR(外部数据存储器写选通)P3.7/RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位信号。当输入的复位信号延续2个周期以上的高电平时有效,用于完成单片机的复位操作。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。如果微处理器在外部执行状态ALE禁止,置位无效。/PSEN:外部程序存储器的选通信号。由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。振荡器特性:XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2不接。图3-2AT89C5电路仿真图3.1.3芯片擦除整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。3.2液晶模块简介3.2.1模块的功能介绍LM016L液晶模块采用HD44780控制器,hd44780具有简单而功能较强的指令集,可以实现字符移动,闪烁等功能,LM016L与单片机MCU通讯可采用8位或4位并行传输两种方式,hd44780控制器由两个8位寄存器,指令寄存器(IR)和数据寄存器(DR)忙标志(BF),显示数RAM(DDRAM),字符发生器ROMA(CGOROM)字符发生器RAM(CGRAM),地址计数器RAM(AC)。IR用于寄存指令码,只能写入不能读出,DR用于寄存数据,数据由内部操作自动写入DDRAM和CGRAM,或者暂存从DDRAM和CGRAM读出的数据,BF为1时,液晶模块处于内部模式,不响应外部操作指令和接受数据,DDTAM用来存储显示的字符,能存储80个字符码, CGROM由8位字符码生成5*7点阵字符160中和5*10点阵字符32种.8位字符编码和字符的对应关系,可以查看参考文献(30)中的表4. CGRAM是为用户编写特殊字符留用的,它的容量仅64字节,可以自定义8个5*7点阵字符或者4个5*10点阵字符,AC可以存储DDRAM和CGRAM的地址,如果地址码随指令写入IR,则IR自动把地址码装入AC,同时选择DDRAM或CGRAM但愿,LM016L液晶模块的引脚图如图3-2所示图3-2LM016L液晶模块的引脚3.2.2LM016L引脚介绍:Vss(1脚):一般接地。Vdd(2脚):接电源。Vee(3脚):液晶显示器对比度调整端,接电源时对比度最弱,接地时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。RS(4脚):RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。R/W(5脚):R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。E(6脚):E(或EN)端为使能(enable)端,下降沿使能。DB0(7脚):底4位三态、双向数据总线0位(最低位)。DB1(8脚):底4位三态、双向数据总线1位。DB2(9脚):底4位三态、双向数据总线2位。DB3(10脚):底4位三态、双向数据总线3位。DB4(11脚):高4位三态、双向数据总线4位。DB5(12脚):高4位三态、双向数据总线5位。DB6(13脚):高4位三态、双向数据总线6位。DB7(14脚):高4位三态、双向数据总线7位(最高位)(也是busyflang)。寄存器选择控制如表4-1。表4-1寄存器选择控制RSR/W操作说明00写入指令寄存器(清除屏等)01读busyflag(DB7),以及读取位址计数器(DB0~DB6)值10写入数据寄存器(显示各字型等)11从数据寄存器读取数据如图3-3所示。用89C51的P2口作为数据线,用P3.2、P3.1、P3.0分别作为LCD的E、R/W、RS。其中E是下降沿触发的片选信号,R/W是读写信号,RS是寄存器选择信号本模块设计要点如下:显示模块初始化:首先清屏,再设置接口数据位为8位,显示行数为1行,字型为5×7点阵,然后设置为整体显示,取消光标和字体闪烁,最后设置为正向增量方式且不移位。向LCD的显示缓冲区中送字符,程序中采用2个字符数组,一个显示字符,另一个显示电压数据,要显示的字符或数据被送到相应的数组中,完成后再统一显示.首先取一个要显示的字符或数据送到LCD的显示缓冲区,程序延时2.5ms,判断是否够显示的个数,不够则地址加一取下一个要显示的字符或数据。图3-3液晶模块与单片机接口3.3温度传感器的工作原理3.3.1DS18B20概述DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。DS18B20测温原理:低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。DS18B20功能特点:独特的单线接口方式,仅需一个端口引脚可实现微处理器与DS18B20的双向通信;使用范围更宽,电源电压范围为3~5.5V,在寄生电源方式下可由数据线供电;在使用DS18B20时不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内;用户可定义的非易失性温度报警设置;测温范围为-55~+125℃。在-10~85℃时温度分辨率为±0.5℃,DS18B20温度传感器可完成对温度的测量,并用16位符号扩展的二进制补码的形式输出温度值,DS18B20输出的数字量与所测温度的对应关系如表3-2所列。表3-2温度/数据关系温度/℃数据输出(二进制)数据输出(十六进制)+125000001111101000007d0H+8500000101010100000550H+10.1250000000012021001000a2H+0.500000000000010000008H000000000000000000000H-0.51111111111111000fff8H-10.1251111111101011110ff5eH-551111110010010000fc90HDS18B20有4个主要的数据部件:1.光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。2.DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。3.DS18B20温度传感器的存储器DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。3.3.2温度的读取DS18B20在出厂时以配置为12位,读取温度时共读取16位,所以把后11位的2进制转化为10进制后在乘以0.0625便为所测的温度,还需要判断正负。前5个数字为符号位,当前5位为1时,读取的温度为负数;当前5位为0时,读取的温度为正数。DS18B20的初始化:1.先将数据线置高电平“1”。2.延时(该时间要求的不是很严格,但是尽可能的短一点)。3.数据线拉到低电平“0”。4.延时750微秒(该时间的时间范围可以从480到960微秒)。5.数据线拉到高电平“1”。6.延时等待(如果初始化成功则在十五到六十毫秒时间之内产生一个由DS18B20所返回的的电平据该状态来确定它的存在但是注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)7.若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。8.将数据线再次拉高到高电平“1”后结束。3.3.3DS18B20的读/写操作1.数据线先置低电平“0”。2.延时确定的时间为15微秒。3.按从低位到高位的顺序发送字节(一次只发送一位)。4.延时时间为45微秒。5.将数据线拉到高电平。6.重复上(1)到(6)的操作直到所有的字节全部发送完为止。7.最后将数据线拉高。DS18B20的读操作:1.将数据线拉高“1”。2.延时2微秒。3.将数据线拉低“0”。4.延时15微秒。5.将数据线拉高“1”。6.延时15微秒。7.读数据线的状态得到1个状态位,并进行数据处理。8.延时30微秒。3.3.4DS18B20内部结构DS18B20的管脚的排列如图3-5:图3-4DS18B20引脚图图3-4为DS18B20引脚图,DS18B20引脚名称及功能如下表3-3所示。表3-3DS18B20引脚名称以及各引脚功能序号名称引脚功能描述1GND接地端2DQ数字信号输入/输出端3VDD外接供电电源输入端(采用寄生电源接线方式时接地)DS18B20有4个主要的数字部件:64位激光ROM、温度传感器和非易失性温度报警触发器TH和TL、配置寄存器。如图3-5所示图3-5DS18B20内部结构图3.3.5DS18B20测温原理单片DS18B20使用时,总线接5千欧上拉电阻即可,图3-7为DS18B20与单片机的连接电路图。图3-6DS18B20与单片机连接电路图DS18B20的测温过程:用一个高温度系数的振荡器确定一个门周期,内部计数器在这个门周期内对一个低温度系数的振荡器的脉冲进行计数来得到温度值。图3-8为利用单片DS18B20温度测量电路方框图。图3-7温度测量电路方框图斜坡式累加器用来补偿高温振荡器的非线性,以期在测温时获得比较高的分辨率。这是通过改变计数器对温度每增加1℃所需计数的值来实现的。3.3.6高速暂存存储器高速暂存存储器由9个字节组成,其分配如表3-4所示。表3-4DS18B20暂存寄存器分布表寄存器内容及意义暂存器地址LSB0MSB1TH/用户字节12TL/用户字节23转换位数设定,由b5和b6(0-R1-R0-11111):R1-R0:00/9bit01/10bit10/11bit11/12bit至多转换时间:93.75ms187.5ms375ms750ms4保留5保留6保留7CRC校验83.3.7DS18B20的单总线读/写时序DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作按协议进行。ROM中64位序列号的作用是为了可以实现一根总线上挂多个DS18B20,DS18B20为单总线工作方式,故该总线的协议非常严格。协议包括几种单线信号类型:复位脉冲、存在脉冲、写“0”、写“1”、读“0”和读“1”。初始化要求总线主机发送复位脉冲(480~960us,再将其置为高电平)如图3-8所示。图3-8DS18B20初始化时序图当主机把数据从逻辑高电平拉到逻辑低电平时,有两种写时隙:写“1”时隙和写“0”时隙,如图3-9所示。图3-9DS18B20写时序图当从DS18B20读取数据时,主机生成读时隙,如图3-10所示。图3-10DS18B20读时序图3.4系统硬件总电路经过方案选择以及对各部分功能的了解,本设计的总电路图如下图3-11所示 图3-11总电路图4数字温度计软件设计4.1DS18B20模块DS18B20初始化流程图如下图4.1所示图4-1挂一个DS18B20的读/写程序流程图读DS18B20是从最低有效位开始,8位系列编码都读出后,48位序列号再读入,移位寄存器中就存储了CRC值。4.2程序总流程图程序总流程图如下图4-2所示。图4-2程序总流程图系统的工作过程为:单片机和DS18B20温度传感器先进行初始化,接着报警温度进行设置,分析读取温度的正负,对温度进行处理和转换,最后通过单片机的控制把温度值显示在数码管上。5系统的调试与仿真5.1Proteus软件简介Proteus软件是英国Labcenterelectronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。该软件的特点是:1.实现了单片机仿真和SPICE电路仿真相结合,具有模拟电路仿真、数字电路仿真、各种单片机(51系列、AVR、PIG等常用的MCU)及其外围电路(如LCD、RAM、ROM、键盘、LED、A/D、D/A……)组成的系统仿真。2.提供了多种虚拟仪器。如示波器、逻辑分析仪、信号发生器等,调试非常方便。3.提供软件调试功能,同时支持第三方的软件编译和调试环境,如Keil等软件。4.具有强大的原理图绘制功能。Proteus与其它单片机仿真软件不同的是,它不仅能仿真单片机CPU的工作情况,也能仿真单片机外围电路或没有单片机参与的其它电路的工作情况。因此在仿真和程序调试时,关心的不再是某些语句执行时单片机寄存器和存储器内容的改变,而是从工程的角度直接看程序运行和电路工作的过程和结果。对于这样的仿真实验.从某种意义上讲,是弥补了.实验和工程应用阉脱节的矛盾和现象。单片机系统仿真设计时,常用到的是两类软件,即仿真软件和编程软件。编程软件主要完成程序的编写、编辑、编译、调试等任务,直到得到最终系统所需的.hex文件,而仿真软件则完成虚拟硬件电路的设计、测试及运行等任务,其存储的文件是以DNS为后缀。目前常用单片机仿真软件是Proteus软件,常用编辑软件是KEIL软件。5.2Keil软件简介KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。KeilC51软件是一个基于32位Windows环境的应用程序,支持C语言和汇编语言编程,其6.0以上的版本将编译和仿真软件统一为μVision(通常称为μV2)。Keil提供包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,由以下几部分组成:μVisionIDE集成开发环境C51编译器、A51汇编器、LIB51库管理器、BL51连接/定位器、OH51目标文件生成器以及Monitor-51、RTX51实时操作系统。5.3系统的调试与实现程序的调试有很多种软件可以选择,KEIL、伟福、Proteus等。其中,KEIL既可以调试C语言又可以调试汇编语言,本设计是用C语言编写的程序,所以采用了KEIL软件进行调试。在系统调试中,一般先对硬件及软件进行分模块的调试,然后再进行系统的整体调试。各模块均调试完成后,会把程序写入单片机,然后组装连接各硬件模块,看系统通电运行后的各模块配合情况以及整体实现功能。本设计的调试分为三步:一是软件调试,二是硬件调试,三是软硬件联合调试。5.4Proteus仿真结果(1)设定温度上限为七十度下限为三十度。此时为八十度,故黄灯亮,实现报警。(2)此时为二十度低于下限,故绿灯亮(3)此时为六十度,处于界限之内,故黄灯绿灯都不亮。6总结本文介绍了基于89C51单片机的数字温度计控制系统的设计,对整个硬件电路和软件程序设计做了分析,文中介绍了数字温度计的现状及发展,介绍了仿真软件proteus及keil的基本知识,学习了proteus的仿真方法和步骤,介绍了数字温度计的设计方案及原理介绍,加深了51单片机的知识了解,介绍52单片机的结构、特点等。并学习了数字温度传感器DS18B20,设计软件仿真,更直观的反应设计的正确性。本文对其中的一些基本原理也做了简要的概述。其实写完了本篇论文,也仅仅是对数字温度计控制系统做出了一个简单的设计方案,数字温度计科利用在很多领域,在一些人不能直接进入的场所,利用单片机控制的数字温度计,可以设置并控制其中的温度,数字温度计还可以利用在温室中,这样就可以方便的控制温室中的温度,当温度超过所要求的温度时,可发生报警。总之数字温度计利用在很多领域。本课题只是单片机控制数字温度计系统得一种设计方法。参考文献[1]赵建领.51系列单片机开发宝典[J].电子工业出版社,2021[2]晁阳.单片机MCS-51原理及应用开发教程[J].清华大学出版社,2021,10[3]周润景.单片机电路设计、分析与制作[J].机械工业出版社,2021,8[4]倪志莲.单片机应用技术[J].北京理工大学出版社,2021,7[5]薛小玲.单片机接口模块应用与开发实例详解[J].北京航空航天大学出版社,2021,1[6]王煜东.传感器应用电路400例[J].中国电力出版社,2021,8[7]孙余凯.传感器应用电路300例[J].电子工业出版社,2021,3[8]李广弟.单片机基础.北京航空航天大学出版社,2021[9]闫石.数字电子技术[M].高等教育出版社,2021[10]徐惠民,安德宁.单片微型计算机原理接口与应用.北京邮电大学出版社,1996[11]王志刚.现代电子线路.清华大学出版社,2021,10[12]现代电子线路.清华大学出版社,2021,10附录A总电路图附录B #include<reg51.h> #defineucharunsignedchar #defineuintunsignedint uchari; sbitlcdrs=P3^0; sbitlcdrw=P3^1; sbitlcden=P3^2; sbitd1=P1^0; sbitd2=P1^1; uchart0[]="thetemperature"; uchart1[]="is"; ucharwendu[]="0123456789";//利用一个温度表解决温度显示乱码 sbitDQ=P3^7;//定义ds18B20总线IO //液晶显示模块 voiddelay(uintz) { uintx,y; for(x=100;x>1;x--) for(y=z;y>1;y--); } voidwrite_com(ucharcom) { lcdrs=0; P2=com; delay(5); lcden=1; delay(5); lcden=0; } voidwrite_date(uchardate) { lcdrs=1; P2=date; delay(5); lcden=1; delay(5); lcden=0; } voidinit_lcd() { lcden=0; lcdrw=0; write_com(0x38); write_com(0x01); write_com(0x0c); write_com(0x06); write_com(0x80); for(i=0;i<16;i++) { write_date(t0[i]); delay(0); } write_com(0x80+0x40); for(i=0;i<16;i++) { write_date(t1[i]); delay(0); } } //温度采集模块 voidtmpDelay(intnum)//延时函数 { while(num--); } /******************************************************************************/ voidInit_DS18B20()//初始化ds1820 { unsignedcharx=0; DQ=1;//DQ复位 tmpDelay(8);//稍做延时 DQ=0;//单片机将DQ拉低 tmpDelay(80);//精确延时大于480us DQ=1;//拉高总线 tmpDelay(14); x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败 tmpDelay(20); } unsignedcharReadOneChar()//读一个字节 { unsignedchari=0; unsignedchardat=0; for(i=8;i>0;i--) { DQ=0;//给脉冲信号 dat>>=1; DQ=1;//给脉冲信号 if(DQ) dat|=0x80; tmpDelay(4); } return(dat); } voidWriteOneChar(unsignedchardat)//写一个字节 { unsignedchari=0; for(i=8;i>0;i--) { DQ=0; DQ=dat&0x01; tmpDelay(5); DQ=1; dat>>=1; } } unsignedintReadtemp()//读取温度 { unsignedchara=0; unsignedcharb=0; unsignedintt=0; floattt=0; Init_DS18B20(); WriteOneChar(0xCC);//跳过读序号列号的操作 WriteOneChar(0x44);//启动温度转换 Init_DS18B20(); WriteOneChar(0xCC);//跳过读序号列号的操作 WriteOneChar(0xBE);//读取温度寄存器 a=ReadOneChar();//连续读两个字节数据//读低8位 b=ReadOneChar();//读高8位 t=b; t<<=8; t=t|a;//两字节合成一个整型变量。 tt=t*0.0625;//得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度 t=tt*10+0.5;//放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。 return(t); } voiddisplay() { unsignedintnum,num1;//定义的时候用uchar宏定义就会出错 unsignedintshi,ge,xiaoshu; //这里的num,shi,ge,xiaoshu必须用unsignedint无符号整数来表示,用unshignedchar字符型则显示错误 num=Readtemp(); num1=num/10; if(num1>70) {d1=0;d2=1;delay(500);} if(num1<30) {d1=1;d2=0;delay(500);} else {d1=1;d2=1;} shi=num/100; ge=num%10/10; xiaoshu=num%10; write_com(0x80+0x40+5); write_date(wendu[shi]); write_com(0x80+0x40+6); write_date(wendu[ge]); write_com(0x80+0x40+7); write_date(0x2e); write_com(0x80+0x40+8); write_date(wendu[xiaoshu]); } voidmain() { init_lcd(); while(1) { display(); delay(10); } } 致谢在论文即将完成之际,我的心情无法平静,毕业设计也许是我大学生涯上交上的最后一个作业了,本设计能够顺利完成,也归功于左伟杰老师的认真负责,使我不仅能够很好的掌握和运用专业知识,而且能在设计中得以体现。正是有了他的悉心帮助和支持,才使我的毕业论文顺利完成。同时,左老师不仅从做学问更从做人方面给予我众多的启发。他严谨细致、一丝不苟的作风是我学习、工作中的榜样,他循循善诱的教导和不拘一格的思路给予我无尽的启迪。在此,谨向我的指导老师致以诚挚的谢意!论文的完成离不开许昌学院电气信息工程学院老师的支持和帮助,在此,一并向老师表示最真挚的感谢!你们不仅让我学到了专业知识,更让我学到了做人的道理以及生活的态度。最后,我由衷地感谢大学四年中教诲我、培养我的师长们,也由衷地感谢帮助过我的同学们,他们给了我很多有益的启示与帮助,也让我深深的体会到了集体的温暖与力量。在今后的学习生活中我将更加勤奋努力,不辜负老师和同学们的一片期望和关心。
中南民族大学学生课程设计报告课程名称:C程序设计语言选题名称:通讯录管理年级:专业:信息管理与信息系统学号:姓名:指导教师:完成地点:管理学院综合实验室完成日期:1.课程设计的目的为了熟练掌握C语言的语法特点、及其数据结构,提高自身编写程序的能力。通过课程设计实现理论知识与实际情况的结合,使所学知识能够在现实社会中起到一定的作用,防止所编写的程序脱离实际,让程序可以更好的发挥作用,以便减轻实际工作中所遇到的繁琐步骤,提高现实工作中的效率。此外通过课程设计提高逻辑思考能力和解决实际问题的能力。程序设计是公认的、最能直接有效地训练学生的创新思维,培养分析问题、解决问题能力的学科之一。其次课程设计有利于治学态度的培养。程序设计中,语句的语法和常量变量的定义都有严格的要求,有时输了一个中文标点、打错了一个字母,编译就不通过,程序无法正常运行。因此,程序设计初学阶段,学生经常会犯这样的错误,可能要通过几次乃至十多次的反复修改、调试,才能成功,但这种现象会随着学习的深入而慢慢改观。这当中就有一个严谨治学、一丝不苟的科学精神的培养,又有一个不怕失败、百折不挠品格的锻炼。通讯录信息管理系统是生活中不可缺少的部分编写了一个通讯录信息管理系统是十分必要的。本程序设计具有通讯信息的录入,进行保存、查找、删除等功能,操作界面简洁美观,易于操作。程序用了条件、循环、指针、结构体等知识点,综合了文件的打开和保存编写的。可运用于小的管理软件。软件运用菜单实现交互式管理,用户轻松的按键既可实现对软件的操作,操作简单易懂,功能丰富,可以很好的满足的需要。通过对通讯录管理系统的设计,进一步理解和掌握C语言这门课程的知识点,能够熟练的调用各种函数,把各种C语句有机的结合起来,提高自己C语言程序设计的能力,为今后解决实际问题打下良好基础。2.设计方案论证2.1设计思路建立一个函数,用来添加、显示、删除、查询通讯录等信息,完成通讯录的功能。主函数可以调用六个子函数,分别完成添加记录、显示记录、删除记录、查询记录、退出系统等功能。在主函数中可以以1、2、3、4、0数字键分别可以执行某个功能模块。退出程序删除记录查询记录显示退出程序删除记录查询记录显示记录添加记录通讯录管理系统 2.2程序设计2.2.1根据图1定义数据类型建立函数typedefstruct { charscore;/*编号*/ charname[10];/*姓名*/ charnum[15];/*号码*/ charemail[20]; /*邮箱*/ charage[8]; /*年龄*/ charadds[20]; /*住址*/ }Person;2.2.2主函数及其流程图Y定义主函数main()和一系列的功能函数,只有通过这些函数才可实现程序的功能。每次使用都会调用主函数。主函数主要是利用switch语句对数据进行处理,流程图如下:Y添加记录选择1开始N选择2YYYYNNNN退出系统查询记录删除记录显示记录选择0选择4选择3添加记录选择1开始N选择2YYYYNNNN退出系统查询记录删除记录显示记录选择0选择4选择3结束结束PAGE312.2.3增加函数及其流程图.添加通讯录记录流程图:.显示通讯录记录流程图:.删除通讯录记录流程图:.查询通讯录记录流程图:2.3源程序#include<stdio.h>#include<stdlib.h>#include<string.h>typedefstruct { charscore;/*编号*/ charname[10];/*姓名*/ charnum[15];/*号码*/ charemail[20]; /*邮箱*/ charage[8]; /*年龄*/ charadds[20]; /*住址*/ }Person;Personpe[80];intmenu_select() { charc; do{ system("cls"); printf("\t\t*****通讯录*****\n"); printf("\t\t┌───────┐\n"); printf("\t\t│1.添加记录│\n"); printf("\t\t│2.显示记录│\n"); printf("\t\t│3.删除记录│\n"); printf("\t\t│4.查询记录│\n"); printf("\t\t│0.退出程序│\n"); printf("\t\t└───────┘\n"); printf("\t\t请您选择(0-4):"); c=getchar(); }while(c<'0'||c>'4'); return(c-'0'); }intInput(Personper[],intn){ inti=0; charsign,x[10]; while(sign!='n'&&sign!='N') { printf("\t编号:"); scanf("\t%d",&per[n+i].score); printf("\t姓名:"); scanf("\t%s",per[n+i].name); printf("\t年龄:"); scanf("\t%s",per[n+i].age); printf("\t电话号码:"); scanf("\t%s",per[n+i].num); printf("\t通讯住址:"); scanf("\t%s",per[n+i].adds); printf("\t电子邮箱:"); scanf("\t%s",per[n+i].email); gets(x); printf("\n\t是否继续添加?(Y/N)"); scanf("\t%c",&sign); i++; } return(n+i);}voidDisplay(Personper[],intn){ inti; printf("\n");/*格式*/ printf("编号姓名年龄电话号码通讯地址电子邮箱\n"); printf("\n"); for(i=1;i<n+1;i++) { printf("%-5d%-8s%-6s%-13s%-15s%-15s\n",per[i-1].score,per[i-1].name,per[i-1].age,per[i-1].num,per[i-1].adds,per[i-1].email); if(i>1&&i%10==0) { printf("\t\n"); printf("\t"); system("pause"); printf("\t\n"); } } printf("\n"); system("pause");}intDelete_a_record(Personper[],intn){ chars[20]; inti=0,j; printf("\t请输入想删除记录中的名字:"); scanf("%s",s); while(strcmp(per[i].name,s)!=0&&i<n)i++; if(i==n) { printf("\t通讯录中没有此人!\n"); return(n); } for(j=i;j<n-1;j++) { strcpy(per[j].num,per[j+1].num); strcpy(per[j].name,per[j+1].name); strcpy(per[j].age,per[j+1].age); strcpy(per[j].adds,per[j+1].adds); strcpy(per[j].email,per[j+1].email); per[j].score=per[j+1].score; } printf("\t\t\t已经成功删除!\n"); return(n-1);}voidQuery_a_record(Personper[],intn){ intm; printf("\t\n请选择查询方式:\n");printf("\t┌──────┐\n");printf("\t│1姓名│\n");printf("\t│2电话│\n");printf("\t│3地址│\n");printf("\t│4返回│\n");printf("\t└──────┘\n");printf("请选择:");scanf("%d",&m);while(m!=1&&m!=2&&m!=3&&m!=4){ printf("输入错误,请重新选择:"); scanf("%d",&m); } if(m==1) { chars[20]; inti=0; printf("\t请输入想查询的姓名:"); scanf("\t%s",s); while(strcmp(per[i].name,s)!=0&&i<n)i++; if(i==n) { printf("\t通讯录中没有此人!\n"); return; } printf("\t此人编号:%d\n",per[i].score); printf("\t此人年龄:%s\n",per[i].age); printf("\t电话号码:%s\n",per[i].num); printf("\t通讯地址:%s\n",per[i].adds); printf("\t电子邮箱:%s\n",per[i].email); }; if(m==2) { chars[20]; inti=0; printf("\t请输入想查询的电话:"); scanf("\t%s",s); while(strcmp(per[i].num,s)!=0&&i<n)i++; if(i==n) { printf("\t通讯录中没有此人!\n"); return; } printf("\t此人编号:%d\n",per[i].score); printf("\t此人姓名:%s\n",per[i].name); printf("\t此人年龄:%s\n",per[i].age); printf("\t通讯地址:%s\n",per[i].adds); printf("\t电子邮箱:%s\n",per[i].email); }; if(m==3) { chars[20]; inti=0; printf("\t请输入想查询的地址:"); scanf("\t%s",s); while(strcmp(per[i].adds,s)!=0&&i<n)i++; if(i==n) { printf("\t通讯录中没有此人!\n"); return; } printf("\t此人编号:%d\n",per[i].score); printf("\t此人姓名:%s\n",per[i].name); printf("\t此人年龄:%s\n",per[i].age); printf("\t电话号码:%s\n",per[i].num); printf("\t电子邮箱:%s\n",per[i].email); };}voidChange(Personper[],intn){ chars[20]; inti=0; printf("\t请输入想修改的记录中的名字:"); scanf("%s",s); while(strcmp(per[i].name,s)!=0&&i<n)i++; if(i==n) { printf("\t通讯录中没有此人!\n"); return; } printf("\t编号:"); scanf("\t%d",&per[i].score); printf("\t姓名:"); scanf("\t%s",per[i].name); printf("\t年龄:"); scanf("\t%s",per[i].age); printf("\t电话号码:"); scanf("\t%s",per[i].num); printf("\t通讯住址:"); scanf("\t%s",per[i].adds); printf("\t电子邮箱:"); scanf("\t%s",per[i].email); printf("\t修改成功!");}voidWritetoText(Personper[],intn)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生成式人工智能在高校体育教研活动中的应用与效果分析教学研究课题报告
- 26年基础护理技能全产业发展课件
- 26年基础护理农民工技能培训课件
- 26年关节僵硬护理原则课件
- 26年老年高血压护理实操考核标准课件
- 年度设备租赁服务合同二篇
- 湖北省名校2026届高三下学期九模考试化学试题含解析
- 护理技巧:提升患者满意度
- 肾消通络方:糖尿病肾病防治的机制与疗效探究
- 肾启发算法在化工过程建模中的应用与优化研究
- 2025年中国铁路哈尔滨局集团有限公司招聘294人参考笔试题库及答案解析
- 2025年生物长沙中考真题及答案
- 牛津树分级阅读绘本课件
- 职业教育考试真题及答案
- 2026年企业出口管制合规体系建设培训课件与体系搭建
- 劳动仲裁典型案件课件
- 化学品泄漏事故应急洗消处理预案
- 2025年小学生诗词大赛题库及答案
- 员工工龄连接协议书
- 2025年新修订版《森林草原防灭火条例》全文+修订宣贯解读课件(原创)
- 2025年大学《智慧林业-林业GIS技术》考试备考试题及答案解析
评论
0/150
提交评论