已阅读5页,还剩42页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要温度的检测与控制是工业生产过程中比较典型的应用之一,随着传感器在生产和生活中的更加广泛的应用,利用新型单总线式数字温度传感器实现对温度的测试与控制得到更快的开发。在这里介绍了一种基于DS18B20和AT89C52单片机的温度测量及控制系统的硬件结构以及C语言程序设计,该系统设计和布线简单,结构紧凑,体积小,重量轻,抗干扰能力强,性价比高,扩展方便,在大型仓库,工厂,智能化建筑等领域的多点温度检测中有广阔的应用前景。关键词DS18B20;AT89C52;温度测量;控制第页目录摘要.1第1章绪论.2第2章系统方案论证与比较.32.1方案比较.32.2方案论证.4第3章硬件设计.63.1主控芯片介绍.63.2复位电路.83.3时钟电路.93.4矩阵电路.103.5显示电路.113.6测温电路.133.6.1DS18B20单线数字温度传感器.133.6.2DS18B20工作原理.133.6.3DS18B20的性能特点.143.6.4DS18B20内部结构.143.7整机工作原理.16第4章软件设计.17第5章仿真与调试.295.1仿真与调试.295.2调试与运行.29结论.30参考文献.31附录1源程序.32附录2元器件名细表.45附录3仿真电路图.46第1页第1章绪论随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的。温度测控技术也在各个领域应用越来越广泛,同时温度测量也被人们异常关注,一时间涌现出大量各式各样的测试温度仪器,这些仪器的原理到底是怎样的呢?说到底也是所以温度测控的范畴,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、学习、生活提供更好的更方便的设施就需要从数字单片机技术入手,一切想着数字化,智能化控制方向发展。本设计所介绍的数字温度计与传统数字温度计相比,具有读数方便,测温范围广,测量准确,其输出采用数字显示,主要用于对测温比较准确的地方,或科研实验室使用,测温传感器使用DS18B20,用LCD实现温度显示。第2页第2章系统方案论证与比较2.1方案比较方案一:采用热电偶温差电路测温,温度检测部分可以采用低温热偶,热电偶由两个焊接在一起的异金属导线组成(热电偶的组成如图2-1),热电偶产生的热电势由两种金属的接触电势和单一导体的温差电势组成。通过将参考结点保持在已知温度并测量该电压,便可以推测出检测结点的温度。数据采集部分则使用带有A/D通道的单片机,在将随被温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据处理了,在显示电路上就可以将北侧温度显示出来。热电偶的优点是工作温度宽,且体积小,但是也存在输出电压小,容易遭受来自导线环路噪音的影响以及漂移较高的缺点并且这种电路需要用到A/D转换电路,感温电路比较麻烦。方案二:采用数字温度芯片DS18B20测量温度,输出信号全数字化。便于单片机处理和控制,省去传统的测温方法的很多外围电路。且该芯片的物理化学性质稳定,它温用作工业测温元件,此元件线性较好。在0-100摄氏度时,最大线性偏差小于1摄氏度。DS18B20的最大特点之一是采用了单总数的数据传输,由数字温度计DS18B20和微控制器AT89C52构成温度测量装置,它直接输出温度的数字信号,可直接和计算机连接。数码管报警电路复位电路晶振电路单片机测温电路按键防抖动图2-1方案一框图第3页这样温度系统的结构就比较简单,体积也不大。采用51单片机控制软件编程的自由度大,而且体积小,硬件实现简单,安装方便。该系统利用AT89C51芯片控制温度传感器DS18B20进行温度的实时检测并显示,能够实现快速测量环境温度,并可以根据需要设置上限报警温度。从以上两总方案,容易看出方案一的温测装置可测温度范围广,体积小,但是单线性误差大。方案二的温测装置电路简单,精准度较高,实现方便,软件设计也比较简单,故本次设计采用方案二。显示电路可以采用两种方案:第一种是通过单片机控制译码器将译码器输出的数据送给数码管进行显示,但是要单独增加一个显示电路,使设计比较复杂。另一种是直接运用LCD液晶显示,即直接通过单片对其进行显示以及数据处理较多;因此选择第二种方案。2.2方案论证在日常生活及工农业生产中经常要检测温度,传统的方式是采用热电偶或热电阻。其硬件电路和软件调试比较复杂,制作成本较高。近年来随着科技的飞速发展,单片机的应用正不断走向深入。所以我们选用单片机作为核心部件进行逻辑控制及信号的产生,用单片机本生的优势节约成本,使电路更简单。根据题目的要求,本次设计采用由AT89C51单片机及DS18B20温度传感器组成数据采集电路,加上显示电路和控制电路等,根据温度数据测量,通过控制电路对温度进行控制。本系统具有快速显示、测量准确、精度高、可调温控范围、硬件结构简单等优点,是一种比较经济的温度控制系统。主控电路时钟电路复位电路显示电路单片机测温电路电源电路图2-2方案二框图第4页A/D转换器将温度传感器采集的温度模拟信号转化成数字信号,送入单片机的I/O数据接口,然后通过单片机读回I/O数据进行温度的判断,最后将数据送入显示译码单元。显示时,译码电路是将单片机输出的BCD码送入译码器,通过其译码后送入LCD显示电路。第5页第3章硬件设计3.1主控芯片介绍单片机AT89C2051具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。AT89C51是一个低电压,高性能CMOS8位单片机,片内含4kbytes的可反复擦写的Flash只读程序存储器和128bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,内置功能强大的微型计算机的AT89C51提供了高性价比的解决方案。AT89C51是一个低功耗高性能单片机,40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器,2个全双工串行通信口,AT89C51可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。3-1AT89C51主要功能特性:图3-1AT89C51单片机的管脚图第6页表3-1AT89C51单片机的管脚功能。VCC:供电电压。GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写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的一些特殊功能口,如下所示:兼容MCS-51指令系统4k可反复擦写(1000次)FlashROM32个双向I/O口可编程UARL通道两个16位可编程定时/计数器全静态操作0-24MHz1个串行中断128x8bit内部RAM两个外部中断源共6个中断源可直接驱动LED3级加密位低功耗空闲和掉电模式软件设置睡眠和唤醒功能第7页P3口管脚备选功能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:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。3.2复位电路为确保两点间温度控制系统中电路稳定可靠工作,复位电路是必不可少的一部分,复位电路的第一功能是上电复位。一般电路正常工作需要供电电源为5V5%,即第8页4.755.25V。复位是单片机的初始化操作,其目的是使CPU及各专用寄存器处于一个确定的初始状态。如:把PC的内容初始化为0000H,使单片机从0000H单元开始执行程序。除了进入系统的正常初始化之外,当单片机系统在运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需要复位以使其恢复正常工作状态。RST端的外部复位电路有两种操作方式:上电自动复位和按键手动复位。按键手动复位有电平方式和脉冲方式两种,本系统设计采用上电复位,如图2-3所示。上电复位是直接将RST端通过电阻接高电平来实现单片机的复位。3.3时钟电路单片机的时钟信号用来提供单片机内各种微操作的时间基准,时钟电路用于产生单片机工作所需要的时钟信号。单片机的时钟信号用来提供单片机片内各种微操作的时间基准,时钟信号通常用两种电路形式得到:内部振荡和外部振荡。本系统设计采用内部振荡方式,如图2-4所示。MCS-51单片机内部有一个用于构成振荡器的高增益反向放大器,引脚XTALl和XTAL2分别是此放大电器的输入端和输出端,由于采用内部方式时,电路简单,所得的时钟信号比较稳定,实际使用中常采用这种方式。VCCC3R110KGNDRST图3-2复位电路图3-3时钟电路第9页3.4矩阵电路按照键盘与单片机的连接方式可分为独立式键盘与矩阵式键盘。矩阵式键盘是一种常见的输入装置,在日常生活中,矩阵式键盘在计数机、电话、手机、微波炉等各式电子产品上已经被广泛应用。在键盘中按键较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连接,而是通过一个按键加以连接。这样,一个端口就可以构成4x4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20的键盘,而直接用端口线则只能多出一键。所以本次设计采用的是矩阵式键盘,确定矩阵式键盘上的何键被按下可以采用行扫描法。判断键盘中有无键按下:将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位低于电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则按键中无键按下。判断闭合键所在位置:在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,在逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。图3-4矩阵键盘第10页3.5显示电路在单片机应用系统中,对于系统的运行状态和运行结果,通常都需要直观交互显示出来。单片机应用系统中最常用的显示器有LED和LCD两种。这两种显示器都可以显示数字、字符及系统的状态,LED和LED数码显示最为普遍,本设计采用的是更为环保的LCD显示器。字符型液晶显示模块是一种专门用于显示字母,数字,字符等点阵式LCD,目前常用的有16x1,16x2,20x2,40x2行等模块。点阵字符型LCD的接口特性点阵字符型LCD是专门用于显示数字,字母,图形符号及少量自定义字号的液晶显示器。这类显示器把LCD控制器,点阵驱动器,字符存储器,显示体及少量的组容元件等集成一个液晶显示模块,鉴于字符型液晶显示模块目前在国际上已经规范化,其电特性及接口特性是统一的。因此,只要设计出一种字号的接口电路,在指令上稍加修改即可使用各种规格的字符型液晶显示模块。字符型液晶显示模块的控制器大多数为日立公司生产的HD44780及其兼容的控制器。点阵型液晶显示模块的基本特点(1)液晶显示屏是以若干5x8或5x11点阵块组成的显示字符群。每个点阵块为一个字符位,字符间距和行距都为一个点的宽度。(2)主控电路电路为HD44780-及其他公司的全兼容电路。因此从程序员的角度来说,LCD的显示接口与编程是面向HD44780的,只要了解HD44780的编程结构即可进行LCD的显示编程。(3)内部具有字符发生器ROM,可显示192种字符。(4)具有64字节的自定义字符RAM,可以定义8个5x8点阵字符或4个5x11点阵字符。(5)具有64字节的数据显示RAM,共进行显示编程时使用。(6)标准接口,与M68HC08系列MCU容易接口。(7)模块结构紧凑,轻巧,装备容易。(8)单+5V电源供电。(9)低功耗,高可靠性。(10)HD44780的引脚与时序第11页(11)HD44780的外部接口信号一般有16条,与MCU的接口有8条数据线DB0DB7和3条控制线RS,RW,E,HD44780的引脚功能如表3-2所示。表3-2HD47780的引脚功能表引脚符号状态功能1Vss电源地2VDD电源正,接+5V3VL液晶显示偏压4RS输入寄存器选择:为1时选择数据寄存器;为0时选择指令寄存器5RW输入R/W为读写选择线:为1时进行读操作,为0时进行写操作6E输入使能信号7DB0三态数据总线(LSB)8DB1三态数据总线9DB2三态数据总线10DB3三态数据总线11DB4三态数据总线12DB5三态数据总线13DB6三态数据总线14DB7三态数据总线15A背光源正极16K背光源负极控制器HD44780的信号功能控制如表3-33-3控制器HD44780的信号功能RSR/WE功能00下降沿写指令代码01高电平读忙标志和AC值第12页10下降沿写数据11高电平读数据图3-5LCD显示电路3.6测温电路3.6.1DS18B20单线数字温度传感器由DALLAS半导体公司生产的DS18B20型单线智能温度传感器,属于新一代适配微处理器的智能温度传感器,可广泛用于工业、民用、军事等领域的温度测量及控制仪器、测控系统和大型设备中。它具有体积小,接口方便,传输距离远等特点。产品的主要技术指标:(1)测量范围:-55+125;(2)测量精度:0.5;(3)反应时间500ms。3.6.2DS18B20工作原理温度传感器DS18B20将被测环境温度转化成带符号的数字信号(以十六位补码形式,占两个字节)在通过单片机发出命令送给显示器。它的输出脚I/O直接与单片机相连,并接一个上拉电阻,传感器采用外部电源供电。传感器控制程序是按照DS18B20的通信协议编制。系统的工作是在程序控制下,完成对传感器的读写和对温第13页度的显示。3.6.3DS18B20的性能特点(1)采用单总线专用技术,既可通过串行口线,也可通过其它I/O口线与微机接口,无须经过其它变换电路,直接输出被测温度值(9位二进制数,含符号位);(2)测温范围为-55+125,测量分辨率为0.0625;(3)内含64位经过激光修正的只读存储器ROM;(4)适配各种单片机或系统机;(5)用户可分别设定各路温度的上、下限;(6)内含寄生电源。3.6.4DS18B20内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM,温度传感器,非挥发的温度报警触发器TH和TL,高速暂存器。DS18B20的管脚排列如图35所示。64位光刻ROM是出厂前被光刻好的,它可以看作是该DS18B20的地址序列号。不同的器件地址序列号不同。图3-6DS18B20引脚分布图表3-4DS18B20引脚功能序号寄存器名称作用序号寄存器名称0温度低字节以16位补码形式存放4、5保留字节1、21温度高字节以16位补码形式存放6计数器余值第14页2TH/用户字节1存放温度上限7计数器/3HL/用户字节2存放温度下限8CRC表3-5DS18B20信号功能以12位转化为例说明温度高低字节存放形式及计算:12位转化后得到的12位数据,存储在DS18B20的两个高低两个8位的RAM中,二进制中的前面5位是符号位。如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625才能得到实际温度。3.6.5DS18B20控制方法在硬件上,DS18B20与单片机的连接有两种方法,一种是VCC接外部电源,GND接地,I/O与单片机的I/O线相连;另一种是用寄生电源供电,此时UDD、GND接地,I/O接单片机I/O。无论是内部寄生电源还是外部供电,I/O口线要接5K左右的上拉电阻。此次设计选择的是前面一种控制。表32DS18B20有六条控制命令CPU对DS18B20的访问流程是:先对DS18B20初始化,再进行ROM操作命令,最后才能对存储器操作,数据操作。DS18B20每一步操作都要遵循严格的工作时序和通信协议。如主机控制DS18B20完成温度转换这一过程,根据DS18B20的通讯协议,须经三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操做。指令约定代码操作说明温度转换44H启动DS18B20进行温度转换读暂存器BEH读暂存器9个字节内容写暂存器4EH将数据写入暂存器的TH、TL字节复制暂存器48H把暂存器的TH、TL字节写到E2RAM中重新调E2RAMB8H把E2RAM中的TH、TL字节写到暂存器TH、TL字节读电源供电方式B4H启动DS18B20发送电源供电方式的信号给主CPU第15页图3-7测温电路3.7整机工作原理当接通电源以后,温度传感器正常工作,温度传感器将根据被测温度的不同来采集不同的数据,然后将所采集到的数据传送到比较器到中,然后由比较器将采集到的数据转变成高低电平,在送入单片机,单片机通过控制各个引脚电平的高低来来控制温度的显示输出,当温度显示TH为110C,TL为20C,通过矩阵键盘电路可以调节TH和TL的初始值,并且还可以调节当前的显示的温度值,按一次键盘TH和TL的值自加一或自减一,当减到低于20C或高于110时,将自动返回初始值。整机电路图如图3-8所示p3.7P3.7+5VP3.7GNDp1.0.p1.2.3p1.4.5p1.6.7p1.2p1.3.1p1.0p1.4.5p1.6.7XTAL218XTAL119ALE301PSN29RST9P0./AD039.1/18P0.2/AD237.3/36P0.4/AD435.5/54P0.6/AD63.7/72P1.0/T21./EX2P1.23.34P1.45.56P1.67.78P3.0/RXD10.1/TP3.2/IN012./IT13P3.4/014P3.7/RD17.6/W6.5/T15P2.7/A1528P2.0/A821.1/9P2./A023.3/14P2.4/A225.5/136.6/47UAT89C52+5V234567891RP110K+5VD71463D5124D31029D1807E6RW5S4VS1D2VE3LCD1LM016LDQ2VCGN1U3DS18B20+5VR24.7kC130pC230pX1CRYSTAL310uFR10kGNDVCR24.7KP3.7VCCDQGND+5VP3.7GND图3-8整机电路图第16页第4章软件设计整个系统的功能是由硬件电路配合软件来实现的,当硬件基本定型的时候软件也基本定下拉了,从软件的功能不同,可以分为两的类:一是主程序,它是整个软件的核心,专门用来协调各个执行模块和操作者的联系。二是子程序,它是用来完成各种实质性的工作的,如测量、计算、显示、通讯等。每一个执行软件就是一个小的执行模块,这里将每一个模块一一列出来,并为每个执行模块进行功能定义和接口定义。各执行模块规划好以后,就可以规划监控软件了。首先要根据系统的总体功能选择一种最合适的主程序结构,然后根据实时性的条件,合理安排监控软件和执行软件之间的调度关系。4.1主程序模块主程序主要完成硬件初始化,子程序调用等功能图4-1主程序流程图开始设置定时/计数器初值从DS18B20中读取数据等待数据拆字显示温度第17页主程序函数如下:Voidmain()setds18b20(TH,TL,RS);/设置上下限报警温度和分辨率delay(100);while(1)pt=ReadTemperature();temper_LCD();user_temper_LCD(user_temper);alarm_LCD(TH,TL);LCD_Initial();LCD_Print(0,0,TempBuffer0);LCD_Print(0,1,TempBuffer1);scan_full();/看有无键按下if(key_ok)/如有键按下则看到底哪个键按下key_value=key_scan();/调用键盘扫描程序key_command(key_value);/键盘命令处理函数第18页图4-2DS18B20初始化流程图DS18B20初始化函数voidInit_DS18B20(void)unsignedcharx=0;DQ=0;/单片机将DQ拉低delay_18B20(80);/精确延时大于480usDQ=1;/拉高总线delay_18B20(14);x=DQ;delay_18B20(20);等待50us读入DQ的状态等待200usDQ置1初始化结束DS18B20初始化DQ置1D0清零,发复位脉冲延时600usDQ置1第19页/*ds18b20读一个字节*/unsignedcharReadOneChar(void)unsignedchari=0;unsignedchardat=0;for(i=8;i0;i-)DQ=0;/给脉冲信号dat=1;DQ=1;/给脉冲信号if(DQ)dat|=0x80;delay_18B20(4);return(dat);温度测量的结果以二进补码形式来存放,分辨力12位的测量结果用带5个符号的16位二进制格式来表示,高低8位分别存储在两个RAM单元中,前面5位S代表符号位,DS18B20函数的作用就是完成这一过程的第20页N图4-3DS18B20写字节流程图DS18B20写函数voidsetds18b20(unsignedcharTH,unsignedcharTL,unsignedcharRS)Init_DS18B20();WriteOneChar(0xCC);/跳过读序号列号的操作WriteOneChar(0x4E);WriteOneChar(TH);/写入想设定的温度报警上限WriteOneChar(TL);/写入想设定的温度报警下限WriteOneChar(RS);8位数据送完否?DS18B20写入结束延时15usDQ置1设置为恢复状态写入一位数据延时15usDQ清零,将DQ总线电平拉低设置串行位数为8DS18B20写开始第21页LCD上电时,都必须按照一定的时序对LCD进行初始化操作,主要任务是设置LCD的工作方式,显示状态,清屏,输入方式,光标位置等。图4-3LCD初始化流程图功能设置命令调用写入指令到LCD子程序开始子程序返回调用写入指令到LCD子程调用写入指令到LCD子程设置显示状态清屏设定工作方式调用写入指令到LCD子程设置输入方式LCD初始化程序voidLCD_Initial()LcdEn=0;LCD_Write(LCD_COMMAND,0x38);/8位数据端口LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);/开启显示,无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);/清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);/AC递增,画面不动/*voidGotoXY(unsignedcharx,unsignedchary)if(y=0)LCD_Write(LCD_COMMAND,0x80|x);if(y=1)LCD_Write(LCD_COMMAND,0x80|(x-0x40);voidPrint(unsignedchar*str)while(*str!=0)LCD_Write(LCD_DATA,*str);str+;voidLCD_Print(unsignedcharx,unsignedchary,unsignedchar*str)GotoXY(x,y);Print(str);第22页要想把显示字符显示在某一指定位置,就必须先将显示数据写在相应的DDRAM地址中,写数据操作函数就是完成这一过程的函数图4-4LCD写数据流程图voidLCD_Wait(void)LcdRs=0;/RS=0表示选择指令寄存器LcdRw=1;_nop_();/RW=1表示进行读操作LcdEn=1;_nop_();/在EN为下降沿的时候锁存据while(DBPort&0x80)LcdEn=0;_nop_();_nop_()LcdEn=1;_nop_();_nop_();LcdEn=0;LCD要能读写数据,必须对LCD进行读写操作,读操作时,先设置RS和R/W开始当RS=1时,选择数据寄存器把显示数据送至P0口读/写标志位R/W=0时,进行写操作LCD使能信号E至高电平后再过两个时钟周期至低电平,产生一个下降沿信号,使LCD写入显示数据第23页状态,在设置E信号为高,这时从数据口读取数据,写操作时,使能E信号下降沿有效图4-5LCD读写操作流程图LCD写指令函数#defineLCD_COMMAND#defineLCD_DATA#defineLCD_CLEAR_SCREEN/清屏#defineLCD_HOMING/光标返回原点voidLCD_Write(bitstyle,unsignedcharinput)LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();LcdEn=1;_nop_();LcdEn=0;_nop_();LCD_Wait();读/写标志位R/W=0时,进行写操作当RS=0时,选择指令寄存器开始子程序返回调用延时子程序LCD使能信号E至高电平后再过两个时钟周期至低电平,产生一个下降沿信号,往LCD写入指令代码,LCD执行命令把指令数据送至P0口第24页/设置显示模式*#defineLCD_SHOW/显示开#defineLCD_HIDE/显示关#defineLCD_CURSOR/显示光标#defineLCD_NO_CURSOR/无光标#defineLCD_FLASH/光标闪动#defineLCD_NO_FLASH/光标不闪动voidLCD_SetDisplay(unsignedcharDisplayMode)LCD_Write(LCD_COMMAND,0x08|DisplayMode);#defineLCD_AC_UP#defineLCD_AC_DOWN#defineLCD_MOVE/画面可平移#defineLCD_NO_MOVEvoidLCD_SetInput(unsignedcharInputMode)LCD_Write(LCD_COMMAND,0x04|InputMode);第25页最常见的矩阵式键盘按键识别方法是编程扫描,这里采用的是列扫描方法。NOYESNOYES图4-5矩阵键盘流程图键盘扫描函数sfrkey_port=0x90;/定义P1口为键盘扫描口/P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口bitkey_ok=0;/有键按下的标志/*延时子程序*调用一次用时18微秒,t每加1,用时增加6微秒*/voiddelay(unsignedchart)while(t-);unsignedcharr_left(unsignedcharx)x/用AT89C51时就用这个头文件#include/用华邦W78E58B时必须用这个头文件sbitDQ=P37;/定义DQ引脚为P3.7/*ds18b20延迟子函数(晶振12MHz)*/*DS18B20对时间要求很严,但只能长不能短*在11.0592M下也行,因为时间长些*/voiddelay_18B20(unsignedinti)while(i-);/*ds18b20初始化函数*/voidInit_DS18B20(void)unsignedcharx=0;DQ=0;/单片机将DQ拉低delay_18B20(80);/精确延时大于480usDQ=1;/拉高总线delay_18B20(14);x=DQ;delay_18B20(20);/*ds18b20读一个字节*/unsignedcharReadOneChar(void)unsignedchari=0;unsignedchardat=0;for(i=8;i0;i-)第32页DQ=0;/给脉冲信号dat=1;DQ=1;/给脉冲信号if(DQ)dat|=0x80;delay_18B20(4);return(dat);/*ds18b20写一个字节*/voidWriteOneChar(unsignedchardat)unsignedchari=0;for(i=8;i0;i-)DQ=0;DQ=datdelay_18B20(5);DQ=1;dat=1;/*设置DS18B20工作状态*TH和TL分别是上限报警和下限报警温度,RS是显示分辨率的设置*/voidsetds18b20(unsignedcharTH,unsignedcharTL,unsignedcharRS)Init_DS18B20();WriteOneChar(0xCC);/跳过读序号列号的操作WriteOneChar(0x4E);第33页WriteOneChar(TH);/写入想设定的温度报警上限WriteOneChar(TL);/写入想设定的温度报警下限WriteOneChar(RS);/写配置寄存器,格式为0R1R01,1111/R1R0=00分辨率娄9位,R1R0=11分辨率为12位/*读取ds18b20当前温度*/unsignedchar*ReadTemperature(void)unsignedchartt2;Init_DS18B20();WriteOneChar(0xCC);/跳过读序号列号的操作WriteOneChar(0x44);/启动温度转换delay_18B20(70);/温度转化要一段时间Init_DS18B20();WriteOneChar(0xCC);/跳过读序号列号的操作WriteOneChar(0xBE);/读取温度寄存器等(共可读9个寄存器)前两个就是温度/delay_18B20(70);tt0=ReadOneChar();/读取温度值低位tt1=ReadOneChar();/读取温度值高位return(tt);/#include/用AT89C51时就用这个头文件#include/用华邦W78E58B时必须用这个头文件/#include/#include/#include/#include/#include#include/测温头文件#include/液晶显示头文件#include/键盘扫描头文件第34页sbitalarm=P26;/报警信号/sbitDQ=P37;/定义DQ引脚为P3.7unsignedcharkey_value;/存放键盘扫描值bitup_one,down_one;/加1和减1标志bitalarm_up_flag,alarm_down_flag;/上限报警和下限报警设置标志bitset_temper_flag;/设置控制标志温度标志bitalarm_switch;/报警开关unsignedcharuser_temper;/用户标定温度unsignedcharTH=110,TL=-20,RS=0x3f;/上限温度110,下限-20,分辨率10位,也就是0.25Cunsignedchart2,*pt;/用来存放温度值,测温程序就是通过这个数组与主函数通信的unsignedcharTempBuffer117=0x2b,0x20,0x30,0x30,0x2e,0x30,0x30,0x20,0x53,0x45,0x54,0x2b,0x20,0x30,0x30,0x43,0;/显示实时温度,上电时显示+00.00SET+00CunsignedcharTempBuffer017=0x54,0x48,0x3a,0x2b,0x20,0x30,0x30,0x20,0x54,0x4c,0x3a,0x2b,0x20,0x30,0x30,0x43,0;/显示温度上下限,上电时显示TH:+00TL:+00Cunsignedcharcodedotcode4=0,25,50,75;/*因显示分辨率为0.25,但小数运算比较麻烦,故采用查表的方法*再将表值分离出十位和个位后送到十分位和百分位*/*用户设定温度转换为LCD显示数据*功能:将用户设定温度user_temper,分离出符号位,百、十、个位并将它们转化为ACSII码,送到液晶显示缓冲区*/voiduser_temper_LCD(unsignedchartemper)if(temper0x7f)/判断正负,如果为负温,将其转化为其绝对值第35页TempBuffer111=0x2d;/0x2d为-的ASCII码temper=temper;/将负数的补码转换成绝对值temper+;elseTempBuffer111=0x2b;/0x2B为+的ASCII码TempBuffer112=temper/100+0x30;/分离出temper的百十个位if(TempBuffer112=0x30)TempBuffer112=0xfe;/百位数消隐TempBuffer113=(temper%100)/10+0x30;/分离出十位TempBuffer114=(temper%100)%10+0x30;/分离出个位/*温度上下限转换为LCD显示数据*功能:将上下限报警温度,分离出符号位,百、十、个位并将它们转化为ACSII码,送到液晶显示缓冲区*/voidalarm_LCD(unsignedcharTH,unsignedcharTL)if(TH0x7F)/判断正负,如果为负温,将其转化为其绝对值TempBuffer03=0x2d;/0x2d为-的ASCII码TH=TH;/将负数的补码转换成绝对值TH+;elseTempBuffer03=0x2b;/0x2B为+的ASCII码if(TL0x7f)TempBuffer011=0x2d;/0x2d为-的ASCII码TL=TL+1;elseTempBuffer011=0x2b;/0x2B为+的ASCII码TempBuffer04=TH/100+0x30;/分离出TH的百十个位if(TempBuffer04=0x30)TempBuffer04=0xfe;/百位数消隐第36页TempBuffer05=(TH%100)/10+0x30;/分离出十位TempBuffer06=(TH%100)%10+0x30;/分离出个位TempBuffer012=TL/1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 劳务挂靠公司合同范本
- 各类合同范本书籍模板
- 代扣房租租赁合同范本
- 公司贷款申请合同范本
- 2026年企业人力资源管理师之四级人力资源管理师考试题库300道【达标题】
- 位租车含司机合同范本
- 办公场所搬迁合同范本
- 2025年乐平市国企考试试题及答案
- 公寓地暖出租合同范本
- 厂房拆除工装合同范本
- 2025成人高考专升本《艺术概论》试题及答案
- 第八章 健美操教学设计-2025-2026学年初中体育与健康人教版八年级全一册-人教版
- 2025广东食品安全考试题库及答案
- 2025-2026学年高一上学期《新高一政策解读及学科差异化》主题班会课件
- 脏腑推拿课件
- 首检检验记录表
- 医疗质量安全 培训课件
- 2025年乡村振兴考试题及答案
- 肺结核患者护理课件
- 新式茶饮培训课件
- 第三章病毒和亚病毒-微生物学
评论
0/150
提交评论