第三章第7题:
指出下列指令中哪些是非法的?如果非法请改正。 INC DPTR ;对 DEC DPTR ;错 MOV A,@R1 ;对 MOV A,@R2 ;错 MOV 30H,@R3 ;错 MOV 30,@R0 ;错 RL B ;错 JNZ A,NEXT ;错 JNB 08H,NEXT ;错 答:参考附录A。
第三章第九题:
试编写一段程序,其功能为:将33H~38H中6个单字节BCD码拼成3个压缩的BCD码存放在32H开始的单元中。 答案:
org 0000h ljmp start org 0100h start:
mov r0,#33h ;R0记录起始地址 mov r1,#32h ;R1记录转换后的存储单元起始地址 mov a,@r0 ;将33H中的数放到A中 mov r6,a inc r0 ;指向34H mov a,@r0 inc r0 ;指向35H swap a add a,r6 mov @r1,a ;33H和34H单元中的数据组合后放到32H当中 inc r1 ;指向33H mov a,@r0 ;将35H中的数据放到A中 inc r0 ;指向36H mov r6,a mov a,@r0 ;将36H当中的数据放到A中 inc r0 ;指向37H swap a add a,r6 mov @r1,a ;将35H和36H中的数据组合后放到34H当中 inc r1 ;指向34H mov a,@r0 ;将37H中的数据放到A中
inc mov mov swap add mov end
r0 r6,a a,@r0 a a,r6 @r1,a
;指向38H
;将38H中的数据放到A中
;将37H和38H的数据组合后放到34H当中
第四章第七题:
设有一个起始地址为FIRST+1的数据块,存放在内部RAM单元,数据块长度在FIRST单元而且不为0,要求统计该数据块中正偶数和负奇数个数,并将他们分别存放在PAPE单元和NAOE单元。试画出能实现上述要求的程序流程图和编出相应程序。 答案:
FIRST equ 55h PAPE equ 40h NAOE equ 41h ;这三个值可随意选取,这里选取以便能在软件中验证 org 0000h ljmp 0100h org 0100h
start: mov r0,#FIRST
mov r7,@r0 ;将数据块长度放到R7中 inc r0 ;r0中保存了数据起始地址 mov PAPE,#0 mov NAOE,#0
next: mov a,@r0
jb acc.7,negative ;如果为负数则跳到negative处进行处理,为正数则接着执行下面的语句 jb acc.0,kk ;为正数,若不为偶数则跳到kk处 inc PAPE ;为正偶数,则PAPE加1 sjmp kk
negative: jnb acc.0,kk ;为负偶数,跳到kk处进行处理
inc NAOE ;为负奇数,则NAOE加1
kk: djnz r7,next ;如果数据未检测完,继续检测
end
第四章第九题:
在内部RAM中,有一个以BLOCK为起始地址的数据块,块长在LEN单元,请用查表指令编写一个程序,先检查它们是否是16进制数中的A~F,若是16进制数中的A~F则把它们变为ASCII码;若不是,则把它们变为00H。 答案:
BLOCK equ 40h
LEN equ 10h org 0000h ljmp start org 0100h
ASCIIMAP:
db 00h,00h,00h,00h,00h,00h,00h,00h db 00h,00h,41h,42h,43h,44h,45h,46h start: mov r0,#BLOCK
mov r7,#LEN
next:
mov a,@r0 cjne a, #0Ah, nl1
nl1: jnc kk
cjne a,#0Fh,nl2 nl2: jc dispose
sjmp kk
dispose:
mov a,@r0 mov dptr,#ASCIIMAP movc a,@a+dptr mov @r0,a
kk:
inc r0 djnz r7,next end
第四章第十一题:
已知内部RAM的MA(被减数)和MB(减数)中分别有两个带符号数。请编一个减法程序,并把差存入RESULT和RESULT+1(低8位在RESULT单元)中。 答案:
MA equ 30h MA1 equ 31h MB equ 32h MB1 equ 33h RESULT equ 34h RESULT1 equ 35h org 0000h ljmp start org 0100h
start:
mov r3,#MA mov r4,#MA1 mov r6,#MB
mov mov mov acall
dsub:
mov cpl mov lcall ret
dadd:
mov mov mov xrl mov mov clr mov mov clr mov jc lcall mov jb dab1:
mov mov mov clr ret dabe: setb ret dab2:
lcall mov jnb lcall cpl sjmp nsub:
mov clr c subb mov mov
r7,#MB1 r4,#RESULT r3,#RESULT1 dsub a,r6 acc.7 r6,a dadd
a,r3 c,acc.7 20h,c a,r6 c,acc.7 a,r3 acc.7 r3,a a,r6 acc.7 r6,a dab2 nadd a,r3
acc.7,dabe a,20h acc.7,c r3,a ov ov nsub a,r3
acc.7,dab1 cmpt 20h dab1 a,r4 a,r7 r4,a a,r3
subb a,r6 mov r3,a ret
nadd: mov a,r4
add a,r7 mov r4,a mov a,r3 addc a,r6 mov r3,a ret
cmpt: mov a,r4
cpl a add a,#01h mov r4,a mov a,r3 cpl a addc a,#00h mov r3,a ret
第五章第五题:
已知定时器/计数器0工作于方式0,振荡频率为6MHz,计数初值为0FEH,定时时间是多少? 答案:
T = (213 - 计数初值)*晶振周期*12
= (213 - 254)*(1/6)*10-6*12 = (8192 - 254)*(1/6)*10-6*12 = 15876us
第五章第六题:
已知选用定时器1工作模式2作波特率发生器,晶振频率为6MHz,计数初值为0FDH,求波特率是多少? 答案:
波特率 =(2SMOD/32)*fosc/(12*(256-X)) ;X为计数初值
=6*106/(32*12*2) =7812
第五章第十题:
试写出/INT0为边沿触发方式的中断初始化程序。 答案:
SETB IT0 SETB EA SETB PX0
SETB EX0
第五章第十一题:
晶振频率为6MHz的MCS-51单片机,使用定时器0以定时方法在P1.0输出周期为400us、占空比为10:1的矩形脉冲,以定时工作方式2编程实现。 答案:
org 0000h ljmp start org 0100h
start:
anl tmod,#0f0h orl tmod,#02h mov th0,#0ech mov tl0,#0ech mov ie,#00h setb tr0
loop:
jbc tf0,loop1 sjmp loop
loop1:
cpl p1.0 mov th0,#4ch mov tl0,#4ch sjmp loop end
第五章第十五题:
请用中断法编出串口方式1下的发送程序。设单片机主频为6MHz,波特率为600bps,发送数据缓冲器在外部RAM,开始地址为RBLOCK,接收数据区长度为30,采用偶校验(数据块长度不发送)。 答案:
RBLOCK equ 0700h org 0h ljmp start org 0100h
start:
mov tmod,#20h mov tl1,#0e6h mov th1,#0e6h setb tr1 mov scon,#50h; 串行口初始化为方式1,允许接收 mov pcon,#00h; smod = 0
fmt-ram:
mov r7,#30
mov mov
tx-ack:
mov mov
wait1:
jbc sjmp
rx-yes:
jbc sjmp
next1:
mov cjne
tx-news:
movx mov jnb inc
kk:
inc
wait3:
jbc sjmp
next2:
djnz
tx-sum:
mov mov
wai4:
jbc sjmp
rx-0fh;
jbc sjmp
if-0fh:
r6,#00; 清累加和寄存器 dptr,#RBLOCK a,#06h sbuf,a
;发送呼叫信号
ti,rx-yes wait1 ri,next1 rx-yes
;等待发送完
;接收乙机回答
a,sbuf ;判乙机是否同意接收 a,#00h,tx-ack ;不同继续呼叫 a,@dptr sbuf,a psw.0,kk r6 dptr ti,next2 wait3 r7,tx-news a,r6 sbuf,a ri,rx-0fh wait4 ri,if-0fh rx-0fh
mov a,sbuf cjne a,#0fh,fmt-ram end
第六章第五题:
以8031为主的系统,扩展2片2764 EPROM芯片和8KB片外RAM,试画出该系统逻辑图,并写出各芯片的地址。
第六章第九题:
在采用8255扩展I/O口时,若把8255 A口每一位接一个开关,B口每一位接一个发光二极管。请编写A口开关为1时B口相应发光二极管点亮的程序。 答案:
mode equ 90h;A口输入,B口输出 porta equ 0f000h portb equ 0f001h portcontrol equ 0f003 org 0h mov a, #mode mov dptr, #portcontrol movx @dptr, a
next:
mov dptr, #porta movx a, @dptr mov dptr, #portb
movx @dptr, a;假设发光二极管阴极接地 lcall delay sjmp next end
第六章第十二题:
图6-55时ADC0809与MCS-51的一种接口电路。设在内部RAM 20H开始有一数据区,请写出对8路模拟电压连续采集并循环存入(或更新)这个数据区的程序。 答案:
CS0809 equ 7ff8h org ljmp org start:
mov mov mov k0:
mov movx finish:
jb movx mov inc inc djnz sjmp end
0000h start 0100h
r0,#20h r7,#8h dptr,#CS0809
a,#0 @dptr,a
p3.3,finish a,@dptr @r0,a dptr r0 r7,k0 start