智能仪器基础
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.6 输入接口电路仿真举例

3.6.1 数字温度传感器与单片机的接口仿真

数字传感器因其可以直接输出数字信号、使用方便而受到人们的欢迎,数字温度传感器DS18B20就是其中的一种。数字温度传感器内部一般包含温度传感器、A/D转换器、信号处理器、存储器和相应的接口电路,使用比较方便。

DS18B20是DALLAS公司生产的单总线接口数字温度传感器,具有3个引脚,温度测量范围为-55℃~+125℃,可通过编程输出9~12位A/D转换精度,测温分辨率可达0.0625℃,被测的温度用16位补码形式串行输出。

表3.7为DS18B20温度值格式表,其中S是符号位,以12位转换为例,如果测得的温度大于0,这5位都为0,只要将所测得的数值乘以0.0625/LSB即可得到实际温度;如果测得的温度小于0,这5位都为1,测得的数值要取反加一,再乘以0.0625/LSB就可以得到实际温度。温度最大转换时间为750ms。

表3.7 DS18B20温度值格式表

DS18B20与单片机连接非常简单,图3.37为DS18B20与单片机通过P1.0口串行连接的仿真图,但对DS18B20读/写编程时必须严格按照读/写时序,否则可能无法读取测温的结果。

图3.37 DS18B20与单片机接口电路

DS18B20内部有三个主要的数字部件,分别是64位ROM,温度传感器,温度报警触发器TH和TL,每个DS18B20都有一个独特的片序号(储存在ROM中),所以多个DS18B20可以同时连在一根单线总线上。根据DS18B20的通信协议,单片机控制DS18B20必须经过三步。

(1)复位(初始化)操作。通过单线总线的所有操作都从一个初始化序列开始,初始化序列包括一个由总线控制器发出的复位脉冲和紧随其后的DS18B20发出的存在脉冲。

(2)发送(写)ROM操作指令。共有五条操作指令,如表3.8所示。

(3)发送操作命令。温度变换,读温度,设置温度的上、下限值等共六条操作指令,如表3.9所示。

表3.8 ROM操作指令

表3.9 RAM操作指令

8951只接一个DS18B20,最简单的程序是初始化,跳过ROM命令,转换温度命令,再一次初始化,跳过ROM命令,读取温度命令,就完成了一次测温过程。

读取单个DS18B20转换的温度值的程序如下(读取的温度值放在31H和30H中):

宏定义:
T_L              EQU    30H             ;温度值低位放在30H中
T_H              EQU    31H             ;温度值高位放在31H中
FLAG0            EQU    00H             ;DS18B20存在标记
DQ               EQU    P1.0             ;DS18B20的硬件接口
SKIPDS18B20       EQU    0CCH            ;跳过ROM命令
STARTDS18B20     EQU    44H             ;开始温度转换命令
READDS          EQU    0BEH            ;读温度转换命令
主程序:
                ORG    0000H
                SJMP    MAIN
                ORG    0040H
MAIN:            MOV    SP,#60H
                CLR     EA
                CLR     FLAG0
                LCALL  RE_CONFIG       ;设置DS18B20
                LCALL  GET_TEMPER     ;用DS18B20测温子程序
                LJMP    MAIN
测温子程序:
GET_TEMPER:      SETB    DQ
                LCALL  INITDS18B20      ;初始化
                JB      FLAG0,S22
                RET
S22:              LCALL  Delay64us         ;测温
                MOV    A,#SKIPDS18B20
                LCALL   WriteByDS18B20
                MOV    A,#STARTDS18B20
                LCALL   WriteByDS18B20
                LCALL   Delay1s
                LCALL   INITDS18B20
                JB      FLAG0,ABC
                RET
ABC:             LCALL   Delay64us
                MOV    A,#SKIPDS18B20
                LCALL   WriteByDS18B20
                MOV    A,#READDS
                LCALL   WriteByDS18B20
                LCALL   READDS18B20
                RET
READBYDS18B20:   MOV    R2,#08H          ;读DS18B20的一个字节
RE1:              CLR     C
                SETB    DQ
                NOP
                CLR     DQ
                NOP
                NOP
                NOP
                SETB    DQ
                MOV    R3,#07H
                DJNZ    R3,$
                MOV    C,DQ
                MOV    R3,#23
                DJNZ    R3,$
                RRC     A
                DJNZ    R2,RE1
                RET
READDS18B20:     LCALL  READBYDS18B20      ;读温度值
                MOV    T_L,A
                LCALL   READBYDS18B20
                MOV    T_H,A
                RET
WriteByDS18B20:    MOV    R2,#8                ;写入DS18B20
                CLR     C
WR1:             CLR     DQ
                MOV    R3,#6
                DJNZ    R3,$
                RRC     A
                MOV    DQ,C
                MOV    R3,#23
                DJNZ    R3,$
                SETB    DQ
                NOP
                DJNZ    R2,WR1
                SETB    DQ
                RET
RE_CONFIG:       LCALL  INITDS18B20          ;设置DS18B20
                JB      FLAG0,RE_CONFIG1
                RET
RE_CONFIG1:      MOV    A,#0CCH
                LCALL   WriteByDS18B20
                MOV    A,#4EH
                LCALL   WriteByDS18B20
                MOV    A,#00H
                LCALL   WriteByDS18B20
                MOV    A,#00H
                LCALL   WriteByDS18B20
                MOV    A,#7FH
                LCALL   WriteByDS18B20
                RET
Delay500us:        MOV    R6,#00H              ;延时500微秒子程序
                DJNZ    R6,$
                RET
Delay64us:         MOV    R6,#20H              ;延时60微秒子程序
                DJNZ    R6,$
                RET
Delay1s:           MOV    B,#130               ;延时1秒子程序
DELAY1:          NOP
                NOP
                NOP
                NOP
                DJNZ    B,DELAY1
                RET
INITDS18B20:  CLR     DQ                 ;初始化DS18B20
            MOV    R7,#00H
            DJNZ    R7,$
            SETB    DQ
            MOV    R7,#10H
            DJNZ    R7,$
            SETB    FLAG0
            JNB     DQ,TSR5
            CLR    FLAG0
            LJMP    TSR7
TSR5:         MOV    R7,#6BH
            DJNZ    R7,$
TSR7:         SETB    DQ
            RET
            END

从程序中可以看到,DS18B20的优点是硬件简单,CPU只需一根线就可以与多个DS18B20通信,占用微处理器的端口少,可以用于多点温度测控,但软件程序相对比较长,要严格按照资料给出的时序要求编程。

仿真时还可以看到DS18B20内部温度存储器中的值和读出的温度值随温度变化的情况。假设温度为50℃,读到的温度值为0320H,如图3.38所示,对照表3.7,可知温度值为正。

图3.38 转换后输出的温度值

由图3.38可知,DS18B20内部有9个字节RAM,分别为CRC校验寄存器,温度转换后的低字节,高字节,报警用的高温度触发值,低温度触发值,在此例程序中均被设为0,配置寄存器,最后为三个保留字(可以让用户定义)。

从8051的内部RAM窗(图3.38)可见,转换后温度值保留在31H和30H中。

3.6.2 A/D转换芯片ADC0809的接口电路

ADC0809是较常用的8路输入通道的A/D转换器,由单一电源+5V供电,且片内带有锁存功能的8路模拟开关,可对0~5V的8路输入模拟电压信号进行分时转换,转换一次的时间约为100μs,带有三态锁存缓冲器,可直接与MCS-51系列单片机的数据总线相连。

由器件资料知,ADC0809的控制引脚定义为:

ALE:地址锁存允许信号,输入,高电平有效。

START:A/D转换启动信号,输入,高电平脉冲。

EOC:A/D转换结束信号,输出,当启动转换后,该引脚为低电平,当A/D转换结束时,该引脚输出高电平信号,CPU可以通过查询该引脚得知转换是否结束,也可以由该引脚通过反相器接中断,转换结束时进入中断,读取数据。

CLOCK:时钟脉冲信号,要求时钟频率不高于640kHz。

最简单的ADC0809与8951的接口电路如图3.39所示。这里只用了一路输入,需要时可以通过改变输入地址,分时获取8路输入的转换结果。为了简洁,图中ADC0809的CLOCK端直接输入640kHz的时钟脉冲,该脉冲也可以由单片机ALE输入脉冲经分频得到,还可以由单片机编程输出。

图3.39 ADC0809与8951接口电路

ADC0809的工作流程如下所述。

(1)输入三位地址,并使ALE=1,将地址存入地址锁存器。经地址译码器从8路通道中选通一路模拟量送到比较器。

(2)送START一个高电平脉冲,其上升沿使逐次逼近寄存器复位,其下降沿启动A/D转换,并使EOC信号为低电平。

(3)转换结束,转换结果存入输出三态锁存器中,并使EOC信号回到高电平,通知CPU已转换结束。

(4)当CPU执行读数据命令时,使OE为高电平,从D0~D7中读出数据。

编写程序如下:

ORG    0000H
AJMP    MAIN
ORG    0060H
MAIN:    SETB    P1.4
SETB    P1.5
CLR     P1.6             ;给出输入口地址
SETB    P1.2             ;给START一个高电平脉冲
NOP
NOP
CLR     P1.2
NOP
NOP
AA:      JNB     P1.1,AA          ;查询转换是否结束
SETB    P1.0
MOV    A,P3            ;读取转换结果
MOV    30H,A           ;存在内部RAM 30H中
SJMP    $
END

可以看到,ADC0809与8951是并行连接的,相对来说硬件连接线比较多,但程序比较简单,如果P0口和P2口已并行扩展了外部数据存储器等,也可以用P0口扩展接ADC0809。

3.6.3 A/D转换芯片ADC0832的接口电路

ADC0832是美国国家半导体公司生产的一种8位分辨率、双通道A/D转换芯片,其输入/输出电平与TTL/CMOS都兼容,5V电源供电时输入电压为0~5V,工作频率为250kHz,转换时间为32μs,采用串行通信方式输出转换后的数据,与单片机连接十分方便,如图3.40所示,其引脚功能为:

CS:片选使能,低电平有效。

CH1、CH0:模拟输入通道方式选择,当两位数据为“1”、“0”时,只对CH0进行单通道转换;当两位数据为“1”、“1”时,只对CH1进行单通道转换;当两位数据为“0”、“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-;当两位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1作为正输入端IN+。

DI:数据信号输入,选择输入通道。

DO:数据信号输出,输出转换数据。

CLK:芯片时钟输入。

正常情况下,ADC0832与单片机的接口线是四条,但因为DI与DO不是同时与单片机通信,且是双向的,所以电路设计时可以用一根数据线并联DI和DO使用。图3.39给出了ADC0832与单片机最简单的连接方法。

图3.40 ADC0832与单片机接口电路

可以看到,串行连接硬件连接很方便,图中用通道0(CH0)对输入的模拟电压进行采样,转换成数字量后通过P1.2送给CPU,图中加入了一个电压表显示模拟电压值,主程序通过调用子程序ADC可获取A/D转换的数据,在主程序中送入要转换的模拟通道号,转换后的数据存放在内部RAM 30H。注意,程序中CPU主要是通过软件按协议来控制ADC0832,要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。在第1个时钟脉冲下降前DI端必须是高电平,表示启始信号。在第2、3个脉冲下降前DI端应输入两位数据用于选择通道功能,本例中用P1.1端口输出时钟控制脉冲,其程序如下:

ORG    0000H
AJMP    MAIN
ORG    0060H
MAIN:    MOV    B,#10H
LCALL  ADC        ;调用模/数转换子程序
SJMP    $
ADC:     SETB    P1.2         ;初始化通道选择信号
NOP
NOP
CLR     P1.0         ;选中芯片
NOP
NOP
SETB    P1.1         ;通过输出高/低电平形成时钟脉冲
NOP
NOP
CLR     P1.1
NOP
NOP
SETB    P1.1
MOV    A,B
MOV    C,ACC.1
MOV    P1.2,C       ;输入地址高位
NOP
NOP
CLR     P1.1
NOP
NOP
SETB    P1.1
MOV    A,B
MOV    C,ACC.0
MOV    P1.2,C       ;输入地址低位
NOP
NOP
CLR     P1.1
SETB    P1.2         ;地址输入结束
NOP
NOP
MOV    R7,#8
A1:       MOV    C,P1.2       ;P1.2与DO相连,CPU读取数据
MOV    ACC.0,C
RL      A           ;左循环,(首先输入最高位)
SETB    P1.1
NOP
NOP
CLR     P1.1
NOP
NOP
DJNZ    R7,A1       ;输入8位了吗?没有则继续
MOV    30H,A       ;把数据存入30H
SETB    P1.0
CLR     P1.1
SETB    P1.2
RET
END