《单片机原理及应用—基于Proteus和Keil C》 课后答案习题解答 下载本文

DJNZ SJMP

R7, CONT $

;计数器减1,非0,则继续 ;暂停

4.编程查找内部RAM的32H~41H单元中是否有0AAH这个数据,若有这一数据,则将50H单元置为0FFH,否则将50H单元清零。

解:设一个片内RAM指针R0,先指向首地址32H,比较@R0与#0AAH,若相等,则退出循环,给50H单元赋0FFH,若不相等,则R0加1为继续比较下一个字节做准备,直到达到地址为41H或达到计数器规定的16个字节为止还没找到,则给50H单元赋00H 程序1: 移

MOV SJMP DJNZ MOV SJMP END

A,#0FFH

;相等,则准备好要赋的标志值0FFH ;转存到保存结果处 ;修改地址指针

;计数器减1,非0,则继续

;查找失败,则将00H存入结果标志单元 ;将比较结果标志存入50H单元

DOWN R0 $ R7,CONT

50H,A

MOV MOV SJMP CJNE MOV SJMP END MOV MOV

R7,#16 R0,#32H

;计数器赋初值,从20H到30H共16个字节

;比较查找值与指针所指单元的值,不相等转

R0,#32H A,#0FFH

;设地址指针初值

;相等,则准备好要赋的标志值0FFH ;转存到保存结果处 ;修改地址指针

;若指针未越过终点,则继续

;查找失败,则将00H存入结果标志单元 ;将比较结果标志存入50H单元

CONT: CJNE

@R0,#0AAH,NEXT;比较查找值与指针所指单元的值,不相等转移 DOWN R0 $

NEXT: INC

R0,#42H,CONT

A,#00H 50H,A

DOWN: MOV

;暂停

程序2:

;设地址指针初值

CONT: CJNE @R0,#0AAH,NEXT

NEXT: INC

A,#00H

DOWN: MOV

;暂停

5.查找20H~4FH单元中出现00H的次数,并将查找结果存入50H单元。 解:从20H到4FH共48个字节

MOV

R7,#48

;字节计数器赋初值

MOV

R0,#20H

R6

;设地址指针初值

;相等,0的个数计数器加1

CONT: CJNE

INC

@R0,#00H,NEXT ;比较查找值与指针所指单元的值,不相等转移

NEXT: INC

DJNZ MOV SJMP END

R0 $

;修改地址指针

;计数器减1,非0,则继续

;保存O的个数计数值到50H单元 ;暂停

R7,CONT

50H,R6 END

6.已知A=83H,R0=17H,(17H)=34H,写出下列程序段执行之后的A中的内容。 ANL ORL XRL CPL A

END

ANL ORL XRL CPL

A

A,#17H 17H,A A,@R0

;A=03H

;A= 0000 0011 ∨ 0011 0111 =0011 0100

答:

;(17H)=0011 0100 ∨ 0000 0011=0011 0111 ;A=1100 1011

A,#17H 17H,A A,@R0

7.已知单片机的晶振频率为12MHz,分别设计延时为0.1s、1s的子程序。

答:已知单片机的晶振频率为12MHz,则机器周期为1us,延时子程序是通过执行指令序列中机器周期数来达到,如果要0.1s,即100ms,也就是100000us,所以需要机器周期数达到100000。要延时达到1S,可通过对延时为0.1秒的子程序调用10次来实现。 DELAY100MS: D1: D2:

DELAY1S: LOOP:

MOV DJNZ RET

R7,#10

;计数10次

1 99795+2

ACALL DELAY100MS

R7,LOOP

;延时100ms子程序

NOP

MOV R6,#200

;1个机器周期

MOV R7,#250

;1个机器周期

;1个机器周期

DJNZ R7,D2 ;2个机器周期,3*251=753

DJNZ R6,D1 ;2个机器周期,(1+753+2)*132=99792 RET

;2个机器周期,1+99792+2=99795,约100ms

;未达到10次则继续 10*(2+99795+2) ;返回2+10*(2+99795+2)=997992

8.内部RAM从20H单元开始处有一数据块,以ODH为结束标志,试统计该数据块的长度,将该数据块送到外部数据存储器7E01H开始的单元,并将长度存入7E00H单元。 解:从20H的指针用R0,从外部RAM7E01开始的指针用DPTR,计数器用R7

MOV MOV MOV

R7,#0

;字节计数器赋初值 ;设片外RAM地址指针初值

R0,#20H

;设片内RAM地址指针初值

DPTR,#7E01H

CONT: MOV

INC INC INC CJNE MOV SJMP END

A,@R0

;取片内RAM中的一个字节

MOVX @DPTR,A

R7 R0 DPTR $

;存入片外RAM指针所指单元 ;长度计数器加1 ;片内RAM地址指针加1 ;片外RAM地址指针加1 ;未达到结束标志

;取块计数长度值 ;保存 ;暂停

A,#0DH,CONT

A,R7

MOVX @DPTR,A

9.内部RAM从DATA开始的区域中存放着10个单字节十进制数,求其累加和,并将结果存入SUM和SUM+1单元。

解:R7计数,R6保存累加和高8位,R0用作地址指针

ORG LJMP ORG

A A NEXT R6 R0 $

;若无进位则不用管高8位 ;有进位,高8位加1 ;片内RAM地址指针加1 ;未完继续

;保存低8位 ;保存高8位

0000H 100H 40H R7,#10

;字节计数器赋初值 ;设片内RAM地址指针初值 ;累加结果的高8位

;加RAM中的一个字节到ACC

R0,#DATAA R6,A

30H

MAIN

SUM

EQU

DATAA EQU MAIN: MOV

MOV CLR MOV DA JNC INC DJNZ MOV MOV SJMP END

;累加器清0

CONT: ADD A,@R0

NEXT: INC

R7,CONT

SUM,A SUM+1,R6

;暂停

10.内部RAM从DATA1和DATA2单元开始处存放着两个等长的数据块,数据块的长度在LEN单元中。请编程检查这两个数据块是否相等,若相等,将0FFH写入RESULT单元,否则将0写入RESULT单元。

解:从DATA1开始的指针用R0,从DATA2开始的指针用R1,计数器用R7 LEN

EQU

10 30H

DATA1 EQU

DATA2 EQU RESULT EQU

MOV MOV MOV MOV CJNE INC INC DJNZ MOV SJMP

40H 50H R7,#LEN

;字节计数器赋初值

;设片内RAM地址指针初值 ;设片外RAM地址指针初值 ;取片内RAM R0所指的的一个字节

;将R1所指单元内容取到片内RAM地址7FH中

R0,#DATA1 R1,#DATA2 A,@R0 7FH,@R1

CONT: MOV

A,7FH,NOEQ R0 R1 $

;比较,不相等则结束 ;DATA1 RAM地址指针加1 ;DATA2 RAM地址指针加1 ;未完,继续 ;相等,准备写入FFH ;转写入结果处 ;不相等,准备写入00H

;保存比较结果标志 ;暂停

R7,CONT DOWN

A,#0

A,#0FFH

NOEQ: MOV DOWN: MOV

SJMP END

RESULT,A

11.编制程序,将内部RAM中M1、M2、M3和M4单元中的无符号数xl、x2、x3和x4相加,并把和存入RO和R1(R0中为高8位)中。 解: M1 M2 M3 M4

EQU EQU EQU EQU MOV ADD JNC MOV JNC INC JNC INC SJMP END

30H 40H 45H 4FH A,M1 A,M2 R0,#1 A,M3

;取第一个数 ;与第二个数相加 ;有进位,高8位置1 ;与第三个数相加

NEXT1 ;如果无进位,则转移至第三个相加

NEXT1: ADD

NEXT2 R0

A,M4

;没有进位,则转至第四个数相加 ;有进位,高8位加1

;与第四个数相加 ;没有进位,则转至结束 ;有进位,高8位再加1

;低8位保存到R1 ;暂停

NEXT2: ADD

NEXT3 R0 $

R1,A

NEXT3: MOV