单片机简答复习题
1.MCS51的中断系统有几个中断源?几个中断优先级?中断优先级是如何控制的?在出现同级中断申请时,CPU按什么顺序响应(按由高级到低级的顺序写出各个中断源)?各个中断源的入口地址是多少?
答:MCS51单片机有5个中断源,2个中断优先级,中断优先级由特殊功能寄存器IP控制,在出现同级中断申请时,CPU按如下顺序响应各个中断源的请求:INT0、T0、INT1、T1、串口,各个中断源的入口地址分别是0003H、000BH、0013H、001BH、0023H。
2.已知单片机系统晶振频率为6MHz,若要求定时值为10ms时,定时器T0工作在方式1时,定时器T0对应的初值是多少?TMOD的值是多少?TH0=?TL0=?(写出步骤)
答:定时值为10ms时,定时器T0工作在方式1时,定时器T0对应的初值是1388H
TMOD的值是00000001B,TH0=13H;TL0=88H。
3.MCS51系列单片机的内部资源有哪些?说出8031、8051和8751的区别。
答:MCS51系列单片机上有1个8位CPU、128B的RAM、21个SFR、4个并行口、1个串行口、2个定时计数器和中断系统等资源。8031、8051和8751的区别是8031内无ROM;8051内有4KB的掩膜ROM;8751内有4KB的EPROM。
4.如何正确使用P3口?
(1)说明P3口有第一功能和第二功能的使用。
(2)P3口的第二功能各位线的含义。
(3)使用时应先按需要选用第二功能信号,剩下的口线才作第一功能I/O线用。
(4)读引脚数据时,必需先给锁存器输出“1”。
5.简述累加器的ACC的作用。
(1)8位专用寄存器。
(2)运算时存放一个操作数。
(3)运算后存放运算结果,所以称它为累加器。
6.简述寄存器间接寻址方式及其寻址范围。
(1)寄存器中存放的是操作数的地址,操作数是通过寄存器间接得到,这种寻址方式称为寄存器间接寻址方式。
(2)寻址范围:
①内部RAM低128单位,形式@Ri(i=0,1)。
②外部RAM64K使用DPTR作间址寄存器,形式为@DPTR。
7.简述MCS-51单片机的中断入口地址。
中断入口地址为中断响应后PC的内容即中断服务的入口地址。
它们是:外部中断0 0003H
定时器T0中断 000BH
外部中断1 0013H
定时器T1中断 001BH
串行口中断 0023H
8.简述串行数据传送的特点。
(1)传送按位顺序进行,速度慢。
(2)传输线少,成本低。
(3)传送距离远,可达几公尺到几千公里。
9.51系列单片机具有几个中断源,分别是如何定义的?其中哪些中断源可以被定义为高优先级中断,如何定义?
答:具有5个中断源,分别是外部中断INT0和外部中断INT1、定时器溢出中断0和定时器溢出中断1以及串行中断。通过对中断优先级寄存器IP的设置,每个中断源都可以被定义为高优先级中断。
10.各中断源对应的中断服务程序的入口地址是否能任意设定?
答:各中断源的入口地址已经在中断地址区中被定义了,不能任意设定
11.如果想将中断服务程序放置在程序存储区的任意区域,在程序中应该作何种设置?请举例加以说明。
答:如果要将中断服务程序放置在程序存储区的任意区域,在程序中要通过在中断地址区的对应地址上设置跳转指令才可实现对中断服务程序的执行。
例如:外部中断O的中断服务程序INTOP放置在程序存储区的任意区域,此时,通过以下方式,可实现对中断服务程序的执行:(4分)
ORGO003H (2分)
JMP INTOP
列举其他中断跳转的例子也可,但叙述的中断源要与中断地址相对应才可得分,如外中断0对应0003H地址。
12、简述子程序调用和执行中断服务程序的异同点。
相同点:均能中断主程序执行本程序,然后再返回断点地址继续执行主程序。
不同点:
(1)中断服务程序入口地址是固定的,子程序调用入口地址是用户自己设定的。
(2)中断服务子程序返回指令除具有子程序返回指令所具有的全部功能之外,还有清除中断响应时被置位的优先级状态、开放较低级中断和恢复中断逻辑等功能。
(3)中断服务子程序是在满足中断申请的条件下,随机发生的;而子程序调用是用户主程序事先安排好的。
13、已知晶振频率为6MHz,在P1.0引脚上输出周期为500微秒的等宽矩形波,若采用T1中断,工作方式2,试写出中断初始化程序
MOV TMOD, #20H SETB ET1
MOV TL1, #06H SETB TR1
MOV TH1, #06H SJMP $
SETB EA
13. MCS-51指令系统主要有哪几种寻址方式?试举例说明。
答:MCS-51指令操作数主要有以下7种寻址方式:
寻址方式举例
立即寻址 MOV A,#16
直接寻址 MOV 20H,P1
寄存器寻址 MOV A,R0
寄存器间接寻址 MOVX A, @DPTR
变址寻址 MOVC A, @A+DPRT
相对寻址 SJMP LOOP
位寻址 ANL C,70H
14. 定时器T0和T1各有几种工作方式?
答:T0有4种工作方式,T1有3种工作方式,见表面4.4所述。
表4.4 定时器的工作方式
工作方式适用定时器功能说明
方式0 方式1 方式2 方式3 T0、T1
T0、T1
T0、T1
T0
13位的定时器/计数器
16位的定时器/计数器
自动重新装入计数初值的8位的定时器/计数器
分为两个8位计数器TL0和TH0。TL0可工作于定时或计数状态,TH0
则固定为定时状态。方式3对T1则停止计数
15.8031单片机需要外接程序存储器,实际上它还有多少条I/O线可以用?当使用外部存储器时,还剩下多少条I/O线可用?
答:8031系统必须外接程序促成器,原则上说,P0和P2口要用作数据和地址总线,所以只有P1和P3口可用作I/O口,共16条I/O线。在使用外部存储器时,除了占用P0和P2口外,还需要用P3口RD(P3.7)和WR(P3.6)两条控制线,所以这种情况下就只剩下14条I/O线可用了。
16. 8051的振荡周期、机器周期、指令周期是如何分配的?当晶振频率为6MHz时,一个机器周期为多少微秒?
答:8051单片机每条指令的执行时间(即指令周期)为1~4个机器周期,有单字节单周期指令、两字节单周期指令、单字节两周期指令、两字节两周期指令、三字节两周期指令以及单字节四周期指令。一个机器周期有6个状态:S1~S6每个状态又包含两个振荡周期,分为两拍:P1和P2。因此,一个机器周期包含12个振荡周期,表示为:S1P1、S1P2、S2P1、……S6P1、S6P2。
当FOSC=MHz时,机器周期为:(1/6)×12=2(μs)
17、 8051单片机的片内并行接口的作用
答:1。连接负载
2、做通用i/o口
3、做数据/地址总线使用
4、对冰口进行位操作
5.P3口作第二功能使用
18、单片机中断方式的流程图
答:主程序中断服务程序
设置中断入口保护现场
中断优先级恢复现场
执行主程序返回
19、写出下列特殊功能寄存器的名称
TCON 定时/计数器控制寄存器
TM0D 定时/计数器方式控制寄存
SCON 串行通信控制寄存器
PSW 程序状态字寄存器
IE 中断允许寄存器
20、简述8051单片机的内部组成结构
答:8051单片机是个完整的单片微型计算机。芯片内部包括下列硬件资源:
8位CPU;
4KB的片内程序存储器ROM。可寻址64KB程序存储器和64KB外部数据存储器;
128B内部 RAM;
21个S FR;
4个8位并行I/O口(共32位I/O线);
一个全双工的异步串行口;
两个16位定时器/计数器;
5个中断源,两个中断优先级;
内部时钟发生器。
21、单片机的内部存储器的种类,并写出各自的寻址范围和容量?
单片机外部RAM的分类又哪几种?外部ROM的分类有哪几种?
答:各种类型的单片机片内程序存储器的配置形式主要有以下几种形式:
掩膜(Msak)ROM型单片机:内部具有工厂掩膜编程的ROM,ROM中的程序只能由单片机制造厂家用掩膜工艺固化,用户不能修改ROM中的程序。例如:MCS—51系列的8051。
EPROM型单片机:内部具有紫外线可擦除电可编程的只读存储器,用户可以自行将程序写入到芯片内部的EPROM中,也可以将EPROM中的信息全部擦除。擦去信息的芯片还可以再次写入新的程序,允许反复改写。例如:MCS—51系列的8751。
EPROM型单片机使用比较方便,但价格较高,适合于研制产品或结构要求简单的小批量产品。
无ROM型单片机:内部没有程序存储器,它必须连接程序存储器才能组成完整的应用系统。例如:MCS—51系列的8031。
无ROM型单片机价格低廉,用户可根据程序的大小来选择外接程序存储器的容量。这种单片机扩展灵活,但系统结构较复杂。
E2ROM型单片机:内部具有电可擦除叫可编程的程序存储器,使用更为方便。例如:MCS—51的派生型89C51单片机。
OTP(One Time Programmable)ROM单片机:内部具有一次可编程的程序存储器,用户可以在编程器上将程序写入片内程序存储器中,程序写入后不能再改写。例如:NEC公司的μPD75P308GF—3B9。这种芯片的价格也较低。
22.MCS-51单片机有哪几个并行I/O端口?各I/O口有什么特性?
答:MCS-51单片机有4个8位双向的并行I/O口P0~P3,每一个口都由口锁存器(D触发器)、输出驱动器(FET)和输入缓冲器(3态门)组成。各口每一位I/O线都能独立地用作输入或输出,CPU对口的读操作有两种,一种是读取口锁存器的状态,另一种是读取口引脚状态。但这4个并行I/O口的结构和功能却完全不同,它们各自的特性如下:
P0口为三态双向I/O口(开漏输出,内部无上拉电阻)。对于8051/8751/8052,P0口可以作为一般I/O口,也可作为系统扩展的地址/数据总线口。P0口用作外部引脚输入时,口锁存器必须为“1”,关断输出驱动器的FET;作总线口时,分时用作输出外部存储器的低8为地址A0~A7和传送数据D0~D7。对于8032/8052,P1.0和P1.1还有另一种功能:P1.0—定时器T2的外部计数脉冲输入端,P1.1—定时器T2的捕捉/重装触发脉冲输入端。对于8031,P0口只能用作地址/数据总线口。
P1口为准双向I/O口(内部有上拉电阻)。用作外部引脚输入时,相应位的口锁存器必须为“1”,使输出驱动器FET截止。
P2口为准双向I/O口(内部有上拉电阻)。对于8051/8751/8052,P2口可以像P1口一样用作一般I/O口使用,也可以作为系统扩展的地址总线口,输出高8位地址A8~A15。对于8031,P2口只能用作地址总线口。
P3口也是准双向I/O口(内部有上拉电阻),且具有两个功能。作为第一功能使用时,与P1口一样用作一般I/O口。P3口的第二功能定义如下:
23.8051单片机提供了几个中断源?有几级中断优先级别?各中断标志是如何产生的?又如何清除这些中断标志?各中断源所对应的中断矢量地址是多少?
答:8051单片机提供了5个中断源:两个外部INTO和INT1中断源,两个定时片内定时器T0和T1溢出中断源,一个片内全双工串行口中断源.提供了高、低两个中断优先级、能实现两级中断服务程序嵌套,同一个优先级里,由硬件查询来确定优先序列。各中断源请求中断的标志分别由特殊功能寄存器TCON、SCON 的相应位锁存,这些标志位的产生和清除方式如下:
IE0(TCON.1)外部中断0请求标志.当INTO出现有效的中断请求信号时,硬件使IE0置位.在边沿触发方式时,当CPU响应IE0中断后,由硬件清除IE0。
IE1(TCON.3)外部中断1请求标志.置位复位方式与IE0相同。
TF0(TCON.5)T0溢出中断请求标志。每当T0计数器加1计数到溢出时,TF0=1。CPU响应TF0中断,硬件清除TF0。也可以由查询软件清除TF0。
TF1(TCON.7)T1溢出中断请求标志。置位复位方式与TF0相同。
R1(SCON.0)串行口接收中断请求标志。当串行口接收器收到一个串行帧,R1=1。CPU响应R1中断,硬件并不清除R1,R1必须由软件清0。
T1(SCON.1)串行口发送中断请求标志.将8位数据写入SBUF后,发送完一个串行帧,T1=1.CPU响应T1中断,硬件并不清除T1,T1必须由软件清0.
各中断源对应的矢量地址如下:
外部中断0:0003H
定时器 T0:000BH
外部中断:0013H
定时器 T1:001BH
串行口接收和发送:001BH
24. 8031单片机需要外接程序存储器,实际上它还有多少条I/O线可以用?当使用外部存储器时,还剩下多少条I/O线可用?
答:8031系统必须外接程序促成器,原则上说,P0和P2口要用作数据和地址总线,所以只有P1和P3口可用作I/O口,共16条I/O线。在使用外部存储器时,除了占用P0和P2口外,还需要用P3口RD(P3.7)和WR(P3.6)两条控制线,所以这种情况下就只剩下14条I/O线可用了。
25.单片机有哪几个特殊功能寄存器?各在单片机的哪些功能部件中?
答:8051单片机内部有21个特殊功能寄存器,在物理上是分散在片内各功能部件中,在数学上把它们组织在内部数据存储器地址空间80H~FFH中,以便能使用统一的直接寻址方式来访问。这些特殊功能寄存器颁在以下各个功能部件中:
CPU:ACC、B、PSW、SP、DPTR(由DPL和DPH两个8位寄存器组成);
中断系统:IP、IE;
定时器/计数器:TMOD、TCOM、TL0、TH0、TL1、TH1;
并行I/O口:P0、P1、P2、P3;
串行口:SCON、SBUF、PCON
26.8031的扩展储存器系统中,为什么P0口要接一个8位锁存器,而P2口却不接?
答:这是因为P0口是扩展储存器系统的多路低8位地址和数据总线,在访问外部存储器时,P0口分时用作输出外部储存器低8位地址和传送数据,为了在整个访问外部存储器期间,对外部存储器存在着有效的低8位地址信号,所以P0口需要外接一个地址锁存器。ALE信号就是用来把P0口输出的地址字节锁存在这个外接的锁存器中,再从锁存器输出外部存储器的低8位地址。而P2口只用作扩展存储器系统的高8位地址线,并在整个访问外部存储器期间不变,所以不必外接地址锁存器。
27.简述可编程并行接口8255 A的内部结构?
答:8255 A的内部结构由三部分组成:总线接口部分,内部逻辑部分,外部接口部分。
总线接口部分其中有数据总线驱动器,读/写控制逻辑
内部逻辑部分由A组和B组控制电路。
外部接口部分该部分有3个8位并行I/O端口,即A口、B口和C口。
28.设内部RAM(30H)=5AH,(5AH)=40H,(40H)=00H,端口P1=7FH,问执行下列指令后,各有关存储单元(即R0,R1,A,B,P1,30H,40H及5AH单元)的内容如何?
MOV R0,#30H ;R0=30H
MOV A,@R0 ;A=5AH
MOV R1,A ;R1=5AH
MOV B,R1 ;B=5AH
MOV @R1,P1 ;(5AH)=7FH
MOV A,P1 ;A=7FH
MOV 40H,#20H ;(40H)=20H
MOV 30H,40H ;(30H)=20H
解:每一条指令执行后的结果如注释字段所标。最后结果为:R0=30H,R1=5AH,A=7FH,B=5AH,P1=7FH,(30H)=20H,(40H)=20H,(5AH)=7FH。
29. 简述可编程并行接口8255 A的内部结构?
答:8255 A的内部结构由三部分组成:总线接口部分,内部逻辑部分,外部接口部分。
(1)总线接口部分其中有数据总线驱动器,读/写控制逻辑
(2)内部逻辑部分由A组和B组控制电路。
(3)外部接口部分该部分有3个8位并行I/O端口,即A口、B口和C口。
30. 单片机有哪几个特殊功能寄存器?各在单片机的哪些功能部件中?
答:8051单片机内部有21个特殊功能寄存器,在物理上是分散在片内各功能部件中,在数学上把它们组织在内部数据存储器地址空间80H~FFH中,以便能使用统一的直接寻址方式来访问。这些特殊功能寄存器颁在以下各个功能部件中:
(1)CPU:ACC、B、PSW、SP、DPTR(由DPL和DPH两个8位寄存器组成);
(2)中断系统:IP、IE;
(3)定时器/计数器:TMOD、TCOM、TL0、TH0、TL1、TH1;
(4)并行I/O口:P0、P1、P2、P3;
(5)串行口:SCON、SBUF、PCON。
单片机编程复习题
1.某单片机控制系统有8个发光二极管。试画出89C51与外设的连接图并编程使它们由右向左轮流点亮。答:图 (5分) 构思 (3分)
MOV A,#80H (1分)
UP:MOV P1,A (1分)
RR A (2分)
SJMP UP (1分)
2.某控制系统有2个开关K1和K2,1个数码管,当K1按下时数码管加1,K2按下时数码管减1。试画出8051与外设的连接图并编程实现上述要求。
答:图 (5分) 构思 (3分)
程序(4分)
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP AINT0
ORG 0013H
LJMP BINT1
MAIN: MOV IE,#83H
SETB IT0
SETB IT1
MOV R0,#00H
MOV DPTR,#TAB
UP: MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
SJMP UP
AINT0: INC R0
CJNE R0,#10,AINT01
MOV R0,#0
AINT01: RETI
BINT1: DEC R0
CJNE R0,#0FFH,BINT11
MOV R0,#9
BINT11: RETI
3.已知在累加器A中存放一个BCD数(0~9),请编程实现一个查平方表的子程序。
SQR:1NC A
MOVC A,@A+PC
RET
TAB:DB 0,1,4,9,16
DB 25,36,49,64,81
4.请使用位操作指令实现下列逻辑操作:
BIT=(10H∨P1.0)∧(11H∨C Y)
ORL C,11H
MOV 12H,C
MOV C,P1.0
ORL C,/10H
ANL C,12H
MOV BIT,C
RET
5.已知变量X存于VAR单元,函数值Y存于FUNC单元,按下式编程求Y值。
Y=
10 0
1
x
x
x
> -
=
?
?
??
MOV A,VAR
CJNE A,#0,COMP
SJMP RES ;x=0,Y=0 COMP:JNC POSI ;x>0,Y=1
MOV A,#0FFH ;x<0,Y=-1
SJMP RES
POSI:MOV A,#01H
RES:MOV FUNC,A
RET
6.已知在R2中存放一个压缩的BCD码,请将它拆成二个BCD字节,结果存于SUM开始的单元中(低位在前)。MOV R0,#SUM
MOV A,R2
ANL A,#OFH
MOV @R0,A ;存低字节BCD
MOV A,R2
ANL A,#0F0H
SWAP A
1NC R0
MOV @R0,A ;存高字节BCD
RET
7.将存于外部RAM 8000H开始的50H数据传送0010H的区域,请编程实现。
MOV DPTR,#8000H
MOV R0,#10H
MOV R2,#50H
LOOP:MOVX A,@DPTR ;取数
MOVX @R0,A ;存数
1NC DPTR
1NC R0
DJNZ R2,LOOP
RET
8.请将片外RAM20H-25H单元清零
MoV R0,#20H
MOV R7,#06H
CLR A
LOOP:MOVX @R0,A
INC R0
DJNZ R7,LOOP
9.请将ROM3000单元内容送R7
MOV DPTR, #3000H
CLR A
MOVC A,@A+DPTR
MOV R7,A
10.已知一MCS—51单片机系统的片内RAM 20H单元存放了一个8位无符号数7AH,片外扩展RAM的8000H 存放了一个8位无符号数86H,试编程完成以上两个单元中的无符号数相加,并将和值送往片外RAM的01H、00H单元中,同时将所编写程序运行完成后的数据和状态添入下表中给出的PSW的有关位以及寄存器A、DPTR和RAM单元中。
CY A DPTR 片外01H 片外00H 片外8000H
CY A DPTR 片外01H 片外00H 片外8000H
0 01H 8000H 0lH 00H 86H
MOV DPTR,#8000H ;加数单元地址送DPTR
MOVX A,@DPTR ;取加数之一
ADD A,20H ;两数相加
MOV R0,#00H ;和值的低位送片外00H单元
MOVx @R0,A
INC R0
CLR A ;计算和值的高位
ADDC A,#00H
MOVx @R0,A ;高位送片外01H单元
RET
编程要考虑将进位位的值作为结果的一部分取出来。采用其他编程方式也可以,但结果是不会改变的,和值=100H
11.有一长度为10字节的字符串存放在8031单片机内部RAM中,其首地址为40H。要求将该字符串中每一个字符加偶校验位。(以调用子程序的方法来实现。)
源程序如下:
ORG 1000H
MOV R0,#40H
MOV R7,#10
NEXT:MOV A,①
ACALL SEPA
MOV @R0,A
INC R0
DJNZ ②,NEXT
SJMP $
SEPA:ADD A,#00H
③PSW.0,SRET
ORL A,④
SRET:⑤
① @R0② R7③ JNB ④ #80H ⑤ RET
12.从内部RAM30H单元开始,有10个单字节数据。试编一个程序,把其中的正数、负数分别送40H 和50H开始的内部RAM单元。(10分)
MOV R0,#30H
MOV R1,#40H
MOV A,#50H
MOV R7,#10
LOOP:MOV 20H,@R0
JB 20H.7,FSHU
ZSHU:MOV @ R1,20H
INC R1
SJMP NEXT
FSHU:XCH A,R1
MOV @R1,A
XCH A,R1
INC A
NEXT:DJNZ R7,LOOP
SJMP $
13.将20H单元清零
MOV 20H,#00H 或
CLR A
MOV 20H, A
14.将片外RAM2000H中的低字节与片内20H中的低字节交换。
MOV DPTR,#2000H XCHD A,@R0
MOV R0,#20H MOVX @DPTR,A
MOVX @DPTR,A
15.已知某端口地址为2FFFH,将片内RAM20H的内容写到该端口中。
MOV A, 20H
MOVX DPTR, #2FFFH
MOVX @DPTR, A
16.把DPTR的内容压入堆栈
PUSH DPH
PUSH DPL
17.将内部RAM20H为首的16个单元的8位无符号数排序写出程序,并作适当注释
SORT: MOV R0, #20H
MOV R7,#07H
CLR TR0 ;交换标志位复位
LOOP: MOV A,@R0
MOV 2BH, A
INC R0
MOV 2AH, @R0
CLR C
SUBB A, @R0;比较前后两个数
JC NEXT ;
MOV @R0, 2BH
DEC R0
MOV @R0, 2AH
INC R0
SETB TR0 ;置交换标志位有效
NEXT: DJNZ R7, LOOP
JB TR0, SORT;若交换标志位有效,继续进行
HERE: SJMP $
18. 阅读下列硬件图,补齐连接线,并回答问题:
(1) ALE、PSEN、WR、RD的功能
ALE作地址锁存的选通信号,以实现低八位地址的锁存,PSEN信号作扩展程序存储器的读选通信号
WR、RD作为扩展数据存储器和I/O端口的读写选通信号。
(2)图中各芯片的功能
74LS373:地址锁存器,用来锁存P0口发送的地址低8位
2764 :容量为8KB的程序存储器(EPROM)用来存储程序
6264 :容量为8KB的数据存储器(RAM)用来存储数据
8031:不含程序存储器的8位单片机芯片,是不带I/O设备的微型计算机。
(3)2764、6264的地址范围(P2.5取”0”)
2764:8000H~9FFFH 6264: 4000H~5FFFH
19.数据块传送,将RAM从30H开始的连续32个单元的内容传递给片内RAM从60H开始的连续32个单元。 ORG 1000H
MOV R7,#20H
MOV R0, #30H
MOV R1,#60H
LOOP:MOV A,@R0
MOV R1,A
INC R0
INC R1
DJNZ R7, LOOP
SJMP $
END
20.将4个单字节数放片内30H~~33H,它们求和结果放在片内40H,41H单元。
ORG 1000H
MOV R7,#04H
MOV R0,30H
CLR A
MOV 41H,A
LOOP: ADD A,@R0
JNC NEXT
INC 41H
NEXT:INC R0
DJNZ R7,LOOP
MOV 40H,A
SJMP $
END
21.RAM中40H单元内存有一个十六进制数,把这个数转换为BCD码的十进制数,BCD码的十位和个位放在累加器A中,百位放在R2中。
ORG 2200H
MOV A,40H
MOV B,#64H
DIV AB
MOV R2,A
MOV A,#0AH
XCH A,B
DIV AB
SWAP A
ORL A,B
SJMP $
END
22.编程序将片内40H-46H单元内容的高4位清零,保持低4位不变。
ORG 1000H
MOV R7,#07H
MOV R0,#40H
LOOP:MOV A,@R0
ANL A,#0FH
MOV @R0,A
INC R0
DJNZ R7,LOOP
SJMP $
END
23.将31H、32H单元与41 H、40H单元的双字节十进制无符号数相加,结果存入32H,31H,30H单元。即(31H)(30H)+(41H)(40H) 32H、31H、30H。
输入程序
参考程序
MOV R0,#30H
MOV R1,#40H
MOV R2,#02H
CLR C
L1: MOV A,@R0
ADDC A,@R1
DA A
MOV @R0,A
INC R0
INC R1
DJNZ R2,L1
CLR A
MOV ACC.0,C
MOV @R0,A
在31H、30H单元存入加数如3018,在41H,40H单元存入被加数如8975。
(3)输入程序首地址,(从处为2000H),然后开始单步或断点运行该段程序。
(4)运行过程中检查数据的变化,并在最后检查(32H)= ,(31H)= , (30H)= 。24.编程实现逻辑运算:Q=(U *(V+W))+X.Y)+Z。设U~Z的位地址为00H~05H.Q的位地址为07H。《实际中U~Z可以是外部输入端口信号或软件设定的一些控制位》。
实习步骤:
(1)输入所编程序。
MOV C,01H
O RL C,02H
ANL C,00H
MOV F0,C ;暂存U*(V+W)的值
MOV C,03H
ANL C,/04H
ORL C,F0
ORL C,/05H
MOV 07H,C ; 保存结果
(2)部RAM20H单元(位地址00H~07H的位在20H单元)输入某个数据(注意此时各位的状态并做好记录)。
(3)单步或断点运行所编程序,逐步检查Cy及个数据的变化情况(注意检查时也按字节读出,再观察其相应位)。
(4)验证运行结果
(5)改变20H单元的置数,重做。
25.将片内RAM-2单元(如20H)的内容分成两段,并将它们分别存入2单元和3单元。(高位清零)。
输入程序。
参考程序:
MOV R0,#21H
MOV A,20H
ANL A,#0FH
MOV @R0,A
INC R0
MOV A,20H
SWAP A
ANL A,#0FH
MOV @R0
在某单元(如20H)存入待分字的某数(如5BH)。
单步或带断点运行该段程序。
运行过程中注意检查程序的变化,并在最后检查(21H)= ,
(22H)= 。
26.编程实现字符串长度统计:设在单片机内RAM中从STR单元开始有一字符串《以ASC II码存放》,该字符串以$<其值为24H>结束,试统计该字符串的长度,其结果存于LON单元。
(1)输入所编程序
START: CLR A ;计数单元清零
MOV R0,#STR
LOOP: CJNE R0,#24H,NEXT ;判断字符串是否结束
SJMP COMP
NEXT: INT A
INC R0
SJMP LOOP
COMP: MOV LON,A ;将长度存入LON单元
SJMP $
(2)在以STR为首的地址内部RAM单元开始存放待统计长度的数据块(自设),并以#24作为数据块的结束标志。
(3)单步或断点运行所编程序,注意观察每次转移后PC及统计长度单元LON的变化,并做好记录。(4)验证运行结果。
(5)改变数据块长度,重做。
27.编程实现下列逻辑运算Z=(M+N)*(O+P)。设M,N,O,P为片内RAM30H—33H单元,输出结果单元Z地址为34H。
将下列程序输入到实习装置
参考程序
START:MOV A,M
XRL A,N
MOV B,A
MOV A,O
ORL A,P
ANL A,B
MOV Z,A
在M—P(30H—33H单元)装入待进行逻辑运算的数据(自设)。
单步或带断点运行该段程序。
运行过程中注意检查程序的变化,并在最后验证(Z)是否与理论值相符。
28.设从内存BLOCK单元开始存放一无符号数的数据块,其长度为LEN。试找出其最小数,并存入MIN单元。
(1)输入所编程序。
COMP: MOV A,#0FFH ;置比较的初始值
MOV R2,#LEN ;置数据块长度
MOV R1,#BLOCK ;置地址指针
LOOP: CLR C
SUBB A,@R1 ;比较
JC NEXT ;若小,则恢复原值
MOV A,@R1
SJMP NEXT1
NEXT: ADD A,@R1
NEXT1: INC R1 ;若大,则取下个数比较
DJNZ : DJNZ R2,LOOP
MOV MN ,A ;存最小数
SJMP $
(2)确定好数据块的起始地址和长度,并在相应的内部RAM单元存入数据,同时作好记录。
(3)单步或断点运行程序,注意循环次数是否等于数据块长度。
(4)观察PC,A和计数单元的变化并作好记录。
(5)验证运行结果。
29.比较存放在ONE,TWO,TRE三个单元的无符号数,并将小数存放在20H单元中。
输入程序
参考程序
MOV A,ONE
CJNE A,TWO,RR
RR: JC SS
MOV A,TWO
CJNE A,TRE,TT
TT: JC WW
SJMP UU
SS: CJNE A,TRE,VV
VV: JC WW
UU: MOV A,TRE
WW: MOV 20H,A
在ONE,TWO,和TRE三个内部RAM
单步运行,注意PC变化情况,同时检查Cy
检查20H单元的内容,检验是否为最小值
修改ONE
30.设在单片机内部RAM中从STR单元开始存放有一数据块,该数据块以#00H结束,试统计其中为#0FFH 的单元个数并存入NUM单元。
(1)输入所编程序。
COUNT: CLR A ;清计数单元
MOV R0,#STR ;置地址指针
LOOP: CJNE #0FFH,LOOP1;数据为#0FFH则计数单元加1
INC A
LOOP1: INC R0
CJNE @R0,#000H,LOOP;数据块取完?
MOV NUM A ;存统计结果
SJMP $
(2)确定好数据块的起始地址,同时在相应的内部RAM单元建立好数据块(此数据块以#00H结束,并使其中若干个单元的内容为#0FFH),同时作好记录。
(3)单步或断点运行程序,注意循环跳出循环时刻。
(4)观察并记录PC,A和计数单元的变化情况。
(5)验证运行结果。
31.根据Rn单元内容(00H—7FH),分别转向程序ROUT00—ROUT7FH
参考程序
输入程序
MOV A,Rn
RL A
MOV DPTR,#JMPTAB
JMP @A+DPTR
JMPTAB:AJMP PROG00
AJMP PROG01
…
AJMP PROGnn
PROG00:MOV 20H,#
SJMP $
…
PROGnn:MOV 20H,#nH
SJMP $
为便于实习,可缩小散转范围,运行前在Rn 中装入的数限定为00H—03H中的某一个。
确定JMPBAB及PROG00—PROG03的地址,并在PROGn处写人处理程序。
单步或断点运行,观察并记录A,DPTR以及PC变化情况。
修改Rn中数据,重做。
32.求平方子程序计算X=a^2+b^2
先建立0~9的平方表(十进制),TAB为表首地址指针。子程序所完成
的功能是用查表的方式求出平方值。计算X=a^2+b^2时只要两次调用子程序分别求出a^2和b^2,然后相加即可。(设X,a,b分别存于内部RAM的ONE,TWO和TRE三个单元中)。
子程序入口:(A)=待查表的数
子程序入口:(A)=平方值
实习步骤
(1)在选定的存区中建立好平方表。
MAIN: MOV A;ONE ;调求平方子程序
ACALL SQR
MOV R1,A
MOV A,TWO
ACALL SQR
ADD A,R1 ;求平方和
MOV TRE,A
SJMP $
SQR: INC A ;修正查表偏移量(入口A)
MOVC A, @A+PC ;查表求平方值(出口A )
RET ;返回
TAB: DB: 0,1,4,9,16 ;平方表
DB: 25,36,49,64,81
(2)输入并调试已编好的子程序,按要求准备如口即在A中装如待查平方的数,独立运行子程序后,检查A 中的内容是否为平方值.
(3)输入并调试已遍好的主程序,注意观察子程序的调用和返回情况.
(4)观察并记录运行过程中的子程序的入口,出口及PC和各积存器的变化情况.
33.片内RAM30H开始的单元中有10B的二进制数,请编程求它们之和(和<256 ).
解ADDIO:MOV R0,30H
MOV R7,#9
MOV A,@R0
LOOP: INC R0
ADD A,@R0
DJNZ R7,LOOP
MOV 30H,A
RET
34. 试编程对8155进行初始化,设A口为选通输出,B口为选通输入,C口作为控制联络口,并启动定时器/记数器按方式1工作,工作时间为10ms,定时器计数脉冲频率为单片机的时钟频率24分频,fosc=12MHz。解:算得初值=5000 =1388H
MOV DPTR,#7F04 ;定时器低八位寄存器地址 DPTR
MOV A,#88H ;低8位初值 A
MOVX @DPTR,A ; 低8位初值低8位寄存器
INC DPTR ;DPTR指向定时器高8位
MOV A,#13H ;高8位初值 A
MOVX @DPTR,A ;高8位初值高8位寄存器
MOV DPTR,#7F00H ;8155命令寄存器地址 DPTR
MOV A,0C5H ;命令字 A
MOVX @DPTR,A ;命令字命令寄存器
35.试将8031单片机外接一片2716 EPROM和一片6116 RAM组成一个应用系统,请画出硬件连线图,并指出扩展存储器的地址范围。
答:2716是2K×8位的EPROM,6116是2K×8位的静态RAM,两者都仅需要11根地址线。由于没有规定地址范围,故可按最简单的方式来连接,即省去地址译码器,程序存储器的地址必须从0开始,基本地址为0000H—07FFH。数据存储器的地址为0000H—07FFH。控制线的连接为/PSEN控制EPROM的读出,/RD和/WR 控制RAM的读写,两个芯片的片选端都固定接地,连线图如图所示。
A7 A10 . A9 A0 A8 /OE
/WE D7 . 6116 D0 /CE
P2.2 P2.1 P2.0
P0
8031
ALE /PSEN
/EA
/RD /WE
36.应用单片机内部定时器T0工作在方式1下,从P1.0输出周期为2ms 的方波脉冲信号,已知单片机的晶振频率为6MHZ 。
请(1)计算时间常数X ,应用公式X=216-t (f /12) (2)写出程序清单 解:X=216-t(F/12) =216-1*10-3*6*106/12 =OFEOCH ORG 3000H
START:MOV TMOD,#01H MOV TL0,#OCH MOV THO,#OFEH SETB TR0
LOOP: JBC TFO,DONE SJMP LOOP
DONE: MOV TL0,#OCH MOV THO,#OFEH CPL P1.0 SJMP LOOP
37.片内RAM40H 开始的单元内有10B 二进制数,编程找出其中最大值并存于50H 单元中. 解 START: MOV R0,#40H ;数据块首地址送R0 MOV R7,#09H ;比较次数送R7
A7 A10 . A9 A0 A8 /OE D7
. 2764 D0 /CE D7 Q7 .
D0 Q0 G /E
MOV A,@R0 ;取数送A
LOOP: INC R0
MOV 30H,@R0 ;取数送30H
CJNE A,30H,NEHT ;(A)与(30H)相比
NEXT: JNC BIE1 (A)≥(30H)转BIR1
MOV A,30H ;(A)<(30H),大数送A BIE1: DJNZ R7,LOOP ;比较次数减1,不为0,继续比较 MOV 50H,A ;比较结束,大数送50H
RET
38.设计一个2×2行列式键盘电路并编写键盘扫描子程序。
解:(1)2×2行列式键盘电路如图所示。
5V P1.7
P1.6
P1.1
P1.0
89C51
(2)键盘扫描子程序:
KEY1: ACALL KS1 ;调用判断有无键按下子程序
JNZ LK1 ;有键按下,转LK1
AJMP KEY1 ;无键按下,返回
LK1: ACALL T12MS ;调延时12ms子程序
ACALL KS1 ;查有无键按下
JNZ LK2 ;若有,则为键确实按下,转逐列扫描
AJMP KEY1 ;无键按下,返回
LK2: MOV R4,#00H ;首列号 R4
MOV R2,#FEH ;首列扫描字 R2
LK4: MOV A,R2 ;列扫描字 P1口
MOV P1,A ;使第一列线为0
MOV A,P1 ;读入行状态
JB ACC.0,LONE;第0行无键按下,转查第一行
MOV A,#00H ;第0行有键按下,该行首键号#00H A
AJMP LKP ;转求键号
LONE: JB ACC.1,NEXT ;第一行无键按下,转查下一列
MOV A,#02 ;第一行有键按下,该行首键号#02 A LKP: ADD A,R4 ;键号=首行号+列号
PUSH ACC ;键号进栈保护
LK3: ACALL KS1 ;等待键释放
JNZ LK3 ;未释放,等待 POP AC ;键释放,键号 A RET ;键扫描结束
NEXT: INC R4 ;列号加1,指向下一列 MOV A,R2 ;列扫描字 A
JNB ACC.1,KND ;判断2列全扫描完?扫描完,转KND
RL A ;没扫描完,扫描字左移一位,形成下一列扫描字 MOV R2,A ;扫描字 R2 AJMP LK4 ;扫描下一列 AJMP KEY1 ;全扫描完,返回
MOV A,#FCH ;全扫描字11111100B A MOV P1,A ;全扫描字 所有行 MOV A,P1 ;读取列值
CPL A ;取正逻辑,高电平表示有键按下 ANL A,#0C0H ;屏蔽低6位,取高2位 RET ;出口状态(A )!=0,有键按下
39.编程将片内RAM30H 单元开始的15B 的数据传送到片外RAM3000H 开始的单元中去。 解:STRAT :MOV R0,#30H MOV R7,#0FH MOV DPTR,#3000H LOOP : MOV A,@R0 MOVX @DPTR,A INC R0 INC DPTR DJNZ R7,LOOP RET
40.编制一个循环闪烁灯的程序。有8个发光二极管,每次其中某个灯闪烁点亮10次后,转到下一个闪烁10次,循环不止。画出电路图。
解
本程序的硬件连接如图所示。当P1.0输出高电平时,LED 灯亮,否则不亮。
其程序如下:
MOV A,#01H ;灯亮初值
SHIFT: LCAIL FLASH ;调闪亮10次子程序 RR A ;右移一位 SJMP SHIFT ;循环
FLASH: MOV R2,#0AH 闪烁10次计数
P1.0 8013 P1.7
D0 Q0 74LS240
D7 Q7
5V
FLASH1; MOV P1,A ;点亮
LCALL DELAY ;延时
MOV P1,#00H ;熄灭 LCALL DELAY ;延时 DJNZ R2,FLASH1 ;循环RET