周国运版51单片机课后习题答案资料

6.分析下面指令是否正确,并说明理由。 MOV R3,R7 错,两个操作数不能同时为工作寄存器 MOV B,@R2 对 DEC DPTR 错,不存在 MOV 20H.8,F0 错,位传送指令必须用C PUSH DPTR CPL 36H 错,不存在 MOV PC,#0800H 错,PC不能访问

7.分析下面各组指令,区分它们的不同之处。 MOV A,30H 与 MOV A,#30H 前者表示:(30H)→A 后者表示:30H→A MOV A,R0 与 MOV A,@R0 前者表示:(R0)→A 后者表示:((R0))→A MOV A,@R1 与 MOVX A,@R1 前者表示:在片内数据存储器((R1))→A 后者表示:在片外数据存储器((R1))→A MOVX A,@R0 与 MOVX A,@DPTR 前者R0表示8位地址 后者DPTR表示16位地址 MOVX A,@DPTR 与 MOVC A,@A+DPTR 前者表示:((DPTR))→A 后者表示:((DPTR)+(A))→A

8.在MCS-51单片机的片内RAM中,已知(30H)=38H,(38H)=40H,(40H)=48H,(48H)=90H。请说明下面各是什么指令和寻址方式,以及每条指令执行后目的操作数的结果。 MOV A,40H ;数据传送,直接寻址,(A)=48H MOV R0,A ;数据传送,寄存器寻址,(R0)=48H MOV P1,#0FH ;数据传送,立即数寻址,(P1)=0FH MOV @R0,30H ;数据传送,直接寻址,(48H)=38H MOV DPTR,#1234H ;数据传送,立即数寻址,(DPTR)=1234H MOV 40H,30H ;数据传送,直接寻址,(40H)=38H MOV R0,38H ;数据传送,直接寻址,(R0)=40H MOV P0,R0 ;数据传送,直接寻址,(P0)=40H MOV 28H,#30H ;数据传送,立即数寻址,(28H)=30H MOV A,@R0 ;数据传送,寄存器间接寻址,(A)=38H

9.已知(A)=23H,(R1)=65H,(DPTR)=1FECH,片内RAM(65H)=70H, ROM(205CH)=64H。试分析下列各条指令执行后目标操作数的内容。 MOV A,@R1 ;(A)=70H MOVX @DPTR,A ;(1FECH)=70H MOVC A,@A+DPTR ;(A)=64H XCHD A,@R1 ;(A)=65H

6

10.已知(A)=76H,(R1)=76H,(B)=4,CY=1,片内RAM(76H)=0D0H,(80H)=6CH。试分析下列各条指令执行后目标操作数的内容和相应标志位的值。 ADD A,@R1 ;(A)=46H,CY=1 SUBB A,#75H ;(A)=0D0H,CY=1 MUL AB ;(A)=40H,(B)=03H DIV AB ;(A)=15H,(B)=01H ANL 76H,#76H ;(76H)=50H ORL A,#0FH ;(A)=1FH XRL 80H,A ;(80H)=73H

11.已知(A)=83H,(R0)=17H,(17H)=34H,试分析当执行完下面程序段后累加器A、R0、17H单元的内容。 ANL A,#17H ;(A)=03H ORL 17H,A ;(17H)=37H XRL A,@R0 ;(A)=34H CPL A ;(A)=0CBH

12.阅读下面程序段,说明该段程序的功能。 MOV R0,#40H MOV R7,#10 CLR A LOOP: MOV @R0,A INC A INC R0

DJNZ R7,LOOP SJMP $

答:把0,1,2,3??数列送到40H开始的10个单元中。

13.阅读下面程序段,说明该段程序的功能。 MOV R0,#40H MOV A,R0 INC R0 ADD A,@R0 MOV 43H,A CLR A ADDC A,#0 MOV 42H,A SJMP $

答:40H加41H单元的数,结果送42H:43H

第4章 习题答案

1.用C51编程较汇编语言有哪些优势?

7

答:(1)编程容易

(2)容易实现复杂的数值计算 (3)容易阅读、调试、维护程序 (4)容易实现模块化开发 (5)程序可移植性好 2.C51字节数据、整型数据以及长整型数据在存储器中的存储方式各是怎样的? 答:字符变量(char)无论是unsigned char数据还是signed char数据,均为1个字节,即8位,因此被直接存储在RAM中,可能存储在0~0x7f区域(包括位寻址区域),也可能存储在0x80~0xff区域,与变量的定义有关。

整型变量(int)不管是unsigned int数据还是signed int数据,均为2个字节,即16位,其存储方法是高位字节保存在低地址(在前面),低位字节保存在高地址(在后面)。

长整型变量(long)为4个字节,即32位,其存储方法与整型数据一样,是最高位字节保存的地址最低(在最前面),最低位字节保存的地址最高(在最后面)。

3.C51定义变量的一般格式是什么?变量的4种属性是什么?特别要注意存储区属性。

答:[存储类型] 数据类型 [存储区] 变量名1[=初值] [,变量名2[=初值]] [,?]

变量的4种属性是存储类型,数据类型,存储区,变量名

4.C51的数据存储区域类型有哪些?各种存储区域类型是哪种存储空间,存储范围是什么?如何将变量定义存储到确定的位置?

答:bit 片内数据区的位寻找区,位地址0x00~0x7f,128位(字节地址0x20~0x2f)

data 直接寻址片内数据区的低128字节

bdata 片内数据区的位寻址区0x20~0x2f,也可字节访问,16字节 idata 间接寻址片内数据区的256字节,与MOV @Ri 对应

pdata 分页寻址片外数据区的256字节,与MOVX @Ri 对应,P2不变 xdata 片外数据区的全空间,64KB code 全部程序存储空间,64KB

绝对定位关键字_at_ ,指针,库函数的绝对定位宏。

5.C51位变量的定义格式是什么?如何定义bdata型字节变量的位变量?

答:[存储类型] bit 位变量名1[=初值] [,位变量名2[=初值]] [,?] sbit 位变量名 = bdata型变量名^位号常数 6.如何定义8位字节型特殊功能寄存器?如何定义16位特殊功能寄存器?如何定义特殊功能寄存器的位变量?

答:sfr 特殊功能寄存器名 = 地址常数 sfr16 特殊功能寄存器名 = 地址常数

sbit 位变量名 = 特殊功能寄存器名^位号常数

8

7.C51专用指针定义的一般格式是什么?如何确定专用指针定义的指向空间和指针变量本身存储的空间?

答:[存储类型] 数据类型 指向存储区 *[指针存储区] 指针名1 [,*[指针存储区] 指针名2,?]

*的左面是指向存储区,*的右面是指针存储区

8.C51函数定义的一般形式是什么?如何定义中断处理程序?如何选择工作寄存器组?

答:返回类型 函数名(形参表) [函数模式] [reentrant] [interrupt m] [using n] {

局部变量定义 执行语句 }

[interrupt m]字段中的m定义中断处理程序的中断号 [using n]字段中的n选择工作寄存器组

9.在C51中,对汇编语言函数的命名规则是怎样的,具体地说:不传递参数的函数名格式是什么?通过寄存器传递参数的函数名格式是什么?传递参数重入函数的函数名格式是什么?

答:?PR?函数名?模块名 //不传递参数

?PR?_函数名?模块名 //通过寄存器传递参数

?PR?_?函数名?模块名 //对重入函数通过堆栈传递参数

10.在C51中,函数返回值传递的规则是什么? 答:(1)调用时参数的传递 分三种情况:少于等于3个参数时通过寄存器传递(寄存器不够用时通过存储区传递),多于3个时有一部分通过存储区传递,对于重入函数参数通过堆栈传递。通过寄存器传递速度最快。 (2)函数返回值的传递

当函数有返回值时,其传递都是通过寄存器

11.在C51中,怎样嵌入汇编语言程序?怎样进行处理实现混合编程? 答:其方法是用编译控制指令“#pragma src”、“#pragma asm”和“#pragma endasm”实现。编译控制命令“#pragma src”是控制编译器将C源文件编译成汇编文件,“#pragma src”要放在文件的开始;“#pragma asm”和“#pragma endasm”指示汇编语言程序的开始和结束,分别放在汇编程序段的前面和后面。 对于函数的调用方法,与调用汇编语言中的函数一样,

在C语言文件中调用汇编语言中的函数,必须先声明再调用。声明格式如下: extern 返回值类型 函数名(参数表);

12.在C51中如何定义模块名?在C51文件中的模块名是什么? 答:模块定义格式如下: NAME 模块名

9

13.在汇编语言文件中:怎样声明函数段?怎样声明公共函数?怎样声明引用函数?怎样声明引用变量?定义函数的格式是什么? 答:对本模块定义的函数段作声明,其格式为: ?PR?函数名?模块名 SEGMENT CODE 公共函数声明。声明格式为: PUBLIC 函数名

引用声明。声明格式为: EXTRN CODE(函数名) 引用声明。声明格式为:

EXTRN 存储区域类型(变量名) 汇编语言函数的格式如下: RSEG ?PR?函数名?模块名 函数名:

14.在C51中怎样把函数定义到确定的位置? 答:对函数的定位方法, CSEG AT 001BH

15.如何在C51文件和汇编语言文件中相互调用对方文件中的函数?

答:汇编语言文件中对于函数的调用方法,与调用汇编语言中的函数一样,如: LCALL DISPLAY

在C语言文件中调用汇编语言中的函数,必须先声明再调用。声明格式如下: extern 返回值类型 函数名(参数表);

例如: extern unsigned char right_shift ( char, char );

16.在C51中,如何访问DATA空间、PDATA空间、XDATA空间、CODE空间某个确定地址单元?

答:用指针定义的访问存储器的宏

使用时需要用预处理命令把该头文件包含到文件中,形式为:#include

(1)按字节访问存储器宏的形式 宏名[地址]

(2)按整型数访问存储器宏的形式 宏名[下标]

17.在某程序中需要定义如下变量:

(1)定义数码管的显示0~9的共阴极显示代码(0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07, 0x7f, 0x6f)数组dis_code,将其定义在CODE区。

(2)定义定时器/计数器0的赋计数值的高、低字节变量TL0_L和TH0_H,将其定义在DATA去区的0x30、0x31处。

(3)定义长度为20的无符号字符型数组data_buf于IDATA区中。 (4)定义长度为100的无符号字符型数组data_array于XDATA区中。 (5)先定义一个无符号字符型变量status于BDATA区中,再定义8个与status

10

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4