单片机要处理这种信号,首先必须将模拟量转换成数字量,这一转换过程就是模—数转换,实现模/数转换的设备称为A/D转换器或ADC。
AD转换器是单片机应用中常见的接口,从事单片机开发的人员通常都会遇到使用AD的要求,本文通过一个典型的例子来学习一种常用AD转换器的用法。
一、模数转换简介
A/D转换电路种类很多,在选择模/数转换器时,主要考虑以下的一些技术指标:转换时间和转换频率、量化误差与分辨率、转换精度、接口形式等。目前,较为流行的 AD转换器件有很多都采用了串行接口,这使得这类芯片与单片机的硬件连接非常简单,而软件编程相对要复杂一些,下面,我们以TI公司的TLC1543为例,制作一个多路输入的电压表,了解一下这类芯片的使用特点。
二、TLC1543特性简介
TLC1543是由TI公司开发的开关电容式AD转换器,该芯片具有如下的一些特点:
10位精度、11通道、三种内建的自测模式、提供EOC(转换完成)信号等。该芯片与单片机的接口采用串行接口方式,引线很少,与单片机连接简单。
图1是TLC1543的引脚示意图,其中A0~A10是11路输入,Vcc和GND分别是电源引脚,REF+和REF-分别是参考电源的正负引脚,使用时一般将REF-接到系统的地,达到一点接地的要求,以减少干扰。其余的引脚是TLC1543与CPU的接口,其中CS为片选端,如不需选片,可直接接地。I/O Clock是芯片的时钟端,Adress是地址选择端,Data Out是数据输出端,这三根引脚分别接到CPU的三个I/O端即可。EOC用于指示一次AD转换已完成,CPU可以读取数据,该引脚是低电平有效,根据需要,该引脚可接入CPU的中断引脚,一旦数据转换完成,向CPU提出中断请求;此外,也可将该引脚接入一个普通的I/O引脚,CPU通过查询该引脚的状态来了解当前的状态,甚至该引脚也可以不接,在CPU向TLC1543发出转换命令后,过一段固定的时间去读取数据即可。
三、单片机与TLC1543芯片的接口
图2使用TLC1543制作的多路输入电压表的电路图,从图中可以看出,这里使用了TLC1543作为基准电压源,将REF-直接接地,P1.0、P1.1、P1.2、P1.3和P1.4分别与EOC、时钟、地址、数据、片选端分别相连。制作时,请参考表1进制连线。注意电容E1和C1一定要用,E1可用10u/16V电解,C1可用0.1uCBB电容,安装时尽量接近20脚和第10脚。输入端可根所需要,接入相应的信号。
编程的要求是在六位数码管的后四位数码管上轮流显示TLC1543各通道的测量值,同时用十六进制表示的通道号显示在第1位数码管上。
四、TLC1543驱动程序编写
由于采用串行接口,在硬件电路简单的同时,带来了软件编制的复杂性,初学单片机的入门者很难掌握这类芯片的编程方法,这给此类芯片的应用带来一定的限制。为解决这一问题,我们在实际应用该芯片的基础上写出了该芯片的驱动程序,有了驱动程序,使用者不必再关心TLC1543数据手册中的时序图之类不易懂的部份,只要了解清楚驱动程序的用法,即可使用该芯片。
TLC1543共有11条输入通道,这11条通道的编号从0~10,读取时,根据编号来获得想应通道的数据,此外,内部还有三条用于测试的通道,分别是接:
、 和 其通道编号分别是11、12和13.
1.驱动程序
;以下定义各引脚
ADCLK EQU P1.1 ;时钟
ADaddr EQU P1.2 ;地址引脚
ADDout EQU P1.3 ;数据端
ADCS EQU P1.4 ;片选端
命令:ADConver
参数:r2通道号,转换前存入转换结后数据在r0r1中,高位在前
资源占用:r0,r1,r7,A
ADConver:
CLR ADClk
CLR ADCS
MOV A,R2
RLC A
;送出地址信号
MOV R7,#4
C_L1:
RLC A
MOV ADAddr,C
SETB ADClk
NOP
NOP
NOP
NOP
CLR ADClk
DJNZ R7,C_L1
;补6个脉冲
MOV R7,#6
C_L2:
SETB ADClk
NOP
NOP
NOP
NOP
CLR ADClk
DJNZ R7,C_L2
;等待转换结束
SETB ADCS
NOP
NOP
NOP
NOP
CLR ADCS
;取高2位
NOP
NOP
NOP
NOP
SETB ADDout
SETB ADClk
MOV C,ADDout
MOV ACC.1,C
CLR ADClk
NOP
NOP
NOP
NOP
SETB ADDout
SETB ADClk
MOV C,ADDout
MOV ACC.0,C
CLR ADClk
ANL A,#00000011B ;清A的高6位
MOV R0,A ;保存数据
MOV R7,#8
C_L3:
NOP
NOP
NOP
NOP
SETB ADDout
SETB ADClk
MOV C,ADDout
MOV ACC.0,C
RLC A
CLR ADClk
DJNZ R7,C_L3
SETB ADCS
MOV R1,A
RET
2.驱动程序的使用
该驱动程序中用到了四个标记符号:
ADClk与TLC1543的Clk引脚相连的单片机引脚
ADaddr 与TLC1543的Address引脚相连的单片机引脚
ADDout 与TLC1543的AdDout引脚相连的单片机引脚
ADCS 与TLC1543的 引脚相连的单片机引脚
实际使用时,根据接线的情况定义好ADclk、ADaddr、ADDout、ADCS,将通道号送入R2,调用ADConver,即可从R0、R1中得到转换后的数据,使用非常简单。
;**************************************************
; 平凡单片机工作室
;http://www.mcustudio.com
; Copyright 2003 pingfan's McuStudio
; All rights Reserved
;作者:周坚
;文件名:ad.asm
;功能简介:每隔1s轮流将一个通道的值显示在数码管后4位,首位显示通道号
;**************************************************
gCoun DATA 22H ;通道计数器
CLK bit P1.1 ;时钟端
ADDR bit P1.0 ;地址端
Dout bit P1.4 ;数据输出端
CS bit P1.3 ;片选端
Hidden DATA 10H ;消隐码
Counter DATA 57H ;显示程序用计数器
DISPBUF DATA 58H ;显示缓冲区首地址
ORG 0000H
JMP START
ORG 000BH ;定时中断使用T0
JMP DISP ;定时中断程序
ORG 30H
START:
MOV SP,#5FH ;初始化
MOV P1,#0FFH
MOV P0,#0FFH
MOV P2,#0FFH ;关所有LED及数码管
MOV TMOD,#00000001B
MOV TH0,#HIGH(65536-3000)
MOV TL0,#LOW(65536-3000)
SETB TR0
SETB EA
SETB ET0
MOV Counter,#0 ;计数器清零
MOV DISPBUF+1,#Hidden ;第2位显示器消隐
MOV gCoun,#0 ;通道计数器清零,指向通道0
LOOP:
CALL Delay ;延时1s
MOV R2,gCoun ;送通道号
CALL ADConver
MOV A,R0
MOV R6,A
MOV A,R1
MOV R7,A
CALL HB2
;调用二-十进制转换程序
;入口:待转换的双字节十六进制数在R6和R7中
;出口:转换结束的结果在R3、R4和R5中,压缩BCD码方式存储
MOV A,R4
ANL A,#0F0H
SWAP A ;高低4位互换
MOV DispBuf+2,A ;最高位
MOV A,R4
ANL A,#0FH
MOV DispBuf+3,A
MOV A,R5
ANL A,#0F0H
SWAP A
MOV DispBuf+4,A
MOV A,R5
ANL A,#0FH
MOV DispBuf+5,A
;以上程序段将压缩BCD码转换成非压缩BCD码并送显示缓冲区
MOV DispBuf,gCoun ;将通道号送第1个显示器的显示缓冲区
INC gCoun ;通道号加1
MOV A,gCoun
CJNE A,#11,LOOP ;判断是否到11了
MOV gCoun,#0 ;到则回零
JMP LOOP
;主程序到此结束