10.1在80C51应用系统中扩展一片8255外界4位显示器和4位BCD码拨盘(参考题图10-1电路),试画出该部分的接口逻辑电路、并编写相应的显示子程序和读拨盘的子程序。
答:参考题图10-1设计电路如题图10-2所示,此外在PC0~3的各引脚上均接有一下拉电阻,图中省略没画。由题图10-2电路知A、B、C口和命令口地址分别如下:
ADDR_PORTA EQU 07FFCH ;A口地址
ADDR_PORTB EQU 07FFDH ;B口地址
ADDR.PORTC EQU 07FFEH ;C口地址
ADDR_CMND EQU 07FFFH ;命令口地址
;定义4个BCD码变量
CODE1 EQU 30 H
CODE2 EQU 31H
CODE3 EQU 32H
CODE4 EQU 33H
ORG 0030H
MOV A,#10000001B ;设置8255的PA、PB口为输出
MOV DPTR,#ADDR_CMND ;PC口高4位为输出,低4位为输人
MOVX @DPTR,A
PRG_START:
MOV CODEl,#00H ;初始化4个BCD码值
MOV CODE2,#00H
MOV CODE3,#00H
MOV CODE4,#00H
MOV R3,#8FH ;置码盘扫描码初值
MOV R2,#04H ;置码盘扫描次数
FIND_CODE:
MOV DPTR,#ADDR_PORTC
MOV A,R3
MOVX @DPTR.A ;将码盘扫描码送出
MOVX A,@DPTR;读PC口低4位
MOV Rl,A ;暂存读数
MOV C,ACC.3
MOV A,CODEl
RLC A
MOV CODEI,A ;将ACC.3从左移人CODEl
MOV A,Rl ;取读数
MOV C,ACC.2
MOV A,CODE2
RLC A
MOV CODE2.A ;将ACC.2从左移人CODE2
MOV A,R l;取读数
MOV C,ACC.1
MOV A,CODE3
RLC A
MOV CODE3,A ;将ACC.l从左移人CODE3
MOV A,Rl ;取读数
MOV C,ACC.0
MOV A,CODE4
RLC A
MOV CODE4,A ;将ACC.0从左移人CODE4
MOV A,R3
CLR C
RRC A ;更改扫描位
MOV R3,A
DJNZ R2,FIND_CODE ;4次扫描末完,继续
MOV Rl,#CODEl ;将CODEl地址送Rl
MOV R2,#04H ;设置动态扫描位数
MOV R3,#0F7H ;设置当前扫描位
DSP_LP:
MOV A,#OFFH
MOV DPTR,#ADDR_PORTA
MOVX @DPTR,A ;关显示
MOV A,@Rl ;读当前地址内容
ADD A,#03H ;转换成段码
MOVC A,@A+PC
AJMP DSP_LPl
DM_TAB:
DB 03FH,006H,05BH,04FH,066H,06DH,07DH,007H
DB 07FH,06FH,000H,000H,000H,000H,000H,000H ;A~F不显示'
DSP_LP1:
MOV DPTR, # ADDR_PORTB ;设段码地址
MOVX @ DPTR, A ;将段码送出
MOV A,R3 ;取位码
MOV DPTR, #ADDR_PORTA ;设位码地址
MOVX @ DPTR, A ;将位码送出
RR A ;位码右移
MOV R3,A
ACALL DELAY_10MS ;调延时l0ms子程序(在此省略)
DJNZ R2,DSP_LP ;显示未完,继续
AJMP PRG_START ;转去执行读码盘
10.2 用串行口扩展4个发光数码管显示电路,编程使数码管轮流显示"ABCD"和"EFGH",每秒钟变换一次。
答:根据题图10-3中电路,设计程序如下
ORG 0030H
CLR P1. 0 ;清显示
SETB P1. 0
MOV SCON,#00 H ;设置串口工作方式
EX10_2A:
MOV R1,#04H ;显示位数
MOV R2,#00H ;地址偏移量
EX10_2B:
MOV A,R2 ;取显示段码
ADD A,#03H
MOVC A,@A+PC
AJMP EX10_2C ;跳转
DB 77H,7CH,39H,5EH ;A,B,C,D的段码(本例中为共阳极)
EX10_2C:
MOV SBUF,A ;启动串口发送
JNB TI, $ ;等待一帧发送完毕
CLR TI ;清发送中断标志
INC R2 ;修改地址偏移量
DJNZ R1,EX10_2B ;一屏显示未完,继续
ACALL DELAY ;调15延时子程序(省略)
MOV R1,#04H ;下一帧显示
MOV R2,#00H
EX10_2D:
MOV A,R2
ADD A,#03H
MOVC A,@A+PC
AJMP EX10_2E
DB 79H,71H,3DH,76H ;E,F,G,H的段码
EX10_2E:
MOV SBUF,A
JNB TI, $
CLR T1
INC R2
DJNZ R1,EX10_2D
CALL DELAY ;调1s延时子程序(省略)
AJMP EX10_2A ;循环
10.3 试说明非编码键盘的工作原理。为何要消除键抖动,又为何要等待键释放?
答:由非编码键盘所提供的行和列矩阵,通过接口电路或者单片机的I/O口与CPU相连。
CPU可以采用查询或中断方式了解有无键输人并检查是哪一个键按下,且将该键号送入
CPU。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能。
由于目前,无论是按键或是键盘的大部分,都是利用机械触点的合、断作用。机械触点在闭合及断开瞬间由于弹性作用的影响,在闭合及断开即释放瞬间均有抖动过程,从而使电压信号也出现抖动。抖动时间长短与开关的机械特性有关。
按键的稳定闭合时间,由操作人员的按键动作所确定,一般为十分之几秒至几秒时间。在此期间电压信号将出现多次变化很容易产生误判。为了保证CPU对键的一次闭合仅作一次键输人处理,必须去除抖动影响。
当键释放时同样存在键抖动影响,为了确保键释放也需要等待和判别。
10.4 试设计一个用8255与16键键盘连接的接口电路,并编写键码识别程存。
答:由题图10-4电路知C口和命令口地址分别如下
题图10-4
ADDR.PORTC EQU 07FFEH ;C口地址
ADDR_CMND EQU 07FFFH ;命令口地址
ORG 0030H
MOV A,#10001000B ;设置PC口位(3~0)为输出,位(7~4)为输人
MOV DPTR,#ADDR_CMND ;命令口地址送DPTR
MOVX @DPTR,A
MOV DPTR,#ADDR_PORTC
MOV A,#0F0H
MOVX @DPTR,A ;将PC口位(3~0)置0
KEY: ACALL KS ;调用KS判断有键按下吗?
JNZ K1 ;有键按下则转Kl
AJMP KEY ;无键按下转KEY
Kl: ACALL DLY_20MS ;有键按下延时去抖动
ACALL KS ;调用KS再判断有无键按下?
JNZ K2 ;键按下,转逐列扫描
AJMP KEY ;误读键,返回
K2:MOV R2,#0FEH ;首列扫描宇送R2
MOV R4,#00H ;首列号送R4
K3:MOV DPTR,#ADDR_LPORTC ;将列扫描字(R4低4位)送PC位(3~0)
MOV A,R2
MOVX @DPTR,A
NOP
MOVX A,@LDPTR ;读PC位(7~4)
JB ACC.4,L1 ;第0行无键按下,转查第1行
MOV A,#00H ;有键按下,置第0行首键号
AJMP LK ;转求键号
LI: JB ACC.5,L2 ;第1行无键按下,转查第2行
MOV A,#04H ;有键按下,置第1行首键号
AJMP LK ;转求键号
L2: JB ACC.6,L3 ;第2行无键按下,转查第3行
MOV A,#08H ;有键按下,置第2行首键号
AJMP LK ;转求键号
L3: JB ACC.7,NEXT ;第3行无键按下,改查下1列
MOV A,#0CH ;有键按下,置第3行首键号
LK:ADD A,R4 ;求键号:形成键码送A
PUSH ACC ;键码入栈保护
K4: ACALL DLY_20MS ;等待键释放
ACALL KS
JNZ K4
POP ACC ;键释放,键码出栈
RET ;键扫描结束,返回
NEXT: INC R4 ;修改行号
MOV A,R2
JNB ACC.3,KEY ;第4列为0,己扫完最高列,转开始
RL A ;末扫描完,扫描宇左移1位,变为下1列扫描
MOV R2,A ;扫描字送回R2
AJMP K3 ;转列扫描
;---------------------------------------
KS: MOV DPTR,#ADDR_PORTC
MOV A,#0F0H
MOVX @DPTR,A ;全扫描字OH送PC口低4位
NOP
MOVX A,@DPTR ;读人PC高4位
ORL A,#0FH ;屏蔽低4位
CPL A ;变成正逻辑,以高电平表示有键按下
RET
10.5 什么是D/A转换器?筒述T形电阻网络转换器的工作原理。
答:在计算机控制的实时控制系统中,有些被控对象需要用模拟量来控制,模拟量在此指连续变化的电量。此时,就需要将数字量转换为相应的模拟量,以便操纵控制对象。这一过程即为"数/模转换"D/A(Digit to Analo9)。能实现D/A转换的器件称为D/A转换器或DAC。
一个二进制数是由各位代码组合起来的,每位代码都有一定的权。为了将数字量转换成
模拟量,应将每一位代码按权大小转换成相应的模拟输出分量,然后根据叠加原理将各代码对应的模拟输出分量相加,其总和就是与数字量成正比的模拟量,由此完成D/A转换。
为实现上述D/A转换,需要使用解码网络。解码网络的主要形式有二进制权电阻解码网络和T形电阻解码网络。
T形电阻网络整个电路是由相同的电路环节所组成,每节有两个电阻(R和2R);一个开
关,相当于二进制数的一位,开关由该位的代码所控制。由于电阻接成T形,故称T形解码网络。此电路采用了分流原理实现对输入位数字量的转换。题图10-5为可以转换4位二进制数的T形电阻网络D/A原理图。图中无论从哪一个R-2R节点向上或向下看,等效电阻都是2R。从d0~d3,看进去的等效输人电阻都是3R,于是每一开关流人的电流不可以看做相等,即I=VREF/3R。这样由开关d0~d3,流人运算放大器的电流自上向下以1/2系数逐渐递减,依次为1/2I、1/4I、1/8I、1/16I。设d3d2d1d0为输人的二进制数字量,于是输出的电压值为:
V0= 一RFB∑Ii =
一(RFB×VREF/3R) ×(d3×2-1十d2×2-2十d1×2-3十d0×2-4)=
一[(RFB(VREF/3R) ×2-4] ×(d3×23十d2×22十dl×21十d0×20)
式中d0~d3取值为0或1,0表示切换开关与地相连,1表示切换开关与参考电压VREF接通,该位有电流输入。这就完成了由二进制数到模拟量电压信号的转换。由此公式可以看出VREF
和V0的电压符号正好相反,即要使输出电压V0为正,则VREF必须为负。
题图 10-510.6 DAC0832与80C51单片机连接时有哪些控制信号?其作用是什么?
答 见题图10-6,DAC0832与80C51单片机连接时的控制信号主要有ILE、CS、 WR1、XFER、WR2。它们的作用如下:
● ILE:数据锁存允许控制信号输人线,高电平有效。
● CS:片选信号输人端,低电平有效。
● WRl:输人寄存器的写选通输人端,负脉冲有效(脉冲宽度应大于500ns)。当CS为
"0",ILE为"1",WR1有效时,DI0~DI7,状态被锁存到输人寄存器。
●XFER:数据传输控制信号输人端,低电平有效。
●WR2:DAC寄存器写选通输人端,负脉冲(脉冲宽度应大于500ns)有效。当XFER为
"0"且WR2有效时,输人寄存器的状态被传送到DAC寄存器。
题图10-6
10。7 在 一个 晶振 为 12MHz的 80C51应 用 系统 中,接 有一 片DAC0832,它的 地址为 7FFFH,输出电压为 0~5V。请画出有关逻辑框图,并编写一个程序,使其运行后, DAC能输出一个矩形波,波形占空比(为脉冲宽度与周期之比)为 1: 4。高电平时电在为 2.5V,低电平时为1.25V。
答:有关逻辑框图见题图10-6,编程序如下:
MOV DPTR,#7FFFH ;置口地址
EX10_7A:
MOV A,#7FH ;将2.5V送出
MOVX @DPTR,A
ACALL DELAY ;调延时子程序(省略)
MOV A,#3FH ;将1.25V送出
MOVX @DPTR,A
ACALL DELAY ;调延时子程序
ACALL DEL_AY ;调延时子程序
ACALL DELAY ;调延时子程序
AJMP EXl0_7A ;循环
10.8 试说明逐次逼近A/D转换器的工作原理。
答:逐次逼近式A/D转换器的转换原理即"逐位比较",其过程类似于用砝码在天平上称物体重量。题图10-7为一个N位的逐次逼近式A/D转换器原理图。它由N位寄存器、D/A转换器、比较器和控制逻辑等部分组成,N位寄存器代表N位二进制数码。
题图10-7
当模拟量VX送入比较器后,启动信号通过控制逻辑电路启动A/D开始转换。首先,置N位寄存器最高位(Dn-1)为"1",其余位清"0";N位寄存器的内容经D/A转换后得到整个量程
一半的模拟电压心VN与输人电压VX比较。若VX≥VN时,则保留Dn-1=1 ;若VX 与VX比较,重复上述过程,直至判别出D0位取"1"还是取"0"为止,此时控制逻辑电路发出转换结束信号DONE。这样经过N次比较后,N位寄存器的内容就是转换后的数字量数据,整个转换过程就是这样一个逐次比较逼近的过程。 10·9 在一个晶振为12MHz的80C51系统中接有一 片A/D器件ADCO809,它的地址为 0EFF8H~0EFFFH。 试画出有关逻辑图 ,并编写定时采样 0~3通道的程存。设采样频率为 2ms 1次,每个通道采 50个数。把所采的数按 0、1、2、3通道的顺存存放在以 3000H 为首址的片外数据存储区中。 答有关逻辑框图见题图10-8,编程序如下 题图10-8 MOV Rl,#50 ;设置采样次数 MOV R5,#30H ;数据存放首地址 MOV R6,#00H EX10_9A: MOV R2,#04H ;采样通道数 MOV R3,#0EFH ;设置0通道地址 MOV R4,#0F8H EX10_9B; MOV DPH,R3 MOV DPL,R4 MOVX @DPTR,A NOP JB INTl,$ ;等待转换完成 MOVX A,@DPTR ;将转换结果读入 INC R4 ;通道地址加1 MOV DPH,R5 ;取存储地址 MOV DPL,R6 MOVX @DPTR,A ;保存结果 INC DPTR ;修改地址 MOV R5,DPH ;保存地址 MOV R6,DPL LCALL DLY_2MS ;调延时2ms子程序(省略) DJNZ R2,EX10_9B ;4路转换未完,继续 DJNZ R1,EX10_9A ;50次转换未完,继续 LJMP $ ;结束