单片机课后习题答案[1]1 联系客服

发布时间 : 星期二 文章单片机课后习题答案[1]1更新完毕开始阅读552798096c85ec3a87c2c51f

MOVC A,@A+PC

这两条指令都为变址寻址方式。前一条指令以DPTR作为基址寄存器进行查表,使用前 可先给 DPTR 赋予任何地址,因此查表范围可达整个程序存储器的 64KB 空间。后一条指令以PC作为基址寄存器,虽然也提供16位基址,但其值是固定的。由于A的内容为8位无符号数,所以这种查表指令只能查找所在地址以后256B范围内的常数或代码。

6.对80C51片内RAM的128~255字节区的地址空间寻址时,应注意些什么?对特殊 功能寄存器,应采用何种寻址方式进行访问?

答: 此空间有2类不同的物理存储空间,一个是特殊功能寄存器区,一个是RAM区。 直接寻址访问特殊功能寄存器,间接寻址访问RAM区。 7.写出完成下列要求的C语言程序。

(1)将地址为4000H的片外数据存储单元内容,送入地址为30H的片内数据存储单元 中。

答: 可使用绝对地址访问函数实现 DBYTE[0x30] = XBYTE[0x4000];

(2)将地址为4000H的片外数据存储单元内容,送入地址为3000H的片外数据存储单 元中。

答: 可使用绝对地址访问函数实现 XBYTE [0x3000] = XBYTE[0x4000]; (3)将地址为0800H的程序存储单元内容,送入地址为30H的片内数据存储单元中。 答: 可使用绝对地址访问函数实现 DBYTE [0x30] = CBYTE[0x0800]; (4)将片内数据存储器中地址为30H与40H的单元内容交换。 答: unsigned char temp; temp= DBYTE [0x40];

DBYTE [0x40]= DBYTE [0x30]; DBYTE [0x30]= temp;

此题答案不唯一,也可用指针运算或其他方案实现;

(5)将片内数据存储器中地址为30H单元的低4位与高4位交换。 答: 使用C51提供的本征函数_cror_实现; #inclucle

_cror_(DBYTE [0x30],4);

8.将30H、31H单元中的十进制数与38H、39H单元中的十进制数做十进制加法,其和 送入40H、41H单元中,即(31H,30H)+(39H,38H)→(41H,40H)。 答: #include //片内寄存器定义 #include

/*********** main C **************/ void main (void) { unsigned int sum;

sum = DBYTE[0x30]+DBYTE[0x38];

if((sum&0x000f)>0x9) sum += 0x06; //个位十进制调整 if(sum>0x99) sum += 0x60;//十位十进制调整 DBYTE[0x40]= sum;//和低位字节

DBYTE[0x41] = (sum>>8) + DBYTE[0x31]+DBYTE[0x39];//和高位字节 if(DBYTE[0x41]>0x09) DBYTE[0x41] += 0x06;//百位十进制调整 while(1); /* 程序在此死循环 */ }

9.编写程序段完成下列乘法操作: (R4,R3)×(R5),(32H,31H,30H)。此式含义

是将R4、R3中的双字节被乘数与R5中的字节乘数相乘,乘积存放在地址为32H~30H 3个存储单元中((答案不惟一) 。 解: 涉及到寄存器,用汇编实现: ORG 0000H MOV SP,#49H MOV A,R3 MOV B,R5 MUL AB

MOV R0,#30H

MOV @R0,A ;将低8位存入30H INC R0 MOV R1,B MOV A,R4 MOV B,R5 MUL AB ADD A,R1

MOV @R0,A; 将中间8位存入31H MOV A,B

ADDC A,#00H ; 将中间8位的进位加入A中 INC R0

MOV @R0,A ;将高8位存入32H SJMP $ ;程序在此死循环 END

10.编写程序,用 30H 单元内容除以 40H 单元内容,商送入 50H 单元,余数送入 51H 单元。 (答案不惟一)

解: 涉及直接地址,用汇编实现: ORG 0000H MOV SP,#49H

MOV A,30H ;被除数 MOV B,40H;除数 DIV AB;A/B

MOV 50H,A ;商存50H单元 MOV 51H,B ;余存51H单元 SJMP $ ;程序在此死循环 END

11.已知: (30H)= 55H,(31H)= 0AAH。分别写出完成下列要求的指令,并写出32H 单元的内容。 解: (1)(30H)&(31H)→(32H); DBYTE[0x32]= DBYTE[0x30]& DBYTE[0x31];0x00 (2)(30H)|(31H)→(32H); DBYTE[0x32]= DBYTE[0x30]| DBYTE[0x31];0xff (3)(30H)^(31H)→(32H); DBYTE[0x32]= DBYTE[0x30]^DBYTE[0x31];0xff 12.十进制调整指令DA起什么作用?用在何处? 答: 十进制调整指令如下: DA A

功能是把A中二进制码自动调整成二-十进制码(BCD码)。用于对BCD码的加法结果

进行调整。

13.80C51 指令系统中有了长跳转 LJMP、长调用 LCALL 指令,为何还设置了短跳转 AJMP、短调用ACALL指令?在实际使用时应怎样考虑?

答: LJMP addr16,LCALL addr16,指令码中的目标地址均是16位的,所以可以指向64KB 程序存储器空间任意位置。

AJMP addr11,ACALL addr11,指令码中的目标地址均是 12 位的,所以可以指向 2KB 程序存储器空间任意位置。

当使用的程序存储器空间在 2KB 之内或产生的代码长度在 2KB 之内时所有的跳转和调 用可以使用 AJMP ,ACALL 指令。否则建议使用 LJMP,LCALL。高级语言编译器根据所选目标器件和代码情况自动生成。

14.写出下列短跳转指令中标号L00的取值范围。 37FFH AJMP L00

答: 最大转移地址为:37FFH +2KB 15.设堆栈指针(SP)= 60H: (1)2500H LCALL L00 ?? ……

(2)2700H MOV A,#03H ?? …… (3)2750H RET

执行(1)指令后:(SP)、((SP))、((SP-1))、(PC) 各为多少?执行(2)指令后:(SP)、(PC) 为多少?若将(1)指令改为ACALL L00,标号L00的取值范围是多少? 答:

执行(1)指令后,(SP)=62H,((SP))=25H,((SP-1))=03H,(PC)= L00; 执行(2)指令后,(SP)=60H,(PC)= 2702H;

若将(1)指令改为ACALL L00,标号L00的取值范围是当前PC的高5位,加上低11位 从全0变全1;例如:2500H ACALL L00,当前PC=2500H,PC高5位是00100,则L00 取值范围是:[00100, 00000000000~00100, 11111111111]

16.为什么SJMP指令的rel=$时,将实现单指令的无限循环? 答: $表示本指令所处地址, 该指令相当于:Here:SJMP Here 17.有程序如下: CLR C CLR RS1 CLR RS0 MOV A,#38H MOV R0,A MOV 29H,R0 SETB RS0 MOV R1,A MOV 26H,A MOV 28H,C

(1)区分哪些是伪操作指令?哪些是字节操作指令? (2)写出程序执行后,片内RAM有关单元的内容。 (3)如fosc=12MHz,计算这段程序的执行时间。 答: (1)(2)

CLR C;答:位操作指令 (C)= 0 CLR RS1;答:位操作指令 (RS1)= 0 CLR RS0;答:位操作指令 (RS0)= 0

MOV A,#38H;答:字节操作指令 A=38H MOV R0,A;答:字节操作指令R0=(A)=38H

MOV 29H,R0;答:字节操作指令 (29H)=(R0)=38H SETB RS0;答:位操作指令 (RS0)=1

MOV R1,A;答:字节操作指令 R1=(A)=38H MOV 26H,A;答:字节操作指令 (26H)=(A)=38H MOV 28H,C;答:位操作指令 (28H)=(C)=0

(3)如fosc=12MHz,这段程序的执行时间=11μs 18.请用位操作指令,求下列逻辑方程: (1)P1.7 ACC.0&(B.0 P2.0) P3.0 =+ + (2)PSW.5 P1.0&ACC B.6&P1.4 =+ (3)PSW.5 P1.7&B.4 C ACC&P1.0 =++

答: (1)P1_7=(ACC_0)&&(( B_0||P2_0)||(~P3_0));

答: (2)PSW_5=(P1_0&&(~ACC))||( B_6&&(~P1_4)) //此处实际上是取ACC.0 答: (3)PSW_5=(~(P1_7)&&B_4)||CY||((~ACC)&&P1_0) //此处实际上是取ACC.0 19.写出下列各条指令的机器码,并逐条写出依次执行每条指令后的结果和 PSW 的内 容:

(1)CLR A

(2)MOV A, #9BH (3)MOV B, #0AFH (4)ADD A, B

答: (1)CLR A //答案:机器码:E4 (A)=0 , (B)=0, PSW=0x00 (2)MOV A, #9BH //答案:机器码:749B (A)=0x9B , (B)=0, PSW:0x01

(3)MOV B, #0AFH //答案:机器码:75F0AF (A)=0x9B , (B)=0xAF, PSW:0x01 (4)ADD A, B //答案:机器码:25F0 (A)=0x4A , (B)=0xAF, PSW:0xc5 20.伪指令与汇编指令有何区别?说出常用的5种伪指令的作用。 答:

● 汇编指令,编译后产生机器码的指令;

● 伪指令,仅供汇编程序使用,编译后不产生机器码的指令。 常用的5种伪指令如下:

1.设置起始地址ORG(Origin) 指令格式:ORG nn

作用:将ORG nn后的程序机器码或数据存放在以nn为首地址的存储单元中。如伪指令 ORG 1000H,是将目标程序从地址1000H处开始存放的。 2.定义字节DB或DEFB(Define Byte) 指令格式:[LABEL] DB N1,N2,?,Nm

作用:将DB后的8位字节数据N1,N2,?,Nm依次存入以标号LABEL为首地址的 存储单元中。若无标号,则N1,N2,?,Nm依次存放在DB上一条指令之后的存储单元中。

3.定义字DW或DEFW(Define Word)

指令格式:[LABEL] DW NN1,NN2,?,NNm