1、第11章 综合实例多功能数字温度计设计,通过前面几章的学习,读者已经基本掌握了AT89S51单片机的系统设计与程序设计方法。从本章开始,将通过综合的实例向读者继续深入介绍嵌入式系统开发的知识和实例。 本章主要讲解一个多功能数字温度计设计的综合实例,通过该实例,读者能够学习到键盘输入设计、LED数码管接口设计、温度采集、人机交互设计等各方面的知识。,11.1 系统结构与分析,本章介绍的多功能数字温度计具备温度计和时钟的功能,该系统由以下几个部分组成:单片机、温度传感器、显示设备、键盘输入几部分组成。,11.1.1 多功能数字温度计功能分析,在本章设计的多功能温度计,需要具备以下的功能。 温度测量
2、:能够实时显示当前的环境温度; 时钟功能:能够作为时钟使用,显示当前时间; 闹铃功能:能够在设定时间时候,作为闹铃发声; 时钟设置功能:能够设定时钟,修改当前时间; 电池或者直流稳压电源9V供电;,11.1.2 多功能数字温度计系统分析,多功能数字温度计的原理十分简单,即通过温度传感器测量温度,通过单片机采集后在LED数码管上显示出来,同时,该温度计还兼有时钟的功能。,11.2 DS1620温度传感器电路,DS1620是Maxim-Dallas公司生产的一款高性能、宽测温范围的串行数字接口温度传感器。下面详细介绍DS1620温度传感器的使用。,11.2.1 DS1620的性能指标,DS1620
3、温度传感器的主要性能指标如下。 供电电压:2.7V5.5V; 测量温度范围:-55C+125C; 测量温度精度:0.5C; 转换时间:50ms; 接口:三线串行接口; 可设定报警限值; 9Bit温度数据格式。,11.2.2 DS1620的引脚定义,DS1620具有8-Pin的SOIC封装和DIP双列直插封装,其引脚分布如图所示。,11.2.3 DS1620的温度格式,DS1620采用的9位的温度数据格式,负温度数据用补码表示,最低位表示0.5,因此需要两个8位寄存器存储温度值,如图所示为温度为-25C的数据值。,11.2.4 DS1620的三线数据串行接口,DS1620的三线数据串行接口由一下
4、三个信号线组成。 RST(复位); CLK(时钟); DQ(数据)。,11.2.5 DS1620的控制寄存器,DS1620具有一个8位的控制寄存器,用于控制温度传感器的所有操作,其寄存器各位分布如图所示。,11.2.6 DS1620的操作字,要对DS1620进行需要的操作,就需要执行DS1620的操作字,如图11.8时序图中的Protocol部分就是操作字的代码,跟随Protocol后的是操作字的参数或者读取值。 DS1620共有如下的9个不同的操作字,通过不同的操作字可以实现开始转换温度、对DS1620的寄存器进行读写、读取温度数据、设置TH和TL等操作。 AAH:读取转换好的温度数据,从指
5、令输入后的第9个时钟脉冲开始,将输出温度寄存器中的数据; 01H:给高温临界寄存器写入TH数据;02H:给低温临界寄存器写入TL数据; A1H:读高温临界寄存器中的TH数据;A2H:读低温临界寄存器中的TL数据; EEH:开始转换温度数据;22H:停止转换温度数据; 0CH:写控制寄存器;ACH:读控制寄存器。,11.2.7 DS1620的单独工作模式,DS1620可以工作在无单片机控制的系统中,称为DS1620的单独工作模式,在这种工作模式下,主要是依靠DS1620的三个温度限制输出引脚进行控制,作为热继电器使用。 使用该工作模式必须写入控制寄存器操作模式和TH、TL寄存器的温度设定值,使用
6、CLK/CONV用作转换开始控制端。这种工作模式下,控制寄存器的CPU标志位必须设为“0”。,11.2.8 DS1620的单片机接口电路,当使用AT89S51控制DS1620进行温度测量时,只需要使用AT89S51的三个引脚和DS1620的串行接口按照通讯协议进行通讯即可,其电路如图所示。,11.3 MAX7219数码管驱动电路,MAX7219是Maxim公司生产的一款高性能8位共阴极数码管驱动芯片,通过MAX7219可以使用单片机极少的引脚实现多个数码管的显示驱动。,11.3.1 MAX7219的性能指标,MAX7219的主要性能指标如下。 10Mhz的串行接口; 独立的LED数码管段控制;
7、 可以使用内部BCD数码管解码; 150uA的Shut-Down电流; 可以调节数码管发光强度; 工作温度范围:-40C85C;,11.3.2 MAX7219的引脚定义,如图所示,MAX7219具有24引脚的SO贴片与DIP双列直插两种不同的封装。,11.3.3 MAX7219的串行数据通讯,单片机需要通过D0D15的16位串行通讯对MAX7219进行控制,,11.3.4 MAX7219的内部寄存器地址,要实现数码管的不同模式、不同形式下的驱动,就需要对MAX7219的内部寄存器进行操作,寄存器的地址为数据D8D11位,如图所示。,11.3.5 MAX7219的数字位寄存器,数字位寄存器的地址
8、为01H08H,其对应了每个数码管的现实内容,在没有进行使用解码模式时,其存储数据与数码管显示的对应方式如图所示。,11.3.6 MAX7219的停机寄存器,停机寄存器用于关闭MAX7219,如图所示,当D0=0 时,MAX721 处于停机状态;当D0=1 时,处于正常工作状态。,11.3.7 MAX7219的测试寄存器,测试寄存器用于测试数码管和MAX7219十分正常工作,如图所示,当D0=0时,MAX7219 按设定模式正常工作;当D0=1 时,处于测试状态。 在测试状态下,无论MAX7219 处于什么模式,全部LED 将按最大亮度显示。,11.3.8 MAX7219的亮度寄存器,数码管的
9、现实亮度可以用硬件和软件两种方法调节,亮度寄存器中的D0D3位可以控制LED 显示器的亮度,如图所示,通过改变亮度寄存器的值,可以调整MAX7210驱动数码管的有效循环时间,从而改变数码管显示的亮度。,11.3.9 MAX7219的扫描界限寄存器,MAX7219的扫描界限寄存器用于限定MAX7219的扫描数码管的个数,这个主要是用于当MAX7219被用于驱动不到8个数码管的情况下,例如本章的数码温度计只使用了6个数码管,就可以限制扫描数码管的个数为6。 如图所示,该寄存器中D0D3 位数据设定值为07H,设定值表示显示器动态扫描个数为18。,11.3.10 MAX7219的译码寄存器,该寄存器
10、的8 位二进制数的各位分别控制8 个LED 显示器的译码方式。当高电平时,选择BCD-B 译码模式,当低电平时选择不译码模式,而使用送来数据为字型码,其具体对应的实例如图所示。,11.3.11 MAX7219驱动电路设计,如图所示为官方推荐的MAX7219常用驱动电路连接图,图中ISET引脚连接的是硬件调节数码管亮度的电阻,可以通过更改外接电阻值改变数码管的亮度。 DIG0DIG7引脚分别与8位数码管的共阴极相连,SEG AG及其DP引脚分别与每个数码管的AG与GP段相连,AG以及DP各段的定义请参考图,11.4 其他硬件电路设计,除了温度传感器电路和数码管驱动电路,在本节中继续介绍多功能温度
11、计其余的硬件电路设计,包括单片机最小系统、电源系统、按键输入等部分。,11.4.1 AT89S51单片机最小系统电路,在该设计中采用了AT89S51单片机作为核心处理器,因此在电路中首先需要设计的是AT89S51的最小系统。 AT89S51单片机的最小系统电路包含以下几个部分: 单片机供电电路:AT89S51需要具有可靠的5V供电,在电路图中的VCC和GND为供电网络标识符; 振荡电路:AT89S51需要一个稳定的振荡电路才能够正常工作,在该电路采用了24Mhz的晶振作为AT89S51的时钟源; 复位电路:复位电路是单片机正常运行的一个必要部分,复位电路应该保证单片机在上电的瞬间进行一次有效的
12、复位,在单片机正常工作时将RST引脚置低。此外通过一个按键进行手动复位,在单片机运行不正常时使用。,11.4.2 键盘输入电路,由于多功能数字温度计具备时钟的功能,因此需要具有设置时钟的按键输入设备,在本章案例中采用了4个上拉的按键作为输入设备,与AT89S51的P1_0P1_3相连,其电路如图所示。 键盘输入的具体设计细节请参考本书第7章。,11.4.3 电源电路,为了降低成本,该多功能数字温度计采用了MC7805作为电源芯片,MC7805是使用最为广泛的一种电源稳压芯片,各大芯片公司都有生产或具有兼容产品。 从芯片的手册上可知,MC7805能够将730V的输入电压稳压至5V输出,但是由于M
13、C7805不是开关电源,而是线性稳压电源,因此多余的电压都将转换为热能被消耗,导致芯片发热,因此MC7805的输入电压不宜太高。 采用MC7805作为电源的电路,其中BAT是电池电源输入端,一般为9V。,11.4.4 多功能数字温度计的硬件电路,通过11.2.111.2.5小节的设计分析,可以得到该多功能数字温度计的硬件电路图如图所示,其中P2为电源输入接口,蜂鸣器使用P2_7引脚驱动。,11.5 多功能数字温度计软件设计,本节讲解多功能温度计的软件设计,软件要实现的功能包括实时温度测量显示、时钟显示、时钟设置、闹铃设置、闹铃等功能。下面详细讲解软件的设计过程。,11.5.1 软件结构分析,一
14、个嵌入式系统软件总是由复杂的程序构成的,一般来说,一个完整的嵌入式程序分为两个主要的层次,功能软件和底层驱动。,11.5.2 DS1620驱动程序设计,DS1620的驱动程序由以下几部分组成。 DS1620写字节函数;DS1620读字节函数; DS1620写控制寄存器函数;DS1620读控制寄存器函数; DS1620读取温度值函数;DS1620启动转换函数; DS1620初始化函数; 11.5.2.1 宏定义 11.5.2.2 DS1620写字节函数 11.5.2.3 DS1620读字节函数 11.5.2.4 DS1620写控制寄存器函数 11.5.2.5 DS1620读控制寄存器函数 11.
15、5.2.6 DS1620读温度值函数 11.5.2.7 DS1620启动温度转换函数 11.5.2.8 DS1620初始化函数,11.5.3 MAX7219驱动程序设计,MAX7219的驱动程序由以下几部分组成。 MAX7219写控制函数; MAX7219初始化函数; 11.5.3.1 宏定义 11.5.3.2 MAX7219写控制函数 11.5.3.3 MAX7219初始化函数,11.5.4 键盘接口程序设计,键盘接口程序的功能是对按下的按键进行识别,为程序提供按键码,为执行下一步程序提供来自用户的反馈。 键盘接口程序比较简单,就是使用P1口读取按键的值,然后返回按键值,具体的按键输入程序过
16、程请读者参考本书第七章。 11.5.4.1 宏定义 11.5.4.2 键盘接口程序,11.5.5 蜂鸣器驱动程序设计,驱动蜂鸣器就是靠AT89S51的P2_7引脚,驱动蜂鸣器就是通过P2_7输出一个低电平,将三极管导通,从而驱动蜂鸣器发声。 11.5.5.1 宏定义 11.5.5.2 蜂鸣器驱动,11.5.6 定时器时钟基准设计,定时器时钟基准的目的是产生以一秒为周期的时钟基准,这样就可作为时钟的驱动基准。 利用定时器T0可以产生2ms的中断脉冲,500个2ms技术即为1s。在使用24MHz晶振时,产生2ms需要的计数器初值为: #define TH0_VALUE 0x06 #define T
17、L0_VALUE 0x00 11.5.6.1 定时器时钟中断 11.5.6.2 定时器初始化函数 11.5.6.3 定时器启动函数,11.5.7 时钟显示程序设计,时钟显示程序的功能是每隔一分钟更新一次显示的时钟值,时钟值按照24小时的格式进行显示,具体函数代码如下。,11.5.8 闹铃程序设计,闹铃程序实现的功能是,当当前时间和闹铃时间一致时,闹铃开始发声报警,,11.5.9 按键操作程序设计,用户要通过键盘操作进行闹铃和时钟的设置,因此按键操作函数比较复杂,在函数中调用了键盘接口函数,,11.5.10 显示温度程序设计,显示温度程序的功能是在温度计上实时显示当前所测量的温度值,程序调用了D
18、S1620读温度函数,具体代码如下。,11.5.11 主程序,在所有函数和分支程序都设计完成后,主程序的设计变得十分简单,主程序的工作是初始化各个部件,并在无限循环内不断运行各个子分支程序,,11.6 多功能数字温度计工程文件,与之前章节介绍的小程序不同,在本章的案例中,对于这样一个较大的工程,为了使得所有的函数和分支程序能够统一编译,需要在Keil C51里统一建立一个工程文件,进行统一的编译与调试。,11.6.1 主函数,Main.C为整个工程的主体文件,包含了工程的入口函数main()。(具体内容请参照本书),11.6.2 温度传感器DS1620函数库,DS1620.C包含了所有对温度传
19、感器DS1620的操作函数,具体代码如下所示。(具体内容请参照本书),11.6.3 DS1620引脚定义,DS1620.h对DS1620的操作函数进行了声明,具体代码如下所示。(具体内容请参照本书),11.6.4 数码管驱动MAX7219函数库,MAX7219.c包含了所有对数码管驱动MAX7219的操作函数以及温度显示函数,具体代码如下所示。(具体内容请参照本书),11.6.5 MAX7219头文件定义,MAX7219.h对MAX7219的定义进行了声明,其代码如下所示。(具体内容请参照本书),11.6.6 键盘操作函数,Keys.c包含了所有的键盘操作函数,具体代码如下。(具体内容请参照本书),11.6.7 键盘操作定义,Keys.h包含了对键盘操作函数的声明,具体代码如下所示。(具体内容请参照本书),11.6.8 时钟函数库,Timer.c包含了整个系统的时钟基准函数,以及显示时间函数和闹铃函数,具体代码如下。(具体内容请参照本书),11.6.9 时间函数定义,Timer.h对时间基准相关的函数进行了声明,具体内容如下。#ifndef _H_TIME #define _H_TIMEvoid TIMER_Init(); void TIMER_Start(); void Display_Time(); void Check_Alarm();#endif,