2024年2月6日发(作者:)
摘 要
随着现代信息技术的飞速发展和传统工业的逐步改造,温度自动检测和显示功能在很多领域得到广泛应用。人们在温度检测的准确度、便捷性和快速等方面有着越来越高的要求。而传统的温度传感器已经不能满足人们的需求,其渐渐被新型的温度传感器所代替。
本文设计了一个温度检测报警器电路。采用单片机AT89C51和温度传感器DS18B20组成温度自动测控系统,可根据实际需要任意设定温度值,并进行报警和处理,通过LM016L显示温度。
本文是从测温电路、主控电路、报警电路以及驱动电路等几个方面来设计的。该器件可直接向单片机传输数字信号,便于单片机处理及控制。另外,还能直接采用测温器件测量温度,从而简化数据传输与处理过程。此设计的优点主要体现在可操作性强,结构简单,拥有很大的扩展空间等。
关键词:AT89C51;DS18B20;LM016L;报警电路
Abstract
With the rapid development of modern information technology and traditional
industrial transformation,the system of temperature automatic measurement and
display system is widely used in many have a rising demand in
temperature measurement accuracy,convenient, and ional temperature
sensors have been unable to meet the people's demands,and have gradually been
replaced by new-type temperature sensors.
This article designs a temperature detection circuit,using a micro-controller
AT89C51 and temperature sensor DS18B20,which composes temperature automatic
control system,and temperature values can be setted according to the actual need and
be controlled in time,then display temperature through LM016L.
This design analysis the function in several parts,like temperature measurement
circuit,control circuits,alarm circuits,driver circuit and so device can directly
transfer digital signal to the single-chip and make it convenient to process and
addition,it can also directly measure temperature with temperature
measurement device,then largely simplify data transmission and
advantage of this design are mainly reflected in the stronger maneuverability,simple
structure and larger room for expansion.
Keywords:AT89C51;DS18B20;LM016L;alarming circuit
目 录
第一章 绪论 ..................................................................................................... 1
1.1 选题的背景 ................................................................................................. 1
1.2 选题的目的及意义 ................................................................................... 1
1.3 论文结构 ..................................................................................................... 2
第二章 设计的整体方案 ............................................................................ 3
2.1 设计的主要内容 ....................................................................................... 3
2.2 设计性能要求 ............................................................................................ 3
第三章 模块设计和器件的选择 ............................................................. 4
3.1 单片机的选择 ............................................................................................ 4
3.2 温度采集模块设计 ................................................................................... 8
3.3 温度显示模块设计 ................................................................................. 15
3.4直流电机驱动模块 .................................................................................. 19
第四章 系统电路设计 ............................................................................... 21
4.1 主电路程序 ............................................................................................... 21
4.2 晶振复位电路 .......................................................................................... 21
4.3 温度采集电路 .......................................................................................... 24
4.4 按键电路 ................................................................................................... 26
4.5驱动电路..................................................................................................... 26
4.6 报警电路 ................................................................................................... 27
4.7 电源电路 ................................................................................................... 28
第五章 软件仿真 ......................................................................................... 30
5.1 软件介绍 ................................................................................................... 30
5.2 仿真过程 ................................................................................................... 30
第六章 体会与展望 ....................................................................................... 34
6.1 设计总结 ................................................................................................... 34
6.2 设计前景 ................................................................................................... 34
附录
附录A 系统总图 ............................................................................................ 36
B 系统程序 ............................................................................................ 37
参考文献 ............................................................................................................. 53
外文资料 ............................................................................................................. 65
致
谢 .................................................................................................................. 73
江西理工大学2013届本科生毕业设计(论文)
第一章 绪论
1.1 选题的背景
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的。单片机在测控领域中具有十分广泛的应用,它既可以测量电信号,又可以测量温度湿度等非电信号。由单片机构成的温度检测、温度控制系统可广泛应用于很多领域。单片机在工业控制、尖端武器、通信设备、信息处理、家用电器等测控领域的应用中独占鳌头。今天,我们的生活环境和工作环境有越来越多称之为单片机的小电脑在为我们服务。时下,家用电器和办公设备的智能化、遥控化、模糊控制化已成为世界潮流,而这些高性能无一不是靠单片机来实现的。
温度是个非常常见的量,不仅与人民的生活息息相关,而且工业和农业生产也需要实时测量温度,因此研究温度的测量方法和装置具有重要的意义。测量温度的关键是温度传感器,传感器属于信息技术的前沿尖端产品,尤其是温度传感器技术,在我国各领域已经应用的非常广泛,可以说是渗透到社会的每一个领域。
本次设计就是基于单片机为核心的温度报警器。
1.2 选题的目的及意义
随着现代信息技术的飞速发展和传统工业改造的逐步实现,能够独立工作的温度检测和显示系统已应用于诸多领域。无论是在工业方面、农业方面或者是平民大众的生活当中,我们都能看到温度报警器的身影。
传统的测温元件有热电偶和热电阻。而热电偶和热电阻测出的一般是电压,再转换成对应的温度,需要比较多的外部硬件支持。其缺点如下:
(1)硬件电路复杂;
(2)软件调试复杂;
(3)制作成本高。
因此,利用新型温度传感器取代旧式的温度传感器是必然的趋势,新型的温度传感器的优势越来越得到体现,越来越普及。单片机以其功能强、体积小、可靠性高、造价低和开发周期短等优点,成为自动化和各个测控领域不可缺少的器件。
本设计的温度报警器与传统的温度报警器相比,不仅具有读数方便,测温范围广,测温准确,控制方便、组态简单和灵活性大等优点,而且可以大幅度1
江西理工大学2013届本科生毕业设计(论文)
提高被控温度的技术指标,从而能够大大提高产品的质量和数量。如果你还需附加的功能,只要通过扩展单片机的端口,在软件里面编写相应的程序即可。在本设计中,温度传感器使用DS18B20,显示部分用LM016L,能准确达到以上要求。
1.3 论文结构
第一章介绍了此设计的背景和意义。第二章叙述了设计的整体思路,即如何将单片机,温度传感器和显示屏结合在一起以达到设计目标。第三章叙述了选择AT89C51单片机、DS18B20和显示设备等的原因。第四章叙述系统的电路及流程图。第五章通过仿真软件来模拟温度报警器。第六章客观评价本设计存在的优缺点,及作品的发展。
2
江西理工大学2013届本科生毕业设计(论文)
第二章 设计的整体方案
2.1 设计的主要内容
根据系统的设计要求,温度传感器DS18B20把所测得的温度发送到AT89C51单片机上,然后通过LM016L显示,除此,还可以设置合适的温度区间,对所测温度进行监控。利用外接的键盘设置电路,对温度上下限进行设置。当温度过低时,黄灯报警,并驱动电炉工作,电驴加热程度与温度有关;当温度过高时,旋转灯报警,且驱动风扇工作,风扇的转速与温度有关,当高温部分超过30℃时,风扇全速转动,当高温部分小于30℃时,风扇加速转动。系统框图如下:
图2-1 系统框图
按键输入
驱动装置
高温驱动
低温驱动
温度传感器
AT89C51
温度显示
双声黄灯报警
报警电路
单声旋转灯报警
2.2 设计性能要求
设计的主要功能和指标如下:
(1)利用温度传感器(DS18B20)测量某一点温度并显示。
(2)方便用户设定上下限温度,可调节的温度范围在0℃——99℃。
(3)当达到报警温度后,能够进行报警,并且作出相应的处理。
3
江西理工大学2013届本科生毕业设计(论文)
第三章 模块设计和器件的选择
本设计选用DS18B20作为温度传感器,选用AT89C51单片机作为整个设计的核心处理器。通过处理来自温度传感器的温度信息后,将此信息传送给LCD016L,并驱动相应的外围设备,当温度过低时,驱动电炉进行加热;当温度过高时,驱动风扇进行散热。所用到的器件有AT89C51、DS18B20、LCD016L等。
3.1 单片机的选择
AT89C51是美国ATMEL公司生产的低电压、高性能的CMOS 8位单片机,片内含4K bytes的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机数据存储器(RAM)。该器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MSC-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C51单片机可以提供许多高性价比的应用场合,可灵活应用于各种控制领域。
3.1.1 AT89C51的基本组成
图3-1所示为AT89C51带闪存(Flash ROM)单片机的基本结构框图。
4
江西理工大学2013届本科生毕业设计(论文)
振荡器和
时序
OSC
80C51
CPU
内中断
外中断
控制
P0 P2 P1 P3
程序存储器
4KB Flash
ROM
数据存储器
128字节RAM/SFR
外部事件计数输入
2*16位定
时器/计数器
DBUS
64KB总线
扩展控制器
可编程I/O
可编程全双工串行口
串行通信
图3-1 AT89C51单片机结构框图
在一小块芯片上,集成了一个微型计算机的各个组成部分,即AT89C51单片机芯片包括:
❖ 一个8位80C51微处理器(CPU)。
❖ 片内128字节数据处理器RAM/SFR,用以存放可以读/写的数据。
❖ 片内4K程序存储器Flash ROM,用以存放程序、一些原始数据和表格。
❖ 4个8位并行I/O端口P0—P3,每个端口可以用作输入/输出。
❖ 两个16位的定时器/计数器。每个定时器/计数器可以设置成计数方式,用以对外部事件进行计数;也可以设置成定时方式,并可以根据计数或定时的结果实现计算机控制。
❖ 具有5个中断源、两个中断优先级的中断控制系统。
❖ 一个全双工URAT的串行I/O口,用于实现单片机之间或单片机与PC机之间的串行通信。
❖ 片内振荡器和时钟电路。但石英晶体和微调电容需要外接,最高振荡频率为24MHz。
❖ 89C51单片机与8051单片机相比,具有两种节电工作方式,即空闲方式和掉电方式。
以上各个部分通过片内8位数据总线相连接。
5
江西理工大学2013届本科生毕业设计(论文)
3.1.2 AT9C51的引脚及其功能
1.电源引脚VCC和VSS
VCC:电源端,为+5v。
VSS:接地端。
2.外接晶体引脚XTAL1和XTAL2
XTAL1:接外部晶体和微调电容的一端。来自反向振荡放大器的输入及内部时钟电路的输入。
XTAL2:接外部晶体和微调电容的一端。来自反向振荡放大器的输出。
3.控制信号引脚RST、ALE、PSEN、EA
RST:复位输入端,高电平有效。当复位时,需要保持输入端两个机器周期的高电平时间。
ALE/PROG :地址锁存允许信号端。当CPU访问外部存储器时,ALE输出信号作为锁存低8位地址的控制信号。在Flash编程期间,此引脚用于输入编程脉冲。通常情况下,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外输出时钟或定时信号。
PSEN:外部存储允许输出信号端。当外部程序存储器取指令时,每个机器周期两次PSEN有效。但在此期间内,每当访问外部程序存储器时,这两次有效的PSEN信号将不出现。
EA/Vpp:外部程序存储器地址允许输入端/固化编程电压输入端。当EA保持低电平时,CPU只访问片外ROM并执行片外程序存储器中的指令,而不管是否有片内程序存储器。然而需要注意的是,如果加密位LB1被编程,则复位时在内部会锁存EA端的状态;当EA端保持高电平时,CPU只访问片内Flash ROM并执行内部程序存储器中的指令。在Flash ROM编程期间,此引脚也用于施加12V的编程电源(Vpp)。
4.输入/输出端口P0、P1、P2、P3
P0口:P0口是一个漏级开路的8位双向I/O口,每脚可吸收8个TTL门电流。当P1口作为输入口时,应先向端口锁存器写入全1,此时P0的全部引脚浮空,可作为高阻抗输入。在Flash ROM编程时,P0口接受指令字节;而当Flash进行校验时,P0输出指令字节,此时必须外接上拉电阻。
6
江西理工大学2013届本科生毕业设计(论文)
P1口:P1口是一个内部带上拉电阻的8位双向I/O口,P1的输出缓冲器能驱动4个TTL输入。P1口管脚写入1后,被内部电阻上拉为高电位,可用作输入。在Flash ROM编程和校验时,P1口作为低八位地址。
P2口:P2口是一个内部带上拉电阻的8位双向I/O口,P2的输出缓冲器能驱动4个TTL输入。对端口写1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。当P2口用于外部程序存储器或16位地址的外部数据存储器进行存取时,P2口输出地址的高八位。P2口在Flash ROM编程和校验时,用于接收高位地址和一些控制信号。
P3口:P3口是一个内部带上拉电阻的8位双向I/O口,P3的输出缓冲器能驱动4个TTL输入。对端口写1时,它们被内部上拉为高电平,并用作输入。P3口在Flash ROM编程和校验时,用于接收一些控制信号。在AT89C51中,P3端口还用于一些复用功能。其复用功能如表3-1所列。
表3-1 P3各端口引脚与复用功能表
端口管脚
P3.0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7
复用功能
RXD(串行输入口)
TXD(串行输出口)
INT0(外部中断0)
INT1(外部中断1)
T0(定时器0的外部输入)
T1(定时器1的外部输入)
WR(外部数据存储器写选通)
RD(外部数据存储器读选通)
3.1.3 AT89C51的工作模式
AT89C51单片机有两种节电工作模式,分别为空闲模式和掉电模式。这两种模式是通过控制SFR中的PCON(电源控制寄存器)中的PD和IDL位来实现的。PD是掉电模式,当PD=1时,激活掉电工作模式。IDL是空闲模式,当IDL=1时,激活空闲工作模式。如果同时向PD和IDL同时写1,则PD优先。
在空闲工作状态下,内部时钟不向CPU提供,而只供给中断、串行口、定时器部分。CPU的内部状态维持,即包括堆栈指针SP、程序计数器PC、程序状态字PSW、累加器ACC所有的内容保持不变,端口状态也保持不变。ALE和PSEN7
江西理工大学2013届本科生毕业设计(论文)
保持逻辑高电平。
进入空闲模式后,有两种方法可以退出。一是任何的中断请求被响应都可以由硬件将IDL清0而中止此模式。当执行完中断服务程序返回到主程序时,在主程序中,下一条要执行的指令将是原先使IDL置位指令后面的那条指令。另一种退出方法是通过硬件复位,由于在空闲模式下振荡器仍然工作,因此硬件复位仅需2个机器周期便可完成。而RST端的复位信号直接将IDL清0,从而退出空闲模式,CPU则从进入空闲方式的下一条指令开始重新执行程序。
在掉电模式下,内部振荡器停止工作。由于没有振荡时钟,因此,所有的功能的部件都停止工作。但内部RAM区和特殊功能寄存器的内容被保留,而端口的输出状态值都保存在对应的SFR中,ALE和PSEN都为低电平。
退出掉电模式的唯一方法是硬件复位,复位后将所有特殊功能寄存器的内容初始化,但不改变片内RAM的数据。下表为空闲和掉电模式外部引脚状态。
表3-2 空闲和掉电模式外部引脚状态
模式
空闲模式
空闲模式
掉电模式
掉电模式
程序存储器
内部
外部
内部
外部
ALE
1
1
0
0
PSEN
P0
1
1
0
0
数据
浮空
数据
浮空
P1
数据
P2
P3
数据
数据
数据
地址
数据
数据
数据
数据
数据
数据
数据
3.2 温度采集模块设计
3.2.1 方案论证
方案1:采用热敏电阻,这种电阻是利用对温度敏感的半导体材料制成的,电阻值随温度变化有明显的改变。负温度系数热敏电阻通常是由锰、钴的氧化物烧制成,但热敏电阻精度、重复性、可靠性较差,不适用于检测小于1℃的信号;而且线性度较差,不能直接用于A/D转化,应该用硬件或软件对其进行线性补偿。
方案2:采用温度传感器铂电阻Pt1000.铂电阻的物理化学性能在高温和氧化物介质中很稳定,它能用做工业测温元件,且元件线性度较好。但其成本太贵,不适合做普通设计。
方案3:采用集成温度传感器DS18B20。此传感器可以直接读取被测温度值,无需转换,电路简单,精度高,软硬件均易实现。
方案选择:选择方案3。理由:电路可靠,无需调试,费用较低,可靠性8
江西理工大学2013届本科生毕业设计(论文)
高,具有很高的精度,并且应用电路简单,便于设计。
3.2.2 DS18B20的性能特点
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器。与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字读数方式。DS18B20的性能特点如下:
独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条接口线,即可实现微处理器与DS18B20的双向通讯。
DS18B20支持多点组网功能,多个DS18B20可以并联在一起,实现组网多点测温。
DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。
适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电。
测温范围-55℃~+125℃,在-10℃~+85℃时精度为±0.5℃。
零待机功耗。
可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。
用户可定义的非易失性温度报警设置。
负电压特性,电源极性接反时,温度计不会因发热而烧毁,只是不能正常工作。
DS18B20作为新型的一线器件,能够方便地和中央处理器进行连接,并具有很大的扩展空间。温度范围较广,使得整体的测温范围能大幅度的上升,零待机消耗更是起到了节能的作用。利用用户能自定义报警设置这一特点,能够在实现报警功能上得到很大的便利,同时极强的抗干扰性能使得温度的检测更加准确,作为温度计最基本的要求,准确必须满足。这些好处使得DS18B20最终被选择。
3.2.3 DS18B20的内部结构
DS18B20采用3脚PR-35封装,其内部结构框图如下图所示。
9
江西理工大学2013届本科生毕业设计(论文)
64位ROM和
单线接口
存储器与控制逻辑
高
速
缓
存
温度传感器
高温触发器TH
低温触发器TL
配置寄存器
8位CRC发生器
图3-2 DS18B20内部结构框图
64位ROM的位结构如下图所示。开始8位是产品类型的编号;接着是每个器件的唯一的序号,共有48位;最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用单线进行通信的原因。
8位检验CRC
48位序列号
8位工厂代码(10H)
MSB
LSB
MSB
LSB
MSB
LSB
图3-3 64位ROM结构框图
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的电可擦除的E2PROM。
高速暂存RAM为9字节的存储器,结构如图3-4所示。
图3-4为高速暂存RAM结构图
1 0
江西理工大学2013届本科生毕业设计(论文)
前2字节包含测得的温度信息。第3和第4字节是TH和TL的复制值,是易失的,每次上电复位时被刷新。第5个字节为配置寄存器,其内容用于确定温度值的数字转化分辨率,DS18B20工作时按此寄存器中的分辨率将温度转化为相应精度的数值。该字节各位的定义如图3-5所示.
位数
含义
8
TM
7
R1
6
R0
5
1
4
1
3
1
2
1
1
1
图3-5 配置寄存器位定义
其中,低5位一直为1;TM是测试位,用于设置DS18B20在工作模式还是在测试模式,在DS18B20出厂时,该位被设置为0,用户不要去改动;R1和R0决定温度转换的精度位数,即用来设置分辨率,其定义方法见表3-3。
表3-3 DBS18B20分辨率的定义和规定
R1
0
0
1
1
R0
0
1
0
1
分辨率/位
9
10
11
12
温度最大转化时间/ms
93.75
187.5
375
750
由表3-3可见,DS18B20温度转换的时间比较长,而且设定的分辨率越高,所需要的转换时间越长。因此,在实际应用中要将分辨率和转化时间权衡考虑。高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。第9字节是前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。
当DS18B20接受到温度转换命令后,开始启动转化。转化完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存RAM的第1、2字节中。单片机可以通过单线接口读出该数据,低位在前,高位在后,数据格式是以0.0625℃/LSB形式表示。温度值格式如图3-6所示。
低字节
23
22
21
S
20
S
21
22
23
25
24
24
高字节
S S S
26
图3-6 温度数据值格式
图中,S表示符号位。当S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当S=1时,表示测得的温度值为负值,要先将补码变11
江西理工大学2013届本科生毕业设计(论文)
成原码,再计算十进制值。表3-4列出了部分温度值对应的二进制温度表示的数据。
表3-4 DS18B20温度与表示值对应表
温度
+125
+85
+25.0625
+10.125
+0.5
0
-0.5
-10.125
-25.0625
-55
二进制表示
0000 0111 1101 0000
0000 0101 0101 0000
0000 0001 1001 0001
0000 0000 1010 0010
0000 0000 0000 1000
0000 0000 0000 0000
1111 1111 1111 1000
1111 1111 0101 1110
1111 1110 0110 1111
1111 1100 1001 0000
十六进制表示
07D0H
0550H
0191H
00A2H
0008H
0000H
FFF8H
FF5EH
FE6FH
FC90H
64位ROM的最高位有效字节中存储有循环冗余检验码(CRC)。主机根据ROM的前56位来计算CRC值,并与存入DS18B20的CRC值相比较,以判断主机收到的ROM数据是否正确。
3.2.4 DS18B20的测温原理
DS18B20的测温原理如图3-7所示,图中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 ℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55 ℃所对应的一个基数值。
减法计数器1对低温度系数振荡器产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值加1,减法计数器1的预置值将被重新装入,并重新开始对低温度系数振荡器产生的脉冲信号进行计数。如此循环,直到减法计数器2计数到0时,停止温度寄存器的累加,此时温度寄存器的数值就是所测温度值。图中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述1 2
江西理工大学2013届本科生毕业设计(论文)
过程,直到温度寄存器值达到被修正温度值。
另外,由于DS18B20单线通信功能是分时完成的,有严格的时隙概念,因此读/写时序很重要。系统对DS18B20的各种操作必须按照协议进行。操作协议为:初始化DS18B20(发复位脉冲)——发ROM功能命令——发存储器操作命令——处理数据。
预置
减到0
减法计数器1
增加
温度寄存器
停止
高温度系数振荡器
减法计数器2
减到0
预置
斜率累加器
计数比较器
低温度系数振荡器
图3-7 DS18B20测温原理图
3.2.5 DS18B20的各条命令
Read ROM [33H]。这条命令允许总线控制器读取DS18B20的位系列编码、唯一的序列号和8位CRC码。只有在总线上存在单只DS18B20时,才能使用该命令。如果总线上不止一个从机,则当所有从机试图同时传送信号时就会发生数据冲突(漏极开路连在一起形成相“与”的效果)。
Match ROM [55H]。这是一条匹配ROM指令,后跟64位ROM序列,让总线控制器在多点总线上定位一只特定的DS18B20。只有与64位ROM序列完全匹配的DS18B20才能响应随后的存储器操作。所有与64位序列不匹配的从机都将等待复位脉冲。这条指令在总线上有单个或多个器件都是可以使用。
Skip ROM [CCH]。这条命令允许总线控制器不用提供64位ROM编程就使用存储器操作命令,在单点总线情况下,可以节省时间。如果总线上不止一个从机,则在Skip ROM命令之后跟着发一条读命令。由于多个从机同时传送信号,所以总线上就会发生数据冲突(漏极开路连在一起形成相“与”)。
Search ROM [F0H] 当一个系统重新启动时,总线控制器可能并不知道单线上有多少器件或它们的64位ROM编码。搜索ROM命令允许总线控制器用排除法识别总线上的所有从机的64位编码。
1 3
江西理工大学2013届本科生毕业设计(论文)
Alarm Search [ECH]。这条命令的流程与Search ROM相同。然而,只有在最近一次测温后遇到报警条件的情况下,DS18B20才会响应这条命令。报警条件定义为温度高于TH或低于TL。只要DS18B20不掉电,报警状态将一直保持,直到下一次测得的温度值达不到报警条件。
Write Scratchpad [4EH]。这条命令向DS18B20的暂存器TH和TL中写入数据,可以在任何时刻发出复位命令来中止写入。
Read Scratchpad [BEH]。这条命令读取暂存器的内容。读取将从第1字节开始,一直进行下去,直到第9字节(CRC)读完。如果不想读完所有字节,则控制器可以在任何时间发出复位命令来中止读取。
Copy Scratchpad [48H]。这条命令将暂存器的内容复制到DS18B20的E2PROM存储器,即把温度报警器触发字节存入非易失性存储器里。如果总线控制器在这条命令之后跟着发出读时间隙,而DS18B20又忙于把暂存2器复制到EPROM存储器,则DS18B20就会输出一个0;如果复制结束,则DS18B20输出1.如果使用寄生电源,则总线控制器必须在这条命令发出之后立即启动强上拉,并最少保持10ms。
Convert T [44H]。这条命令启动一次温度转化而无需其他数据。温度转化命令被执行后DS18B20进入等待状态。如果总线控制器在这条命令之后跟着发出读时间隙,而DS18B20又忙于做时间转化,则DS18B20将在总线上输出0;如果温度转化完成,则输出1.如果使用寄生电源,则总线控制器必须在发出这条命令之后立即启动强上拉,并保持500ms以上时间。
Recall E2 [B8H]。这条命令把报警触发器的值复制到暂存器。这种复制操作在DS18B20上电时自动执行,这样器件一上电暂存器里马上就存在有效的数据了。若在这条命令发出之后发出读数据隙,器件会输出温度转化忙的标识:0表示忙;1表示完成。
Read Power Supply [B4H]。若把这条命令发给DS18B20后发出读时间隙,器件会返回它的电源模式:0表示寄生电源;1表示外部电源。
3.2.6 温度数据的计算处理方法
从DS18B20读取出的二进制必须先转换成十进制,才能用于字符的显示。DS18B20的转化精度为9~12位可选,为了提高精度采用12位。在采用12位转化精度时,温度寄存器里的值是以0.0625为步进的,即温度值为温度寄存器里的二进制值乘以0.0625,就是实际的十进制温度值。
通过观察表3-5可以发现,一个十进制与二进制间有很明显的关系,就是1 4
江西理工大学2013届本科生毕业设计(论文)
把二进制的高字节的低半字节和低字节的高半字节组成一个字节,这个字节的二进制化为十进制后,就是温度值的百、十、个位值。而剩下的低字节的低半字节化为十进制后,即是温度值的小数部分。因为小数部分是半字节,所以二进制值范围是0~F,转化为十进制小数值就是0.0625的倍数。实际不必这么高的精度,可以精确到0.1℃.下表就是二进制与十进制的近似对应关系表。
表3-5 小数部分二进制和十进制的近似对应关系表
二进制值
十进制值
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 1 1 2 3 3 4 4 5 6 6 7 8 8 9 9
3.3 温度显示模块设计
3.3.1液晶显示简介
在日常生活中,我们对液晶显示器并不陌生。液晶显示模块已作为很多电子产品的通用器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。
本次设计采用液晶显示器的原因:(1)显示质量高,由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。(2)数字式接口,液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。(3)体积小、重量轻,液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。
(1)液晶显示原理
液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样就可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
(2)液晶显示器的分类
液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、1 5
江西理工大学2013届本科生毕业设计(论文)
点阵式等。除了黑白显示外,液晶显示器还有彩色显示。
(3)液晶显示器各种图形的显示原理:
a.线段的显示
点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。这就是LCD显示的基本原理。
b.字符的显示
用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,即要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”。这样一来就组成某个字符。但对于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。
3.3.2 LM016L的结构及功能
LM016L液晶模块采用HD44780控制器,HD44780具有简单而功能较强的指令集,可以实现字符移动,闪烁等功能,LM016L与单片机通讯可采用8位或4位并行传输两种方式,HD44780控制器由两个8位寄存器,指令寄存器(IR)和数据寄存器(DR)、忙标志(BF)、显示数RAM(DDRAM)、字符发生器ROM(CGOROM)、字符发生器RAM(CGRAM)、地址计数器RAM(AC)。LM016L液晶模块的引脚功能如表3-6所示。
1 6
江西理工大学2013届本科生毕业设计(论文)
表3-6 引脚功能表
引脚 符号
1
2
3
VSS 一般接地
VDD 接电源(+5V)
VEE 液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
4 RS RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
5
6
7
8
9
10
11
12
13
14
RW
E
D0
D1
D2
D3
D4
D5
D6
D7
RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
E端为使能端,下降沿使能。
低4位三态、 双向数据总线 0位(最低位)
低4位三态、 双向数据总线 1位
低4位三态、 双向数据总线 2位
低4位三态、 双向数据总线 3位
高4位三态、 双向数据总线 4位
高4位三态、 双向数据总线 5位
高4位三态、 双向数据总线 6位
高4位三态、 双向数据总线 7位(最高位)(也是busy flag)
功能说明
LM016L字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线,本次模型采用14条引脚线,如图3-9所示。
。
图3-9 LM016L模型
寄存器选择控制如表3-7.
1 7
江西理工大学2013届本科生毕业设计(论文)
表3-7寄存器选择控制表
RS
0
0
1
1
R/W
0
1
0
1
操作说明
写入指令寄存器(清除屏等)
读busy flag(D7),以及读取位址计数器(D0~D6)值
写入数据寄存器(显示各字型等)
从数据寄存器读取数据
busy flag(D7):此位被清除为0时,LCD将无法再处理其它的指令要求。液晶模块内部的控制器共有11条控制指令,如表3-8所示:
表3-8 控制命令表
序号
1
2
3
清显示
光标返回
输入模式
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
BF
0
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
1
DL
0
0
0
1
0
0
1
D
0
1
1
*
指令 RS RW D7 D6 D5 D4 D3 D2 D1 D0
I/D S
C
*
*
B
*
*
4 显示开/关控制
5 光标或字符移位 0
6 功能 0
S/C R/L
N F
7 字符发生器地址 0
8 数据存贮器地址 0
9 读忙标志或地址 0
10
11
写数到CGRAM或DDRAM)
从CGRAM或DDRAM读数
1
1
字符发生存储器地址
显示数据存储器地址
计数器地址
要写的数据内容
1 读出的数据内容
LM016L液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)
指令1:清显示,指令码01H,光标复位到地址00H位置。
指令2:光标复位,光标返回到地址00H。
指令3:光标和显示模式设置。 I/D:光标移动方向,高电平右移,低电平左移; S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。
指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,1 8
江西理工大学2013届本科生毕业设计(论文)
低电平表示关显示; C:控制光标的开与关,高电平表示有光标,低电平表示无光标 ;B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或显示移位。 S/C:高电平时移动文字,低电平时移动光标。
指令6:功能设置命令。 DL:高电平时为4位总线,低电平时为8位总线 ;N:低电平时为单行显示,高电平时双行显示 ;F: 低电平时显示5*7的点阵字符,高电平时显示5*10的点阵字符。
指令7:字符发生器RAM地址设置。
指令8:DDRAM地址设置。
指令9:读忙信号和光标地址。 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据。
指令11:读数据。
3.4直流电机驱动模块
3.4.1方案选择
方案一:采用继电器对电动机的开和关进行控制,通过开关的切换对电机的速度进行调整。这个方案的优点是电路较为简单,实现容易;缺点是继电器的响应速度慢、机械结构易损坏、寿命较短。
方案二:采用专用芯片L298。L298是一个具有高电压、大电流的全桥驱动芯片,它响应频率高,且还带有控制使能端。用该芯片作为电机驱动,操作方便,稳定性好,性能优良。
基于上述理论和实际情况分析,拟定选择方案二。
3.4.2 L298驱动芯片
L298 为SGS-THOMSON Microelectronics 所出产的双全桥直流电机专用驱动芯片( Dual Full-Bridge Driver ) ,内部包含4信道逻辑驱动电路,是一种二相和四相电机的专用驱动器,可同时驱动2个二相或1个四相电机,内含二个H-Bridge 的高电压、大电流双全桥式驱动器,接收标准TTL逻辑准位信号,可驱动46V、2A以下的步进电机,且可以直接通过电源来调节输出电压;此芯片可直接由单片机的I/O端口来提供模拟时序信号,节省了单片机I/O 端口的使用。在本次设计中,此驱动芯片的作用主要是放大电流。因为单片机的引脚输出电流大约为30mA,而一般的电机的工作电流在十几安培左右。故采用1 9
江西理工大学2013届本科生毕业设计(论文)
此芯片可以保证电机正常工作。L298的逻辑功能如下表3-9。
表3-9 L298的逻辑功能
IN1
X
1
0
0
1
IN2
X
0
1
0
1
ENA
0
1
1
1
1
电机状态
停止
正转
反转
停止
停止
2 0
江西理工大学2013届本科生毕业设计(论文)
第四章 系统电路设计
整个设计的电路包括了最小系统电路、温度采集电路、温度显示电路、报警电路、按键电路等。
4.1 主电路程序
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的温度值。主程序的另一功能是判断上限温度是否大于下限温度。其程序流程见图4-1所示。由总的流程图可以分析出,在整个程序中应该包括如下几个部分:读取DS18B20温度子程序,温度转换子程序,温度计算子程序,数据显示子程序等。主程序流程图如下所示。
开始
N
上限大于下限?
系统初始化
按键检测?
N
中读取温度 从DS18B20
按键设置
Y
error
显示温度
Y
Y
温度极限?
报警程序
N
返回
4.2 晶振复位电路
图4-1 主程序流程图
晶振、复位电路与单片机连接构成最小系统电路,如何选取合适的引脚,选取何种连接方式都至关重要。因此需要了解AT89C51的引脚特点。图4-2为AT89C51单片机的引脚图。
2 1
江西理工大学2013届本科生毕业设计(论文)
图4-2 AT89C51单片机引脚图
在晶振电路中,AT89C51具有两种晶振方式,一种是片内时钟振荡方式,但需要在引脚外接石英晶体和振荡电容,振荡电容的值一般取10-30pf。另一种是外部时钟方式,即将XTAL1接外部时钟,XTAL2脚悬空。本设计的晶振电路采用片内时钟振荡方式,如图4-3所示。
图4-3 晶振电路
2 2
江西理工大学2013届本科生毕业设计(论文)
单片机的晶振频率采用12MHZ,加两个30pF电容。两个电容主要用于校正波形,振荡器的作用主要是产生时钟振荡。而整个电路的作用则是为了产生自激振荡。
对于复位电路,AT89C51有两种复位方式,分别是上电复位和按键复位。本设计采用的是按键复位,即利用复位电容和按键的组合。按键复位:引脚RST作用是复位输入。当振荡器复位时,要保持RST脚两个机器周期的高电平时间。在按下按键后,系统自动复位。在复位电路中添加按键主要是为了能够使得复位更加方便,电容主要是在复位后进行充电,而下拉电阻起到限流的作用,保护了电路。
图4-4 复位电路
读出温度程序的主要功能是读出RAM中的数据。在读出时需进行CRC校验,校验有错时不进行温度数据的读取。其程序流程图如图4-5所示。
全部读完?
读取操作
发读取温度命令
发跳过ROM命令
CRC校验?
发DS18B20复位命令
N
Y
移入温度寄存器
N
结束
Y
图4-5 读出温度子程序流程图
图4-5 读出温度程序流程图
2 3
江西理工大学2013届本科生毕业设计(论文)
4.3 温度采集电路
温度采集电路主要运用到了DS18B20和AT89C51。如何使两者连接实现功能是温度控制电路的主要设计目的。
图4-6 DS18B20管脚图
在硬件上,DS18B20与单片机的连接有两种方法,一种是VCC接外部电源,GND接地,DQ与单片机的I/O线相连;另一种是用寄生电源供电,此时VCC、GND接地,DQ接单片机I/O。内部寄生电源DQ口线要接5KΩ左右的上拉电阻。这里采用的是第一种连接方法,DS18B20的1脚接地,3脚接电源,2脚接单片机的P2.7口。如图4-7所示:
图4-7 温度采集电路
温度采集部分软件编程包括温度转换程序、温度计算程序及温度显示程序。
温度转换程序是从发温度转化命令开始。当采用12位分辨率时,转换时间约为750ms。温度转化命令程序流程图如下所示。
发DS18B20复位命令
发跳过ROM命令
发温度转换开始命令
结束
图4-8温度转化程序流程图
2 4
江西理工大学2013届本科生毕业设计(论文)
温度计算程序将RAM中读取的值进行BCD码的转化运算,并进行温度值正负的判定。计算温度程序流程图如下所示。
Y
温度值取补码置“-”标志
温度零下?
计算整数位温度BCD值
开始
计算小数位温度BCD值
N
无标志
结束
图4-9 温度计算程序流程图
温度显示程序主要是对显示缓冲器中的显示数据进行刷新操作。 一个字节不能直接在显示屏上显示,这就需要将字节通过处理转化成能在LCD上显示的数,所以在接收到温度信息后,需要通过程序的转化,变成能在LCD上显示的字符。温度显示程序流程图如下图所示。
N
温度数据移入显示寄存器
百位数为0?
Y
十位数为0 ?
N
百位显示数据
(不显示符号)
Y
十位显示符号
百位不显示
结束
百位显示符号
十位显示数据
图4-10温度显示程序流程图
2 5
江西理工大学2013届本科生毕业设计(论文)
4.4 按键电路
本次设计采用3*4矩阵键盘电路,方便用户设置上下限。由下图可以看出其工作原理。当按下上限按钮,则进入十位设置,完成后,自动跳转到个位进行设置。若需要修改时,重复上面的操作步骤直至合适为止。下面分别为按键硬件电路和流程图。
图4-11 按键电路
上限或下
限按下?
Y
N
上限设置
下限设置
返回
图4-12 按键程序流程图
4.5驱动电路
在Proteus中用电炉可以表示实际生活中的热电阻。当温度过低时,系统驱动电炉加热,且加热程度与温度有关。当低温部分不超过5℃时,加热程度为2 6
江西理工大学2013届本科生毕业设计(论文)
25%;当低温部分不超过10℃时,加热程度为50%;当低温部分不超过15℃时,加热程度为75%;的那个低温部分超过15℃,加热程度为100%,即完全加热。下图为电炉装置图。
图4-13 电炉装置图
当温度过高时,系统驱动风扇进行散热。当高温部分不超过30℃时,风扇加速运转;当高温部分超过30℃时,风扇全速运转。下图为电机电路图。
图4-14 电机电路图
4.6 报警电路
4.6.1 低温报警
当温度低于下限时,黄灯和双声报警。蜂鸣器一端接地,另一端直接和单2 7
江西理工大学2013届本科生毕业设计(论文)
片机的P3.3端口相连。其连接方式如4-15所示。
图4-15 低温报警电路
4.6.2 高温报警
当温度过高时,采用了旋转灯和单声报警。声音报警部分与低温报警的相同,旋转灯报警的电路如下图所示。
图4-16 高温报警电路
4.7 电源电路
由于本设计中除了电机驱动芯片L298采用+12v工作电压外,其它均是+5v。所以只需设计+5v和+12v的稳压电源即可。本次设计采用的是W7800三端稳压器。W7800系列三端稳压器的输出电压有5V、6V、9V、12V、15V、18V和24V七个档次,型号后面的两个数字表示输出电压值。输出电流有1.5A(W7800)、0.5A(W78M00)、0.1A(W78L00)三个档次。它因为性能稳定、价格低廉而得到2 8
江西理工大学2013届本科生毕业设计(论文)
广泛的应用。
W7800的应用电路如下图所示,输出电压和最大输出电流决定于所选三端稳压器。图中电容C9用于抵消输入线较长时的电感效应,以防止电路产生自激振荡,其容量较小,一般小于1uF。电容C11用于消除输出电压中的高频噪声,可取小于1uF的电容,也可取几微法甚至几十微法的电容,以便输出较大的脉冲电流。但是若C11容量较大,一旦输入端断开,C11将从稳压器中输出端向稳压器放电,易使稳压器损坏。因此,可在稳压器的输入端(引脚1)和输出端(引脚3)之间跨接一个二极管,如下图所示,起保护作用。
图4-17 W7800
2 9
江西理工大学2013届本科生毕业设计(论文)
第五章 软件仿真
5.1 软件介绍
Proteus是英国Labcenter公司开发的电路分析与实物仿真及印制电路板设计软件,它可以仿真、分析各种模拟电路与集成电路,软件提供了大量模拟与数字元器件及外部设备,各种虚拟仪器,特别是它具有对单片机及其外围电路组成的综合系统的交互仿真功能。
Proteus主要由ISIS和ARES两部分组成,ISIS的主要功能是原理图设计及与电路原理图的交互仿真,ARES主要用于印制电路板的设计。
5.2 仿真过程
在Proteus中仿真如下图所示,主要包括四部分:测量并显示温度,设置温度上下限、报警和驱动。
图5-1 测量温度仿真
在仿真过程中,主要检测DS18B20是否能快捷地检测出室温,能否随着温度的变化而变化。由仿真结果可以看出,温度传感器显示的温度和LCD上显示的温度是相同的。
设置温度上下限时,只需按下上限按钮或者下限按钮。而设置温度上限和设置温度下限的方式相同。下面举例演示上限的设置方法。
假设要想改变上限温度。那么只需按下上限按钮即可。若上限值小于下限值,则会显示“error”,用以提示用户输入了错误的信息。只有输入合适的上限温度后,才会显示温度。
3 0
江西理工大学2013届本科生毕业设计(论文)
图5-2 温度上限设置的仿真演示
当温度过低时,系统会进行黄灯和双声报警,并驱动电炉加热。且加热程度与低温部分有关。
黄灯,单声报警 低温部分小于5℃
低温部分小于10℃ 低温部分小于15℃ 低温部分大于15℃
图5-3 低温报警和驱动电路
3 1
江西理工大学2013届本科生毕业设计(论文)
当温度过高时,旋转灯和单声报警,并且驱动电机进行散热。当高温部分不超过30℃时,电机加速运转;当高温部分超过30℃后,电机全速运转。
当实时温度为40℃时,此时电机加速运转至35.2。
当实时温度为50℃时,电机加速运转至89.8。
3 2
江西理工大学2013届本科生毕业设计(论文)
当实时温度为90℃时,电机全速运转,转速为461。
当实时温度为100℃时,电机全速运转,转速为461。
图 5-4 高温报警电路仿真
3 3
江西理工大学2013届本科生毕业设计(论文)
第六章 体会与展望
6.1 设计总结
在工业生产和日常生活中,对温度控制系统的要求,主要是保证温度在一定温度范围内微变,稳定性好,不振荡,对系统的快速性要求高。在论文中简单分析了单片机温度控制系统设计过程及实现方法。本系统的测温范围为0℃——99℃,温度检测系统根据用户设定的温度范围完成温度控制。
本次毕业论文中设计的温度报警器主要由AT89C51和DS18B20来实现。因此需要通过查阅资料来了解这些器件的基本结构、主要功能和注意事项等。通过了解器件,比较彼此之间的优缺点,来确定设计所需的器件,如何更好的利用器件的特点成为本次设计重要的一方面。在确定了器材之后,如何利用使之最大限度的体现设计的功能,完成设计目标,这又是需要花大量时间去思考的。
在设计完成之后,设计合理的程序和通过仿真软件模拟仿真,又再一次检验了设计的成果。整个设计从确定题目,到寻找相关资料,再到选择合适的器件,接着对电路图的绘制,程序的编写,仿真的进行,最终调试。一步步走过来,一点点的进步,花了大量的时间和精力,而成果也是喜人的。
经过两个多月的方案论证、系统的硬件、软件设计以及调试。查阅了大量的关于传感器、单片机接口电路、以及控制方面的理论。经过了一番特殊的体验后,经历了失败的痛苦,也尝到了成功的喜悦。第一次靠用所学的专业知识来解决问题。检查了自己的知识水平,使我对自己有一个全新的认识。通过这次毕业设计,不仅锻炼了自己分析问题、处理问题的能力,还提高了自己的动手能力。这些培养和锻炼对于我们大学生来说,是很重要的。
6.2 设计前景
单片机自动控制已经广泛的应用于人们的生产和生活,传统用模拟电路来控制温度的做法,已经逐渐被淘汰。这个系统的实现,改变了传统的温度控制方法,为温度的控制开辟了一条新的道路。
与传统的温度报警器相比,本次设计的温度报警具有读数方便,测温范围广,测温准确,其输出采用数字显示,由于单片机价格相对低廉,所以可以大量的普及。
生活中,人们渐渐习惯了温度报警器的存在,而单片机的相对低廉决定了温度报警器的经济效益。对于本系统的使用者来说,能够很稳定的控制温度。只要配上适当的温度传感器,这个系统还可以实现很多领域的温度自动控制。3 4
江西理工大学2013届本科生毕业设计(论文)
这对于提高系统的利用率,避免重复设计有很大的帮助。在本系统的作用下,可以为工作系统提供一个良好的环境,使产品的数量和质量有很大的提高,产品的生产成本降低,从而使系统的使用者获得的利润提高了。
当然单纯的温度检测也许不能满足这些要求,在本设计基础上加上湿度检测,与温度调节装置连接起来,用于自动调节温度等等,都是可以扩展的内容。
总之,本设计简便实用,并且可研究开发和升级的空间是很大的。
3 5
江西理工大学2013届本科生毕业设计(论文)
附 录
3 6
江西理工大学2013届本科生毕业设计(论文)
/*************温度检测报警器电路设计系统程序*********/
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define LCM1602_DB0_DB7 P0 // 定义LCM1602的数据总线
sbit yel=P3^3;
sbit DQ=P2^7; //ds18b20与单片机连接口
sbit RS=P2^0; //1602控制接口
sbit RW=P2^1;
sbit EN=P2^2;
sbit heater=P2^4;
sbit buzzer=P3^5;
sbit MA=P2^6;
sbit MB=P2^5;
sbit PWM=P2^3;
uchar code high[]="HIGH:";
uchar code low[]="LOW :";
uchar code cc[]="error";
uchar display_t[]=" 100.4";
uchar code df_Table[]= { 0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9 };
uchar CurrentT = 25; //当前温度,默认为25
//读出温度暂存
uchar Signed_Temp = 0; //有符号温度值
uchar Temp_Value[]={0x00,0x00};
uint num[]= {30,25,0};
uchar display[5]={0x00,0x00,0x00,0x00,0x0};
uint num1[]={3,0,2,5};
int up_n=0,down_n=0,i,m=0,T_h=0,T_l=0;
uchar c = 0xAA; //即11001100,不断移位达到旋转灯的效果
uchar key_num=0,key_temp1; //按键函数里用来暂存按键值的
uint error=0; //设置错误状态标志
uchar key_scan();
3 7
sbit LCM1602_Busy=P0^7;
江西理工大学2013届本科生毕业设计(论文)
uchar ng;
//1602 延时函数,使用晶振12Mhz
/***********延时程序*****************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay1(uint z)
{
for(;z>0;z--);
}
/*****************lcd1602测忙****************/
void LCM1602_TestBusy(void)
{
do{
LCM1602_DB0_DB7 = 0xff;
RS = 0;
}
/*********写入指令数据到lcd*************/
void write_com(uchar com) //1602控制字
{
LCM1602_TestBusy();
RW=0;
RS=0; //选择指令寄存器
P0=com;
delay(5);
EN=1;
delay(5);
//把地址给D0~D7
//延时一小会,让1602准备接受数据
//下降沿执行命令
RW = 1;
EN = 0;
delay(2);
}
while(LCM1602_Busy);
//ds18b20延时函数 11us
EN= 1;
3 8
江西理工大学2013届本科生毕业设计(论文)
EN=0;
}
/**************写入字符显示数据到lcd**************/
void write_data(uchar date) //1602显示字
{
LCM1602_TestBusy();
RW=0;
RS=1; //选择数据寄存器
delay(5);
EN=1;
P0=date;
delay(5);
EN=0;
}
/***************初始化************************/
void init1602()
{
EN=0;
RW=0;
write_com(0x38); //设置16*2行显示,5*7点阵,8位数据接口
write_com(0x06);
write_com(0x01); //清屏
}
void blank_up(uchar add) //第一行空字符函数
{
write_com(0x80+add);
write_data(0x20);
}
void blank_low(uchar add)
{
write_com(0x80+0x40+add);
write_data(0x20);
}
/***********************按键设置********/
//第二行空字符函数
write_com(0x0c); //开显示,关光标
3 9
江西理工大学2013届本科生毕业设计(论文)
void up_set()
{
}
void down_set()
{
}
uchar key_scan()
{
uchar key_temp0;
P1=0x07;
key_temp0=P1;
if(key_temp0!=0x07)
{
delay(1);
key_temp0=P1;
if(key_temp0!=0x07)
{
P1=0xf8; //1111 1000
key_temp1=P1;
if(key_temp0==0x06) //0000 0110 横列p1.0有按键按下
//防止误操作
//按键检测
if(up_n==0)
{
}
key_num=11; //下限的键值为11
while(key_temp1==0xf0) key_temp1=P1;
if(down_n!=0)down_n=0;
++down_n;
if(down_n==0)
{
}
key_num=10; //上限的键值为10
while(key_temp1==0xf0) key_temp1=P1;//等待按键弹起
if(up_n!=0)up_n=0;
++up_n;
//上限设置参数加1
4 0
江西理工大学2013届本科生毕业设计(论文)
{
switch(key_temp1)
{
case 0xf0:key_num=0;break;//1111 0000 纵列p1.3被按下
case 0xd8:key_num=2;break;//1101 1000 纵列p1.5被按下
case 0xb8:key_num=3;break;//1011 1000 纵列p1.6被按下
}
//0000 0101 横列 p1.1被按下
case 0xe8:key_num=1;break;//1110 1000 纵列p1.4被按下
}
else if(key_temp0==0x05)
}
return key_num;//得到键值
}
/************效果控制**************/
void U_lamp() //超过上限时旋转灯
{
switch(key_temp1)
{
case 0xf0:up_set();break;
case 0xe8:key_num=4;break;
case 0xd8:key_num=5;break;
case 0xb8:key_num=6;break;
}
}
//0000 0011 横列 p1.2被按下
{
switch(key_temp1)
{
case 0xf0:down_set();break;
case 0xe8:key_num=7;break;
case 0xd8:key_num=8;break;
case 0xb8:key_num=9;break;
}
}
else if(key_temp0==0x03)
}
4 1
江西理工大学2013届本科生毕业设计(论文)
{
SCON = 0x00; //串行口的工作方式0,即移位寄存器
{
}
void Buzzer()
{
}
/***************18b20初始化**********************/
void init_DS18B20()
{
uchar presence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();
DQ=0;
delay1(50);
DQ=1;
delay1(6);
//550us
//释放总线
//66us
//_nop_() 1us
{
}
buzzer = 0;
buzzer = ~buzzer;
delay1(80);
for(i=0;i<70;i++)
//蜂鸣器报警
yel=!yel;
delay(10);
TI = 1; //发送中断标志位
c = _crol_(c,1); //循环左移
SBUF = c; //串行口的缓冲寄存器
while(TI==0);
TI = 0;
}
//低于下限时,黄灯报警 void D_lamp()
4 2
江西理工大学2013届本科生毕业设计(论文)
presence=DQ; //presence=0;继续下一步
}
delay1(45);
presence=~DQ;
}
DQ=1;
}
/***********18b20读1字节函数********************/
uchar ReadOneByte(void) //从总线上读取1字节
{
}
/***************18b20写命令函数***************************/
void WriteOneByte(uchar dat) //向1-WIRE总线上写1字节
{
uchar i;
for(i=0;i<8;i++)
{
DQ = 1;
_nop_();_nop_();
DQ = 0; _nop_();_nop_();_nop_();_nop_();_nop_();
DQ = dat&0x01;
delay1(6);
uchar i;
uchar dat=0;
for(i=0;i<8;i++)
{
DQ = 1;_nop_();_nop_();
dat >>= 1;
//先读取低位上的数据
//再次拉高总线,让总线处于空闲状态
DQ = 0;_nop_();_nop_();_nop_();_nop_();
DQ = 1;_nop_();_nop_();_nop_();_nop_();
if(DQ)
}
dat |= 0x80;
delay1(6);
DQ = 1;
return (dat);
4 3
江西理工大学2013届本科生毕业设计(论文)
dat >>= 1;
}
DQ=1;
delay1(1);
}
/***************读出温度函数*******************/
void Read_Temperature()
{
init_DS18B20();
WriteOneByte(0xcc); //跳过读序列号
WriteOneByte(0xbe);//读取温度
Temp_Value[0] = ReadOneByte();
Temp_Value[1] = ReadOneByte();
init_DS18B20();
WriteOneByte(0xcc); //跳过读序列号
WriteOneByte(0x44); //启动温度转换
}
void Display_Temperature()
{
uchar i;
if((Temp_Value[1]&0xf8)==0xf8)
{
Temp_Value[1] = ~Temp_Value[1];
Temp_Value[0] = ~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)
Temp_Value[1]++;
ng = 1;
}
else ng=0;
display[0] = df_Table[Temp_Value[0]&0x0f];/温度小数部分
//获取温度整数部分(无符号)
CurrentT=((Temp_Value[0]&0xf0)>>4)| (Temp_Value[1]&0x07)<<4);
有符号温度值(忽略小数位)
Signed_Temp=!ng ? CurrentT : -CurrentT;
display[3] = CurrentT/100; //百位
4 4
//获取
江西理工大学2013届本科生毕业设计(论文)
display[2] = CurrentT%100/10; //十位
display[1] = CurrentT%10; //个位
//小数位的显示
num[2]=(int)display[3]*100+(int)display[2]*10+(int)display[1];
display_t[5] = display[0] + '0';
}
void set()//设置状态
{
uint t_key=0;
t_key=P1;
if(up_n==1&&down_n==0)
display_t[4] = '.';
display_t[3] = display[1] + '0';
display_t[2] = display[2] + '0';
display_t[1] = display[3] + '0';
{
}
if(display_t[2] == ' ')
display_t[2] = '-';
else
if(display_t[1] == ' ')
display_t[1] = '-';
display_t[0] = '-';
else
display_t[1] = ' ';
display_t[2] = ' ';
if(ng) //负数符号显示在恰当位置
//个位
//十位
//百位
if(display[3] == 0) //高位为0时不显示
if(display[2] == 0&&display[3]==0)//高和次高位为0时,次高位不显示
write_com(0x80+0x40+9);
for(i=0;i<6;i++)
{
}
write_data(display_t[i]);
write_com(0x80+0x40+15);
write_data('C');
4 5


发布评论