(3)ljmp loop 3字节 (4)mov r0,a 1字节 (5)ajmp loop 2字节 1
(6)mov a,30h2字节 (7)sjmp loop 2字节
(8)mov b,#30h 2字节
15.设堆栈指针(sp)=60h,片内ram中的(30h)=24h,(31h)=10h。执行下列程序段后,61h, 62h, 30h, 31h, dptr及sp中的内容将有何变化? push 30h push 31h pop dpl pop dph
mov 30h, #00h mov 31h, #0ffh 解:
结果为: 61h、62h单元为堆栈单元,其内容已被弹出栈。 (31h)=0ffh (dptr)=2410h (sp)=60h 17.完成以下的数据传送过程 (1)r1的内容传送到r0。
(2)片外ram 20h单元的内容送r0。
(3)片外 ram 20h单元的内容送片内ram 20h单元。 (4)片外ram 1000h单元的内容送片内 ram 20h单元。 (5)rom 2000h单元的内容送r0。
(6)rom 2000h单元的内容送片内ram 20h单元。 (7)rom 2000h单元的内容送片外ram 20h单元。 解:
(1)r1的内容传送到r0 ; mov a,r1 mov r0,a
(2)片外ram 20h单元内容送r0 ; movr1, #20h movx a, @r1 movr0, a
(3)片外 ram 20h单元的内容送片内ram 20h单元; mov r0, #20h
movx a, @r0 mov 20h, a
(4)片外ram 1000h单元的内容送片内 ram 20h 单元; mov dptr, #1000h movx a, @dptr mov 20h, a
(5)rom 2000h单元的内容送r0单元; clr a
mov dptr,#2000h movc a, @a+dptr mov r0, a
(6)rom 2000h 单元的内容送片内ram 20h单元; clra
movdptr,#2000h movc a, @a+dptr mov 20h, a
(7)rom 2000h单元的内容送片外ram 20h单元。 clra
movdptr,#2000h movc a, @a+dptr movr0,#20h movx @r0, a 2 (30h)=00h
19.编程将片内ram的40h~60h单元中内容送到片外ram以3000h开始的单元中。并将原片内ram数据块区域全部清0。 解: org 0000h ljmp main org 0030h
main: mov sp, #60h mov r7,#21h mov r1,#40h
mov dptr,#3000h loop: mov a,@r1 movx @dptr,a mov @r1, #00h inc r1 inc dptr
djnz r7,loop
sjmp $ end
23.设有100个有符号数,连续存放在片外ram以2000h为首地址的存储区中,试编程统计其中正数、负数、零的个数。 解: org 0000h ljmp main org 0030h
main: mov r2,#100 mov r3,#00h mov r4,#00h mov r5,#00h
mov dptr,#2000h
loop: movx a,@dptr cjne a,#00h,net1 inc r3
sjmp net3
net1: jb acc.7 net2 inc r4
sjmp net3
net2: inc r5 net3: inc dptr djnz r2,loop sjmp $ end
24.试编一查找程序,从外部ram首地址为2000h、长度为9fh的数据块中找出第一个ascii码a,将其地址送到20a0h和20a1h单元中。
解:org 0000h ljmp main org 0030h
main: mov sp, #60h mov dptr,#2000h mov r7,#9fh
lp0: movx a,@dptr cjne a, #41h, lp1 mov r2,dpl mov r3,dph
mov dptr,#20a0h
mov a, r2
movx @dptr,a 3
inc dptr mov a, r3
movx @dptr,a sjmp lp2
lp1: inc dptr djnz r7, lp0 lp2: ret end
27.编程实现将片外ram中2400h~2450h单元中的数传送到2500h~2550h单元中。 解: org 0000h main:mov 30h,#24h ljmp main mov 31h,#00h org 0030h mov 32h,#25h
main:mov r7,#51h mov 33h,#00h mov dptr, #2400hmov r2,#51h
loop: movx a,@dptr loop: mov dph,30h mov dph, #25h mov dpl,31h movx @dptr,a movx a,@dptr mov dph, #24h mov dph,32h inc dptr mov dpl,33h
djnz r7 ,loop movx @dptr,a sjmp $ inc 31h end inc 33h
djnz r2,loop 另一种方法:
sjmp $ org 0000h end ljmp main org 0030h
第三章作业答案
6. 设(tmod)=0a5h,则定时器t0的状态是( 方式1计数),定时器t1的状态是( 方式2 定时)。
27.请写出int1为低电平触发的中断系统初始化程序。 解:
int1为低电平触发的中断系统初始化程序如下: org 0000h ljmp main org0013h ljmp intn1
org0100h
main: mov sp,#60h setbea
setbex1 ; 开int1中断
clrpx1; 令int1为低优先级 clrit1; 令int1为电平触发 sjmp $ end
28.说明mcs-51单片机响应中断后,中断服务的入口地址。 解: 4
36解:
设定好定时器的定时时间,采用中断方式用软件设置计数次数,进行溢出次数累计,从而得到较长的时间。
37.利用定时器输出周期为2 ms的方波, 设单片机晶振频率为 6 mhz。试编程实现之。 解:
当定时器/计数器采用方式0时,初值为: 则真正的16
位计数初值为:f00ch(高8 位,低5位) 程序如下: org 0000h org 000bh
ljmp t0int; t0中断入口
start: mov sp, #60h ; 初始化程序 mov tl0, #0ch ; t0赋初值 mov th0,
mov tmod, #01h ; 定时器/计数器0工作于方式1 setb tr0; 启动t0
setb et0 ; 开t0中断 setb ea
; 开总允许中断 sjmp $ t0int
:push acc push psw
mov tl0,
mov th0, #0feh setb tr0; 启动t0 pop psw pop acc reti end
当采用查询方式时: 兰色字部分应该为: lp1: jbc tf0, lp2 sjmp lp1
lp2: cpl p1.0 mov tl0, #0ch mov th0, setb tr0 sjmp lp1 end 5