4.7.1.2程序清单
转换结果送20H和21H。(20.7H为符号位、20.4为千位、20.(0~3)H为百位、21.
(4~7)H为十位、21.(0~3)H为个位),量程出错送10H。
INITI:SETBIT1;初始化有关部分
SETBEA;IT1=1外部中断l为边沿触发
SETBEX1;EA=1,EX1=1允许外部中断1中断
外部中断1中断服务程序:
PINT1:MOVA,P1
JBACC.4,PINT1;DS1=“1”千位被选通
JBACC.0,PER;Q0=“0”量程出错
JBACC.2,PL1;Q2表示极性“1”为正,“0”为负
SETB07H;20.7H为量程符号位,正为“l”
AJMPPL2
PL1:CLR07H;20.7H为量程符号位,负为“0”
PL2JBACC.3,PL3;SETB04H;千位为1
AJMPPL4;PL3:CLR04H:千位为0
PL4:MOVA,P1;输入转换结果
JNBACC.5,PL4;DS2=“1”百位被选通
MOVR0,#20H:
XCHDA,@ R0;读百位→(20H)0~3
PL5:MOVA,P1;输入转换结果
JNBACC.6,PL5;DS3=“1”十位被选通
SWAPA
INCR0
MOV @ R0,A;读十位→(21H)4~7
PL6:MOVA,P1;输入转换结果
JNBACC.7,PL6;DS4=“1”个位被选通
XCHDA,@ R0:读个位→(21H)0~3
RETI;中断返回
PER:SETB10H;置量程出错标志
RETI
4.7.2ICL7135及其接口
ICL7135为4位半双积分A/D转换器,是动态分时轮流输出BCD码,数据输出为非总线形式,具有精度高、价格低的特点。
4.7.2.1ICL7135特性与输出波形
ICL7135为高精度ADC,其主要特性如下:
(1)总读数为±20000,精度为±1;
(2)输入阻抗大于109Ω;
(3)自校零,保证零电压输入时读数为零;
(4)采用BCD码扫描输出;
(5)设有6个I/O辅助信号,可与设有UART的微处理器或其他复杂电路接口;
(6)输出与TTL电路兼容。
ICL7135为28线双列直插式封装。
ICL7135由±5V电源供电,V+接+5V,V-接-5V,DGND为数字地,即接±5V电源的地。VR为基准电压高电位输入端,AGND为模拟地,它既是模拟信号的地又是基准电压的低电位端。INT为积分器输出,接积分电容。BUF为缓冲放大器的输出,接积分电阻。AZ为自动调零输入端,接自动调零电容。CR+为基准电容的高电位端,CR-为基准电容低电位端。INHI为模拟信号输入的正端,INLO为模拟信号输入的负端。CLK为时钟信号输入端,R/H为运行或保持操作端。D1、D2、D3、D4、D5为位扫描输出端,其中D1为个位,D5为万位。B1、B2、B3、B4为BCD码数据,B1为低位,B4为高位。POL为信号极性输出,信号为正时,POL为“1”,OR为超量程状态输出,UR为欠量程输出。
BUSY为忙信号输出,它指示A/D是正在进行转换还是已转换完毕。ST为数字选通输出,用以通知微处理器或其他器件准备读取ICL的输出数据。
ICL7135在工作期间总是从B8、B4、B2、B1引脚将转换后五位数字的BCD码从高位到低位依次循环扫描输出;同时,引脚D5~D1不断送出相应扫描信号,每个位扫描信号宽度为200个时钟周期。数字输出选通信号ST在每个转换周期内出现一次,一次转换共有5个负脉冲,ST总是出现在每个扫描信号的中部,其宽度为二分之一时钟周期。
4.7.2.2ICL7135与MCS51单片机I/O直接连接接口
只画出了数据线(B8,B4,B2,B1)、位控线(D1~D5)及相应的标志、状态控制线。
89C51只能用本身的I/O口线与ICL7135相连。为了减少I/O口线的占用,使用了74LS157(4选1数据选择器)。使“万”位数及其标志信号B8、B4、B2、B1与P1.3~P1.0共用I/O口线。其分时传送通过D5控制74LS157的选择端SEL实现。SEL输入低电平时,选择1A~4A输入端;SEL输入高电平时,选择1B~4B输入端。当每一个转换周期结束后ST端发出5个负脉冲信号分别与D5(万位)、D4(千位)、D3(百位)、D2(十位)、D1(个位)位选通信号相对应,在位选通信号(D5~D1)控制下,从B8、B4、B2、B1端送出相应位的BCD码。万位数只能输出B1的0或1,其余三位为OR(过量程)、UR(欠量程)和POL(正、负)标志信号。R为自动转换/停止控制。悬空状态时自行产生高电平,按自动转换方式工作。R/H输入低电平时,本次转换完后进入停止状态,输出值保持不变。
根据对ST和D1的处理方法不同,可以有三种接口和软件处理方法。
(1)查询法:由89C51的10根I/O口线与ICL7135的D5~D1、R/H、B8、B4、B2、B1、OR、UR、POL相连。这种方法程序结构简单,但占用CPU时间。
(2)中断查询法:这种方法使用较为普通。ST选通信号与89C51的INT0/INT1相连。在主程序中用P3.3来启动ICL7135A/D转换,并开放外部中断。在中断处理中再对D5~D1进行查询,每个采样周期中输出结果要经过5次中断处理。
(3)中断计数法:这种方法是依据ST脉冲序列的序号与万、千、百、十、个位BCD码有严格的对应关系来设计的。用一内存单元存入除D5外尚待读入的BCD码位数(#04H),然后每中断一次位数减1,位数减至零则个位数BCD码读完。这种方法可以省去D1~D4的接线,从而简化硬件结构。具体程序如下:
MOVR1,#20H
CJNE @ R1,#00H,INT2
LJMPINT5
INT2:ADDA,23H
MOV23H,A
DJNZ20H,RL4
RETI
INT5:JBACC.3,OR;过量程处理,OR略
JBACC.2,UR;欠量程处理,UR略
CLRF0;F0为符号标志
JBACC.1,INT4
SETBF0
INT4:ANLA,#01H
SWAPA
MOV23H,A
MOV20H,#4H
RETI
RL4:MOVR7,#04H
RL5:MOVR1,#23H
MOVR2,#03H
CLRC
RL6:MOVA,@ R1
RLCA
MOV @ R1,A
DECR1
DJNZR2,RL6
DJNZR7,RL5
RETI
4.7.2.3ICL7135通过8155连接接口
在较为复杂的应用系统中,采用8155构成ICL7135的接口电路较为方便。在这样的接口电路中,单片机硬件资源开销最少,而且8155中的计数器还可提供ICL的时钟要求。
当ICL7135的高位选通信号D5输出为高电平,万位数B1和极性(POL)、过量程(OVER)、欠量程(UNDER)标志送入8155的PA0~PA3;当D5输出为低电平时,ICL7135的B1、B2、B4、B8输出低位BCD码,仍然送入PA0~PA3。
8155的A口工作于选通输入方式,ICL7135的数据输出选通脉冲线ST接至8155A口的数据选通信号线ASTB(PC2)上,8155PA口中断请求线AINTR(PC0)反向后接89C51INT1端。当ICL7135完成一次A/D转换后,产生5个数据选通脉冲,分别将各位BCD码和位标志送至PA口。PA口接收到一个数据后,中断标志线AINTR(PC0)变为高电平。
向89C51申请中断,中断响应后将8155A口的数据读入内存。
A/D转换时钟由8155定时器输出。8155定时器置成方波发生器,若89C51晶振为12MHz,ALE输出2MHz频率信号给8155定时器输入端TIN,定时器进行16分频后由输出端(TOUT)输出,125kHz方波作为ICL7135的时钟。
由于ICL7135的A/D转换是自动进行的,完成一次A/D转换后,选通脉冲的产生和89C51的中断开放是异步的,为了保证读出数据的完整性,只对最高位(万位)中断请求做出响应,而低位数据输入采取查询方法。
它将A/D转换结果送入89C51片内RAM的20H、21H、22H单元中。
主程序清单:
MAIN:MOVDPTR,#7F04H;8155定时器初始化
MOVDA,#10H;16分频
MOVX @ DPTR,A
INCDPTR
MOVA,#40H;16分频连续方波
MOVX @ DPTR,A;
MOVDPTR,#7F00H;控制字D6H→8155
MOVA,#0D6H;
MOVX @ DPTR,A;
MOVSP,#60H;设堆栈
MOV20H,#00H;20H清零
MOVP2,#7EH;指向8155RAM
MOVR0,#00H;8155RAM首地址
MOVR7,#55H;置8155RAM个数为3→85=225
MOV1E,#84H;开放外部中断1及CPU中断
WDIN:JBCPSW.5,TRAN;判A/D结果缓冲器装满数据否?
AJMPWDIN;
TRAN:MOVA,20H;A/D结果传送到外部RAM
MOVX @ R0,A;
INCR0
MOVA,21H
MOVX @ R0,A
INCR0
MOVA,22H
MOVX @ R0,A
INCR0
DJNZR7,WDIN;
ACALLPDATA;调用数据处理子程序,处理方法因实际系统而异,这里从略
MOVR0,#00H:重置8155RAM首地址
MOVR7,#55H;重置存数个数
中断服务程序程序清单:
PINTI:MOVDPTR,#7F0lH;读8155A口的A/D结果
MOVXA,@ DPTR;
MOVR2,A;万字位入R2
ANLA,#0F0H;
JNZPRI;D5=0,返回
MOVR1,#20H;
MOVA,R2;
ANLA,#01H;
XCHDA,@ R1;
MOVA,R2;
ANLA,#0EH;
SWAPA
XCHDA,@ R1;
MOV @ R1,A
INCR1
MD4:MOVXA,@ DPTR;读千位
JNBACC.7,WD4
SWAPA
MOV @ Rl,A;千位→(21).4~7
WD3:MOVXA,@ DPTR;读百位
JNBACC.6,WD3
XCHDA,@ R1;百位→(21).0~3
INCR1
WD2:MOVXA,@ DPTR;
JNBACC.5,WD2
SWAPA
MOV @ Rl,A;十位→(22).4~7
WD1:MOVXA,@ DPTR
JNBACC.4,WD1
XCHDA,@ R1;个位→(22).0~3
SETBPSW.5;置一次A/D结果读出标志
PRI:RETI