王勇毕业论文毕业设计(论文)-基于单片机的热水控制器设计

更新时间:2024-05-10 18:02:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

武夷山职业学院

毕业论文(设计)

题 目: 基于单片机的热水控制器

系 别: 电子信息工程技术 专业(班级): 09级电信 姓 名: 王勇 学 号: 20092202110 指 导 教师 : 刘梅卿 完 成 时间 : 2012 年 6 月 5 日

目 录

摘要 ............................................................... 3 1 绪论 ............................................................. 3 2 系统的总体设计 ................................................... 3 3 系统的主要硬件介绍 ............................................... 4

3.1 单片机介绍 .................................................. 4

3.1.1单片机概述 ............................................. 4 3.1.2 单片机编程语言介绍 .................................... 5 3.1.3 系统选择 .............................................. 6 3.1.4 AT89C51引脚功能介绍 ................................... 8 3.2 温度传感器DS18B20 ......................................... 10

3.2.1 DS18B20简介 .......................................... 10 3.2.2 DS18B20的硬件连接 .................................... 11

4 热水控制器的系统设计 ............................................ 12

4.1硬件设计 ................................................... 12

4.1.1 温度检测部分 ......................................... 12 4.1.2 LED数码管显示电路 .................................... 13 4.1.3 报警及控制输出部分 ................................... 14 4.1.4 单片机及按键电路设计 ................................. 14 4.2 软件系统设计 ............................................... 16

4.2.1 系统程序流程图 ....................................... 16 4.2.2 单片机软件开发语言 ................................... 17 4.2.3 DS18B20驱动程序 ...................................... 18 4.2.4 系统的程序源代码 ..................................... 21

参考文献 .......................................................... 27 附:系统整体硬件电路图 ............................................ 28

摘要

本文以单片机AT89C51为核心,从DS18B20温度检测的数据采集、设定值调整、LED数码管显示电路、报警及输出控制电加热器等几个方面出发,详细研究和设计了基于单片机的热水控制器的各个部分内容,设计了单片机及其外围电路,并结合一套经典的程序算法。给出了一套合理的基于单片机的热水控制器软硬件解决方案。

关键字 温度检测 DS18B20 单片机 温度控制

1 绪论

单片机在电子产品中的应用已经越来越广泛,并且在很多电子产品中也将其用到温度检测和温度控制。基于单片机的热水控制器较传统的温度控制器具有更高的智能性,并且系统的功能更加易于扩展和升级,是一种低成本的温度检测、控制方案。

在一些温控系统电路中,广泛采用的是通过热电偶、热电阻或PN结测温电路经过相应的信号调理电路,转换成A/D转换器能接收的模拟量,再经过采样/保持电路进行A/D转换,最终送入单片机及其相应的外围电路,完成监控。但是由于传统的信号调理电路实现复杂、易受干扰、不易控制且精度不高。本文介绍单片机结合DS18B20热水控制器设计,本系统用一种新型的可编程温度传感器(DS18B20),不需复杂的信号调理电路和A/D转换电路能直接与单片机完成数据采集和处理,实现方便、精度高,可根据不同需要用于各种场合。 2 系统的总体设计

单片机的热水控制器需要完成温度的检测并可以通过按键设定调整最高温度和最低温度值、能够显示当前温度值、最高温度和最低温度值,同时要实现水温超过最高温度+3度时,停止电热棒加热并报警;当水位低于最低温度-3度时,启动电热棒加热等功能。需要系统包括单片机最小系统电路和按键电路、LED显示电路、温度检测部分、报警和控制输出等主要部分,系统地总体设计狂徒如下图所示:

DS18B20 温度检测部分 按键 电路 单片机 LED 数码管显示 报警和 输出控制部分

图2.1 系统整体设计框图

3 系统的主要硬件介绍

3.1 单片机介绍 3.1.1单片机概述

单片微机(Single-Chip Microcomputer)简称单片机,通常统称微控制器

(Micro-Controller 简写μC)或微型处理部件(Micro Controller Unit 简写MCU)。一般的说,单片机就是在一块硅片上集成CPU、RAM、ROM、定时器/计数器、和多种I/O的完整的数字处理系统。二十世纪,微电子、IC集成电路行业发展迅速,其中单片机行业的发展最引人注目。单片机功能强、价格便宜、使用灵活,在计算机应用领域中发挥着极其重要的作用。从INTEL公司于1971年生产第一颗单片机Intel-4004开始,开创了电子应用的“智能化”新时代。单片机以其高性价比和灵活性,牢固树立了其在嵌入式微控制系统中的“霸主”地位,在PC机以286、386、Pentium、PⅢ高速更新换代的同时,单片机却“始终如一”保持旺盛的生命力。例如,MCS-51系列单片机已有十多年的生命期,如今仍保持着上升的态势就充分证明了这一点。 1.单片机的结构与组成

目前,单片机的系统结构有两种类型:一种是将程序和数据存储器分开使用, 即哈佛(Harvard)结构,当前的单片机大都是这种结构。另一种是采用和PC机的冯.诺依曼(Von Neumann)类似的原理,对程序和数据存储器不作逻辑上的区分,用来存放用户程序,可分为EPROM、OTP、ROM和FLASH等类。

EPROM型内存编程后其内容可用紫外线擦除,用户可反复使用,故特别适用于开发过程,但EPROM型单片机价格很高。具有ROM型(掩膜型)内存的单片机价格最低,它适用于大批量生产。由于ROM型单片机的代码只能由生产厂商在制造芯片时写入,故用户要更改程序代码就十分不便,在产品未成熟时选用ROM型单片机风险较高。OTP型(一次可编程)单片机介于EPROM和ROM型单片机之间,它允许用户自己对其编程,但只能写入一次。OTP型单片机生产多少完全可由用户自己掌握,不存在ROM型有最小起订量和掩膜费问题,另外,该类单片机价格已同掩膜型十分接近,故特别受中小批量客户的欢迎。Flash型(闪速型)单片机允许用户使用编程工具或在线快速修改程序代码,且可反复使用,故一推出就受到广大用户的欢迎。Flash型单片机,即可用于开发过程,也可用于批量生产,随着制造工艺的改进,Flash型单片机价格不断下降,使用越来越普遍,它已是现代单片机的发展趋势。 随机内存(RAM):用来存放程序运行时的工作变量和数据,由于RAM的制作工

艺复杂,价格比ROM高得多,所以单片机的内部RAM非常宝贵,通常仅有几十到几百个字节。RAM的内容是易失性(也有的称易挥发性)的,掉电后会丢失。最近出现了EEPROM或FLASH型的数据存储器,方便用户存放不经常改变的数据及其它重要信息。单片机通常还有特殊寄存器和通用寄存器,它们是单片机中存取速度最快的内存,但通常存储空间很小。 2.中央处理器(CPU)

是单片机的核心单元,通常由算术逻辑运算部件ALU和控制部件构成。CPU就象人的大脑一样,决定了单片机的运算能力和处理速度。 并行输入/输出(I/O)口:通常为独立的双向口,任何口既可以用作输入方式,又可以作输出方式,通过软件编程来设定。现代的单片机的I/O口也有不同的功能,有的内部具有上拉或下拉电阻,有的是漏极开路输出,有的能提供足够的电流可以直接驱动外部设备。I/O是单片机的重要资源,也是衡量单片机功能的重要指针之一。串口输入/输出口:用于单片机和串行设备或其它单片机的通信。串行通信有同步和异步之分,这可以用硬件或通用串行收发器件来实现。不同的单片机可能提供不同标准的串行通信接口,如UART、SPI、I2C、Micro Wire等。 3.定时器/计数器(T/C)

单片机内部用于精确定时或对外部事件(输入信号如脉冲)进行计数,有的单片机内部有多个定时/计数器。 4.系统时钟

通常需要外接石英晶体或其它振荡源来提供时钟信号输入,也有的使用内部RC振荡器。

以上是单片机的基本构成,现代的单片机又加入了许多新的功能部件,如模拟/数字转换器(A/D)、数字/模拟转换器(D/A)、温度传感器、液晶(LCD)驱动电路、电压监控、看门狗(WDT)电路、低压检测(LVD)电路等等。 3.1.2 单片机编程语言介绍

对于51系列单片机,现有四种语言支持,即汇编、PL/M,C和BASIC。

BASIC通常附在PC机上,是初学编程的第一种语言。一个新变量名定义之后可在程序中作变量使用,非常易学,根据解释的行可以找到错误而不是当程序执行完才能显现出来。BASIC由于逐行解释自然很慢,每一行必须在执行时转换成机器代码,需要花费许多时间不能做到实时性。BASIC为简化使用变量,所有变量都用浮点值。BASIC是用于要求编程简单而对编程效率和运行速度要求不高的场合。

PL/M是Intel从8080微处理器开始为其系列产品开发的编程语言。它很像PASCAL,是一种结构化语言,但它使用关键词去定义结构。PL/M编译器好像汇编器一样可产生紧凑代码。PL/M总的来说是“高级汇编语言”,可详细控制着代码的生成。但对51系列,PL/M不支持复杂的算术运算、浮点变量而无丰富的库函数支持。学习PL/M无异于学习一种新语言。

C语言是一种源于编写UNIX操作系统的语言,它是一种结构化语言,可产生压缩代码。C语言结构是以括号{ }而不是子和特殊符号的语言。C可以进行许多机器级函数控制而不用汇编语言。与汇编相比,有如下优点:对单片机的指令系统不要求了解,仅要求对51的内存结构有初步了解寄存器分配、不同内存的寻址及数据类型等细节可由 编译器管理程序有规范的结构,可分为不同的函数。这种方式可使程序结构化将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性编程及程序调试时间显著缩短,从而提高效率提供的库包含许多标准子程序,具有较强的数据处理能将已编好程序可容易的植入新程序,因为它具有方便的模块化编程技术 C语言作为一种非常方便的语言而得到广泛的支持,C语言程序本 身并不依赖于机器硬件系统,基本上不做修改就可根据单片机不同较快地移植过来。

51的汇编语言非常像其它汇编语言。指令系统比第一代微处理器要强一些。51的不同存储区域使得其复杂一些。尽管懂得汇编语言不是你的目的,看懂一些可帮助你了解影响任何语言效率的51特殊规定。例如,懂得汇编语言指令就可以使用在片内RAM作变量的优势,因为片外变量需要几条指令才能设置累加器和数据指针进行存取。要求使用浮点和启用函数时只有具备汇编编程经验才能

避免生成庞大的、效率低的程序,这需要考虑简单的算术运算或先算好的查表法。

最好的单片机编程者应是由汇编转用C而不是原来用过标准C语言的人。

由此来看,单片机有着微处理器所不具备的功能,它可单独地完成现代工业控制所要求的智能化控制功能,这是单片机最大的特征。 3.1.3 系统选择

本系统以MCS-51单片机成员中的AT89C51为控制核心。AT89C51是美国ATMEL公司生产的低功耗,高性能CMOS 8位单片机,片内含4k bytes的可系统编程的Flash只读程序内存,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚。它集Flash程序内存既可在线编程(ISP)也可用传统方法进行编程及通用8位微处理器于单片芯片中,ATMEL公司的功能强大,低价位AT89C51单片机可为您提供许多高性价比的应用场合,它灵活应用于各种控制领域。

主要性能参数:

(1)与MCS-51产品指令系统完全兼容 (2)4K字节在系统编程(ISP)Flash闪速内存 (3)1000次擦写周期

(4)4.0-5.5V的工作电压范围 (5)全静态工作模式:0Hz—33MHz (6)三级程序加密锁 (7)256?8字体内部RAM (8)32个可编程I/O口线 (9)3个16位定时/计数器 (10)5个中断源

(11)全双工串行UART通道 (12)低功耗空闲和掉电模式 (13)中断可从空闲模唤醒系统 (14)看门狗(WDT)及双数据指针 (15)掉电标识和快速编程特性

(16)灵活的在系统编程(ISP—字节或页写模式) 其内部结构结构如图3.1所示:

图3.1 单片机内部结构图

3.1.4 AT89C51引脚功能介绍 1.电源引脚Vcc和GND

Vcc:电源电压,GND(10脚):接地端。 2.时钟电路引脚XTALl和XTAL2

XTAL2(18脚):接外部晶体和微调电容的一端。在内它是振荡电路反相放大器的输出端,振荡电路的频率就是晶体的固有频率。要检查单片机的振荡电路是否正确工作,可用示波器查看XTAL2端是否有脉冲信号输出。

XTAL 1(19脚):接外部晶体的微调电容的另一端。在片内它是振荡电路反相放大器的输入端。若需采用外部时钟电路时,该引脚输入外部时钟脉冲如图3.2,3.3所示。

3.控制信号引脚RST

RES(8脚)“RST是复位信号输入端,高电平有效。当此输入端保持两个机器周期(24个时钟振荡周期)的高电平时,可以完成复位操作。 4.I/O(输入/输出) P0、 P1、 P2和 P3

标准51单片机,如8051、8031、AT89C51、AT89S51、P89C51等有4个I/O(输入/输出)口,分别为:

P0口(39—32脚):P0口是一个漏极开路的8位双向埠。作为漏极八路的输出端口,每次能驱动8个Ls型TTL负载。当P0口作为输入口使用时,其先向锁存器(地址80H)写入全1,此时P0口的全部引脚悬空,叫作为高阻抗输入。

P1口(1—8脚):P1口是一个带上拉电阻的8位准双向I/O端口每一位能驱动(吸收成输出电流)4个LS型TTL负载。

在P1口作为输入口使用时,应先向P1口锁存器(地址90H)写入全1,上拉电阻接成高电平。

P2口(21—28脚):P2口是一个带内部上接电阻的8位准双向埠。P2口的每一位能驱动4个LS型TTL负载。

P3口(21—28脚):P3口是一个带内部上接电阻的8位准双向埠。P3口的每一位能驱动(吸收或输出电流)4个LS型TTL负载。P3口与其它的I/O埠有很大区别,它除作为—般准双向I/O口外,每个引脚还具有专门的功能,见表3-1。

图3.2 AT89S51单片机晶振接法 图3.3 外部时钟电路

表3-1 端口引脚功能

P1口也是一个准双向口,作通用I/O口使用。其电路结构见图3.4。

输出驱动部分内部有上拉负载电阻与电源相连。实质上拉电阻是两个场效应管(FET)并在一起,—个FET为负载管,其电阻固定;另一个FET可工作在导通或截止两种状态,使其总电阻值变化近为0或阻值很大两种情况。当阻值近似为0时,可将引脚快速上拉至全高电平,当阻值很大时,P1口为高阻输入状态。

当P1口输出高电平时,能向外提供拉电流负载,所以不必再接上拉电阻。在埠用作输入时,也必须先向对应的锁存器写入“1”,使FET截止。由于片内负载电阻较大,约20k—40k,所以不会对输入的数据产生影响。

3.2 温度传感器DS18B20

集成式数字温度传感器DS1820的出现开辟了温度传感器技术的新领域,它利用单总线的特点可以方便的实现多点温度的测量。而可组网数字温度传感器DS18B20则是DS1820的更新产品,它在电压、特性及封装方面都更具有优势,给了用户更多的选择,让用户可以更方便的构建适合自己的测温系统。DS18B20充分利用了单总线的独特特点,可以轻松的组建传感器网络,提供系统的抗干扰性,使系统设计更灵活、方便、而且适合于在恶劣的环境下进行现场温度测量。 3.2.1 DS18B20简介

DS18B20是美国DALLAS公司最新推出的一种可组网数字式温度传感器,与DS1820相同,DS18B20也能够直接读取被测物体的温度值,但是与DS1820相比,DS18B20的功能更强大些。它体积小,电压使用范围宽(3V-5V),用户还可以通过编程实现9-12位的温度读数,即具有可调的温度分辨率,因此它的实用性和可靠性比同类产品更高。另外,DS18B20有多种封装可选,如TO-92、SOIC及CSP封装。图3.5即为DS18B20的管脚排列图。

由图3.5可见,DS18B20只是一个数据输入/输出口,属于单总线专用芯片之一。

图3.5 DS18B20的管脚排列图

DS18B20工作时被测温度值直接以“单总线”的数字方式传输,大大提高了系统的抗干扰能力。其内部采用在板温度测量专用技术,测量范围为-55℃~+125℃,在-10℃~+85℃时,精度为?0.5℃。每个DS18B20在出厂时已具有唯一的64位序列号,因此一条总线上可以同时挂接多个DS18B20,而不会出现混乱现象。另外用户还可自设定非易失性温度报警上下限值TH和TL(掉电后依然保存)。DS18B20在完成温度变换后,所测温度值将自动与存储在TH和TL内的触发值相比较,如果测温结果高与TH或低于TL,DS18B20内部的告警标志就会被置位,表示温值超出了测量范围,同时还有报警搜索命令识别出温度超限DS18B20。

图3.6为DS18B20的内部存储结构图,它包括一个暂存RAM和一个非易失性可擦除

E2RAM。

其中暂存存储的完整性,它包括8度读数,数据格式

图3.6 DS18B20内部存储结构

器作用是在单线通信时确保数据个字节,头两个字节表示测得的温如下:

S=1时表示温度为负,S=0时表示温度为正,其余低于以二进制补码形式表示,最低位为1时表示0.0625℃。温度/数字对应关系如上表所示。

DS18B20内部暂存存储器的第5个字节是结构寄存器,它主要用于确定温度值的数字转换分辨率。字节结构如下:

其中R1、R0用于设置分辨率。 3.2.2 DS18B20的硬件连接

DS18B20与单片机的接口极其简单,只需将DS18B20的信号线与单片机的一位双向端

口相连即可。如图3.7(a)所示。此时应注意将VDD、DQ、GND三线焊接牢固。另外也可用两个端口,即接收口与发送口分开,这样读写操作就分开了,不会出现信号竞争的问题。如图3.7(b)所示。此图是采用寄生电源方式,将DS18B20的VDD和GND接在一起。如若VDD脱开未接好,传感器将只送+85.0℃的温度值。一般测温电缆线采用屏蔽4芯双绞线,其中一对接地线与信号线,另一对接VDD和地线,屏蔽层在源端单点接地。

图3.7 DS18B20与单片机的接口

4 热水控制器的系统设计

4.1硬件设计

基于单片机的热水控制器主要有以下几部分:温度检测数据采集部分,LED数码管显示电路、报警及控制输出部分、单片机及按键电路设计等几个部分,下面分别加以介绍 4.1.1 温度检测部分

温度传感器有很多种,如热敏电阻,热电偶,PN结,半导体温度传感器等。这里选用单总线数字输出的集成半导体温度传感器DS18B20,其特点:独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯;测温范围-55℃~+125℃,固有测温分辨率0.5℃;支持多点组网功能,多个DS1820可以并联在唯一的三线上,实现多点测温;工作电源:3~5V/DC。

温度检测数据采集电路如图4.1所示,由温度传感器DS18B20采集被控对象的实时温度,提供给AT89C51的I/O口作为数据输入。在本次设计中我们所控的对象为热水的温度。

图4.1 温度传感器电路

4.1.2 LED数码管显示电路

显示器分为数码管和液晶显示,我所采用是的数码管显示,其外形和引脚如下图所示:

图4.2 数码管外形和引脚图 LED数码有共阳和共阴两种,把这些LED发光二极管的正极接到一块(一般是拼成一个8字加一个小数点)而作为一个引脚,就叫共阳机极数码管;相反的,就叫共阴的(如下图所示)那么应用时这个脚就分别的接VCC和GND。再把多个这样的8字装在一起就成了多位的数码管了。

图4.3 共阴极和共阳极数码管内部电路

基于单片机的热水控制器采用7段数LED码管显示,这里采用6个数码管显示温度,两位显示设定的最高温度、两位显示设定的最低温度、两位显示热水的当前温度。

6位共阳极数码管采用扫描形式工作,其8个数据为接在单片机灌电流驱动能力最大的PO口,AT89C51单片机的P0口的每一个I/O都能能吸收8个TTL逻辑器件的输入漏电流,算下来能驱动约10mA。能驱动数码管的8个数据阴极。

6位共阳极数码的6个阳极采用6个PNP三极管9012驱动。用单片机P2.0-P2.5 6个I/O口控制。

LED数码管显示电路如图4.4所示。

图4.4 数码管显示电路

4.1.3 报警及控制输出部分

当水温超过最高温度+3度时,热水控制器需停止加热并报警;当水位低于最低温度-3度时,需开始加热,这就需要报警电路及输出模块。

声音报警电路通过驱动蜂鸣器发声实现,当其接通5V的电压会发出蜂鸣叫声。原理图如图4.5,NPN型三极管8050驱动蜂鸣器,当单片机I/O口输出高电平时蜂鸣器发声

此外,控制加热棒的控制信号同样由单片机输出,经过三极管Q3驱动继电器J1, J1 具有两对常开和常闭接点,利用其常开接点串到加热棒的控制回路中,可以实现加热棒的控制。电路中二极管D1为续流二极管, 继电器线圈在通过电流时,会在其两端产生感应电动势。当电流消失时,其感应电动势会对电路中的三极管Q3产生反向电压。当反向电压高于Q3 的反向击穿电压时,会把三极管成损坏。续流二极管并联在线圈两端,当流过线圈中的电流消失时,线圈产生的感应电动势通过二极管和线圈构成的回路做功而消耗掉。从而保护了电路中的三极管的安全。

图4.5 声音报警电路

4.1.4 单片机及按键电路设计

图4.6为单片机及键盘电路的电路图,单片机AT89S52的时钟引脚外接12M晶振,作为单片机工作的时钟,EA端接高电平,表示使用片内程序存储器。RST引脚接了上电复位

电路,当系统上电时,上电复位电路会产生一个高电平脉冲信号,使系统复位。

图4.6 单片机及键盘电路电路图

键盘是标准的输入设备,实现键盘有两种方案:一是采用现有的一些芯片实现键盘扫描,如8279, CH451, LMC9768等,还有就是用软件实现键盘扫描。使用现成的芯片可以节省CPU的开销,但增加了成本,而用软件实现具有较强的灵活性,也只需要很少的CPU开销,可以节省开发成本。本文便使用软件实现键盘的扫描。

常见的键盘可分为独立按键式键盘和行列扫描式键盘。独立按键式键盘应用在需要少量按键的情况,按键和单片机的I/O口线直接连接。而行列扫描式键盘用在按键需求较多的情形下。考虑到热水控制器只需要高限加、高限减、低限加、低限减四个按键 ,所以采用独立按键式键盘。

理论上当按键按下或弹起时,可以相应的产生低电平或高电平,但实际并非如此。键盘按键一般都采用触点式按键开关。当按键被按下或释放时,按键触点的弹性会产生抖动现象。即当按键按下时,触点不会迅速可靠地接通,当按键释放时,触点也不会立即断开,而是要经过一段时间的抖动才能稳定下来,按键材料不同,抖动时间也各不相同。

图4-7 按键抖动示意图

一次完整的按键过程,包含以下几个阶段:如图4-7所示。 1) 等待阶段:此时按键尚未按下,处于空闲阶段;

2) 闭合抖动阶段:此时键刚刚按下,但信号处于抖动状态,系统在检测时应消抖延时,约5ms到20ms;

3) 有效闭合阶段:此时抖动己经结束,一个有效按键动作己经产生,系统应该在此时执行按键功能,或将按键编码记录下来,待键弹起时再执行其功能;

4) 释放抖动阶段:许多时候编程人员并不在此时消抖延时,但最好也执行一次消抖延时,以防止误操作;

5) 有效释放阶段:若设计要求在按键抬起时才执行功能,则应当在此时进行按键功能的处理。

软件上对闭合阶段的抖动一般采取延时再次确认按键是否按下的方式消除抖动。 如上图所示,完成系统的最高温度和最低温度的高低调整的四个按键分别加上拉电阻接到单片机的P1.1-P1.4口上,供单片机查询,当没有按键按下时,单片机I/O口输入高电平,当有按键按下时,对应的单片机端口变为低电平,单片机通过检测这种电平的变化确定按键的状态。

4.2 软件系统设计

4.2.1 系统程序流程图

系统程序流程图如图4.8所示。

开 始 初始化

高于高限3度或 低于低限3度

显示高低限和当前值 Y 控制加热,报警 N 读取温度值 启动DS18B20 Y 高低限增减 是否高低限调整 N 图4.8 系统程序流程图

4.2.2 单片机软件开发语言

对于8051单片机,现有四种语言支持,即汇编、FI/M、C和BASIC。C是一种源于编写UNIX操作系统的语言,它是一种结构化语言,可产生紧凑代码。C可以进行许多机器级函数控制而不用汇编语言。与汇编相比,有如下优点:

(1)对单片机的指令系统不要求了解,仅要求对8051的存贮器结构有初步了解; (2)寄存器分配、不同存贮器的寻址及数据类型等细节可由编译器管理; (3)程序有规范的结构,可分为不同的函数,这种方式可使程序结构化; (4)具有将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性; (5)关键字及运算函数可用近似人的思维过程方式使用; (6)编程及程序调试时间显著缩短,从而提高效率;

(7)提供的库包含许多标准子程序,具有较强的数据处理能力;

(8)已编好程序可容易地植入新程序,因为它具有方便的模块化编程技术。

4.2.3 DS18B20驱动程序

根据DS18B20的通讯协议,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后释放,当DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。

DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。

表4.1 DS18B20温度值格式表

这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。

DSl820工作过程包括;初始化、ROM操作命令、存储器操作、命令处理数据。 1、初始化

单总线上的所有处理均从初始化开始 2、ROM操作指令:

总线主机检测到DSl820的存在,便可以发出ROM操作命令之一,这些命令如: 指令 代码 Read ROM(读ROM) [33H] Match ROM(匹配ROM) [55H] Skip ROM(跳过ROM) [CCH] Search ROM(搜索ROM) [F0H] Alarm search(告警搜索) [ECH] 3、存储器操作命令:

指令 代码 Write Scratchpad(写暂存存储器) [4EH] Read Scratchpad(读暂存存储器) [BEH] Copy Scratchpad(复制暂存存储器) [48H] Convert Temperature(温度变换) [44H] Recall EPROM(重新调出) [B8H] Read Power supply(读电源) [B4H]

4、时 序

主机使用时间隙(time slots)来读写DSl820的数据位和写命令字的位 (1)初始化

时序见图4.9主机总线to时刻发送一复位脉冲(最短为480us的低电平信号)接着在tl时刻释放总线并进入接收状态DSl820在检测到总线的上升沿之后等待15-60us,接着DS1820在t2时刻发出存在脉冲(低电平)如图中虚线所示:

图4.9 初始化时序

(2)写时间隙

当主机总线t0时刻从高拉至低电平时就产生写时间隙,从to时刻开始15us之内应将所需写的位送到总线上,DSl820在t0后15-60us间对总线采样若低电平写入的位是0,若高电平写入的位是1,见图4.10,连续写2位间的间隙应大于1us。

图4.10 写时序

(3)读时间隙

见图4.11,主机总线t0时刻从高拉至低电平时总线只须保持低电平l5us之后在t1时刻将总线拉高产生读时间隙读时间隙。在t1时刻后t2时刻前有效,t2距to为15us,也就是说t2时刻前主机必须完成读位, 并在t0后的60us一120us内释放总线.

图4.11 读时序

根据数字温度传感器的工作时序及原理进行软件的设计,DS18B20的C51程序代码如下:

sbit DQ =P1^0; //DS18B20端口

typedef unsigned char byte; typedef unsigned int word;

void delay(word useconds) //延时子函数 {

for(;useconds>0;useconds--); }

byte ow_reset(void) //复位DS18B20 {

byte presence;

DQ = 0; //送出低电平 delay(29); // 延时 480us DQ = 1; // 送出高电平

delay(3); // 等到DS18B20存在脉冲

presence = DQ; // 读存在脉冲(低电平有效) delay(25); //延时 return(presence); }

byte read_byte(void) //从 1-wire 总线上读取一个字节 {

byte i;

byte value = 0; for (i=8;i>0;i--) {

value>>=1;

DQ = 0; // 输出一脉冲 DQ = 1; delay(1); if(DQ)

value|=0x80; delay(6); }

return(value);

}

void write_byte(char val) //向 1-WIRE 总线上写一个字节 {

byte i;

for (i=8; i>0; i--) // 写一个字节,每次写一位 {

DQ = 0; DQ = val&0x01; delay(5); DQ = 1;

val=val/2; //用除法实现移位 } delay(5); }

char Read_Temperature(void) //读取温度 {

byte temp[2]; float x;

ow_reset(); //复位DS18B20 write_byte(0xCC); //跳过 ROM

write_byte(0xBE); //写入读存储器指令 temp[1]=read_byte(); //读入数据 temp[0]=read_byte();

x= temp[1]*0x112 + temp[0];

x= x*0.0625; //将数值转换为摄氏温度

return x; }

4.2.4 系统的程序源代码

系统的C51 源程序如下:

#include #include

sbit DQ =P1^0; //DS18B20端口

sbit HUP=P1^1; //最高温度增键 sbit HDOWN=P1^2; //最高温度减键 sbit LUP=P1^3; //最低温度增建 sbit LDOWN=P1^4; //最低温度减键

sbit BAOJING=P1^5; //报警输出 sbit OUT=P1^6; //控制加热棒

sbit LED1=P2^5; //第一位数码管位控制端

sbit LED2=P2^4; //第二位数码管位控制端 sbit LED3=P2^3; //第三位数码管位控制端 sbit LED4=P2^2; //第四位数码管位控制端 sbit LED5=P2^1; //第五位数码管位控制端 sbit LED6=P2^0; //第六位数码管位控制端

unsigned char code tab_LED[10]={0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0xF8,0x80,0x90};

//显示的段码,分别代表0-9

typedef unsigned char byte; typedef unsigned int word;

//****************************18b20驱动程序*********************************

void delay(word useconds) //延时子函数 {

for(;useconds>0;useconds--); }

byte ow_reset(void) //复位DS18B20 {

byte presence;

DQ = 0; //送出低电平 delay(29); // 延时 480us DQ = 1; // 送出高电平

delay(3); // 等到DS18B20存在脉冲 presence = DQ; // 读存在脉冲(低电平有效) delay(25); //延时 return(presence); }

byte read_byte(void) //从 1-wire 总线上读取一个字节 {

byte i;

byte value = 0; for (i=8;i>0;i--) {

value>>=1;

DQ = 0; // 输出一脉冲 DQ = 1; delay(1); if(DQ)

value|=0x80; delay(6); }

return(value); }

void write_byte(char val) //向 1-WIRE 总线上写一个字节 {

byte i;

for (i=8; i>0; i--) // 写一个字节,每次写一位 {

DQ = 0; DQ = val&0x01; delay(5); DQ = 1;

val=val/2; //用除法实现移位 }

delay(5); }

//************** Read_Temperature完成一次采样过程,返回温度值*****************

char Read_Temperature(void) //读取温度 {

byte temp[2]; float x;

ow_reset(); //复位DS18B20 write_byte(0xCC); //跳过 ROM

write_byte(0xBE); //写入读存储器指令 temp[1]=read_byte(); //读入数据 temp[0]=read_byte();

x= temp[1]*0x112 + temp[0];

x= x*0.0625; //将数值转换为摄氏温度

return x; }

//****************************主函数****************************************** main() {

byte n=20,h=50,l=30; //定义温度值、高低限,并置初值 byte i;

BAOJING=0; //初始化 OUT=0; LED1=1; LED2=1; LED3=1; LED4=1; LED5=1; LED6=1;

while(1) {

if(HUP==0) //如果温度高限增加键按下 {

delay(10000); //按键消抖 if(HUP==0) h++; }

else if(HDOWN==0) //如果温度高限减小键按下 {

delay(10000); //按键消抖 if(HDOWN==0) h--; }

else if(LUP==0) //如果温度低限增加键按下 {

delay(10000); //按键消抖 if(LUP==0) l++; }

else if(LDOWN==0) //如果温度低限减小键按下 {

delay(10000); // if(LDOWN==0) l--; }

else //

{ n=Read_Temperature(); // if (n>h+3)

{BAOJING=1; // OUT=0;} else if(n

OUT=1; // }

i=h/10; // P0=tab_LED[i]; // LED1=0; // delay(1000); // LED1=1;

i=h; // P0=tab_LED[i]; // LED2=0; // delay(1000); // LED2=1;

i=l/10; // P0=tab_LED[i]; // LED3=0; // delay(1000); // LED3=1;

i=l; // P0=tab_LED[i]; // LED4=0; // delay(1000); // LED4=1;

i=n/10; //按键消抖 如果没有按键按下 读取温度值 报警并停止加热 启动加热 取第一位显示数据

查显示段码表,将第一位段码送P0口选中第一位 调用延时 取第二位显示数据

查显示段码表,将第二位段码送P0口选中第二位 调用延时 取第三位显示数据

查显示段码表,将第三位段码送P0口选中第三位 调用延时 取第四位显示数据

查显示段码表,将第四位段码送P0口 选中第四位 调用延时 取第五位显示数据

P0=tab_LED[i]; //查显示段码表,将第五位段码送P0口 LED5=0; //选中第五位 delay(1000); //调用延时 LED5=1;

i=n; //取第六位显示数据

P0=tab_LED[i]; //查显示段码表,将第六位段码送P0口 LED6=0; //选中第六位 delay(1000); //调用延时 LED6=1; } }

//************************主程序结束********************************

致谢

通过本次毕业设计,我在指导老师刘梅卿的精心指导和严格要求下,获得了丰富的理论知识,极大地提高了实践能力,并对当前电子领域的研究状况和发展方向有了一定的了解,单片机领域这对我今后进一步学习计算机方面的知识有极大的帮助。另外,此次毕业设计还获得了武夷山职业学院各位领导和老师的大力支持。在此,我忠心感谢刘梅卿老师以及师兄们的指导和帮助。在未来的工作和学习中,我将以更好的成绩来回报各位领导和老师。

参考文献

[1] 沙占友,智能化集成温度传感器原理及应用.机械工业出版社,2002.7

[2] ATMLE Corporation,8-Bit Microcontroller AT89C51 DATE SHEET. 0265F-A–12/97 [3] 路勇,高文焕主编.电子电路实验及仿真.清华大学出版社,1999 [4] 康华光编.电子技术基础.高等教育出版社,2000

[5] 冯建华,单片机应用系统设计与产品开发,人民邮电出版社,2004 [6] 杨文龙编,单片机原理及应用.西安电子科技大学出版社,2000

[7] 马忠梅等,单片机的C语言应用程序设计.北京航空航天大学出版社,1997

[8] 黄俊钦编,新型传感器原理.航空工业出版社,1991

[9] Dallas Semiconducotr,Programmable Resolution 1-Wire Digital Thermometer DS18B20 DATE

SHEET. [10] 阉石,数字电子技术基础.北京:高等教育出版社,2004

[11] 何立民,单片机高级教程-应用与设计.北京:北京航空航天大学出版社,2000

附录(系统整体硬件电路图)

本文来源:https://www.bwwdw.com/article/kdpg.html

Top