TAB1 TAB2 DB DW
EQU EQU
1234H 3000H
“MAIN”
TAB1, TAB2,70H
答:从1000H开始的各有关存储单元的内容(16进制)如下: 4D 41 49 4E 12 34 30 00 00 70 78 7F E4 F6 D8 FD 75 81 07 02
4-4.设计子程序时应注意那些问题?参P73~73 在编写子程序时应注意以下问题:
(1)子程序的第一条指令前必须有标号。
(2)主程序调用子程序,有如下两条子程序调用指令:
① 绝对调用指令ACALL addr11。被调用的子程序的首地址与绝对调用指令的下一条指令的高5位地址相同,即只能在同一个2KB区内。
② 长调用指令LCALL addr16。addr16为直接调用的目的地址,被调用的子程序可放置在64KB程序存储器区的任意位置。
(3)子程序结构中必须用到堆栈,用来保护断点和现场保护。
(4)子程序返回时,必须以RET指令结束。 (5)子程序可以嵌套,但要注意堆栈的冲突。
4-5.试编写一个程序,将内部RAM中45H单元的高4位清0,低4位置1。 答:参考程序如下: MOV A,45H
A,#0FH ;高4位清0 A,#0FH ;低4位置1
MOV 45H,A 解法2: MOV A,#0FH MOV 45H,A ;高4位清0,低4位置1
已知程序执行前有A=02H ,(42H)下述程序执行后,( ),*4-6.SP=42H, (41H)=FFH,=FFH,A=
,(42H)= ( ),PC= ( )。 SP =( ) (41H) = ( );(DPH)= FFH,SP=41H POP DPH ;(DPL)=FFH ,SP=40H POP DPL
;DPTR=3000H MOV DPTR,#3000H
;(A)=04H RL A
ANL ORL
;(B)=04H MOV B, A
(A)=50H MOVC A,@A+DPTR ;
;(41H)=50H,SP=41H PUSH Acc
;(A)=04H MOV A,B ;(A)=05H
(A)=80H MOVC A,@A+DPTR ;
;(42H)=80H,SP=42H PUSH Acc ;(PC)=8050H,SP=40H RET
ORG 3000H INC
A
DB 10H,80H,30H,80H,50H,80H
答:A=80H ,SP=40H,(41H)=50H,(42H)=80H ,PC=8050H
4-7.试编写程序,查找在内部RAM的30H~50H单元中是否有0AAH这一数据。若有,则将51H单元置为 “01H”;若未找到,则将51H单元置为“00H”。
·6·
答:参考程序如下: START: MOV R0,#30H
LOOP:
MOV MOV CJNE MOV LJMP INC DJNZ MOV RET
;内部RAM的首地址
;要查找的数据字节数
;从内部RAM取数
R2,#20H
A,@R0
NEXT: EXIT:
A,#0AAH,NEXT ;判断是否为“AA”
;是 “AA” 将51H单元置为 “01H” 51H,#01H
EXIT
;指向内部RAM的下一单元 R0 R2,LOOP 51H,#00H
;循环次数控制
;若未找到,则将51H单元置为“00H”
4-8.试编写程序,查找在20H~40H单元中出现“00H”这一数据的次数,并将查到的结果存入41H单元。
答:参考程序如下: START: MOV 41H,#0
;内部RAM的首地址 MOV R0,#20H
;数据字节数 MOV R2,#20H
LOOP: MOV
A,@R0
JNZ NEXT
INC 41H ;“00H”这一数据的次数 NEXT: INC R0
DJNZ RET
;在内部RAM的20H~40H单元中出现
;从内部RAM取数
;判断是否为0
;指向内部RAM的下一单元
;循环次数控制 R2,LOOP
*4-9.在内部RAM的21H单元开始存有一组单字节无符号数,数据长度为20H,编写程序,要求找
出最大数存入MAX单元。
答:参考程序如下: ORG 0100H
MOV MOV MOV DEC MOV
R2, #20H ;要比较的数据字节数 A , #21H ;内部RAM的首地址
; R1 , A
;数据长度减1 R2
A , @R1 ;从内部RAM的首地址取数
;送R3保存 LOOP: MOV R3,A
DEC R1 CLR C SUBB A,@R1
JNC LOOP1
LOOP1: LOOP2:
MOV A,@R1 SJMP LOOP2 MOV A,R3
DJNZ R2, LOOP
MOV @R0,A RET
*4-10.若SP=60H,标号LABEL所在的地址为3456H,LCALL指令的地址为2000H,执行如下指令: 2000H LCALL LABEL
·7·
后,堆栈指针SP和堆栈内容发生了什么变化?PC的值等于什么?如果将指令LCALL直接换成ACALL是否可以?如果换成ACALL指令,可调用的地址范围是什么?参P58
答:(1)SP=SP+1=61H (61H)=PC的低字节=03H SP=SP+1=62H (62H)=PC的高字节=20H
(2)PC=3456H (3)不可以
(4)2KB=2048 Byte
*4-11.对例4-14中的程序进行修改,使其精确延时50ms。 答:可对程序做如下修改: ORG 0100H DEL: DEL1: DEL2:
MOV R7, #200 MOV R6, #123
DJNZ R6, DEL2
;将原来的立即数125改为123 ;增加的指令
NOP DJNZ R7, DEL1 RET
程序修改后的延时时间为:1+(1+123*2+1+2)*200+2=50003us=50.003ms
。参P93 5-1.外部中断1的中断入口地址为(0013H)H。定时器1的中断入口地址为(001BH)
。最低者为(定时器1中断)。参P92 *5-2.若(IP)= 00010100B,则优先级最高者为(外部中断1)
5-3. 中断服务子程序与普通子程序有哪些相同和不同之处?答:RETI指令在返回的同时清除相应的优先级触发器,以允许下次中断,而RET指令则没有这个操作。除了这一点两条指令不同外,其它操作都相同。参P59
。P89 5-4.下列说法正确的是( D )
A.各中断源发出的中断请求信号,都会标记在AT89S51的IE寄存器中
B.各中断源发出的中断请求信号,都会标记在AT89S51的TMOD寄存器中
C.各中断源发出的中断请求信号,都会标记在AT89S51的IP寄存器中 D.各中断源发出的中断请求信号,都会标记在AT89S51的TCON与SCON寄存器中
5-5. AT89S51单片机响应外部中断的典型时间是多少?在哪些情况下,CPU将推迟对外部中断请求的响应?参P94答:在一个单一中断的系统里,AT89S51单片机对外部中断请求的响应时间总是在3~8个机器周期之间。在下述三种情况下,A(1)AT89S51将推迟对外部中断请求的响应:T89S51正在处理同级或更高优先级的中断。(2)所查询的机器周期不是当前正在执行指令的最后一个机器周期。
(3)正在执行的指令是RETI或是访问IE或IP的指令。 如果存在上述三种情况之一,AT89S51将丢弃中断查询结果,将推迟对外部中断请求的响应。
。5-6.中断查询确认后,在下列各种AT89S51单片机运行情况下,能立即进行响应的是( D )
参P94A.当前正在进行高优先级中断处理B.当前正在执行RETI指令
C.当前指令是DIV指令,且正处于取指令的机器周期D.当前指令是MOV A,R3 5-7.AT89S51单片机响应中断后,首先由硬件自动生成一条长调用指令LCALL,执行该指令的过程包括:首先把( pc)内容压入堆栈,以进行断点保护,然后把长调用指令的16位地址送( pc ),使程序执行转向(程序存储器)中的中断地址区。参P93
*5-8.编写外部中断1为下跳沿触发的中断初始化程序段。参P90~91 答: 参考程序段如下:
SETB
IT1
SETB
EX1
SETB EA
。参P95~96 5-9.在AT89S51的中断请求源中,需要外加电路实现中断撤销的是( A )
·8·
A.电平方式的外部中断请求 B.下跳沿触发的外部中断请求
C.外部串行中断 D.定时中断
*5-10.中断响应需要满足哪些条件?参P93
答:一个中断源的中断请求被响应,必须满足以下必要条件:(1)总中断允许开关接通,即IE寄存器中的中断总允许位EA=1。(2)该中断源发出中断请求,即该中断源对应的中断请求标志为“1”。
(3)该中断源的中断允许位=1,即该中断被允许。(4)无同级或更高级中断正在被服务。
、(C)、(D) )。 5-11.下列说法正确的是( (A)
A.同一级别的中断请求按时间的先后顺序响应
B.同一时间同一级别的多中断请求,将形成阻塞,系统无法响应
C.低优先级中断请求不能中断高优先级中断请求,但是高优先级中断请求能中断低优先级中断请求D.同级中断不能嵌套
*5-12.某系统有三个外部中断源1、2、3,当某一中断源发出的中断请求使INT1引脚变为低电平时(参见图5-10),便要求CPU进行处理,它们的优先处理次序由高到低为3、2、1,中断处理程序的人口地址分别为1000H,1100H,1200H。试编写主程序及中断服务子程序(转至相应的中断处理程序的入口即可)。答:参见电路如图5-10,参考程序如下:
ORG 0000H
LJMP ORG LJMP ORG SETB SETB MOV NOP
MAIN 0013H INT_EX1 0030H
EX1 EA
;采用电平触发,低电平有效中断 ;允许外部中断1
MAIN: CLR IT0
;插入一段用户程序 WAIT:
PCON,#01H ;单片机进入休眠方式等待中断
LJMP WAIT ;以下为外部中断1服务子程序 INT_EX1: JB P1.2,NEXT1
LJMP INT_IR3
;判断是不是2号中断 NEXT1: JB P1.1,NEXT2
;跳转到2号中断处理程序 LJMP INT_IR2
;跳转到1号中断处理程序 NEXT2: LJMP INT_IR1
ORG 1000H INT_IR3: 相应中断处理程序
RETI ORG 1100H
INT_IR2: 相应中断处理程序 RETI ORG 1200H
INT_IR1: 相应中断处理程序
;中断返回
;判断是不是3号中断
;跳转到3号中断处理程序
;中断返回
RETI 第6章 AT89S51的定时/计数器
;中断返回
·9·
参考答案
。参P90,参P102~103 6-1.下列说法正确的是( A )
A.特殊功能寄存器SCON,与定时器∕计数器的控制无关 对 B.特殊功能寄存器TCON,与定时器∕计数器的控制无关 错
C.特殊功能寄存器IE,与定时器∕计数器的控制无关 错 D.特殊功能寄存器TMOD,与定时器∕计数器的控制无关 错
*6-2.如果采用的晶振频率为3MHZ,定时器∕计数器工作在方式0、1、2下,其最大定时时间各为多少?答:因为机器周期:
1212Tcy???4(?s)6 fOSC3?10所以定时器/计数器工作方式0下,其最大定时时间为
Tmax?213?4?10?6(s)?8192?4(?s)?32768(?s)?32.768(ms)
所以定时器/计数器工作方式1下,其最大定时时间为
Tmax?216?4?10?6(s)?65536?4(?s)?262144(?s)?262.144(ms)
所以定时器/计数器工作方式2下,其最大定时时间为
Tmax?2?4?108?6(s)?256?4(?s)?1024(?s)?1.024(ms)
6-3.定时器/计数器用作定时器模式时,其计数脉冲由谁提供?定时时间与哪些因素有关?参P102 答:定时/计数器作定时器模式时,其计数脉冲由系统振荡器产生的内部时钟信号12分频后提供。定时时间与时钟频率和定时初值有关。
6-4.定时器/计数器用作计数器模式时,对外界计数频率有何限制?参P107
答:由于确认1次负跳变要花2个机器周期,即24个振荡周期,因此外部输入的计数脉冲的最高频率为系统振荡器频率的1/24。
6-6. 定时器/计数器的工作方式2具有什么特点?适用于哪些应用场合?答:定时器/计数器的工作方式2具有自动恢复初值的特点,适用于精确定时,比如波特率的产生。参P105
6-8. 一个定时器的定时时间有限,如何使用两个定时器的串行定时来实现较长时间的定时?
答:方法1,在第一个定时器的中断程序里关闭本定时器的中断程序,设置和打开另一个定时器;在另一个定时器的中断程序中关闭本定时中断,设置和打开另一个定时器。这种方式的定时时间为两个定时器定时时间的和。方法2,一个作为定时器,在定时中断后产生一个外部计数脉冲(比如由P1.0接INT0 产生),另一个定时器工作在计数方式。这样两个定时器的定时时间为一个定时器的定时时间乘以另一个定时器的计数值。
6-9. 当定时器T0用于方式3时,应该如何控制定时器T1的启动和关闭?参P106答:控制信号C/T和M1 M0。定时器T1的启动是工作于方式0、1、2。定时器T1的关闭是工作于方式3。
*6-10.定时器∕计数器测量某正单脉冲的宽度,采用何种方式可得到最大量程?若时钟频率为6MHz,求允许测量的最大脉冲宽度是多少?答:采用方式1定时工作方式。最大脉冲宽度为131.072ms。
*6-12. THX与TLX(X=0,1)是普通寄存器还是计数器?其内容可以随时用指令更改吗?更改后的新值是立即刷新还是等当前计数器计满之后才能刷新?参P101答:THx与TLx (x=0,1)是由特殊功能寄存器构成的计数器,其内容可以随时用指令更改,更改后的新值是立即刷新。但在读THx、TLx的值时,应该先读THx值,后读TLx,再读THx。若两次读得THx相同,则可确定读得的内容正确。若前后两次读得的THx有变化,再重复上述过程。
。参P123 7-1.帧格式为1个起始位,8个数据位和1个停止位的异步串行通信方式是方式( 1 )
7-2.在串行通信中,收发双方对波特率的设定应该是(相等的)的。参P128
( ABDE )是正确的。 7-3.下列选项中,
·10·