周国运版51单片机课后习题答案
更新时间:2024-06-27 03:49:01 阅读量: 综合文库 文档下载
- 单片机周国运课后答案推荐度:
- 相关推荐
第1章 习题答案
1.什么是单片机?
答:将中央处理器(Central Processing Unit,CPU)、随机存储器、只读存储器、中断系统、定时器/计数器以及I/O接口电路等微型计算机的主要部件集成在一块芯片上,使其具有计算机的基本功能,就叫做单片微型计算机(Single Chip Micro Computer,SCMC),简称单片机。由于单片机的指令功能是按照工业控制的要求设计,所以单片机又称为微控制器(Micro Controller Unit,MCU)。
2.单片机有哪些特点?
答: (1)单片机的存储器ROM和RAM是严格区分的。ROM称为程序存储器,只存放程序、固定常数及数据表格。RAM则为数据存储器,用作工作区及存放用户数据。
(2)采用面向控制的指令系统。
(3)单片机的I/O引脚通常是多功能的。 (4)单片机的外部扩展能力强。
(5)单片机体积小,成本低,运用灵活,易于产品化。
(6)面向控制,能有针对性地解决从简单到复杂的各类控制任务,因而能获得最佳的性能价格比。
(7)抗干扰能力强,适用温度范围宽。
(8)可以方便地实现多机和分布式控制,使整个控制系统的效率和可靠性大为提高。
3.单片机的应用有哪些?
答: (1)工业控制。单片机可以构成各种工业控制系统、数据采集系统等。如数控机床、自动生产线控制、电机控制、测控系统等。 (2)仪器仪表。如智能仪表、医疗器械、数字示波器等。
(3)计算机外部设备与智能接口。如图形终端机、传真机、复印机、打印机、绘图仪、磁盘/磁带机、智能终端机等。
(4)商用产品。如自动售货机、电子收款机、电子秤等。
(5)家用电器。如微波炉、电视机、空调、洗衣机、录像机、音响设备等。 (6)消费类电子产品。 (7)通讯设备和网络设备。 (8)儿童智能玩具。
(9)汽车、建筑机械、飞机等大型机械设备。 (10)智能楼宇设备。 (11)交通控制设备。
4.常见的单片机有哪些类型?
答: 1.AVR单片机;2.Motorola单片机;3.MicroChip单片机;
4.Scenix单片机;5.EPSON单片机;7.GMS90单片机;8.华邦单片机 9.Zilog单片机;10.NS单片机;11.AX1001单片机
1
第2章 习题答案
1.MCS-51单片机内部包含哪些主要逻辑功能部件? 答:(1)1个8位的微处理器CPU。
(2)8KB的片内程序存储器Flash ROM(51子系列的Flash ROM为4KB),用于烧录运行的程序、常数数据。
(3)256B的片内数据存储器RAM(51子系列的RAM为128B),在程序运行时可以随时写入数据和读出,用于存放函数相互传递的数据、接收的外部数据、中间结果、最后结果以及显示的数据等。
(4)3个16位的定时器/计数器(51子系列仅有2个定时器),每个定时器/计数器可以设置为计数方式,用于对外部事件信号进行计数,也可以设置为定时方式,满足各种定时要求。
(5)有一个管理6个中断源(51子系列1是5个中断源)、两个优先级的中断控制器。
(6)4个8位并行I/O端,每个端口既可以用作输入,也可以用于输出。 (7)一个全双工的UART(通用异步接收发送器)串行I/O口,用于单片机之间的串行通信,或者单片机与PC机、其它设备、其它芯片之间的串行通信。 (8)片内振荡电路和时钟发生器,只需外面接上一晶振或输入振荡信号就可产生单片机所需要的各种时钟信号。
(9)有一个可寻址64KB外部数据存储器、还可以寻址64KB外部程序存储器的三总线的控制电路。
2.MCS-51单片机的EA引脚有何功能?信号为何种电平?
答: EA为片外程序存储器选择输入端。该引脚为低电平时,使用片外程序存储器,为高电平时,使用片内程序存储器。
3.MCS-51单片机的ALE引脚有何功能?信号波形是什么? 答: ALE为地址锁存信号,每个机器周期输出两个正脉冲。在访问片外存储器时,下降沿用于控制外接的地址锁存器锁存从P0口输出的低8位地址。在没有接外部存储器时,可以将该引脚的输出作为时钟信号使用。
4.MCS-51单片机的存储器分为哪几个空间?如何区分不同空间的寻址?
答: MCS-51单片机有4个存储空间,它们是片内程序存储器和数据存储器,在片外可以扩展的程序存储器和数据存储器。这4个存储空间可以分成三类:片内数据存储空间(256B的RAM和128B的特殊功能寄存器)、片外数据存储空间(64KB)、片内和片外统一编址的程序存储空间(64KB)。不同的存储空间,它们有各自的寻址方式和访问指令。片内数据存储空间用MOV指令访问。片外数据存储空间用MOVX指令访问。片内和片外统一编址的程序存储空间用MOVC指令访问。 5.简述MCS-51单片机片内RAM的空间分配。内部RAM低128字节分为哪几个主要部分?各部分主要功能是什么?
答: 片内数据存储器按照寻址方式,可以分为三个部分:低128字节数据区,高128字节数据区间,特殊功能寄存器区。低128字节数据区分为三个区域:工作
2
寄存器区,位寻找区和通用数据区。工作寄存器区4组工作寄存器;位寻找区既可以做位操作,也可以字节操作;通用数据区用于堆栈和存放程序运行时的数据和中间结果。 6.简述MCS-51单片机布尔处理器存储空间分配,片内RAM包含哪些可以位寻址的单元。位地址7DH与字节地址7DH如何区别?位地址7DH具体在片内RAM中的什么位置?
答:低128字节数据区的位寻找区和高128字节数据区的某些可位寻址的特殊功能寄存器。位地址7DH与字节地址7DH可通过不同的指令来区别,位地址7DH用位寻址指令来访问,字节地址7DH用字节寻址指令来访问,位地址7DH在低128字节数据区的位寻找区的2FH字节。
7.MCS-51单片机的程序状态寄存器PSW的作用是什么?常用标志有哪些位?作用是什么?
答:PSW是一个8位寄存器,用于设定CPU的状态和指示指令执行后的状态。
CY(PSW.7):进位标志。在执行加减运算指令时,如果运算结果的最高位(D7)发生了进位或借位,则CY由硬件自动置1。
AC(PSW.6):半进位标志位,也称为辅助标志位。在执行加减运算指令时,如果运算结果的低半字节(D3)发生了向高半字节进位或借位,则AC由硬件自动置1。
F0、F1(PSW.5 和PSW.1):用户标志位。用户可以根据需要对F0、F1赋予一定的含义,由用户置1和清0,作为软件标志。
RS1、RS0(PSW.4 和PSW.3):工作寄存器组选择控制位。通过对这两位设定,可以从4个工作寄存器组中选择一组作为当前工作寄存器。
OV(PSW.2):溢出标志位,有两种情况影响该位。一是执行加减运算时,如果D7或D6任一位,并且只一位发生了进位或借位,则OV自动置1,
P(PSW.0):奇偶标志位。每条指令执行完后,该位都会指示当前累加器A中1的个数。如果A中有奇数个1,则P自动置1。
8.MCS-51单片机复位后,CPU使用哪组工作寄存器?它们的地址是什么?用户如何改变当前工作寄存器组?
答: MCS-51单片机复位后,CPU使用0组工作寄存器。它们的地址是08H~0FH。通过程序状态字PSW中的RS1、RS0标志位改变当前工作寄存器组。
9.什么叫堆栈?堆栈指针SP的作用是什么?
答: 堆栈是在RAM专门开辟的一个特殊用途的存储区。堆栈是按照“先进后出”(即先进入堆栈的数据后移出堆栈)的原则存取数据。堆栈指针SP是一个8位寄存器,其值为栈顶的地址,即指向栈顶,SP为访问堆栈的间址寄存器。
10.PC与DPTR各有哪些特点?有何异同?
答: PC与DPTR都是16位的寄存器。PC由两个8位的计数器PCH和PCL组成。PC实际是程序的字节地址计数器,它的内容是将要执行的下一条指令的地址,具有自加1功能。改变PC的内容就可以改变程序执行的方向。DPTR的高字节寄存器用DPH表示,低字节寄存器用DPL表示。DPTR既可以作为一个16位寄存器使用,也可以作为两个独立的8位寄存器使用。DPTR主要用于存放16位地址,
3
以便对64KB的片外RAM和64KB的程序存储空间作间接访问。
11.测试哪个引脚,可以快捷地判断单片机是否正在工作? 答: 若要检查单片机是否工作,可以使用示波器查看ALE引脚是否有脉冲信号输出。
12.读端口锁存器和“读引脚”有何不同?各使用哪些指令? 答: 一种是读取锁存器原来的输出值,另一种情况是打开端口的缓冲器读取引脚上的信号,读端口锁存器,用MOV A,Pi指令。“读引脚”,要先用MOV Pi,#0FFH对相应端口写FFH,使输出场效应管T截止,才能够正确输入,再用MOV A,Pi指令。
13.MCS-51单片机的P0~P3口结构有何不同?用作通用I/O口输入数据时应注意什么?
答: P2口是一个双功能口,一是通用I/O口,二是以总线方式访问外部存储器时作为高8位地址口。与P1口的结构类似,驱动部分基本上与P1口相同,但比P1口多了一个多路切换开关MUX和反相器3。P3口是一个多功能口,与P1口的结构相比不难看出,P3口与P1口的差别在于多了“与非门”3和缓冲器4。正是这两个部分,使得P3口除了具有P1口的准双向I/O口的功能之外,还可以使用各引脚所具有的第2功能。P0多了一路总线输出(地址/数据)、总线输出控制电路(反相器3和与门4)、两路输出切换开关MUX及开关控制C,并且把上拉电阻换成了场效应管T1,以增加总线的驱动能力。用作通用I/O口输入数据时应注意要先用MOV Pi,#0FFH对相应端口写FFH,使输出场效应管T截止,才能够正确输入。
14.P0口用作通用I/O口输出数据时应注意什么?
答: P0口与其它端口不同,它的输出级无上拉电阻。当把它用作通用I/O口时,输出级是开漏电路,故用其输出去驱动NMOS输入时外接上拉电阻,这时每一位输出可以驱动4个LS型TTL负载。用作输入时,应先向端口锁存器写1。 15.什么叫时钟周期?什么叫机器周期?什么叫指令周期?时钟周期、机器周期与振荡周期之间有什么关系?
答: 时钟周期即振荡周期:为晶振的振荡周期,是最小的时序单位。状态周期:是振荡频率2分频后的时钟周期。显然,一个状态周期包含2个振荡周期。机器周期(MC):1个机器周期由6个状态周期、即12个振荡周期组成,是量度指令执行时间的单位。指令周期:是执行一条指令所需要的时间。一个指令周期由1~4个机器周期组成。
16.MCS-51单片机常用的复位电路有哪些?复位后机器的初始状态如何? 答: 复位电路有两种方式:上电自动复位电路和手动复位电路。复位后,程序计数器PC变为0000H,使单片机从程序存储器地址0000H单元开始执行。除P0~P3为FFH;SP为07H;SBUF为不确定。大部分特殊功能寄存器清零。
17.MCS-51单片机有几种低功耗工作方式?如何实现,又如何退出?
4
答: MCS-51单片机有空闲和掉电两种低功耗工作方式。当CPU执行完置IDL=1的指令后,系统就进入空闲方式。进入空闲方式之后,有两种方法可以退出。一种是任何中断请求被响应都可以由硬件将IDL位清0而结束空闲方式。另一种退出空闲方式的方法是硬件复位。当CPU执行完置PD=1的指令后,系统就进入掉电工作方式。对于一般的单片机来说,退出掉电方式的唯一方法是由硬件复位。
第3章 习题答案
1.简述MCS-51汇编指令格式。
答: MCS-51汇编语言指令由四部分组成,其一般格式如下: [标号:] 操作码 [操作数] [;注释]
格式中的方括号意为可以没有相应部分,可以没有标号、操作数和注释,至少要有操作码。其操作数部分最多可以是两项: [第1操作数] [,第2操作数]
2.何谓寻址方式?MCS-51单片机有哪些寻址方式,是怎样操作的?各种寻址方式的寻址空间和范围是什么?
答: MCS-51单片机有7种寻址方式:立即数寻址、寄存器寻址、直接寻址、寄存器间接寻址、变址寻址、位寻址和指令寻址。可以分为两类:操作数寻址和指令寻址。
立即数寻址的寻址空间和范围是:在程序存储空间,随指令读入MOV A,#46H 直接寻址的寻址空间和范围是:片内RAM中,低128字节和SFR MOV A,46H 寄存器寻址的寻址空间和范围是:使用R0~R7、A、B、C、DPTR MOV A,R2 寄存器间接寻址的寻址空间和范围是:片内RAM:使用@Ri,SP;范围为256B,不含SFR,片外RAM:使用@Ri,@DPTR;范围为64KB MOV A,@R0 MOVX A,@DPTR 变址寻址的寻址空间和范围是:使用@A+PC,@A+DPTR;在程序存储器中; 范围分别为PC之后256B之内和64KB全空间 MOVC A,@A+DPTR
位寻址的寻址空间和范围是:使用位地址;在位寻址空间;RAM的20H~2FH和SFR SETB 36H
指令绝对寻址的寻址空间和范围是:操作数是目标地址;在程序存储空间; 范围为2KB或64KB全空间 AJMP FIRST LJMP SECON
指令相对寻址的寻址空间和范围是:操作数是相对地址;在程序存储空间;范围﹣128~127 SJMP LOOP
3.访问片内RAM低128字节使用哪些寻址方式?访问片内RAM高128字节使用什么寻址方式?访问SFR使用什么寻址方式?
答: 访问片内RAM低128字节使用直接寻址,寄存器间接寻址,位寻址;访问片内RAM高128字节使用寄存器间接寻址;访问SFR使用直接寻址,位寻址。
4.访问片外RAM使用什么寻址方式? 答: 访问片外RAM使用寄存器间接寻址
5.访问程序存储器使用什么寻址方式?指令跳转使用什么寻址方式? 答: 访问程序存储器使用指令绝对寻址,指令相对寻址。指令跳转使用指令绝对寻址,指令相对寻址。
5
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
14.阅读下面程序段,说明该段程序的功能。 MOV A,30H MOV B,#5
7
MUL AB ADD A,31H MOV 33H,A CLR A ADDC A,B MOV 32H,A SJMP $
答:(30H)×5+(31H)→(32H:33H)
15.编写程序,用位处理指令实现“P1.4=P1.0∨(P1.1∧P1.2)∨P1.3”的逻辑功能。 MOV C,P1.1 ANL C,P1.2 ORL C,P1.0 ORL C,P1.3 MOV P1.3,C
16.编写程序,若累加器A的内容分别满足下列条件,则程序转到LABLE存储单元。设A中存放的的无符号数。
(1)A≥10; (2)A>10; (3)A≤10。 (1)
CJNE A,#10,NEXT LJMP LABLE NEXT:
JNC LABLE (2)
CJNE A,#10,NEXT LJMP NEXT2 NEXT:
JNC LABLE NEXT2: (3)
CJNE A,#10,NEXT LJMP LABLE NEXT: JC LABLE
17.编写程序,查找片内RAM的30H~50H单元中是否有55H这一数据,若有,则51H单元置为FFH;若未找到,则将51H单元清0。 MOV R0,29H NEXT: INC R0
CJNE R0,#51H,NEXT2 MOV 51H,#0FFH
8
AJMP OVER NEXT2:
CJNE @R0,#55H,NEXT MOV 51H,#0 OVER:
18.编写程序,查找片内RAM的30H~50H单元中出现0的次数,并将查找的结果存入51H单元。 MOV R0,30H MOV 51H,#0 NEXT:
CJNE @R0,#00H,NEXT2 INC 51H NEXT2: INC R0
CJNE R0,#51H,NEXT
19.在片外RAM中有一个数据块,存有若干字符、数字,首地址为SOURCE要求将该数据块传送到片内RAM以DIST开始的区域,直到遇到字符“$”时结束($也要传送,它的ASCII码为24H)。 MOV DPTR,#SOURCE MOV R0,#DIST NEXT:
MOVX A,@DPTR MOV @R0,A INC DPTR INC R0
CINE A,#24H,NEXT
20.片内RAM的30H和31H单元中存放着一个16位的二进制数,高位在前,低位在后。编写程序对其求补,并存回原处。 CLR C MOV A,#0 SUBB A,31H MOV 31H,A MOV A,#0 SUBB A,30H MOV 30H,A
21.片内RAM中有两个4字节压缩的BCD码形式存放的十进制数,一个存放在30H~33H单元中,另一个存放在40H~43H单元中。编写程序将它们相加,结果的BCD码存放在30H~33H中。 CLR C
MOV R0,#30H
9
MOV R1,#40H MOV R2,#4 NEXT:
MOV A,@R0 ADDC A,@R1 MOV @R0,A INC R0 INC R1
DJNZ R2,NEXT 22.编写程序,把片外RAM从2000H开始存放的16字节数据,传送到片内从30H开始的单元中。 MOV DPTR,#2000H MOV R0,#30H MOV R1,#0 NEXT:
MOVX A,@DPTR MOV @R0,A INC DPTR INC R0 INC R1
CINE R1,#16H,NEXT
第4章 习题答案
1.用C51编程较汇编语言有哪些优势? 答:(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[=初值]]
10
[,?]
变量的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 位变量名 = 特殊功能寄存器名^位号常数
7.C51专用指针定义的一般格式是什么?如何确定专用指针定义的指向空间和指针变量本身存储的空间?
答:[存储类型] 数据类型 指向存储区 *[指针存储区] 指针名1 [,*[指针存储区] 指针名2,?]
*的左面是指向存储区,*的右面是指针存储区
8.C51函数定义的一般形式是什么?如何定义中断处理程序?如何选择工作寄存器组?
答:返回类型 函数名(形参表) [函数模式] [reentrant] [interrupt m] [using n] {
局部变量定义 执行语句 }
[interrupt m]字段中的m定义中断处理程序的中断号 [using n]字段中的n选择工作寄存器组
9.在C51中,对汇编语言函数的命名规则是怎样的,具体地说:不传递参数的函数名格式是什么?通过寄存器传递参数的函数名格式是什么?传递参数重入
11
函数的函数名格式是什么?
答:?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 模块名 13.在汇编语言文件中:怎样声明函数段?怎样声明公共函数?怎样声明引用函数?怎样声明引用变量?定义函数的格式是什么? 答:对本模块定义的函数段作声明,其格式为: ?PR?函数名?模块名 SEGMENT CODE 公共函数声明。声明格式为: PUBLIC 函数名
引用声明。声明格式为: EXTRN CODE(函数名) 引用声明。声明格式为:
EXTRN 存储区域类型(变量名) 汇编语言函数的格式如下: RSEG ?PR?函数名?模块名 函数名:
14.在C51中怎样把函数定义到确定的位置? 答:对函数的定位方法, CSEG AT 001BH
12
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的8个位对应的位变量flag_lamp1、flag_lamp2、flag_machine1、flag_machine2、flag_port1、flag_port2、flag_calcu1和calcu2(从低位到高位)。
答:(1)unsigned char code dis_code[10]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f};
(2)unsigned char data TL0_L _at_ 0x30, TH0_H _at_ 0x31; (3)unsigned char idata data_buf[20]; (4)unsigned char xdata data_array[100]; (5)unsigned char bdata status; sbit flag_lamp1=status^0; sbit flag_lamp2=status^1; sbit flag_machine1=status^2; sbit flag_machine2=status^3; sbit flag_port1=status^4; sbit flag_port2=status^5; sbit flag_calcu1=status^6; sbit flag_calcu2=status^7;
18.在89C52单片机中增加了定时器/计数器2(T2),修改头文件“REG51.H”,
13
添加如下内容:
(1)特殊功能寄存器T2CON、T2MOD、RCAP2L、RCAP2H、TL2、TH2,地址分别为0xc8~ 0xcd。 (2)对T2CON的8个位分别定义位变量CP_RL2、C_T2、TR2、EXEN2、TCLK、RCLK、EXF2、和TF2(从低位到高位)。
(3)定义位变量T2、T2EX对应于P1口的第0位和第1位;定义位变量ET2对应于EI的第5位;定义位变量PT2对应于IP的第5位;
(4)对P1口的8个位分别定义位变量P0_0、P0_1、P0_2、P0_3、P0_4、P0_5、P0_6和P0_7(从低位到高位)。 答:(1) sfr T2CON=0xc8; sfr T2MOD=0xc9; sfr RCAP2L=0xca; sfr RCAP2H=0xcb; sfr TL2=0xcc; sfr TH2=0xcd; (2)
sbit CP_RL2=T2CON^0; sbit C_T2=T2CON^1; sbit TR2=T2CON^2; sbit EXEN2=T2CON^3; sbit TCLK=T2CON^4; sbit RCLK=T2CON^5; sbit EXF2=T2CON^6; sbit TF2=T2CON^7; (3)
sbit T2=P1^0; sbit T2EX=P1^1; sbit ET2=EI^5; sbit PT2=IP^5; (4)
sbit P0_0=P0^0; sbit P0_1=P0^1; sbit P0_2=P0^2; sbit P0_3=P0^3; sbit P0_4=P0^4; sbit P0_5=P0^5; sbit P0_6=P0^6; sbit P0_7=P0^7; 19.编写一C51函数,把从键盘输入的5位十进制数数转换成一个无符号整型数(假设未超出整型数范围)。设从键盘输入的数存放在一无符号数组中,低位数为低下标元素。
unsigned char data key_buffer[5];
14
unsigned int trans_int(void) {
unsigned char data i; unsigned int data temp=0; for(i=0;i<5;i++) {
temp=temp*10+key_buffer[i]-0x30; }
return temp; }
20.编写一C51函数,把一整型数按十进制数将其各位分离,分离后放在一无符号数组中,便于显示。要求把低位数作为低下标元素。 unsigned char data shu[5]; void main(unsigned int x) {
unsigned int temp; unsigned char i; for(i=0;i<4;i++) {
shu[i]=temp; temp=temp/10;
}
shu[4]=temp; }
21.编写一C51函数,使用专用指针,把片外数据存储器中从0x100开始的30个字节数据,传送到片内从0x40开始的区域中。 void main() {
unsigned char data i,*dpt; unsigned char xdata *xdpt; dpt=0x40; xdpt=0x100;
for(i=0;i<30;i++)
*(dpt+i)=*(xdpt+i); }
22.编写一C51程序,实现从P1口输出产生的流水灯,要求用汇编语言函数实现数据左移或右移。 #pragma src
#include void main() {
15
unsigned char temp,i; while(1) {
temp=0x55; P1=temp; delay();
#pragma asm MOV A,temp RR A
MOV temp,A
#pragma endasm
P1=temp; delay(); } }
23.某单片机系统的P2口接一数模转换器DAC0832输出模拟量,现在要求从DAC0832输出连续的三角波,实现的方法是从P2口连续输出按照三角波变化的数值,从0开始逐渐增大,到某一最大值后逐渐减小,直到0,然后再从0逐渐增大,一直这样输出。试编写一函数,使从P2口输出的值产生三角波,并且使三角波的周期和最大值通过入口参数能够改变。 #include #define DAC0832 XBYTE[0x7FFF]
void san(unsigned char max1,unsigned char zhou1) {
unsigned char i,j,max,zhou; max=max1; zhou=zhou1;
while(1) {
for(i=0;i<=max,i++) {
DAC0832=i;
for(j=0;j } for(i=max-1;i>0,i--) { DAC0832=i; for(j=0;j } } 16 24.在数字滤波中有一种叫做“中值滤波”技术,就是对采集的数据按照从大到小或者从小到大进行排序,然后取其中在中间位置的数作为采样值。试编写一函数,对存放在片内数据存储器中从0x50开始的20个单元的采样数据用冒泡法排序进行中值滤波,把得到的采样数据存放到0x4f单元中。 void midf() { unsigned char data temp,i,j,*ptr,*ptr1; ptr=0x50; ptr1=0x4f; for(j=20;j>1,j--) { for(i=0;i if(*(ptr+i)>*(ptr+i+1)) { temp=*(ptr+i+1); *(ptr+i+1)=*(ptr+i); *(ptr+i)=temp; } } } *ptr1=*(ptr+20/2); } 25.在数字滤波中有一种叫做“去极值平均滤波”技术,就是对采集的数据按照从大到小或者从小到大进行排序,然后去掉相同数目的极大值和极小值,对中间部分数据求算术平均值作为采样值。试编写一函数,对存放在片外数据存储器中从0x150开始的16个单元的采样数据,用选择法进行“去极值平均滤波”,把得到的采样数据存放到0x14f单元中。 void teaf() { unsigned char xdata *ptr; unsigned char data temp,i,j,*ptr1; ptr=0x150; ptr1=0x4f; for(j=16;j>1,j--) { for(i=0;i if(*(ptr+i)>*(ptr+i+1)) { temp=*(ptr+i+1); *(ptr+i+1)=*(ptr+i); *(ptr+i)=temp; 17 } } } 26.利用库函数_getkey编写一函数,实现从单片机串行口接收数据的C51程序,把接收的数据存放在片内数据存储器从0x40开始的区域,遇到回车符CR(ASCII码是0x0d)结束。 include unsigned char data *dpt; unsigned char i=0,temp; dpt=0x40; while(1) { temp=_getchar(); if(temp==0x0d) break; *(dpt+i)=temp; i++; } } 27.利用库函数scanf编写一函数,实现从单片机串行口接收数据的C51程序,把接收的数据存放在片外数据存储器从0x240开始的区域,遇到回车符CR(ASCII码是0x0d)结束。 include unsigned char xdata *xdpt; unsigned char i=0,temp; xdpt=0x240; while(1) { scanf(“%c”,&temp); if(temp==0x0d) break; *(xdpt+i)=temp; i++; 18 } temp=0; for(i=0;i<16-2;i++) temp=temp+*(ptr+i+1); *ptr1=temp/(16-2); } } 28.利用库函数putchar编写一函数,实现从单片机串行口发送数据的C51程序,发送的数据存放在片内数据存储器从0x50开始的区域,遇到回车符CR(ASCII码是0x0d)结束。 include unsigned char data *dpt; unsigned char i=0; dpt=0x50; while(*(dpt+i)!=0x0d) { putchar(*(dpt+i)); i++; } } 29.利用库函数printf编写一函数,实现从单片机串行口发送数据的C51程序,发送的数据存放在片外数据存储器从0x100开始的区域,遇到回车符CR(ASCII码是0x0d)结束。 include unsigned char xdata *xdpt; unsigned char i=0; xdpt=0x100; while(*(xdpt+i)!=0x0d) { printf(“%c”,*(xdpt+i)); i++; } } 30.编写一定时器/计数器0定时100ms中断处理函数,使函数实现时钟的功能,即产生时钟的秒、分钟和小时。设定时初值的高、低字节分别为TIMER_H和TIMER_L。 设fosc=6mhz #include unsigned char data shi,fen,miao,bfm; 19 void main() { TMOD=0x01; TIMER_H=15536/16; TIMER_L=15536; ET0=1; EA=1; TR0=1; while(1); } void time0_int() interrupt 1 { TIMER_H=15536/16; TIMER_L=15536; bfm++; if(bfm==10) { bfm=0; miao++; } if(miao==60) { miao=0; fen++; } if(fen==60) { fen=0; shi++; } if(shi==24) { shi=0; } } 31.在Keill C的调试状态下,如何使用跟踪运行、单步运行、跳出函数运行命令? 答:Step命令和Step Over命令的区别:当遇到调用函数时,前者将跟踪进入函数,而后者是一步执行完函数。 如果用全速运行命令Go,可以使用Stop Running命令停止运行。 欲退出调试状态,可以再次点击Debug菜单下的Start/Stop Debug Session命令或相应的按钮。 20 32.在Keill C的调试状态下,如何设置断点和删除断点? 答:方法1:用鼠标双击。在需要设置的行的最前面,双击鼠标左键,即可设置或清除断点。 方法2:用命令或命令按钮。先将光标移到需要设置的行,然后点击Debug菜单下的Insert/Remove Breakpoint命令或工具栏中的相应按钮,即可设置或清除断点。 另外还有断点禁用和全部清除命令及按钮。 33.在Keill C的调试状态下,如何观察和修改寄存器? 答:寄存器窗口、在线帮助窗口和工程管理器是同一个窗口,在工程管理器窗口下包含3个标签,即包含3个区域。在调试状态下,点击View菜单下的Project Window命令或对应的按钮,就会显示或隐藏工程管理器窗口,然后点击窗口下边的寄存器标签,即显示出寄存器窗口。 除了sec和states之外,其它寄存器的值都可以改变。改变的方式有两种:一是用鼠标直接点击左键进行修改;二是在调试命令窗口直接输入寄存器的值,如输入“A=0x32”,则寄存器A的值立即显示0x32。 34.在Keill C的调试状态下,如何观察和修改变量? 答:在调试状态下,点击View菜单下的Watch & Call Stack Window命令或对应的按钮,就会显示出或隐藏起变量窗口。变量窗口包含有4个标签,即4个显示区,可以分别显示局部变量(Locals标签)、指定变量(Watch #1和Watch #2两个标签)、及堆栈调用(Call Stack标签)。 在局部变量区,显示的是当前函数中的变量,这些变量不用设置,自动出现在窗口中。为了观察其它变量,可以在Watch#1或Watch#2标签按F2输入变量名。在程序运行中,可以观察这些显示的变量的变化,也可以用鼠标点击修改它们的值。 另外还有更简单的方法观察变量的值,在程序停止运行时,将光标放到要观察的变量上停大约1秒,就会出现对应变量的当前值,如operate=0x32。 35.在Keill C的调试状态下,如何观察和修改data区、idata区、xdata区的数据?如何观察code区的数据? 答:在调试状态下,点击View菜单下的Memory Window命令或对应的按钮,就会显示出或隐藏起存储器窗口。存储器窗口包含4个标签,即4个显示区,分别是Memory#1、?、Memory#4。 在4个显示区上边的“Address”栏输入不同类型的地址,可以观察不同的存储区域。 1)设置观察片内RAM直接寻址的data区,在Address栏输入D:xx(xx为十六进制的两位数,下同),便显示从xx地址开始的数据。高128字节显示的是特殊功能寄存器的内容。 2)设置观察片内RAM间接寻址的idata区,在Address栏输入I:xx,便显示从xx地址开始的数据。高128字节显示的也是数据区的内容,而不是特殊功能寄存器的内容。 3)设置观察片外RAM xdata区,在Address栏输入X:xxxx,便显示从xxxx地址开始的数据。 21 4)设置观察程序存储器ROM code区,在Address栏输入C:xxxx,便显示从xxxx地址开始的程序代码。 在显示区域中,默认的显示形式为十六进制的字节。 除了程序存储器中的数据不能修改之外,其它3个区域的数据均可修改。修改方法是,用鼠标对准欲修改的单元,点击鼠标右键,在弹出的菜单中对Modify Memory at 0x?命令点击鼠标左键,会弹出的文本输入栏输入数据,然后用鼠标左键点击“OK”即可。 36.在Keill C的调试状态下,如何观察各个片内外设的运行状态?如何修改它们的设置? 答:在调试状态下,点击Peripherals菜单下的不同外设选项命令,就会显示或隐藏对应外设的观察窗口。如显示定时器0窗口,点击Peripherals菜单下的Timer下面的Timer0选项,便会显示出定时器/计数器0状态窗口。 在程序运行时,各个片内外设的状态会不断地变化,为了随时观察它们的变化,可以启用View菜单下的Periodic Windows Update命令,让Keil C自动周期刷新各个调试窗口。另外,也可以在窗口中对设备直接进行设置,与程序中的命令设置一样,并且立即生效。 第5章 习题答案 1.什么是中断和中断系统?计算机采用中断系统带来了哪些优越性? 答:当CPU当CPU正在处理某事件的时候,外部或者内部发生的某一事件请求CPU迅速去处理,于是CPU暂时中止当前的工作,转去处理所发生的事件。中断服务处理完该事件后,再返回到原来被中止的地方继续原来的工作,这样的过程称为中断。 1.CPU与外设同步工作 2.实时处理 3.故障处理 2.MCS-51共有几个中断源?各中断标志是如何产生的,又如何清零的?CPU响应中断时,中断入口地址各是多少? 答:MCS-51共有5个中断源。各中断标志是通过中断请求产生的,通过指令或硬件清零的。CPU响应中断时,中断入口地址各是03H,0BH,13H,1BH,23H。 3.编写一段对中断系统那个初始化的程序,使之允许INT0、INT1、T1、串行口中断,且使串行口中断为高优先级。 EX0=1; EX1=1; ET1=1; ES=1; EA=1; PS=1; 4.什么是中断优先级?什么是中断嵌套?处理中断优先级的原则是? 答:中断响应的优先次序是中断优先级。当一个中断处理的过程中又响应了更高优先级的中断是中断嵌套。处理中断优先级的原则是先高级中断,后低级中断。 22 同级的按自然优先级排序。 5.MCS-51在什么情况下可以响应中断?中断响应的过程是? 答:响应中断的条件 (1)中断源有中断请求; (2)中断总允许位EA=1; (3)请求中断的中断源的中断允许位为1; 在满足以上条件的基础上,若有下列任何一种情况存在,中断响应都会受到阻断。 (1)CPU正在执行一个同级或高优先级的中断服务程序。 (2)正在执行的指令尚未执行完。 (3)正在执行中断返回指令 RETI或者对专用寄存器IE、IP进行读/写的指令。CPU在执行完上述指令之后,要再执行一条指令,才能响应中断请求。 中断请求被响应后,有内部长调用(LCALL)将程序转向对应的中断矢量地址,执行执行中断服务程序。 6.中断响应过程中,为什么通常要保护现场?如何保护和哪些信息要进行保护? 答:因为中断服务程序会用到寄存器和存储器的数据会被覆盖,而中断是要返回的,所以通常要保护现场。方法是把要保护的内容压入到堆栈。 7.MCS-51的ROM中,应如何安排程序区? 答:程序区从00H到32H的存储区依次存放主程序入口和各中断服务程序的入口。 8.外部中断触发方式有几种?它们的特点是什么? 答:外部中断触发方式有2种。它们的特点是低电平触发方式,边沿触发方式,上一个机器周期检测为高电平,接下来的下一个机器周期为低电平。 9.中断系统的初始化一般包括哪些内容? 答:开相应中断允许,开总中断允许,设置中断优先级。 10.中断响应的时间是否使确定不变的?为什么?在实际以用中应如何考虑这一因素? 答:中断响应的时间不是确定不变的。因为中断发生的位置是不确定的。在实际应用中对实时性要求高的场合要考虑这一因素,合理安排程序。 11.在中断请求有效并开中断的状况下,能否保证立即响应中断?有什么条件? 答:在中断请求有效并开中断的状况下,不能保证立即响应中断。如果要立即响应中断必须是当前指令的最后周期,没有同级或更高级中断发生,下一条指令不是 RETI或者对专用寄存器IE、IP进行读/写的指令。 12.中断服务程序与普通子程序有什么根本的区别? 答:中断服务程序是随机发生的,结束后要返回断点。 普通子程序是安排好的,没有断点。 13.为什么要用RETI指令结束中断服务程序?RETI指令的功能是什么?为什么 23 不用RET指令作为中断服务程序的返回指令? 答:中断服务程序返回指令RETI,除了具有“RET”指令的功能外,还将开放中断逻辑的作用。 14.哪些中断源的中断请求标志位是由硬件自动复位的?哪些中断的中断请求标志必须通过软件编程进行复位? 答:外部中断和定时器中断是由硬件自动复位的。串行口中断的中断请求标志必须通过软件编程进行复位。 第6章 习题答案 1. MCS-51单片机内部有几个定时器/计数器,有几种工作方式? 答:89C52内部有3个定时器/计数器,定时器0有4种工作方式,定时器1有3种工作方式,定时器2有4种工作方式。 2.定时器/计时器用作定时器用时,其定时时间和哪些因素有关?作计数器时,对外界计数频率有何限制? 答:定时器的定时时间和单片机的振荡频率和定时初值有关。做计数器时候,其外界计数频率最大不能超过Fosc/12。 3. MCS-51单片机的定时器/计数器的定时和计数两种功能各有什么特点? 答:定时是对时钟脉冲进行计数。 计数是对外部计数脉冲进行计数。 4.MCS-51单片机的T0、T1定时器/计数器四种工作方式各有什么特点? 答:方式0:13位计数模式。 方式1:16位计数模式。 方式2:8位自动重装入计数模式。 方式3:只有T0有的双8位计数模式。 5.根据定时器/计数器0方式1逻辑结构图,分析门控位GATE取不同值时,启动定时器的工作过程。 答:当GATE=0:软件启动定时器,即用指令使TCON中的TR0置1即可启动定时器0。 GATE=1:软件和硬件共同启动定时器,即用指令使TCON中的TR0置1时,只有外部中断INT0引脚输入高电平时才能启动定时器0。 6.当定时器/计数器的加1计数器计满溢出时, 溢出标志位TF1由硬件自动置1,简述对该标志位的两种处理方法。 答:一种是以中断方式工作,即TF1置1并申请中断,响应中断后,执行中断服务程序,并由硬件自动使TF1清0;另一种以查询方式工作,即通过查询该位是否为1来判断是否溢出,TF1置1后必须用软件使TF1清0。 7.设MCS-51单片机fosc=12MHz,要求T0定时150μs,分别计算采用定时方式0、方式1和方式2时的定时初值。 24 答:方式0的定时初值:IF6AH 方式1的定时初值:FF6AH 方式2的定时初值:6AH 8. 设MCS-51单片机fosc=6MHz,问单片机处于不同的工作方式时,最大定时范围是多少? 答:方式0的最大定时范围:131,072μs 方式1的最大定时范围:16,384μs 方式2的最大定时范围:512μs 9.设MCS-51的单片机晶振为6MHZ,使用T1对外部事件进行计数,每计数200次后,T1转为定时工作方式,定时5ms后,又转为计数方式,如此反复的工作,试编程实现。 答: #include TMOD=0x60; TL1=56; TH1=56; TR1=1; ET1=1; EA =1; While(1); } void serve() interrupt 3 { if (!F0) { TMOD=0x10; TL1=63036; TH1=63036/16; F0=~F0; } else { TMOD=0x60; TL1=56; TH1=56; F0=~F0; } } 10. 用方式0设计两个不同频率的方波,P1.0输出频率为200Hz,P1.1输出频 25 率为 100Hz,晶振频率12MHz。 #include void main() { TMOD=0x00; TL0=0x1c; TH0=0xb1; TR0=1; F0=0; ET0=1; EA =1; While(1); } void serve() interrupt 1 { TL0=0x1c; TH0=0xb1; P1_0=~P1_0; if(F0==0) F0=1; else { F0=0; P1_1=~P1_1; } } 11.定时器T0已预置为156,且选定用于方式2的计数方式,现在T0输入周期为1ms的脉冲,问此时T0的实际用途是什么?在什么情况下计数器0溢出? 答:T0的实际用途是定时1s,每隔1s计数器0溢出一次。 12.P1.0输出脉冲宽度调制(PWM)信号,即脉冲频率为2kHz、占空比为7:10的矩形波,晶振频率12MHz。 #include unsigned char data count; void main() { TMOD=0x02; TL0=206; TH0=206; TR0=1; ET0=1; 26 EA =1; count=0; While(1); } void serve() interrupt 1 { count++; if(count<=7) P1_0=1; else P1_0=0; if(count==10) count=0; } 13.两只开关分别接入P3.0、P3.1,在开关信号4种不同的组合逻辑状态,使P1.0分别输出频率0.5kHz、1kHz、2kHz、4kHz的方波,晶振频率为12MHz。 #include unsigned char data sta; unsigned char data cou; unsigned char data mag; void main() { TMOD=0x02; TL0=131; TH0=131; TR0=1; ET0=1; EA =1; cou=0; While(1); } void serve() interrupt 1 { unsigned char temp; P3=0xff; temp=P3&0xfc; if(temp!=sta) { sta=temp; cou=0; 27 } 14.MCS-51单片机P1端口上,经驱动器连接有8只发光二极管,若fosc=6MHz,试编写程序,使这8只发光二极管每隔2s循环发光一次(要求T0定时)。 #include unsigned char data cou; unsigned int data tim; void main() { TMOD=0x02; TL0=16; TH0=16; TR0=1; ET0=1; EA =1; P1=0; cou=0; tim=1; While(1); } void serve() interrupt 1 { tim++; if(tim==500) { P1=0x01< 28 } if(sta=0x00) mag=7; else if(sta=0x01) mag=3; else if(sta=0x10) mag=1; else if(sta=0x11) mag=0; if(cou==mag) { P1_0=~P1_0; cou=0; } else cou++; tim=1; cou++; if(cou==8) cou=0; } } 15.设fosc=12MHz。试编写一段程序,对定时器T1初始化,使之工作在模式2,产生200μs定时,并用查询T1溢出标志的方法,控制P1.1输出周期为2ms的方波。 #include void main() { unsigned char i; TMOD=0x20; TL1=56; TH1=56; TR1=1; while(1) { while(TF1=1) { TF1=0; i++; if(i==5) { P1_1=~P1_1; i=0; } } } } 16.使用一个定时器,如何通过软、硬件结合的方法,实现较长时间的定时? 答:先使用硬件实现单位时间的定时,通过软件设置计数来实现较长时间的定时。 29 第7章 习题答案 1.什么是串行异步通信,它有哪些作用? 答:单位信息的各位数据被分时一位一位依次顺序传送的通信方式称为串行通信,通过起始位和停止位来进行同步的串行通信称为串行异步通信。适用于速度较慢的数据传输。 2.89C52单片机的串行口由哪些功能部件组成?各有什么作用? 答:89C52通过引脚RXD(P3.0,串行数据接收端)和引脚TXD(P3.1,串行数据发送端)与外界进行通信,单片机内部的全双工串行接口部分,包含有串行发送器和接收器,有两个物理上独立的缓冲器,即发送缓冲器和接收缓冲器SBUF。发送缓冲器只能写入发送的数据,但不能读出;接收缓冲器只能读出接收的数据,但不能写入。控制状态寄存器SCON ,用于定义串行通信口的工作方式和反映串行口状态。 3.简述串行口接收和发送数据的过程。 答:在发送过程中,当执行一条将数据写入发送缓冲器SBUF(99H)的指令时,串行口把SBUF中8位数据以fosc/l2的波特率从RXD(P3.0)端输出,发送完毕置中断标志TI=1。写SBUF指令在S6P1处产生一个正脉冲,在下一个机器周期的S6P2处,数据的最低位输出到RXD(P3.0)脚上;再在下一个机器周期的S3、S4和S5输出移位时钟为低电平时,在S6及下一个机器周期的Sl和S2为高电平,就这样将8位数据由低位至高位一位一位顺序通过RXD线输出。并在TXD脚上输出fosc/12的移位时钟。在“写SBUF”有效后的第10个机器周期的SlPl将发送中断标志TI置位。 接收时,用软件置REN=1(同时,RI=0),即开始接收。当使SCON中的REN=1(RI=0)时,产生一个正的脉冲,在下一个机器周期的S3P1~S5P2,从TXD(P3.1)脚上输出低电平的移位时钟,在此机器周期的S5P2对P3.0脚采样.并在本机器周期的S6P2通过串行口内的输入移位寄存器将采样值移位接收。在同一个机器周期的S6P1到下一个机器周期的S2P2,输出移位时钟为高电平。于是,将数据字节从低位至高位接收下来并装入SBUF。在启动接收过程(即写SCON,清RI位),将SCON中的RI清0之后的第l0个机器周期的SlPl将RI置位。这一帧数据接收完毕,可进行下一帧接收。 4.89C52串行口有几种工作方式?有几种帧格式?各工作方式的波特率如何确定? 答:89C52串行口有4 种工作方式,有2种帧格式。 方式0的波特率=fosc/12 2SMOD方式2的波特率=×fosc 642SMOD串行口方式1、方式3的波特率=×(T1溢出速率) 32 5.若异步通信接口按方式3传送,已知每分钟传送3 600个字符,其波特率是多少? 答:波特率是3600*9/60=5400bit/s。 30 6.89C52中SCON的SM2、TB8、RB8有何作用? 答:SM2:多机通信控制位。 TB8:发送数据的第9位。 RB8:接收数据的第9位。 7.设fsoc=11.059 2MHz,试编写一段程序,其功能为对串行口初始化,使之工作于方式1,波特率为1 200b/s;并用查询串行口状态的方法,读出接收缓冲区的数据并回送到发送缓冲区。 #include void main() { unsigned char temp; SCON=0x50; TMOD=0x20; TH1=0xE8; TL1=0xE8; TR1=1; while(RI==0); temp=SBUF; RI=0; SBUF=temp; } 8.若晶振为11.059 2MHz,串行口工作于方式1,波特率为4 800b/s。写出用T1作为波特率发生器的方式字和计数初值。 答:SCON=0x50; TMOD=0x20; TH1=0xE8; TL1=0xE8; 9.为什么定时器T1用作串行口波特率发生器时,常选用工作模式2?若已知系统时钟频率和通信用波特率,如何计算其初值? 答:工作模式2有自动重装入功能。 X=256-fosc?(SMOD?1) 384?波特率 10.若定时器T1设置成模式2作波特率发生器,已知fosc=6MHz,求可能产生的最高和最低的波特率。 答:最高波特率为8Mb/s。 最低波特率为15625b/s。 11.简述单片机多机通信的原理。 31 答:若置SM2=1,则允许多机通信。多机通信协议规定,第9位数据(D8)为1,说明本帧数据为地址帧;若第9位为0,则本帧为数据帧。当一片89C52(主机)与多片89C5l(从机)通信时,所有从机的SM2位都置l。主机首先发送的一帧数据为地址,即某从机机号,其中第9位为1,所有的从机接收到数据后,将其中第9位装入RB8中。各个从机根据收到的第9位数据(RB8中)的值来决定从机可否再接收主机的信息。若(RB8)=0,说明是数据帧,则使接收中断标志位RI=0,信息丢失;若(RB8)=1,说明是地址帧,数据装入SBUF并置RI=1,中断所有从机,被寻址的目标从机清除SM2,以接收主机发来的一帧数据。其他从机仍然保持SM2=1。 12.当89C52串行口按工作方式1进行串行数据通信时,假定波特率为1 200b/s,以中断方式传送数据,请编写全双工通信程序。 #include unsigned char data txbuf; unsigned char data rebuf; void main() { unsigned char temp; SCON=0x50; TMOD=0x20; TH1=0xE8; TL1=0xE8; TR1=1; ES=1; EA=1; } void comre() { rebuf=SBUF; } void comtx() { SBUF=txbuf; } void serial_server() interrupt 4 { if(TI) TI=0; else { 32 RI=0; comre(); } } 13.当89C52串行口按工作方式3进行串行数据通信时,假定波特率为1 200b/s,第9位数据作奇偶校验位,以中断方式传送数据,请编写通信程序。 #include unsigned char data txbuf; unsigned char data rebuf; void main() { unsigned char temp; SCON=0xd0; TMOD=0x20; TH1=0xE8; TL1=0xE8; TR1=1; ES=1; EA=1; } void comre() { ACC=SBUF; if(RB8==P) rebuf=ACC; else error(); } void comtx() { ACC=txbuf; SBUF=ACC; TB8=P; } void serial_server() interrupt 4 { if(TI) TI=0; else 33 { RI=0; comre(); } } void error() { F0=1; } 第8章 习题答案 1.假定一个存储器有4096个存储单元,其首地址为0,则末地址为多少? 答:末地址为4095。 2.6根地址线和11根地址线各可选多少个地址? 答:6根地址线可选26个地址。 11 11根地址线可选2个地址。 3.用2K×4位的数据存储器芯片扩展4K×8位的数据存储器需要多少片?地址总线是多少位?画出连线图。 答:需要4片,地址总线是12位。 89C52 数据总线D0~D3 数据总线D4~D7 2K*4b 2K*4b 2K*4b 2K*4b 地址总线A0~A10 地址总线A11 4.用两片74HC573芯片扩展89C52的P1端口实现6位发光二极管的开关控制和点亮。 34 74HC573 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 D0 Q0 D1 Q1 D2 Q2 D3 Q3 D4 Q4 D5 Q5 D6 Q6 D7 Q7 LE 74HC2573 89C52 Q0 D0 Q1 D1 Q2 D2 Q3 D3 Q4 D4 Q5 D5 Q6 D6 Q7 D7 LE + WR P2.0 RD + 5.用2K×8位的数据存储器芯片扩展64K×8位的数据存储器需要多少根地址线? 答:需要16根地址线。 6.I2C和SPI各有什么特点? 答:I2C总线是二线制,采用器件地址的硬件设置方法,通过软件寻址完全避免了器件的片选线寻址方法,从而使硬件系统具有简单灵活的扩展方法。I2C总线简单,结构紧凑,易于实现模块化和标准化。 SPI是Motorola公司推出的一种同步串行通讯方式,是一种三线同步总线。有多个SPI接口的单片机时,应为一主多从,在某一时刻只能由一个单片机为主器件;在扩展多个SPI外围器件时,单片机应分别通过I/O口线来分时选通外围器件。 7.用P1口模拟SPI从外部先发送从片内RAM中30H开始的10个字节,再接收30个字节存放在40H开始的片内RAM中。引脚自定义。 unsigned char data txbuf[10] _at_ 0x30; unsigned char data rebuf[30] _at_ 0x40; void main() { unsigned char i; for(i=0;i<10;i++) spiout(txbuf[i]); for(i=0;i<30;i++) 35 rebuf[i]=spiin(); } 8.用P1口模拟I2C从外部接收一组数据,遇到“$”结束。引脚自定义。 unsigned char xdata buffer[100] ; void main() { unsigned char temp=0; unsigned char i=0; temp=rxbyt(); while(temp!=’$’) { buffer[i]=temp; i++; } } 第9章 习题答案 1.为什么要消除键盘的机械抖动?有哪些方法? 答: 键抖动会引起一次按键被误读多次。为了确保CPU对键的一次闭合仅做一次处理,必须去除键抖动。在键闭合稳定时,读取键的状态,并且必须判别;在键释放稳定后,再作处理。按键的抖动,可用硬件或软件两种方法消除。如果按键较多,常用软件方法去抖动,即检测出键闭合后执行一个延时程序,产生12~20 ms的延时,让前沿抖动消失后,再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当确认有键按下或检测到按键释放后,才能转入该键的处理程序。 2.试说明非编码键盘的工作原理。如何判断按键释放? 答: 非编码键盘的单片机系统中,键盘处理程序首先执行有无键按下的程序段,当确认有按键按下后,下一步就要识别哪一个按键被按下。对键的识别常用逐行扫描查询法或行列反转法。在获取键号后,继续扫描端口,直到状态改变,去抖动后,再次确认状态改变,即可判断按键释放。 3.试述A/D转换器的种类和特点。 答: 模/数(A/D)转换电路的种类很多,例如,计数比较型、逐次逼近型、双积分型等等。逐次逼近型A/D转换器.在精度、速度和价格上都适中,是最常用的A/D转换器件。双积分A/D转换器,具有精度高、抗干扰性好、价格低廉等优点,但转换速度低。 4.设计一个2×2的行列式键盘(同在P1口)电路并编写键扫描程序。 36 +5V 89C52 P1.0 P1.1 P1.2 P1.3 #include unsigned char key() { unsigned char row,col=0,k =-1; P1=0xf0; if((P1&0xf0)==0xf0) return(k); delay20ms(); if((P1&0xf0)==0xf0) return(k); for(row=0;row<2;row++) { P1=~(1< if(k!=0xf0) { while(k&(1<<(col+2))) col++; k=row*2+col; P1=0xf0; while((P1&0xf0)!=0xf0); break; } } return(k); } 5.试设计一个LED显示器/键盘电路。 37 +5V 100Ω P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 7407 89C52 +5V 5.1kΩ P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 a b 7407 e f g dp c d 7406 6.在一个fosc为12MHz的89C52系统中接有一片ADC0809,它的地址为7FFFH,试编写ADC0809初始化程序和定时采样通道2的程序(假设采样频率为1ms/次,每次采样4个数据)。 #include #include define DAC0809 XBYTE[0x7fff] unsigned char xdata buffer[4] _at_ 0xa0; void main() { TMOD=0x01; TH0=0xFC; TL0=0x18; EA=1; ET0=1; TR0=1; DAC0809=2; while(1); } void time0_srv() interrupt 1 { unsigned char i; TH0=0xFC; TL0=0x18; for(i=0;i<4;i++) 38 buffer[i]=DAC0809; } 7.试说明TLC2543的特点和与89C52的接口方式。 答:TLC2543的特性如下: 12位A/D转换器(可8位、12位和16位输出); 在工作温度范围内转换时间为l0μs; 11通道输入; 3种内建的自检模式; 片内采样/保持电路; 最大±l/4 096的线性误差; 内置系统时钟; 转换结束标志位; 单/双极性输出; 输入/输出的顺序可编程(高位或低位在前); 可支持软件关机: 输出数据长度可编程。 TLC2543与89C52的接线很简单,用SPI接口。 8.DAC0832与89C52单片机连接时有哪些控制信号?其作用是什么? 答:ILE:数据锁存允许信号,高电平有效。 CS:输入寄存器选择信号,低电平有效。 WR1:输入寄存器的“写”选通信号,低电平有效。 WR2:DAC寄存器的“写”选通信号,低电平有效。 XFER:数据传送信号,低电平有效。 9.在一个89C52单片机与DAC0832组成的应用系统中,DAC0832的地址为7FFFH,输出电压为0~5V。试编写产生矩形波,其波形占空比为1:4,高电平时电压为2.5V,低电平时电压为1.25V的转换程序。 #include #define DAC0832 XBYTE[0x7FFF] void main() { unsigned char i; while(1) { DAC0832=127; delay(); DAC0832=63; for(i=0;i<3;i++) delay(); } } 39 10.试说明TLC5615的特点。 答:10位CMOS电压输出; 5 V单电源工作; 与微处理器3线串行接口(SPI); 最大输出电压是基准电压的2倍; 输出电压具有和基准电压相同的极性; 建立时间12.5μs; 内部上电复位; 低功耗,最高为l.75 mW; 引脚与MAX515兼容。 11.以DAC0832为例,说明D/A的单缓冲与双缓冲有何不同。 答:若应用系统中只有一路D/A转换或虽然是多路转换,但并不要求同步输出时,则采用单缓冲器方式接口,当地址线选通DAC0832后,只要输出控制信号,DAC0832就能一步完成数字量的输入锁存和D/A转换输出。 对于多路D/A转换接口,要求同步进行D/A转换输出时,必须采用双缓冲器同步方式接法。DAC0832采用这种接法时,数字量的输入锁存和D/A转换输出是分两步完成的,即CPU的数据总线分时地向各路D/A转换器输入要转换的数字量并锁存在各自的输入寄存器中,然后CPU对所有的D/A转换器发出控制信号,使各个D/A转换器输入寄存器中的数据同时打入DAC寄存器,实现同步转换输出。 40
正在阅读:
周国运版51单片机课后习题答案06-27
二年级上册数学总复习资料01-29
外出考察(参会)总结报告(样稿)05-25
六一活动安全预案02-17
福建省福州三中2012届高三理综第四次月考试题 - 图文03-24
the difference between Greek and Roman07-28
塑钢窗验收标准定稿06-10
2016焊接与热切割作业初训模拟试卷12-24
2014年劳动合同范本(草案)05-23
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 国运
- 课后
- 单片机
- 习题
- 答案