位地址20H在内存中位寻址区24H单元的第0位。
9、AT89S51如何确定和改变当前工作寄存器组?
答:当前工作寄存器组由程序状态继寄存器PSW中的RS1和RS0两位的取值来确定和改变。有4种组合方式用来从4组工作寄存器组中进行选择。
10、PC是什么寄存器?是否属于特殊功能寄存器?它有什么作用? 答:PC是16位程序计数器(Program Counter),它不属于特殊功能寄存器范畴,程序员不能像访问特殊功能寄存器那样来访问PC。PC是专门用于在CPU取指令期间寻址程序存储器的。PC总是保存着下一条要执行的指令的16位地址。通常程序是顺序执行的,在一般情况下,当取出一个指令(更确切地说为一个指令字节)字节后,PC自动加1。如果在执行转移指令、子程序调用/返回指令或中断时,要把转向的目标地址赋给PC。
11、DPTR是什么寄存器?它由哪些特殊功能寄存器组成?它的主要作用是什么?
答:DPTR是16位数据指针寄存器,它由两个8位特殊功能寄存器DPL(数据指针低8位)和DPH(数据指针高8位)组成,DPTR用于保存16位地址,作间址寄存器用,可寻址外部数据存储器,也可寻址程序存储器。 12、AT89S51单片机的时钟周期与振荡周期之间有什么关系?什么叫机器周期和指令周期?如果晶振频率分别为6 MHz 和12MHz,则机器周期各为多少?
答:时钟周期又称为振荡周期,它是单片机中最基本、最小的时间单位,也是振荡频率的倒数。
CPU完成一次基本操作所需要的时间就是1个机器周期,1个机器周期包括12个振荡周期。 指令周期是执行一条指令所需的时间。通常一个指令周期包含1~4个机器周期。 如果晶振频率为6 MHz 和12MHz,则机器周期分别为2μs 和1μs。
13、单片机复位有几种方法?复位后机器的初始状态如何?
答:(1) 单片机复位方法有:上电自动复位、按键电平复位和外部脉冲复位三种方式。
(2) 复位后,PC的内容被初始化,单片机从0000H单元开始执行程序,片内RAM中的数据不受影响。特殊功能寄存器SFR中SP=07H,P0~P3=FFH,其他的SFR初始值一般为0。
14、1个机器周期的时序如何划分?
答:1个机器周期=12个震荡周期=6个状态周期,每个状态周期包含2个震荡周期。即1个机器周期的时序可以划分如下:
S1P1S1P2S2P1S2P2S3P1S3P2S4P1S4P2S5P1S5P2S6P1S6P2 其中S=State为状态;P=Phase为相位。
15、AT89S51有几种低功耗方式?如何实现? 答:89S51有待机和掉电两种低功耗方式。
待机方式和掉电方式是通过对SFR中的PCON(地址87H)相应位置1而启动的。 当CPU执行使IDL=1(PCON.0=1)的指令后,系统进入待机工作方式。这时,内部振荡器继续工作,内部时钟只供给中断、串行口、定时器/计数器,而不向CPU提供,CPU停止工作;当CPU执行一条使PD=1(PCON.1=1)的指令后,系统进入掉电工作方式。在这种工作方式下,内部振荡器停止工作。由于没有振荡时钟,所有的功能部件都停止工作。但内部RAM区和特殊功能寄存器的内容被保留,而端口的输出状态值都保存在对应的SFR中,ALE和PSEN都为低电平。
5
第3章 习题
1、什么是计算机的指令和指令系统?
答:指令是计算机用于控制各功能部件完成指定动作的指示和命令。
计算机能够执行的各种指令的集合称为指令系统。
2、什么是机器语言、汇编语言和高级语言?
答:单片机能够直接识别和执行的指令是由二进制代码组成的机器码,也常用十六进制形式表示,又称为机器语言。
机器语言不易记忆、书写、查错和修改,所以单片机开发者根据不同功能和操作对象的机器指令,分别用具有一定含义的符号即指令助记符来表示。这些助记符一般采用与指令功能相关的英文单词缩写,以便于人们理解、记忆和使用。这种用助记符形式表示的机器指令称为汇编语言指令。 高级语言是一种独立于机器的,在编程时不需要对机器结构及其指令系统有深入了解的通用性语言,它与机器语言和汇编语言相比,更加接近人的思维。
3、什么叫寻址方式?寻址方式的多少有何意义?
答:计算机执行程序的过程实际上就是不断寻找操作数并进行操作的过程,寻址方式就是寻找指令中的操作数或操作数所在地址的方式。
寻址方式的多少标志着单片机指令系统的有效性和灵活性。
4、要访问特殊功能寄存器和片外数据存储器,应采用哪些寻址方式?
答:访问特殊功能寄存器可以采用直接寻址、位寻址和寄存器寻址;访问片外数据存储器只能采用寄存器间接寻址。
5、如何访问片内RAM单元和片外RAM单元?可使用哪些寻址方式?
答:对于低128字节的片内RAM单元可以采用直接寻址、寄存器寻址、寄存器间接寻址和位寻址访问;对于高128字节的片内RAM单元可以采用直接寻址、寄存器寻址和位寻址。
用MOVX指令可以访问片外RAM单元,且只能使用寄存器间接寻址。
6、如何访问片内外程序存储器?可使用哪些寻址方式?
答:用MOVC指令,采用变址寻址访问片内外程序存储器,或采用相对寻址方式访问程序存储器中从PC当前值开始的256字节。
7、在进行压缩BCD码的加法运算时,为什么要进行十进制调整? 如何实现?
答:因MCS-51指令系统中没有十进制加法运算指令,在进行压缩BCD码的加法运算时,只能通过二进制加法指令来实现。单片机自动将两数按照二进制相加时,将结果用十六进制显示, 而BCD码在进行加法运算时应逢十进一,但计算机将其当作十六进制数处理,进一就相当于加16,比十进制的BCD码多出6个数,结果中就可能会出现大于9的非法码。
用在加法指令后安排一条DA A指令,当BCD加法运算结果中出现非法码时,计算机会自动加6,进行修正。
8、什么是进位和溢出?
答:两数运算的结果若没有超出字长的表示范围,则由此产生的进位是自然进位;若两数的运算结
6
果超出了字长的表示范围(即结果不合理),则称为溢出。例如将正数3FH和负数D0H相加,其结果不会超出8位字长的表示范围,所以其结果10FH中的进位是正常进位(也就是模)。但是,若正数3FH与正数70H相加,其结果为AFH,最高位为\,成了负数的含义,这就不合理了,这种情况称为溢出。
9、在89S51片内RAM中,已知 (30H)=51H,(51)H=69H,(69H)=4EH。分析下面各条指令执行后的结果。
MOV A, 30H MOV R1, A MOV 40H, @R1 MOV 30H, 40H
答:各条指令执行的过程及最后结果如下: MOV A, 30H ; A←(30H),A=51H
MOV R1, A ; R1←(A),R1=51H MOV 40H, @R1 ; 40H←((R1)),(40H)=69H MOV 30H, 40H ; (30H)←(40H),(30H)=69H 执行后,A=51H,R1=51H,(30H)=69H。
10、已知A=83H,R0=17H,(17H)=34H。写出执行完下列程序片段后A的内容。
ANL A,#17H ORL 17H,A XRL A,@R0 CPL A
答:各条指令执行的过程及最后结果如下:
ANL A,#17H ;A ←83H∧17H,A=03H
ORL 17H,A ;17H←34H∨03H,(17H) =37H XRL A,@R0 ;A ←03H⊕37H,A=34H CPL A ;A ←A求反,A=0CBH 执行后,A=0CBH。
11、使用位操作指令实现下列逻辑操作,要求不得改变未涉及位的内容。 (1)使ACC.0置1 (2) 累加器的高4位清零 答:(1) SETB ACC.0或SETB E0H
(2) CLR ACC.7 CLR ACC.6
CLR ACC.5 CLR ACC.4
12、编程将累加器A与R0中的内容交换。 答:方法(1): XCH A,R0 方法(2): MOV B,A MOV A,R0 MOV R0,B
7
13、将片内RAM中30H单元的内容传送到片外1000H单元中。 答: MOV A, 30H
MOV DPTR, #1000H MOV @DPTR, A
14、将片外RAM中30H单元的内容传送到片外3000H单元中。 答: MOV R0, #30H
MOV A, @R0 MOV DPTR, #3000H MOV @DPTR, A
15、编程将片外RAM从2000H开始存放的50个数传送到片内30H开始的单元中。 答:编程如下:
MOV R7,#50H ;数据块长度送R7 MOV R0,#30H ;数据块目的地址送R0 MOV DPTR,#2000H ;数据块源地址送DPTR
LOOP: MOVX A,@ DPTR ;传送一个数据
MOV @R0,A
INC DPTR ;指向下一个数据 INC R0
DJNZ R2,LOOP ;数据块长度减1,未传送完,继续传送
16、编程查找内部RAM的20H~50H单元中是否有“#”号。若有,则将A置1,否则清0。 答:“#”号的ASCII码为23H,将待查数据逐一与23H比较查找。编程如下: MOV R7,#31H ;数据块长度送R7
MOV R0,#20H ;数据块首地址送R0
LOOP: MOV A,@R0 ;待查找的数据送A
CLR C ;清进位位
SUBB A,#23H ;将待查找的数据与23H比较 JZ L1 ;是则转L1 INC R0 ;不是,则地址加1,指向下一个待查数据 DJNZ R7,LOOP ;数据块长度减1,不等于0则继续查找 MOV A,#00H ;等于0,未找到,A清0
L1: MOV A,#0FFH ;找到“#”号,A置1
17、两个4位BCD码,高位在前。一个存放在31H和30H中,另一个存放在33H和32H中,求和,并存回到31H和30H中。 编程如下:
MOV R0,#30H MOV R1,#32H MOV A,@R0 ADD A,@R1 DA A
MOV @R0,A
8