基于单片机的温度检测与控制系统设计

上传人:痛*** 文档编号:40685444 上传时间:2021-11-17 格式:DOC 页数:38 大小:677.17KB
收藏 版权申诉 举报 下载
基于单片机的温度检测与控制系统设计_第1页
第1页 / 共38页
基于单片机的温度检测与控制系统设计_第2页
第2页 / 共38页
基于单片机的温度检测与控制系统设计_第3页
第3页 / 共38页
资源描述:

《基于单片机的温度检测与控制系统设计》由会员分享,可在线阅读,更多相关《基于单片机的温度检测与控制系统设计(38页珍藏版)》请在装配图网上搜索。

1、 毕 业 实 习 报 告 第一部分:温度的显示与控制系统设计摘要:本设计通过51单片机控制DS18B20芯片采集温度,并对采集温度进行分析,随后51单片机对不同温度范围进行判断并做出相应的措施,以此实现了一个温度检测与控制系统,本设计的一个创新就是可以通过矩阵键盘对所需正常温度进行自由设置,增加本设计系统的灵活性。此外,本设计都是采用C语言编写的。仿真软件PROTEUS与Keil µVision2开发环境介绍1.1、PR0TEUS软件介绍(一)、该软件的特点:1、全部满足我们提出的单片机软件仿真系统的标准,并在同类产品中具有明显的优势。2、具有模拟电路仿真、数字电路仿真、单片机及其外

2、围电路组成的系统的仿真、RS232 动态仿真、I2C 调试器、SPI 调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。3、目前支持的单片机类型有:68000 系列、8051 系列、AVR 系列、PIC12 系列、PIC16 系列、PIC18系列、Z80 系列、HC11 系列以及各种外围芯片。 支持大量的存储器和外围芯片。总之,该软件是一款集单片机和SPICE 分析于一身的仿真软件,功能极其强大,是其他任何一款软件不能相比的。(二)、ISIS智能原理图输入系统ISIS是Preoteus系统的中心,具有控制原理图画图的超强的设计环境。ISIS有以下特性:1、

3、出版质量的原理图ISIS提供给用户图形外观,包括线宽、填充类型、字符等的全部控制,使用尸能够生成如杂志上看到的精美的原理图,画完图可以以图形文件输出,画图的外形由风格模板定义。2、良好的用户界面IsIs有一个无连线方式,用户只需单击元件的引脚或者先前布好的线,就能实现布线此外,摆放、编辑、移动和删除操作能够直接用鼠标实现无需去单击菜单或图标。3自动走线只要单击想要连接的两个引脚,就能简单地实现走线。在特殊的位置需要布线时,使用者只需在中间的角落单击。自动走线也能在元件移动的时候操作,自动解决相应连线。节点能够自动布置和移除。既节约了时间,又避免了其他可能的错误。4层次设计ISIS支持层次图设计

4、,模块可画成标准元件,特殊的元件能够定义为通过电路图表示的模块,能够任意设定层次,模块可画成标准元件,在使用中可放置和删除端口的子电路模块。5、总线支持ISIS提供的不仅是一根总线,还能用总线引脚定义元件和子电路。因此,一个连线在处理器和存储器之间的32位的处理器总线可以用单一的线表示,节省绘图的时间和空间。6元件库ISIS的元件库包含8000个元件,有标准符号、三极管、二极管、热离子管、TTLCMOS、ECL、微处理器,以及存储器元件、PLD、模拟Ic和运算放大器。7可视封装工具原理图和PCB库元件的匹配是由封装工具简化的。在原理图部分的引脚旁边将显示PCB的封装,并允许每个引脚名对应文本和

5、图形的引脚号码。8复合元件ISIS的元件库表达方式有很多种,无论是单个元件、同态复合元件、异态复合元件,还是连接器,都可以在原理图上以独立引脚来表达,不用所有线都连到一个独立元件上。9、元件特性设计中的每个元件都有一定数日的属性或特性。某些特性控制软件的特定功能(如PCB封装或仿真)用户也可以添加自己的特性。一旦库建立,就能提供默认值及特性定义。特性定义提供大量的特性描述,当修改元件时,将显示在编辑区域内。10、报告ISIS支持许多第三方网表格式,因此能为其他软件所使使用设置元件清单后可以添加用户所需的元件属性,也可设置属性列以挑选一定数目的属性。ERC报告可列出可能的连线错误,如末连接的输入

6、、矛盾的输出及未标注的网络标号。(三)、Proteus 6 Professional 界面简介安装完Proteus 后,运行ISIS 6 Professional,会出现以下窗口界面:1原理图编辑窗口(The Editing Window):顾名思义,它是用来绘制原理图的。蓝色方框内为可编辑区,元件要放到它里面。注意,这个窗口是没有滚动条的,你可用预览窗口来改变原理图的可视范围。2预览窗口(The Overview Window):它可显示两个内容,一个是:当你在元件列表中选择一个元件时,它会显示该元件的预览图;另一个是,当你的鼠标焦点落在原理图编辑窗口时(即放置元件到原理图编辑窗口后或在原理

7、图编辑窗口中点击鼠标后),它会显示整张原理图的缩略图,并会显示一个绿色的方框,绿色的方框里面的内容就是当前原理图窗口中显示的内容,因此,你可用鼠标在它上面点击来改变绿色的方框的位置,从而改变原理图的可视范围。3模型选择工具栏(Mode Selector Toolbar):主要模型(Main Modes):1* 选择元件(components)(默认选择的)2* 放置连接点3* 放置标签(用总线时会用到)4* 放置文本5* 用于绘制总线6* 用于放置子电路7* 用于即时编辑元件参数 (先单击该图标再单击要修改的元件配件(Gadgets):1* 终端接口(terminals):有VCC、地、输出、

8、输入等接口2* 器件引脚:用于绘制各种引脚3* 仿真图表(graph):用于各种分析,如Noise Analysis4* 录音机5* 信号发生器(generators)6* 电压探针:使用仿真图表时要用到7* 电流探针:使用仿真图表时要用到8* 虚拟仪表:有示波器等2D 图形(2D Graphics):1* 画各种直线2* 画各种方框3* 画各种圆4* 画各种圆弧5* 画各种多边形6* 画各种文本7* 画符号8* 画原点等4元件列表(The Object Selector):用于挑选元件(components)、 终端接口(terminals)、 信号发生器( generators )、 仿真

9、图表( graph )等。举例, 当你选择“ 元件(components)”,单击“P”按钮会打开挑选元件对话框,选择了一个元件后(单击了“OK”后),该元件会在元件列表中显示,以后要用到该元件时,只需在元件列表中选择即可。5方向工具栏(Orientation Toolbar):旋转: 旋转角度只能是90的整数倍。翻转: 完成水平翻转和垂直翻转。使用方法:先右键单击元件,再点击(左击)相应的旋转图标6仿真工具栏仿真控制按钮1* 运行2* 单步运行3* 暂停4* 停止(四)、操作简介1、绘制原理图:绘制原理图要在原理图编辑窗口中的蓝色方框内完成。原理图编辑窗口的操作是不同于常用的WINDOWS

10、应用程序的,正确的操作是:用左键放置元件;右键选择元件;双击右键删除元件;右键拖选多个元件;先右键后左键编辑元件属性;先右键后左键拖动元件;连线用左键,删除用右键;改连接线:先右击连线,再左键拖动;中键放缩原理图。2、定制自己的元件:有三个个实现途径,一是用PROTEUS VSM SDK 开发仿真模型,并制作元件;另一个是在已有的元件基础上进行改造,比如把元件改为bus 接口的;还有一个是利用已制作好(别人的)的元件,我们可以到网上下载一些新元件并把它们添加到自己的元件库 里面。由于我没有PROTEUS VSMSDK,所以我只介绍后两个。3、Sub-Circuits 应用:用一个子电路可以把部

11、分电路封装起来,这样可以节省原理图窗口的空间。1.2、Keil µVision2软件介绍 Keil软件是目前最流行开发MCS-51系列单片机的软件。Keil提供包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境µVisiion2将这些部分组合在一起。Keil uVision2是德国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,使用接近于传统c语言的语法来开发,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用,而且大大的提高了工作效率和项目开发周期,他还能嵌入汇编

12、,您可以在关键的位置嵌入,使程序达到接近于汇编的工作效率。KEILC51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效,快速的特点。C51编译器的功能不断增强, 使你可以更加贴近CPU本身,及其它的衍生产品。C51已被完全集成到uVision2的集成开发环境中,这个集成开发环境包含:编译器,汇编器,实时操作系统,项目管理器,调试器。uVision2 IDE可为它们提供单一而灵活的开发环境。Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面,使您能在很短的时间内就能学会使用keil c51来开发您的单片机应用程序 。另外重要的

13、一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。二、设计基本原理本设计通过51单片机对DS18B20和LCD1602两款外设芯片进行驱动与控制,以此来实现系统功能。、51单片机原理及管教功能1、 简介89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATM

14、EL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。2、 结构特点8位CPU;片内振荡器和时钟电路;32根I/O线;外部存贮器寻址范围ROM、RAM64K;2个16位的定时器/计数器;5个中断源,两个中断优先级;全双工串行口;布尔处理器;3、 管脚说明VCC:供电电压。GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次

15、写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/89C51引脚图地址的低八位。在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”时,其管脚被内部

16、上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT

17、89C51的一些特殊功能口,如下表所示:口管脚 备选功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,AL

18、E端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA/VPP:当/EA保持低电平时,则在此期间为外部程序存储器(0000H-FFF

19、FH),不管是否有内部程序存储器读取外部ROM数据。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,单片机读取内部程序存储器。(扩展有外部ROM时读取完内部ROM后自动读取外部ROM)。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。、DS18B20芯片读写原理1、 特性独特的一线接口,只需要一条口线通信,简化了分布式温度传感应用 无需外部元件 可用数据总线供电,电压范围为3.0 V至5.5 V 无需备用电源测量温度范围为-55°C至+125华氏相当于是

20、-67°F到257华氏度 -10°C至+85°C范围内精度为±0.5°C。温度传感器可编程的分辨率为912位 温度转换为12位数字格式最大值为750毫秒 用户可定义的非易失性温度报警设置 应用范围包括恒温控制,工业系统,消费电子产品温度计,或任何热敏感系统。2、 引脚定义(1)、DQ为数字信号输入/输出端; (2)、GND为电源地; (3)、VDD为外接供电电源输入端(在寄生电源接线方式时接地)。3、DS18B20工作原理 DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2

21、s 减为750ms。低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振 随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在55所对应的一个基数值。计数器1对 低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重 新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即 为所测温度。斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。4、 D

22、S18B20有4个主要的数据部件 光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位 (28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用 是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以 0.0625/LSB形式表达,其中S为符号位。    

23、0; 表1: DS18B20温度值格式表 这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0, 这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际 温度。 例如+125的数字输出为07D0H,+25.0625的数字输出为0191H,-25.0625的数字输出为FF6FH,-55的数字输出为FC90H 。 表2: DS18B20温度数据表      (3)DS18B20温度传感器的存储

24、器 DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存放高温度和低温度触发器 TH、TL和结构寄存器。 (4)配置寄存器 该字节各位的意义如下: 表3: 配置寄存器结构 TMR1R011111低五位一直都是"1",TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用 户不要去改动。R1和R0用来设置分辨率,如下表所示:(DS18B20出厂时被设置为12位) 表4: 温度分辨率设置表 R1R0分辨率温度最大转换时间009位93.75ms 0110位187.5ms 101

25、1位375ms 1112位750ms 4、高速暂存存储器 高速暂存存储器由9个字节组成,其分配如表5所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在 高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如表1所示。对应的温度计算: 当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。表 2是对应的一部分温度值。第九个字节是 冗余检验字节。 表5: DS18B20暂存寄存器分布 寄存器内容 字节地址温度值低位 (LS Byte)0温度值高位 (MS Byte)1高温限值(TH)2低温限值(

26、TL)3配置寄存器4保留5保留6保留7CRC校验值8根据DS18B20的通讯协议,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行 复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后 释放,当DS18B20收到信号后等待1660微秒左右,后发出60240微秒的存在低脉冲,主CPU收到此信号表示复位成功。 表6: ROM指令表 指 令 约定代码功 能读ROM33H读DS1820温度传感器ROM中的编码(即64位地址) 符合 ROM 55H发出此命令之后

27、,接着发出 64 位 ROM 编码,访问单总线上与该编码相对应的 DS1820 使之作出响应,为下一步对该 DS1820 的读写作准备。 搜索 ROM 0FOH用于确定挂接在同一总线上 DS1820 的个数和识别 64 位 ROM 地址。为操作各器件作好准备。 跳过 ROM 0CCH忽略 64 位 ROM 地址,直接向 DS1820 发温度变换命令。适用于单片工作。 告警搜索命令 0ECH执行后只有温度超过设定值上限或下限的片子才做出响应。 表6: RAM指令表 指 令 约定代码功 能温度变换44H启动DS1820进行温度转换,12位转换时最长为750ms(9位为93.75ms)。结果存入内部

28、9字节RAM中。 读暂存器 0BEH 读内部RAM中9字节的内容 写暂存器 4EH 发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令之后,是传送两字节的数据。 复制暂存器 48H 将RAM中第3 、4字节的内容复制到EEPROM中。 重调 EEPROM 0B8H 将EEPROM中内容恢复到RAM中的第3 、4字节。 读供电方式 0B4H 读DS1820的供电模式。寄生供电时DS1820发送“ 0 ”,外接电源供电 DS1820发送“ 1 ”。 (三)、1602LCD特性+5V电压,对比度可调内含复位电路提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能有80字节显

29、示数据存储器DDRAM内建有160个5X7点阵的字型的字符发生器CGROM8个可由用户自定义的5X7的字符发生器CGRAM字符型LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚)图3、1602各引脚的定义HD44780内置了DDRAM(显示数据存储RAM)、CGROM(字符存储ROM)和CGRAM(用户自定义RAM)。  DDRAM就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下表: 也就是说想要在LCD1602屏幕的第一行第一列显示一个“A”字,就要向DDRAM的00H地址写

30、入“A”的代码就行了。但具体的写入是要按LCD模块的指令格式来进行的,后面我会讲到的。一行有40个地址 在1602中我们就用前16个就行了。第二行也一样用前16个地址。对应如下: DDRAM地址与显示位置的对应关系 1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常 用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点 阵字符图形显示出来,我们就能看到字母“A” 图4、1602字符表上表中的字符代码与我们PC中

31、的字符代码是基本一致的。因此我们在向DDRAM写C51字符代码程序时甚至可以直接用P1'A'这样的方法。PC在编译时就把“A”先转为41H代码了。字符代码0x000x0F为用户自定义的字符图形RAM(对于5X8点阵的字符,可以存放8组),就是CGRAM了。对DDRAM的内容和地址操作,HD44780的指令集及其设置说明,共有11条指令:基本操作时序: 读状态           输入:RS=L,RW=H,E=H      

32、;              输出:DB0DB7=状态字 写指令           输入:RS=L,RW=L,E=下降沿脉冲,DB0DB7=指令码 输出:无 读数据           输入:RS=H,RW=H,E=H   &#

33、160;                             输出:DB0DB7=数据 写数据           输入:RS=H,RW=L,E=下降沿脉冲,DB0DB7=数据 输出:无 1.清屏指令 功能:<

34、1> 清除液晶显示器,即将DDRAM的内容全部填入“空白”的字符码20H; <2> 光标归位,即将光标撤回液晶显示屏的左上方; <3> 将地址计数器(AC)的值设为0。 2.光标归位指令 功能:<1> 把光标撤回到显示器的左上方; <2> 把地址计数器(AC)的值设置为0; <3> 保持DDRAM的内容不变 3.输入模式设置指令 功能:设定每次写入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。参数设定的情况如下所示: 位名       

35、0;      设置 I/D            0=写入新数据后光标左移      1=写入新数据后光标右移 S                0=写入新数据后显示屏不移动 1=写入新数据后显示屏整体右移1

36、个字 4. 显示开关控制指令功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下: 位名              设置 D                0=显示功能关         

37、  1=显示功能开 C                0=无光标                   1=有光标 B           &

38、#160;    0=光标不闪烁               1=光标闪烁 5. 设定显示屏或光标移动方向指令 功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下: S/C               R/L     

39、60;          设定情况 0                 0          光标左移1格,且AC值减1 0         

40、0;       1          光标右移1格,且AC值加1 1                 0          显示器上字符全部左移一格,但光标不动 1 &

41、#160;               1          显示器上字符全部右移一格,但光标不动 6.功能设定指令 功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下: 位名              设置

42、DL                             0=数据总线为4位 1=数据总线为8位 N                  

43、             0=显示1行 1=显示2行 F                                0=5×7点阵/每字符

44、0; 1=5×10点阵/每字符 7.设定CGRAM地址指令功能:设定下一个要存入数据的CGRAM的地址。8.设定DDRAM地址指令 功能:设定下一个要存入数据的CGRAM的地址。 (注意这里我们送地址的时候应该是0x80+Address,这也是前面说到写地址命令的时候要加上0x80的原因) 9.读取忙信号或AC地址指令 功能:<1> 读取忙碌信号BF的内容,BF=1表示液晶显示器忙,暂时无法接收单片机送来的数据或指令; 当BF=0时,液晶显示器可以接收单片机送来的数据或指令; <2> 读取地址计数器(AC)的内容。 10.数据写入DDRAM或CGRA

45、M指令 功能:<1> 将字符码写入DDRAM,以使液晶显示屏显示出相对应的字符; <2> 将用户自己设计的图形存入CGRAM。 11.从CGRAM或DDRAM读出数据的指令功能:读取DDRAM或CGRAM中的内容。 基本操作时序: 读状态           输入:RS=L,RW=H,E=H      输出:DB0DB7=状态字 写指令      

46、60;    输入:RS=L,RW=L,E=下降沿脉冲,DB0DB7=指令码 输出:无 读数据           输入:RS=H,RW=H,E=H      输出:DB0DB7=数据 写数据           输入:RS=H,RW=L,E=下降沿脉冲,DB0DB7=数据 输出:无 三、实训成果系统设计原理

47、图(2)、流程图开始 是否设置 正常温度范围采用 温度? 否 初始化或者已设置范围 是 设置最大温度值MAX 设置最小温度值MIN 采集当前温度NUM 并在LCD显示 NUM>MAX 电机转动、高温灯 ? 是 闪烁、蜂鸣器报警 否 NUM<MIN 低温指示灯亮 、 ? 是 加热灯开启 否 正常温度指示灯亮、高温及低温 指示灯灭、关闭电机、关闭加热 灯、关闭蜂鸣器。(三)、)程序代码及注释#include<reg52.h>#include<intrins.h> /包含_nop_()函数定义的头文件#define uchar unsigned char#defi

48、ne uint unsigned intuchar code digit="0123456789-+." /定义字符数组显示数字及正负号uchar code table1="Current temperature"uchar code table2="Cent"uchar code table3="HIGH:" ;uchar code table4="LOW:"sbit lcden=P07; /定义LCD使能位sbit lcdrs=P06; /定义LCD的RS位sbit motor=P30; /

49、定义电机驱动位sbit lamp=P31; /定义加热灯驱动位sbit DQ=P36; /定义DS18B20的数据位sbit LED1=P05; /定义高温指示灯驱动位sbit LED2=P02; /定义正常指示灯驱动位sbit LED3=P01; /定义低温指示灯驱动位sbit buzzer=P03;uchar time,flag,flag1,flag2,flag3,flag4,flag5,flag6,flag7,num,i2;uint temp,num1;volatile uint numt,numt1,numt2;char numhigh,numlow; /定义高温度,低温度void d

50、elay(uint z) /粗略延时子程序 uint x,y; for(x=z;x>0;x-) for(y=10;y>0;y-);void delay1ms()/1毫秒延时子程序 unsigned int i,j; for(i=0;i<4;i+); for(j=0;j<33;j+) ; void delaynms(unsigned char n)/延时多毫秒子程序 unsigned char i; for(i=0;i<n;i+) delay1ms(); void write_com(uchar com) /LCD写指令子程序 lcdrs=0; P2=com; de

51、lay(5); lcden=1; delay(5); lcden=0;void write_data(uchar date) /LCD写数据子程序 lcdrs=1 P2=date; delay(5); lcden=1; delay(5); lcden=0;void LCD_init() /LCD初始化子程序 lcden=0; write_com(0x38); write_com(0x0C); write_com(0x06); write_com(0x01); write_com(0x80);bit Init_DS18B20() /DS18B20初始化子程序 bit flag; /储存DS18B

52、20是否存在的标志,flag=0,表示存在;flag=1,表示不存在 DQ = 1; /先将数据线拉高 for(time=0;time<2;time+) /略微延时约6微秒 ; DQ = 0; /再将数据线从高拉低,要求保持480960us for(time=0;time<200;time+) ; /略微延时约600微秒 ; /以向DS18B20发出一持续480960us的低电平复位脉冲 DQ = 1; /释放数据线(将数据线拉高) for(time=0;time<10;time+) ; /延时约30us(释放总线后需等待1560us让DS18B20输 出存在脉冲) flag

53、=DQ; /让单片机检测是否输出了存在脉冲(DQ=0表示存在) for(time=0;time<200;time+) ; /延时足够长时间,等待存在脉冲输出完毕 return (flag); /返回检测成功标志unsigned char ReadOneChar()/DS18B20读子程序 unsigned char i=0; unsigned char dat; /储存读出的一个字节数据 for (i=0;i<8;i+) DQ =1; / 先将数据线拉高 _nop_(); /等待一个机器周期 DQ = 0; /单片机从DS18B20读书据时,将数据线从高拉低即启动读时序 _nop_

54、(); /等待一个机器周期 DQ = 1; /将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备 for(time=0;time<2;time+) ; /延时约6us,使主机在15us内采样 dat>>=1; if(DQ=1) dat|=0x80; /如果读到的数据是1,则将1存入dat else dat|=0x00;/如果读到的数据是0,则将0存入dat /将单片机检测到的电平信号DQ存入ri for(time=0;time<8;time+); /延时3us,两个读时序之间必须有大于1us的恢复 return(dat); /返回读出的

55、十六进制数据WriteOneChar(unsigned char dat)/DS18B20写子程序 unsigned char i=0; for (i=0; i<8; i+) DQ =1; / 先将数据线拉高_nop_(); /等待一个机器周期 DQ=0; /将数据线从高拉低时即启动写时序 DQ=dat&0x01; /利用与运算取出要写的某位二进制数据, /并将其送到数据线上等待DS18B20采样 for(time=0;time<10;time+);/ /延时约30us,DS18B20在拉低后的约1560us/期间从数据线上采样DQ=1; /释放数据线 for(time=0

56、;time<1;time+) ;/延时3us,两个写时序间至少需要1us的恢复期 dat>>=1; /将dat中的各二进制位数据右移1位 for(time=0;time<4;time+) ; /稍作延时,给硬件一点反应时间void ReadyReadTemp() /DS18B20读准备子程序 Init_DS18B20(); /将DS18B20初始化 WriteOneChar(0xCC); / 跳过读序号列号的操作 WriteOneChar(0x44); / 启动温度转换 delaynms(200); /转换一次需要延时一段时间 Init_DS18B20(); /将DS1

57、8B20初始化 WriteOneChar(0xCC); /跳过读序号列号的操作 WriteOneChar(0xBE); /读取温度寄存器,前两个分别是温度的低位和高位void disply_init0() /LCD显示0子程序 for(num=0;num<4;num+) write_data(table2num); delay(20);void disply_init1()/LCD显示1子程序 for(num=0;num<19;num+) write_data(table1num); delay(20); write_com(0X80+0X4B); for(num=0;num<

58、;4;num+) nwrite_data(table2num); delay(20); void disply_init2() /LCD显示2子程序 write_com(0X80); for(num=0;num<5;num+) write_data(table3num); delay(20); void disply_init3() /LCD显示3子程序 write_com(0X80+0x40);for(num=0;num<4;num+) write_data(table4num); delay(20); void display_temp1(uchar x) /LCD显示温度整数

59、子程序 unsigned char j,k,l; /j,k,l分别储存温度的百位、十位和个位 j=x/100; /取百位 k=(x%100)/10; /取十位 l=x%10; /取个位 write_com(0x80+0x43); /写显示地址,将在第2行第7列开始显示 if(flag=1) /负温度时 显示“” write_data('-'); /将百位数字的字符常量写入LCD write_data(digitj); /将十位数字的字符常量写入LCD write_data(digitk); /将十位数字的字符常量写入LCD write_data(digitl); /将个位数字的

60、字符常量写入LCD delaynms(100); /延时1ms给硬件一点反应时间 void display_temp2(uchar x) /LCD显示温度小数子程序 write_data(digitx); /将小数部分的第一位数字字符常量写入LCD delaynms(100); /延时1ms给硬件一点反应时间void highwarning() /高温警告子程序 LED1=0; buzzer=1; delaynms(1000); LED1=1; buzzer=0;void lowwarning() /低温警告子程序 LED3=1; delaynms(1000); LED3=0;void jud

61、ge(uchar m1,char numlow1,char numhigh1) /判断温度范围子程序 char m ; if(flag=1) m=-m1; else m=m1; if(m>=numhigh1) highwarning(); LED2=1; motor=1; if(m<numhigh1)&(m>numlow1) lamp=1; motor=0; LED1=1; LED2=0; LED3=1; if(m<=numlow1) lowwarning(); lamp=0; LED2=1; motor=0; uint keeyboard()/键盘扫描子程序P

62、1=0xfe;temp=P1;temp=temp&0xf0;num1=20;while(temp!=0xf0)temp=P1;switch(temp)case 0xee:num1=7;break;case 0xde:num1=8;break;case 0xbe:num1=9;break;while(temp!=0xf0)/松手检测temp=P1;temp=temp&0xf0;P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0)temp=P1;switch(temp)case 0xed:num1=4;break;case 0xd

63、d:num1=5;break;case 0xbd:num1=6;break;while(temp!=0xf0)/松手检测temp=P1;temp=temp&0xf0;P1=0xfb;temp=P1;temp=temp&0xf0;while(temp!=0xf0)temp=P1;switch(temp)case 0xeb:num1=1;break;case 0xdb:num1=2;break;case 0xbb:num1=3;break;case 0x7b:num1=10;break;while(temp!=0xf0)/松手检测temp=P1;temp=temp&0xf0

64、;P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0)temp=P1;switch(temp)case 0xd7:num1=0;break;case 0xb7:num1=12;break;case 0x77:num1=11;break;while(temp!=0xf0)/松手检测temp=P1;temp=temp&0xf0;if(num1!=20)return(num1);void extern_interrupt() /外部中断初始化 EX0=1; /开外部中断0 EX1=1; /开外部中断1 IT0=1; /下降沿触发中断 EA=1; /开总中断void main() uchar tltemp,i,ii,i1; uchar TL; /温度低位 uchar TH; /温度高位 uchar TN; /温度

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!