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