MOVX @DPTR,A ACALL DELY INC R1
MOV A,R2 RR A
;字段码送PB口 ;调用1ms延时
;未完,字位码右移一位
;指向下一字符
JB ACC.0,FINA ;判断8位显示完否 MOV R2,A SJMP LOOP RET
;转下一位显示
FINA:
TAB1: DB 6FH,5CH,5CBH,5EH ;good by的字段码表
DB 00H,7CH,2EH,00H
DELY: MOV R7,#02H ;延时子程序 DEL1: MOV R6,#0FFH DEL2: DJNZ R6,DEL2 并编程。
解:8031扩展的8255 I/O口,连接一个4行6列键盘电路如下图所示。
P0D0~7DALEQ0Q1Q7GCED0~7DA0A1CS
DJNZ R7,DEL1 RET
7.8.利用8031扩展的8255 I/O口,连接一个4行6列键盘,要求画出电路图和键盘管理程序流程图,
PA5PA4PA3PA2PA1PA0+5V80518255APB00PB16RD172839451011RDWRRSTPB2121314151617WR181920212223RESETPB38051单片机与8255A接口的键盘电路的连接程序流程图略,参考程序如下:
MAIN: MOV R0,#73H
MOV A,#82H MOVX
@R0,A
;8255控制口
;8255控制字(A口输出,B口输入)
在键扫描子程序中共调用另外两个子程序,分别是:DELY 12ms延时子程序,软件消抖动。 DECI 判断子程序,判断是否有键闭合。程序如下:
DECI:MOV R0,#70H ;PA口地址
MOV A,#00H MOVX @R0,A
INC R0 CPL A
;PB口地址
;A取反,无键按下则全0
MOVX A,@R0 ;读PB口
;PA口送00H
ANL A,#0FH RET
;屏蔽A高半字节
执行DECI子程序的结果是:有闭合键则(A)≠0,无闭合键则(A)=0。 键盘扫描程序: KEYB: ACALL DECI ;检查有键闭合否
LK1: LK2: LK4:
LONE: LTWO: LTHR: LKP : LK3:
NEXT:`
KND: DELY: DEL1:
JNZ LK1
;A≠0则转移
AJMP KEYB
ACALL DELY ;共12ms去抖动 ACALL DECI ;再检查有键闭合否 JNZ LK2
;有键闭合,转LK2
AJMP KEYB ;无键闭合,延时6ms后转KEYB MOV R2,#FEH ;扫描处值送R2
MOV R4,#00H ;扫描列号送R4 MOV R0,#70H ;建立PA口地址 MOV A,R2
MOVX @R0,A ;扫描初值送PA口 INC R0
;指向PB口
MOVX
A,@R0 ;读PB口
JB ACC.0,LONE ;ACC.0=1第1行无键闭合,转LONE MOV A,#00H ;装第1行行值 AJMP
LKP
JB ACC.1,LTWO ;ACC.1=1第2行无键闭合,转LTWO
MOV A,#06H ;装第2行行值
AJMP
LKP
JB ACC.2,LTHR ;ACC.2=1,第3行无闭合键,转LTHR
MOV A,#0CH ;装第3行行值
AJMP
LKP
JB ACC.3,NEXT ;ACC.3=1,第4行无键闭合则转NEXT
MOV A,#12H ;装第4行行值 ADD A,R4 ;计算键码 PUSH ACC
;保护键码
ACALL DECI
;查键是否继续闭合,若闭合再延时 JNZ LK3 POP ACC ;若键起,则键码送A RET INC R4
;扫描列号加1
MOV A,R2
JNB ACC.5,KND ;第5位为0,已扫完最高位则转KND RL A MOV R2,A AJMP LK4
;进行下一列扫描 AJMP KEYB ;扫描完毕,开始新的一次
MOV R7,#18H ;延时12ms子程序(晶振12MHZ)
DJNZ R6,DEL1
DJNZ RET
R7,DELY
键盘扫描程序的运行结果,是把闭合键的键码放在累加器A中。然后再根据键码进行其它处理。 7.9.以DAC0832为例说明D/A转换器单缓冲接口方式的实现。
解:所谓单缓冲方式就是使0832的两个寄存器中有一个处于直通方式,而另一个处于
受控的锁存方式。在实际应用中,如果只有一路模拟量输出,或虽有几路模拟量但并不要求同步输出的情况下,就可采用单缓冲方式。单缓冲方式如图7.30所示,DAC0832的ILE接高电平,允许输入数据锁存,WR1和WR2都与8051的WR相接,CS和XFER与8051的P2.7(A15)相连,假设无关地址线为1,则0832的口地址为7FFFH。这种连接方法是把0832看作8051的一个带有数据锁存功能的输出设备。CPU把一个8位数据#data写入DAC寄存器,也就实现了一次D/A转换,输出一个与#data对应的模拟量。转换过程的程序如下:
+5VDAC0832P0ALE8051P2.7WR74LS373GDI0~DI7CSXFERWR1WR2VccILEVrefRfbIout1Iout2AGNDDGND-A+Vout图7.30 DAC0832单缓冲方式接口
MOV DPTR,#7FFFH ;指向0832的口地址
MOV A,#data ;取将要转换的8位数据量送A MOVX @DPTR,A ;写入0832,进行一次D/A转换并输出
7.10.以DAC0832为例说明D/A转换器双缓冲接口方式的实现。
解:所谓双缓冲方式,就是把DAC0832的两个锁存器都接成受控锁存方式。双缓冲方式DAC0832的连接如图7.35示。
为了实现寄存器的可控,应当给寄存器分配一个地址,以便能按地址进行操作。图中是使用地址译码
图7.35 DAC0832的双缓冲方式的连接
输出分别接CS和XFER实现的。然后再给WR1和WR2提供写选通信号。这样就完成了两个锁存器都可控的双缓冲接口方式。
由于两个锁存器占据两个地址,因此在程序中需要使用两条传送指令,才能完成一个数字量的模拟转换。假定输入寄存器地址为FEH,DAC寄存器地址为FFH。则完成一次数/模转换的程序如下:
MOV R0,#FEH
MOVX @R0,A INC R0
MOVX @R0,A
;装入输入寄存器地址 ;转换数据送输入寄存器 ;产生DAC寄存器地址 ;数据通过DAC寄存器
7.11.A/D转换器转换数据的传送有几种方式? 答:A/D转换器转换数据的传送有3种方式: 1.定时传送方式
对于一种A/D转换器来说,转换时间作为一项技术指标是已知和固定的。例如ADC0809转换时间为128μs,相当于6MHZ的MCS-51单片机共64个机器周期。
2.查询方式
A/D转换芯片有表明转换完成的状态信号,例如ADC0809的EOC端。因此可以用查询方式,软件测试EOC的状态,即可确知转换是否完成,并接着进行数据传送。
3.中断方式
把表明转换完成的状态信号EOC作为中断请求信号,以中断方式进行数据传送。 7.12.简述逐次逼近式A/D转换的原理。 答:略
7.13.多片D/A转换器为什么必须采用双缓冲接口方式?
答:双缓冲方式多用于多路数/模转换系统,以实现多路模拟信号同步输出的目的。
第14题图 第15题图
7.14.使用D/A转换器产生梯形波,梯形底部在0V,梯形顶部在+2.5V,平顶宽度自定,请编程实现。 解:采用图7.30 DAC0832单缓冲方式接口,参考程序如下:
MOV MOV MOVX INC CJNZ LCALL MOV DEC JNZ LCALL MOV DJNZ DJNZ RET
DPTR,#7FFFH;输入寄存器地址 A,#00H @DPTR,A A
;转换初值 ;D/A转换 ;转换值增量 ;调延时程序
UP:
A,#80H,UP;80H为+2.5V输出对应的数字量 DELAY A,#7FH @DPTR,A A
A,DOWN DELAY R7,#2 R6,#0FFH R6,DL1 R7,DL2
DOWN: MOVX
DELAY: MOV DL2: DL1:
7.15.使用D/A转换器产生如图所示的三角波,请编程实现 解:根据图7.30,参考程序如下:
MOV
DPTR,#7FFFH
相关推荐: