单片机原理及应用技术课后习题答案主编牛月兰.docx
《单片机原理及应用技术课后习题答案主编牛月兰.docx》由会员分享,可在线阅读,更多相关《单片机原理及应用技术课后习题答案主编牛月兰.docx(11页珍藏版)》请在冰豆网上搜索。
单片机原理及应用技术课后习题答案主编牛月兰
单片机应用技术习题解答
3-4.假定累加器A中的内容为30H,执行指令
1000H:
MOVCA,@A+PC
后,把程序存储器()单元的内容送入累加器A中。
答:
1031H。
3-7.下列程序段的功能是什么?
PUSHAcc
PUSHB
POPAcc
POPB
答:
A的内容与B的内容互换。
3-9.写出完成如下要求的指令,但是不能改变未涉及位的内容。
(A)把Acc.3,Acc.4,Acc.5和Acc.6清零。
(B)把累加器A的中间4位清零。
(C)把Acc.2和Acc.3置1。
答:
(A)ANLA,#87H;(A)∧10000111
(B)ANLA,#0C3H;(A)∧11000011
(C)ORLA,#0CH;(A)∨00001100
3-10.已知程序执行前有(A)=02H,(SP)=52H,(51H)=FFH,(52H)=FFH,下述程序执行后,(A)=(50H),(SP)=(52H),(51H)=(30H),(52H)=(50H),(PC)=(5030H)。
POPDPH;(SP)=52H,(52H)=FFH,(DPH)=FFH,(SP)=51H
POPDPL;(SP)=51H,(51H)=FFH,(DPL)=FFH,(SP)=50H
MOVDPTR,#4000H;(DPTR)=4000H
RLA;原来(A)=02H,左移一位后(A)=04H
MOVB,A;(B)=04H,
MOVCA,@A+DPTR;(4004H)=30H→A,(A)=30H
PUSHAcc;(SP)=51H,(51H)=30H
MOVA,B;(A)=04H
INCA;(A)=05H
MOVCA,@A+DPTR;(4005H)=50H→A,(A)=50H
PUSHAcc;(52H)=(A)=50H,(SP)=52H
RET;(PCH)=50H,(SP)=51H,(PCL)=30H,(SP)=50H
ORG4000H
DB10H,80H,30H,50H,30H,50H
3-12:
如果DPTR=507BH,SP=32H,(30H)=50H,(31H)=5FH,(32H)=3CH,则执行下列指令后:
POPDPH
POPDPL
POPSP
DPH=(3CH),DPL=(5FH),SP=(4FH)
3-13.假定(SP)=60H,(A)=30H,(B)=70H,则执行下列指令后,(SP)=(),(61H)=(),(62H)=()。
PUSHAcc;(61H)=30H,(SP)=61H
PUSHB;(62H)=70H,(SP)=62H
答:
(SP)=62H,(61H)=30H,(62H)=70H。
4-13.编写程序,实现双字节无符号数加法运算,要求(R0R1)+(R6R7)→60H和61H中。
答:
参考程序如下:
ORG0000H
MOVA,R1
ADDA,R7
MOV61H,A
MOVA,R0
ADDCA,R6
MOV60H,A
SJMP$
END
4-16.若SP=60H,标号LABEL所在的地址为3456H,LCALL指令的地址为2000H,执行如下指令:
2000HLCALLLABEL
后,堆栈指针SP和堆栈内容发生了什么变化?
PC的值等于什么?
如果将指令LCALL直接换成ACALL是否可以?
如果换成ACALL指令,可调用的地址范围是什么?
答:
(1)堆栈指针SP和堆栈内容变化为:
SP=SP+1=61H(61H)=PC的低字节=03H
SP=SP+1=62H(62H)=PC的高字节=20H
(2)PC的值:
PC=3456H。
(3)不可以将指令LCALL直接换成ACALL。
(4)可调用的地址范围是2KB,即2002H~27FFH。
5-3:
编写出外部中断1为跳沿触发的中断初始化程序。
答:
SETBIT1
SETBEX1
SETBEA
5-5:
某系统有3个外部中断源1、2、3,当某一中断源变为低电平时,便要求CPU进行处理,它们的优先处理次序由高到低依次为3、2、1,中断处理程序的入口地址分别为1000H,1100H,1200H。
试编写主程序及中断服务程序(转至相应的中断处理程序的入口即可)。
答:
若仅在/INT0引脚接3个外部中断源,电路如图5-10(P115)
ORG0000H
LJMPMAIN
ORG0003H
LJMPINT_EX0
ORG0030H
MAIN:
CLRIT0;采用低电平有效触发中断
SETBEX0;允许外部中断0
SETBEA
;插入用户程序
WAIT:
MOVPCON,#01H;单片机进入休眠方式等待中断
NOP
LJMPWAIT
;以下为外部中断0服务子程序
INT_EX0:
JNBP1.0,NEXT1;判断是不是1号中断
LJMPINT_IR1;跳转到1号中断处理程序
NEXT1:
JNBP1.1,NEXT2;判断是不是2号中断
LJMPINT_IR2;跳转到2号中断处理程序
NEXT2:
LJMPINT_IR3;跳转到3号中断处理程序
ORG1000H
INT_IR1:
;插入相应中断处理程序
RETI;中断返回
ORG1100H
INT_IR2:
;插入相应中断处理程序
RETI;中断返回
ORG1200H
INT_IR3:
;插入相应中断处理程序
RETI;中断返回
6-2AT89S51单片机的定时器/计数器有工作方式,各有什么特点?
答:
AT89S51单片机的定时器/计数器有工作方式0、工作方式1、工作方式2和工作方式3四种;在工作方式0时,为13位计数器,在工作方式1时,为16位计数器,在工作方式2时,为具有自动恢复初值的8位计数器,在工作方式3时,增加了一个8位定时器/计数器,使单片机具有3个位定时器/计数器。
6-7特殊寄存器TMOD的C/
位的作用是什么?
答:
特殊寄存器TMOD的C/
位的作用用于选择计数器模式还是定时器模式。
6-10AT89S51单片机晶振频率是6MHz,要求用定时器T0定时,每定时1s时间到,就使P1.7引脚外接的发光二极管的状态发生变化,由亮变暗,或反之。
试计算初值,并编写程序。
解:
采用查询方式进行编程,程序如下:
(1)计算计数初值X
因为(216 − X) *2 ×10−6 = 10−1,所以X = 15536 = 3CB0H。
因此TH0 = 3CH,TL0 = B0H。
(2)10次计数的实现
对于中断10次的计数,采用B寄存器作为中断次数计数器。
(3)程序设计
参考程序如下:
ORG0000H;程序运行入口
LJMPMAIN;跳向主程序入口MAIN
ORG000BH;T0的中断入口
LJMPIT0P;转T0中断处理子程序IT0P
ORG1000H;主程序入口
MAIN:
MOVSP,#60H;设堆栈指针
MOVB,#0AH;设循环次数10次
MOVTMOD,#01H;设置T0工作在方式1定时
MOVTL0,#0B0H;给T0设初值
MOVTH0,#3CH
SETBET0;允许T0中断
SETBEA;总中断允许
SETBTR0;启动T0
HERE:
SJMPHERE;原地循环,等待中断
IT0P:
MOVTL0,#0B0H;T0中断子程序,T0重装初值
MOVTH0,#3CH
DJNZB,RTURN;B中断次数计数,减1非0则中断返回
CPLP1.7;1s定时时间到,P1.7取反
RTURN:
RETI
6-12由P3.4引脚(T0)输入一个低频脉冲信号,要求P3.4每发生一次负跳变时,P1.0输出一个500μs的同步负脉冲,同时P1.1输出一个1ms的同步正脉冲。
已知晶振频率为6MHz。
解:
参考程序如下:
ORG0000H
BEGIN:
MOVTMOD,#06H
MOVTH0,#0FFH
MOVTL0,#0FFH
CLRP1.1
SETBP1.0
SETBTR0
DELL:
JBCTF0,RESP1
AJMPDELL
RESP1:
CLRTR0
CPLP1.0
CPLP1.1
MOVTMOD,#02H
MOVTH0,#06H
MOVTL0,#06H
SETBTR0
LOOP3:
JBCTF0,LOOP4
SJMPLOOP3
LOOP4:
CPLP1.0
LOOP1:
JBCTF0,LOOP2
SJMPLOOP1
LOOP2:
CPLP1.1
AJMPBEGIN
END
7-8.假定串行口串行发送的字符格式为1个起始位、8个数据位、1个奇校验位、1个停止位,请画出传送字符“B”的帧格式。
答案1:
传输字符“B”的帧格式如下:
起始位
0
1
0
0
0
0
1
0
1
停止位
答案2:
字符“B”的ASCII码为“42H”(既0BH+37H),帧格式如下:
数字(0~9)H的ASCII码为(0~9)+30H,数字(AH~FH)的ASCII码为(A~F)+37H。
请画出传送字符“C”的帧格式?
7-9.若晶体振荡器为11.0592MHz,串行口工作于方式1,波特率为4800bit/s,写出用T1作为波特率发生器的方式控制字和计数初值。
答:
T1的TMOD为20H,查表得计数初值为FAH(在PCON中SMOD=0)
MOVTMOD,#20H
MOVTH1,#0FAH
MOVTL1,#0FAH
MOVSCON,#40H
7-11.某AT89S51单片机串行口,传送数据的帧格式为1个起始位(0),7个数据位,1个偶校验位和1个停止位
(1)组成。
当该串行口每分钟传送1800个字符时,试计算出波特率。
答:
串口每秒钟传送的字符为:
1800/60=30个字符/秒
所以波特率为:
30个字符/秒×10位/个字符=300bit/s。
或波特率=1800×(1+7+1+1)/60=300bit/s
8-5.假设有n条地址线,容量是N,对应关系是
。
由于
,因此,4KB的容量需要12条地址线。
8.从左向右4片程序存储器27128的地址空间为
1#27128的地址空间为0000H~3FFFH
2#27128的地址空间为4000H~7FFFH
3#27128的地址空间为8000H~BFFFH
4#27128的地址空间为C000H~FFFFH
9-4.82C55芯片的控制字为:
10011110B=9EH
MOVDPTR,#XXXXH
MOVA,#9EH
MOVX@DPTR,A
9-5.根据82C55的PC口按位置位/复位控制字:
82C55控制寄存器的地址为8003H,PC5置1的控制字为00001011B=0DH,PC5置1的程序为
MOVDPTR,#8003H
MOVA,#0DH
MOVX@DPTR,A
82C55控制寄存器的地址为8003H,PC0清0的控制字为00000000B=00H,PC0清0的参考程序为:
MOVDPTR,#8003H
MOVA,#00H
MOVX@DPTR,A