计算机控制技术
论文
政研论文下载论文大学下载论文大学下载关于长拳的论文浙大论文封面下载
-基于18B20的双路温度采集器设计
《计算机控制技术》课程设计任务书
基于18B20的双路温度采集器设计
1、设计内容
采用单片机(如AT89C52)作为控制芯片,用LCD显示测量温度值,例用数字式温度传感器18B20采集温度;设计系统的电路图,并分析电路工作过程。写出程序的流程图,说明系统的工作原理。设定测温环境的温度在0-50度之内,否则报警。
2、设计要求:
1)设计系统的硬件原理电路图,并说明各部分的设计及工作原理。 2)设计系统的软件,包括系统的流程框图、及系统源程序及注解源程序。
1
引 言
工业控制计算机的一个重要应用领域,计算机控制正是为了适应这一领域的需要而发展起来的一门专业技术,它主要研究如何将计算机技术、通信技术、和自动控制理论应用于工业生产过程,并设计所需要的计算机控制系统。
计算机控制系统的发展大致上可以分为以下几个阶段:(1)开创时期(1955,1962年),(2)直接数字控制时期(1962,1967年),(3)小型计算机时期(1967,1972年),(4)微型计算机时期(1972年至今)。尤其在近代代社会,随着计算机技术的发展和各种相关理论的成熟,计算机控制技术更是取得了巨大的发展,现在工程和科学技术中,担负着重要的角色。
从本质上看,计算机控制系统的工作原理可以归纳为:实时数据采集、实时控制决策、实时控制输出。系统硬件一般包含测量变送、执行机构、模拟量输入输出通道、数字量输入输出通道、人机接口、内外部总线等结构。目前常用的计算机控制系统主机有:可编程序控制器(PLC)、工控机(IPC)、单片机(MCU)、DSP、智能调节器等。
在这些控制系统主机中,单片机以其低廉的价格和较高的性能得到了广泛应用。通过对单片机及其外围常用元器件的学习和掌握,对进一步了解计算机控制是很有帮助的。应此,在结束计算机控制技术这门课程的学习后,锻炼自己的动手能力,设计一个数字式温度计也是很有意义的。
本文主要讲述怎样设计一个由单片机和温度传感器构成的一个小型实时系统,给出了具体的设计过程和详细的步骤,并且此系统已经在实际中做成了实例。
2
目 录
引 言 ...................................................................................................................................... 2 第一章 设计
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
论证............................................................................................................ 4
1.1 系统主机选择........................................................................................................... 4
1.2 温度传感器选择 ....................................................................................................... 5
1.3 液晶选择 .................................................................................................................. 6
1.4 报警电路选择........................................................................................................... 6 第二章 硬件电路设计............................................................................................................ 7
2.1 单片机最小系统设计 ............................................................................................... 7
2.2 测温电路设计 ........................................................................................................ 10
2.3 显示电路设计 ........................................................................................................ 11
2.4 报警电路设计 ........................................................................................................ 12 第三章 软件设计 ................................................................................................................. 13
3.1 测温程序 ................................................................................................................ 13
3.2 显示程序 ................................................................................................................ 17
3.3 报警程序 ................................................................................................................ 20
3.4 主程序 .................................................................................................................... 20 第四章 小结 ......................................................................................................................... 22 参考文献 ............................................................................................................................... 23 附录1 原理图 ...................................................................................................................... 24 附录2 元器件清单 .............................................................................................................. 25 附录3 源程序 ...................................................................................................................... 26
3
第一章 设计方案论证
日常生活中很多地方都需要应用测温系统,比如冰箱中需要知道内部的温度来决定压缩机是否工作,热水器需要知道当前的水温是否符合设定的温度值,空调需要知道室内温度以决定是否制冷等等。一般来说一个测温系统由以下三部分组成:控制部分、测量部分、显示部分。当然,显示部分并不是必需的,但有显示部分的系统更能让使用者了解系统的运行。
1.1 系统主机选择
计算机控制系统各主机有各自的特点:
?PLC专为在工业环境下应用而设,可靠性高,编程容易,功能完善,扩展灵活,安装调试方便。
?工控机是一种面向工业控制、采用
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
总线技术和开放式体系结构的计算,配有丰富的外围接口,具有可靠性高,可维修性好,环境适应力强,控制实时性强,输入输出通道完善等优点。
?单片机体积小、功能全、价格低、软件丰富、面向控制、开发应用方便。
?DSP采用改进型的哈佛结构,具有专门的硬件乘法器,广泛采用流水线操作,提供特殊指令,可以用来快速地实现各种数字信号处理。
?智能调节器是一种数字化的智能仪表,以为处理器或单片微型计算机为核心,具有数据通信功能,能完成生产过程1,4个回路直接数字控制任务,在DCS的分散过程控制级中得到广泛应用。
考虑成本、开发周期、应用等方面,在本次设计中采用单片机来作为控制系统主机。目前市场上主流的单片机有Intel公司的MCS系列、Motorola公司的M68HC系列、Microchip公司的PIC系列、以及Philips、Atmel、NEC、STC等公司的产品。
本次设计选择的是Atmel公司的AT89C52,是美国 ATMEL 公司生产的低电压,高性能 CMOS 8 位单片机,片内含 8k bytes 的可反复擦写的 Flash 只读程序存储器和 256
4
bytes 的随机存取数据存储器(RAM),器件采用 ATMEL 公司的高密度、非易失性存储技术生产,与标准 MCS-51 指令系统及 8052 产品引脚兼容,片内置通用 8 位中央处理器(CPU)和 Flash 存储单元,功能强大 AT89C52 单片机适合于许多较为复杂控制应用场合。
有关AT89C52的功能特性,可以参看第二章,硬件电路设计部分。 1.2 温度传感器选择
温度传感器是检测温度的器件,其种类最多,应用最广,发展最快。目前最市场山主要有热敏电阻、双金属片、集成化半导体温度传感器和热电偶四大类。
?热敏电阻(其中分正温度和负温度特性两类),其根据电阻材料随温度的变化而影响材料的电阻率随之相应变化的原理实现温度传感的,其特点是工作温度范围广,成本低、但线性差,误差较大,适用于温控精度要求不高的场合。
?双金属片通常是将两片不同的金属叠在一起,根据不同金属的热膨胀率的差异,导致双金属机构产生于温度变化相对应的形变的原理做成的,其特点的温度范围大,但精度极低。
?集成化半导体温度传感器是由硅二极管和运算放大器组成的,是三端器件,其根据硅二极管正向压降随温度的升高而线性降低的原理,由于线性降低的线性精度虽然良好,但变化值微小,所以要通过运算放大器线性放大,另外,通过改变运算放大器的负反馈电阻的值,实现输出不同电压变化范围的各规格产品,以适应不同设备的要求。其特点是精度高,热惯性小,响应快,输出负载能力大(抗电磁干扰能力强),成本较高,温度适用范围小。
?热电偶是根据两个不同导体或半导体在不同的温度下之间产生电动势的所谓的温差发电效应产生的传感器,其并非真正意义上的温度传感器,但它对温差敏感。
它们的工作原理可以查看相关资料,这里不做详细阐述。
本次设计中采用的是集成化半导体温度传感器DS18B20。DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9,12位的数字值读数方式。可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从
5
DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。因而使用DS18B20可使系统结构更趋简单,可靠性更高。他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。
1.3 液晶选择
液晶显示器(LCD)的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面。LCD以其微功耗、体积小、重量轻、超薄型等诸多优点在袖珍式仪表和低功耗系统中得到越来越广泛的应用。
应用当中通常是将显示屏和控制器集成在一块电路板上,称为液晶显示模块(LCM)。目前市场山主要有段式、字符式、点阵式三种类型的液晶显示模块,其中字符型液晶显示模块已经成为单片机应用设计中最常用的信息显示器件。
本设计中,显示的内容比较简单(字母或者数字),因此选择字符型的显示模块性价比高。这里采用LCD1602,它可以显示两行,每行16个字符,采用单,5V电源供电,外围电路配置简单。
1.4 报警电路选择
目前市场上 存在各种各样的报警电路,比如声光触发、触摸断线出发、红外触发等等。一般来说,一个系统都需要设计一个报警电路,以提醒使用者当前系统所出现的错误或者需要引起操作者的注意。考虑本次设计的数字式温度表,只需要在测量的温度超出范围时,提醒使用者即可。因此,相应的报警电路不需要复杂的功能,只需采用一个发光二极管和一个蜂鸣器即可。
6
第二章 硬件电路设计
本次设计的双路测温系统主要由以下部分组成:控制电路(AT89C52)、测量电路(两个DS18B20)、显示电路(LCD1602)、报警电路。图1所示为系统的组成框图。
测量电路
控
制 显示电路 电
路
报警电路
图2 AT89C52(PDIP封装) 图1 系统框图
2.1 单片机最小系统设计
单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统.对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路、按键输入、显示输出等。
应用89C52单片机设计并制作一个单片机最小系统,达到如下基本要求:
?具有上电复位和手动复位功能。
?使用单片机片内程序存储器。
?具有基本的人机交互接口:按键输入、LED显示功能。
?具有一定的可扩展性,单片机I/O口可方便地与其他电路板连接。
由于本次设计中并没有按键输入功能,严格来说,并不能称为最小系统,使用它来称呼只是为方便叙述。
一 AT89C52功能特性
1.特性概述
AT89C52与 MCS—51 产品指令和引脚完全兼容,自带8k 字节 Flash 闪速存储器和256 字节内部 RAM有,40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2
7
个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,0Hz—24MHz全静态操作,并支持两种软件可选的节电工作模式。
AT89C52极限参数:
工作温度 -55? 至 +125?
最高工作电压 6.6v
直流输出电流 15mA
任一引脚对地电压 -1.0v至 +7.0v
AT89C52有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。图2为PDIP封装的AT89C52。限于篇幅,有关AT89C52的详细内容,这里不做阐述,读者可以参看其数据手册或者相关书籍。
2.相关引脚及功能:
?P0 口:P0 口是一组 8 位漏极开路型双向 I/O 口(引脚32,39),也即地址/数据总线复用口。一般在使用时,需外加上拉电阻。
?P1 、P2、P3口:P1 (引脚1,8)、P2(引脚21,28)、P3(引脚10,17)是带内部上拉电阻的 8 位双向 I/O 口。
在访问外部程序存储器或 16 位地址的外部数据存储器时,P2 口送出高 8 位地址数据。在访问 8 位地址的外部数据存储器时,P2 口输出 P2 锁存器的内容。P3 口除了作为一般的 I/O 口线外,每个引脚都具有第二功能。
?RST:复位输入(引脚9)。当振荡器工作时,RST 引脚出现两个机器周期以上高电平将使单片机复位。
?ALE/PROG: (引脚30)当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低 8 位字节。
?PSEN:程序储存允许(PSEN)输出(引脚29)是外部程序存储器的读选通信号。
?EA/VPP:外部访问允许。欲使 CPU 仅访问外部程序存储器(地址为 0000H—FFFFH),EA 端必须保持低电平(接地)。如 EA 端为高电平(接 Vcc 端),CPU 则执行内部程序存储器中的指令。
?XTAL1:振荡器反相放大器的及内部时钟发生器的输入端。
?XTAL2:振荡器反相放大器的输出端。
8
3.存储器资源
AT89C52采用哈佛结构,程序存储器和数据存储器分开,具有各自独立的寻址方式、寻址空间和控制信号,并且均可扩展外部存储器,最大寻址空间寻址为64K。
?程序存储器:如果EA引脚接地,程序读取只从外部存储器开始。如果EA 接VCC,程序读写先从内部存储器(地址为0000H,1FFFH)开始,接着从外部寻址,寻址地址为:2000H~FFFFH。
数据存储器:AT89C52 有256 字节片内数据存储器,高128 字节与特殊功能寄?
存器重叠。也就是说高128字节与特殊功能寄存器有相同的地址,而物理上是分开的,通过寻址方式决定是访问RAM还是特殊功能寄存器空间。
二 时钟电路
时钟电路是单片机正常工作的基础,AT89C52
中有一个用于构成内部振荡器的高增益反相放大
器,引脚XTAL1 和XTAL2 分别是该放大器的输入端
和输出端。这个放大器与作为反馈元件的片外石英
晶体或陶瓷谐振器一起构成自激振荡器,振荡电路
参见图3。
外接石英晶体(或陶瓷谐振器)及电容C1、
C2 接在放大器的反馈回路中构成并联振荡电石英晶体时:C1,C2=30pF?10pF 路。对外接电容C1、C2 虽然没有十分严格的要图3内部振荡器 求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程序及温度稳定性,如果使用石英晶体,推荐电容使用30pF?10pF。晶体振荡频率f一般选择f?12MHz。
三 复位电路
89C52在上电时,在复位引脚RST上出现两个机器周期以上的高电平,单片机内则初始复位;当RST由高电平变低电平时,89C52从0000H地址开始执行程序。有时因为外界的干扰而使得程序进入死循环或者偏离正常的程序执行,须由人工复位。结合以上两种情况,常用的复位电路如图4所示。
9
其中:开关RST用于人工复位,接通时
可以保证RST引脚获得足够长时间的高电
平;极性电容C,在89C52上电时,对C充
电,C与电阻R相连的一段端保持高电平,
从而保证RST引脚获得大于两个机器周期的
高电平;无极性电容Ch主要起滤波作用,滤
去高频谐波;二极管VD的作用是,当电源电
压瞬间下降时,使电容迅速放电。
C=22uF,Ch=0.01uF,R=10k(经验值)
图4复位电路 2.2 测温电路设计
DS18B20 采用单总线技术,既可通过串行口线,也可通过其它I/O 口线与微机接口,传感器内部内置A/D,直接输出9~12 位(含符号位)的被测温度值,测温范围为-55?~ +125?,测量分辨率最高可达0.0625?,12为精度转换时间750ms(典型);每片DS18B20 内含64bit 经过激光修正的只读存储器ROM,开始8位是产品类型编码,接着的48位是每个器件唯一的序号,最后8位是前面56位的CRC(循环冗余校验)码,因此任意多个DSl820可以存放在同一条单线总线上;从DSl8B20送出或从主机送入DS18B20仅需一条线(和地线);每只DS18B20都可以设置成两种供电方式即数据总线供电方式和外部供电方式,采取数据总线供电方式可以节省一根导线但完成温度测量的时间较长,采取外部供电方式则多用一根导线但测量速度较快。 DALLAS
18B20 DS18B20的引脚图如图5所示。
1 2 3
引脚说明:
GND 地线
DQ 数据I/O
Vdd 可选电源线
图5DS18B20 根据18B20的单总线特性,结合设计的目的
10
(两路温度测量),因此这里采用的方案是:利用单片机的一个I/O口作为单总线使用,两路18B20挂接在单总线上,由于单总线的开漏特性,需要外接一个4.7k的上拉电阻,18B20采用外电源供电工作方式,以提高测量速度。设计的电路如图6所示。
16. . . . . . . . . . . . . . . .1
图6两路DS18B20 图7LCD1602
2.3 显示电路设计
1602字符型LCD模块的应用非常广泛,而各种液晶厂家均有提供几乎都是同样规格的1602模块或兼容模块,尽管各厂家的对其各自的产品命名不尽相同;1602字符型LCD模块最初采用的LCD控制器采用的是HD44780,在各厂家生产的1602模块当中,基本上也都采用了与之兼容的控制IC,所以从特性上基本上是一样的;当然,很多厂商提供了不同的字符颜色、背光色之类的显示模块。
通常所见到的1602基本规格:
显示容量:16x2个字符
芯片工作电压:4.5,5.5v
工作电流:2.0mA(5.0v)
模块最佳工作电压:5.0v
引脚说明:
1 GND 电源地
2 Vcc 电源+5V
3 Vo 对比度调节
4 RS寄存器选择(H = 数据选择,L = 指令选择)
5 RW 读写信号
6 E 使能信号
7~14 DB0 ~ DB7 数据线
15 A LED+
16 K LED- (不带背光功能的1602只有1,14引脚,没有15、16引脚)
图7为LCD1602示意图,设计的显示电路如图8所示。为便于调节对比度,在1、2引脚间加一可调电阻。7,14数据引脚接89C52的P0口,RS、RW、E三个控制端接三个
11
I/O口。两个背光引脚这里不使用。
图8显示电路 图9报警电路
2.4 报警电路设计
本次设计的报警电路比较简单,由一个放光二极管和一个蜂鸣器组成。由于89C52I/O口驱动电流较小,因此发光二极管外接电源,串联一个电阻后接至I/O口;蜂鸣器由一个三极管驱动,三极管由89C52的I/O口控制(图9)。
主要电路的设计都已完成,考虑今后的可扩展性,上面所述未分配的引脚按如下方式分配:
DS18B20:P2.0作为两路18B20的单总线使用;
LCD1602:RS – P1.2,RW – P1.1 ,E –P1.0;
报警电路:P1.3控制发光二极管,P3.1控制蜂鸣器。
12
第三章 软件设计
根据第二章中系统的组成,相应程序的设计思路:
系统初始化
测量温度
图11 单总线处理次序
是否超是 报警 过范围
否
显示温度
是 否
图10 系统程序框图 图12 测温程序框图 3.1 测温程序
由于DS18B20采用单总线方式来与主机实现通信,而单总线在任何时刻只能有一个控制信号或数据,数据要能在单片机和单总线芯片之间实现可靠的传送,遵循单总线处理次序通信协议,确保数据有条不紊地传送,图11为处理次序示意图。 一 DSl8B20 工作过程及时序
DSl8B20 工作过程中的协议:初始化?RoM 操作命令?存储器操作命令?处理数据
ROM 操作命令: Match ROM(匹配ROM) [55H]、Skip ROM(跳过ROM] [CCH]、Search ROM(搜索ROM) [F0H]
存储器操作命令: Read Scratchpad(读暂存存储器) [BEH]、Convert Temperature(温度变换) [44H]
除上述命令外还有其他操作指令,详细的可以参考相关技术文档。
13
由于是双路测温,总线上挂有两个DS18B20,因此必须分辨是对哪个器件的操作, 因此需要使用match rom命令,确定哪个器件在与主机通信,以保证通信的正确。由此可得出测温程序的流程框图(图12)。
DS18B20正常工作对时序要求比较严格,图13(a、b、c)所示分别为初始化、读时间隙、写时间隙的时序图。
二 源程序
1.延时
函数
excel方差函数excelsd函数已知函数 2 f x m x mx m 2 1 4 2拉格朗日函数pdf函数公式下载
a 初始化时序
由于DS18B20的时序精准读多为us级的延时,
因此有必要独立编写延时函数。
void delay5(uchar us)
{
while(--us)
{ _nop_(); _nop_(); _nop_();} b 读时间隙 }
对于12M晶振,忽略函数调用和返回时间
(2+2=4us)us=1时,函数可以延时约为5us(对于
11.0592M晶振,时间会大于5us),如果调用时us
较大,误差是可以接受的。
2.初始化函数 c写时间隙 void ds18b20rst()
{
ds_dq=1; //拉高电平,准备复位
delay5(1); //稍作延时
ds_dq=0; //ds_dq拉低,复位信号作用,DS18B20复位
delay5(96); //精确延时 大于480us(非常重要)
ds_dq=1; //释放总线,如果总线上存在18B20,会拉低电平60,240us
delay5(90);
}
3.读/写数据
单总线传输,每次只能传送一位数据,参照图13b、c编写的读/写一位数据如下: bit readbit() ds_dq=1;//拉高电平,准备读取 { _nop_();
bit v; _nop_();
14
} ds_dq=0;//拉低电平,开始读时间隙
_nop_();
_nop_(); void writebit(bit v)
_nop_(); {
_nop_(); ds_dq=1;//拉高电平,准备写
ds_dq=1; _nop_();
_nop_(); _nop_();
_nop_(); ds_dq=0;//开始写时间隙
_nop_(); ds_dq=v;//发送数据
_nop_(); delay5(12);
ds_dq=1; v=ds_dq;//读取值
delay5(12); delay5(1);
return v; }
实际应用当中,需要读取一个字节或写一个字节数据(8为数据),因此编写了读/写一字节的函数,具体见附录三中都是ds18b20.h中的ds18b20rd()和ds18b20wr()函数。
4.匹配ROM
假定DS18B20的64位rom编码存放在数组sensor中,程序如下:
void matchrom(uchar *sensor)
{
uchar i;
ds18b20wr(MatchRom);// 发送匹配ROM命令
for(i=0;i<8;i++) ds18b20wr(*(sensor+i)); // 发送 ROM 代码
}
3.搜索ROM
初始化时,单片机并不知道总线上有几个DS18B20,或者并不知道他们的器件ROM编号,系统对总线上器件的数量和每个器件的ROM的识别与搜索是通过search rom命令与算法配合来实现的。具体工作过程:
总线主机发布ROM搜索命令后执行一次读,总线上所有器件就把它们各自ROM编码的第一位放到总线来作出响应。这次读获得的数据是所有器件放在总线上数据的“与”。再执行一次读,因为ROM搜索命令正在执行所以总线上所有器件把各自ROM编码的第一位的补码放在总线上,第二次读获得的数据也是所有器件放在总线上数据的“与”。对第一位的“两读”就此完成。之后主机再次进行的“两读”则是针对ROM编码的第二位,以此类推。从“两读”获得的数据意义见表1。
对ROM编码的某一位“两读”之后,对该位进行“-写”操作。“-写”操作写的数据要根据“两读”获得的数据来确定。如果“两读”数据为00,则表示总线上器件在该
15
位上数据发生冲突,“-写”写的数据此种情况下具有“排除”的作用,如果器件ROM编码在该位上的数据与“-写”写的数据相同,则继续保持与总线的联系。如果不相同则此器件从总线上“排除”,不再响应主机发布的命令,直到主机进行下一次复位。如果“两读”数据为01,则表示总线上所有器件在该位上均位0,为保持器件与总线的联系,“-写”操作主机应写0。同理,如“两读”数据为10,主机则应写1。
表1“两读”数据意义
“两读”数据 解释
00 有器件在总线上,总线上所有器件在此数据位上发生冲突
01 有器件在总线上,总线上所有器件在此数据位上均为0
10 有器件在总线上,总线上所有器件在此数据位上均为1
11 没有器件在总线上
DS18820 ROM编码的搜索算法
首先作如下几个定义:对“两读”数据为00的ROM编码位,之后“一写”操作要写的数据定义为“00写位”;所有00写位的集合定义为“00写位组”。那么搜索算法所要解决的问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
就是:确立一个00写位组,确保搜索命令能够搜索到一个唯一的ROM编码,并在完成一次搜索后对00写位组做出更新,以确保下次的搜索命令能够搜索到一个唯一的ROM编码并且不会搜索到已经搜索到的ROM编码,直到完成总线上所有器件的ROM编码搜索。
在给出搜索算法规则前再作如下几个定义:00写位组中最高ROM编码位对应的00写位定义为“最高00写位”;00写位组中邻近最高00写位的00写位定义位“次高00写位”;如果更新后的00写位组不足以搜索到一个唯一的ROM编码,则添加新的00写位,这个新的00写位定义为“新00写位”。
DS18820 ROM编码的搜索算法规则:
?第一次搜索确立一个00写位组,其中所有00写位全部为0。
?每次搜索后更新00写位组并从最高00写位开始更新。
?00写位组更新规则:如果最高00写位为0,则改最高00写位为1,更新完成;如果最高00写位为1,则弃去最高00写位并把次高00写位作为新的最高00写位。
16
?如果出现新00写位,新00写位一律为0并作为新的最高00写位。
?如果0写位组全为1,则搜索所有器件的ROM编码,搜索结束
具体的程序可参看附录三ds18b20.h文件中的searchrom函数,限于篇幅,这里作省略。
4.读取温度
假设sensor数组中存放着要读取温度器件的rom编码,变量Tvalue用于存放读取的温度值,读取温度值的程序如下:
readtemp()
{ uchar a,b;
ds18b20rst(); //复位
matchrom(sensor); //匹配rom
ds18b20wr(ReadScratchpad);//读暂存存储器
a=ds18b20rd(); //读低字节
b=ds18b20rd(); //读高字节
Tvalue=(uint)((b*256+a)*0.0625*100);//12位精度时,参考数据手册,最高温度+125?时对应DS18B20的值为0x07d0=20000,因此tanθ=125/20000=0.0625,读取结果放大100倍,精确到两位小数
}
3.2 显示程序
一 LCD1602工作时序
1602液晶的基本的操作分为以下四种:
状态字读操作:输入 RS=低、RW=高、EP=高; 输出:DB0~7读出为状态字;
数据读出操作:输入 RS=高、RW=高、EP=高; 输出:DB0~7读出为数据;
指令写入操作:输入 RS=低、RW=低、EP=上升沿;
数据写入操作:输入 RS=高、RW=低、EP=上升沿。
二 LCD1602指令
1.状态字:
1602 LCD读回的状态字中,最高位为读/写允许位,低7位为当前数据指针的地址值(即AC值)
Bit D7 D6 D5 D4 D3 D2 D1 D0
BF AC6~0
BF位为读/写允许位,在MCU对LCD进行读写操作前,都要确认该位值为0才可进行操作,AC6~0为7位的AC值,表示当前数据指针的地址值。
17
2.工作方式设置指令:
Bit D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 DL N F 0 0 DL:设置控制器与单片机的接口形式,一般设置为1; DL=1:数据总线宽度为8位,即DB7~DB0有效;
DL=0:数据总线宽度为4位,即DB7~DB4有效;
N:设置显示字符的行数,1602 LCD一般都设置为1; N=0:为一行字符;
N=1:为两行字符;
F:设置显示字符的字体,一般设置为0;
F=0:为5X7点阵字符体;
F=1:为5X11点阵字符体;
3.显示状态设置指令:
Bit D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 1 D C B 该指令控制着画面、光标和闪烁的开与关。
D:画面显示状态位;D=1为显示开,D=0为显示关;该指令仅影响显示屏的开关,
并不影响显存中的数据。
C:光标显示状态位;C=1光标显示;C=0光标不显示。 B:闪烁显示状态位;当B=1时闪烁启动;B=0时闪烁关闭;闪烁只对于当前地址指
针指和的字符位有效。
4.光标或画面滚动设置指令:
Bit D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 1 S/C R/L 0 0 该指令设置光标和画面的特性。
S/C:滚动对像的选择
S/C=1 画面滚动
S/C=0 光标滚动
R/L:滚动方向的选择
R/C=1 向右滚动
R/C=0 向左滚动
5.输入方式设置指令:
Bit D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 1 I/D S 该指令的功能在于设置显示字符的输入方式,即在操作数据写入/读出后,AC数据
地址指针的修改方式。
I/D:I/D=0 AC为自动减1的计数器,操作数据后AC自动减一;ID=1 AC为自动加1
计数器,操作数据后AC自动加1;
S:设置写入字符数据时是否允许画面滚动/光标移动(AC自动变化) S=0 禁止
S=1 允许
6.清屏指令:
Bit D7 D6 D5 D4 D3 D2 D1 D0
18
0 0 0 0 0 0 0 1
该指令将空格码(0x20)写入显存中,达到清屏显示的功能。
三 LCD1602RAM地址映射
1602内部显示地址为:00 01 02 ,27H
40 41 42 ,47H
00表示显示屏第一行第一个为位置,每行共有40个地址,只用前16个地址。如果
要在40H(即第二行第一个位置)显示内容,实际写入的数据是C0H(RS=0,RW=0,D7=1,
40H+80H=C0H)。在显示字符时,光标自动右移。另外,在执行每条指令之前确认模块忙
指令为0,否则指令将无效。
四 源程序
lcd_ep=1; 1.检测忙状态
_nop_(); bit lcd_bz() _nop_(); { _nop_(); bit result; _nop_(); lcd_rs=0; lcd_rw=1; lcd_ep=0;//rs=0,rw=0,ep=0->1->0 lcd_ep=1; } _nop_();
3.写数据 _nop_();
_nop_(); void lcd_wdat(uchar dat)
_nop_(); {
while(lcd_bz()); result=(bit)(P0&0x80);
lcd_ep=0;//rs=0,rw=1,ep=1->0 lcd_rs=1;
return result; lcd_rw=0; } lcd_ep=0;
P0=dat; 2.写指令
_nop_(); void lcd_wcmd(uchar cmd) _nop_(); { _nop_(); while(lcd_bz()); _nop_(); lcd_rs=0; lcd_ep=1; lcd_rw=0; _nop_(); lcd_ep=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); P0=cmd; lcd_ep=0;//rs=1,rw=0,ep=0->1->0 _nop_(); } _nop_();
4.初始化 _nop_();
_nop_();
19
lcd_wcmd(0x0c); //整体显示,关一般初始化过程:延时15ms-写指令
光标,不闪烁
38H-延时5ms-写指令0cH-延时5ms-写指 delayms(10);
lcd_wcmd(0x06); //设定输入令06H-延时5ms-写指令01H。初始化过程
方式,增量不移位
中写指令不检测忙状态。delayms()函数 delayms(10);
lcd_wcmd(0x01); //清屏 为延时函数。
delayms(10); void lcd_init() }{
lcd_wcmd(0x38); //8位格式,2
行,5x7点阵
delayms(10);
3.3 报警程序
报警电路的机构很简单,因此只要改变相关控制引脚的高低电平就可达到目的,具体程序:
设置一个报警标志,如果测得的温度超过限度,置标志位,在报警程序中,根据标志位来判断是否发出报警。假设alert_ls, alert_led分别为声光控制引脚,af1、af2分别为两路测温的标志。由硬件电路可知,最初状态alert_ls, alert_led应都为高电平。
void alert(uchar af1,uchar af2)
{
if(af1||af2)
{
alert_led=!alert_led;
alert_ls=!alert_ls;
}
else
{
alert_led=1;
alert_ls=1;
}
}
3.4 主程序
测温程序、显示程序、报警程序都已完成,主程序的工作只需按照顺序分别调用相关函数即可。
20
main()
{
lcd_init();//液晶初始化
searchrom(sensor);//搜寻DS18B20
while (1)
{
ds18b20rst();//初始化DS18B20
ds18b20wr(SkipRom);//跳过ROM
ds18b20wr(ConvertTemperature);//启动所有DS18B20温度转换
delay(200);//延时
readtemp();
alert();
}
}
需要注意的是,理论和实际是由区别的,必须具体问题具体分析,上面所给出的函
数,有的可以直接使用,但有的只是原理,并不能直接调用,因此必须出相关处理,比
如参数调用、结果返回等。
附录3中的所有源程序都经过编译调试,可以直接使用。
21
第四章 小结
为期一周的课程设计即将结束。在这一周中,查找、阅读了大量资料,正所谓工欲善其事,必先利其器,只有详细了解了个部分的工作原理和应用,才能做好设计工作。在这里首先要感谢孙驷洲老师的不遗余力的支持,在最后的时间,笔者已经将程序调试成功,并在孙驷洲老师提供的实验开发板上实现了设计的双路测温系统。
这一周当中,笔者接触了许多电子器件,阅读了许多相关的技术手册和应用资料,收获良多。但由于一些原因,并没有做的很好,比如DS18B20的报警搜索功能和配置功能并没有使用到,自动搜索ROM必须每次系统运行时都调用,如果能做到搜索一次,然后根据各个DS18B20的ROM编码,编号予以存储,这样就能很方便使用。限于时间和理论水平,笔者没有进行相关实验,希望以后能够完成这种设想。
至此,设计的全部内容,包括原理的说明、电路的设计、程序的设计和编写都已完成,当然,这种设计同实际应用是由很大区别的。 但正所谓,未有尝试,何来成果。无数技术精英想必都是从写“hello,world”起家的。因此,笔者认为,这次设计的任务完成的意义还是很大的:学到了知识、锻炼了动手能力、重要的一点,充满兴趣。
22
参考文献
[1]与海生 等.计算机控制技术[M].北京:机械工业出版社,2009.6.
[2]贾伯年 等.传感器技术[M].南京:东南大学出版社,2007.2.
[3]马忠梅 等.单片机的C语言应用程序设计[M].北京:北京航空航天大学出版社,
2003.11.
[4]易丽华 黄俊. 基于AT89C51 单片机与DS18B20 的温度测量系统[J].电子与封装
ELECTRONICS & PACKAGING,2009,第9卷(第5期).
[5] 朱群峰 等.基于DS18B20 的多路温度采集系统[J]. 船电技术,2009 ,Vol.29 No.2. [6] Atmel Corporation. AT89C52 DataSheet.2003. [7] DALLAS.DS18B20Programmable Resolution1-Wire Digital Thermometer[Z].2005.
[8] wertet.DS1820 单线数字温度计[Z].2009.
23
附录1 原理图
24
附录2 元器件清单
元件 参数
RQ 2.2k
R_DS18 4.7k 电阻 R_rst 10k
R_LCD 103
R_up A472J
R_L 470 电容 Ch 0.01uf
C_rst 22uf
C_X1,C_X2 33pf 晶振 Y1 11.0592MHz 二极管 D1
D2 LED 三极管 Q1 PNP 按键 S_rst
蜂鸣器 LS1 Beep IC U1 AT89C52
U2 DS18B20 其他 40Pin双列直插式封装插槽
16Pin单列直插式封装插槽
3Pin单列直插式封装插槽
25
附录3 源程序
#ifndef _ds18b20_h_ //temperature.h #define _ds18b20_h_ #ifndef _temperature_h_ #define MatchRom 0x55 #define _temperature_h_ #define SkipRom 0xcc #define uchar unsigned char #define SearchRom 0xf0
#define uint unsigned int #define ConvertTemperature 0x44
sbit alert_led=P1^3; #define ReadScratchpad 0xbe
sbit alert_ls=P3^1; sbit ds_dq=P2^0; //DS18B20与单片机uchar data Tdat1[16]={"T1: 00.00 "}; 连接口
uchar data Tdat2[16]={"T2: 00.00 "}; uint data Tvalue; //温度值
uchar data sensor[16]={0};
uchar data alertf1,alertf2; //警报标志 void delay5(uchar us) //延时5×us(us)
{
void delay(uchar t) //延时 while(--us) //1.8+3us { {
uchar i=200; _nop_();
while(--t) while (--i); _nop_();
} _nop_();
}
void alert(uchar af1,uchar af2) //告警 }
{
if(af1||af2) void ds18b20rst() //复位DS18B20
{ {
alert_led=!alert_led; ds_dq=1;
alert_ls=!alert_ls; delay5(1);
} ds_dq=0; //ds_dq拉低,复位信号
else delay5(96);//精确延时 大于480us
{ ds_dq=1; //释放总线
alert_led=1; delay5(90);
alert_ls=1; }
}
} bit readbit() //读一位数据
#endif {
bit v;
ds_dq=1;
_nop_(); //ds18b20.h
26
_nop_(); {
ds_dq=0; unsigned char i=0;
_nop_(); for (i=0; i<8; i++)
_nop_(); {
_nop_(); writebit(dat&0x01);
_nop_(); dat>>=1;
ds_dq=1; }
_nop_(); delay5(1);
_nop_(); }
_nop_();
_nop_(); void searchrom(uchar *sensor)
v=ds_dq; // 搜索ROM
delay5(12); {
return v; uchar
} dat,i,j,k,n,v,value,number=1,number_temp=
1,clash_number=0,clash_flag=0; uchar ds18b20rd()//读一字节数据 for(n=0;n
>=1; for(j=0;j<8;j++) //8位数据
if(v) dat|=0x80; {
} value=0;
return(dat); dat=dat>>1; } for(k=0;k<2;k++) //一位数据位,一
位补码位
void writebit(bit v) //写一位数据 {
{ v=readbit();
ds_dq=1; value<<=1;
_nop_(); if(v)value|=0x01;
_nop_(); delay5(12); //60us
ds_dq=0; }
ds_dq=v; switch(value) //根据回复第两位
delay5(12); 数据来发出相应操作
ds_dq=1; {
delay5(1); case 0x00: //总线冲突
} if(n==0)
{
void ds18b20wr(uchar dat) // 写一字节数 number++; 据 number_temp=number;
27
writebit(0); uchar readtemp(uchar *sensor,uchar *Tdat)
} //读取温度并转换成显示数组
else //第二次以上循环时{
{ uchar a,b,af;
clash_number++; ds18b20rst(); if(clash_number>=(number_temp-1)) matchrom(sensor);
{ ds18b20wr(ReadScratchpad);//读暂存
if(!clash_flag) 存储器
{ a=ds18b20rd(); //读低字节
clash_flag=1; b=ds18b20rd(); //读高字节
dat=dat|0x80; Tvalue=(uint)((b*256+a)*0.0625*100);
writebit(1); //tan=125/2000=0.0625
} //结果放大100倍,精确两位小数
else if ((b&0x80)||Tvalue>5000) af=1; else
{ af=0;
clash_flag=0; Tdat[4]=Tvalue/1000+48; //十位
number_temp--; Tdat[5]=Tvalue%1000/100+48; //个
writebit(0); 位
} Tdat[6]='.';
} Tdat[7]=Tvalue%100/10+48; //十分
} 位
break; Tdat[8]=Tvalue%10/1+48; //百分
case 0x01:writebit(0);break; 位
case if(Tdat[4]=='0') 0x02:dat=dat|0x80;writebit(1);break; Tdat[4]=' '; //十位为0,不显示
case 0x03:i=8;j=8;break; if(Tdat[8]=='0')
default:break; {
} Tdat[8]=' ';//百分位为0,不显示
} if(Tdat[7]=='0')
*sensor++=dat; {
} Tdat[7]=' ';//十分、百分均为
} 0,消小数点
} Tdat[6]=' ';
}
void matchrom(uchar *sensor) //匹配ROM }
{ if (af) Tdat[13]='!'; else Tdat[13]=' ';
uchar i; Tdat[15]='\0';
ds18b20wr(MatchRom);// 发送匹配 return af;
ROM命令 }
for(i=0;i<8;i++) ds18b20wr(*(sensor+i));
// 发送 ROM 代码 #endif
}
28
_nop_(); //lcd1602.h lcd_ep=1; #ifndef _lcd1602_h_ _nop_(); #define _lcd1602_h_ _nop_(); sbit lcd_rs=P1^2; //LCD1602与单片机接 _nop_();
口 _nop_(); sbit lcd_rw=P1^1; lcd_ep=0;//rs=0,rw=0,ep=0->1->0
sbit lcd_ep=P1^0; }
extern void delay(uchar);
void lcd_pos(uchar pos) //设定显示位置 void delayms(uint t)// lcd延{
时,t=1,fosc=11.0592,延时约0.01ms lcd_wcmd(pos|0x80); { }
while(--t);
} void lcd_wdat(uchar dat) // 写入显示数据
到LCD
bit lcd_bz() //测试LCD忙碌状态 {
{ while(lcd_bz());
bit result; lcd_rs=1;
lcd_rs=0; lcd_rw=0;
lcd_rw=1; lcd_ep=0;
lcd_ep=1; P0=dat;
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
result=(bit)(P0&0x80); lcd_ep=1;
lcd_ep=0;//rs=0,rw=1,ep=1->0 _nop_();
return result; _nop_(); } _nop_(); void lcd_wcmd(uchar cmd) _nop_(); //写指令数据到LCD lcd_ep=0;//rs=1,rw=0,ep=0->1->0
{ }
while(lcd_bz());
lcd_rs=0; void lcd_init()//LCD初始化
lcd_rw=0; {
lcd_ep=0; lcd_wcmd(0x38); //8位格式,2行,5x7
_nop_(); 点阵
_nop_(); delayms(10);
P0=cmd; lcd_wcmd(0x0c); //整体显示,关光标,
_nop_(); 不闪烁
_nop_(); delayms(10);
_nop_(); lcd_wcmd(0x06); //设定输入方式,
29
增量不移位 //温度转换
delayms(10); delay(200);
lcd_wcmd(0x01); //清屏 alertf1=readtemp(sensor,Tdat1);
delayms(10); lcd_pos(0x00); } display(Tdat1);
lcd_pos(0x0a); void display(uchar *string) // LCD显示 Tsymbol(); { alertf2=readtemp(sensor+8,Tdat2);
while(*string!='\0') lcd_pos(0x40);
{ display(Tdat2);
lcd_wdat(*string); lcd_pos(0x4a);
string++; Tsymbol();
delayms(10); alert(alertf1,alertf2);
} } } }
void Tsymbol() //显示温度符号
{
lcd_wdat (0xdf);
lcd_wdat ('C');
}
#endif
//temperature.c
#include
#include //包含_nop_()
#include
#include
#include
main() //主函数
{
lcd_init();
searchrom(sensor);
while (1)
{
ds18b20rst();
ds18b20wr(SkipRom);
//跳过ROM
ds18b20wr(ConvertTemperature);
30