单片机课后习题答案 下载本文

31.MCS-51的中断服务程序能否存放在64KB程序存储器的任意区域?如何实现? 解:

可以。在相应的中断源的中断程序入口地址处,用一条长跳转指令(LJMP Add16),转到相应64K程序存储器的任意地址(Add16)处,执行相应的中断程序。

32.8051单片机内部有几个定时器/计数器?它们是由哪些特殊功能寄存器组成? 解:

80C51单片机片内设有2个定时器/计数器:定时器/计数器T0和定时器/计数器T1,T0由TH0、TL0组成,T1由TH1、TLl组成。T0、T1由特殊功能寄存器TMOD、TCON控制。

33.8051单片机定时器/计数器作定时和计数使用时,其计数脉冲分别由谁提供? 解:

作定时器用时,计数脉冲来自单片机内部,其频率为振荡频率的1/12。作计数器用时,计数脉冲来自单片机的外部,即P3.4(T0)和P3.5(T1)两个引脚的输入脉冲。

34.定时器/计数器作定时器使用时,其定时时间与哪些因素有关?作计数器时,对外界计数频率有何限制? 解:

作定时器用时,其定时时间与定时器的工作模式、定时器的定时初值以及单片机的晶振频率有关。作计数器用时,外界计数脉冲的频率不能高于振荡脉冲频率的1/24。 35.定时器/计数器的4种工作方式各有何特点?如何选择、设定? 解:

(1) 工作方式O: 13位定时器/计数器工作方式。

工作方式0由TH0的全部8位和TL0的低5位构成13位加1计数器,此时TL0的高3位未用。在计数过程中,当TL0的低5位溢出时,都会向TH0进位,而全部13位计数器溢出时,则计数器溢出标志位TF0置位。

(2) 工作方式l: 16位的定时器/计数器方式。

工作方式1由TH0作为高8位,TL0为低8位,在计数过程中,当全部16位计数器溢出时,则计数器溢出标志位TF0置位。

(3) 工作方式2: 自动重新装入计数初值的8位定时器/计数器工作方式。

工作方式2的16位定时器/计数器被拆成两个8位寄存器TH0和TL0,CPU在对它们初始化时必须装入相同的定时器/计数器初值。定时器/计数器启动后,TL0按8位加1计数器计数,当TL0计数溢出时,置位TF0的同时又从预置寄存器TH0中重新获得计数初值并启动计数。如此反复。适合于需要重复计数的应用场合,也可以当做串行数据通信的波特率发生器使用。

(4) 工作方式3: 两个8位定时器/计数器(仅适用于T0)。

在工作方式3时,定时器/计数器0被拆成两个独立的8位计数器TL0和TH0。其中,TL0既可以作计数器使用,也可以作为定时器使用,定时器/计数器0的各控制位和引脚信号全归它使用。其功能和操作与方式0或方式1完全相同。TH0只能作为简单的定时器使用,只能借用定时器/计数器1的控制位TR1和TF1,也就是以计数溢出去置位TF1,TR1则负责控制TH0定时的启动和停止。

一般情况下,只有在T1以工作方式2运行(当波特率发生器用)时,才允许T0工作于方式3。

TMOD用于控制定时器/计数器T0和T1的工作方式,M1M0为工作方式选择位。 M1M0=00 方式0,13位定时器/计数器; M1M0=01 方式1,16位定时器/计数器;

M1M0=10 方式2,自动重新装入计数初值的8位定时器/计数器; M1M0=11 方式3,两个8位定时器/计数器(仅适用于T0)。

17

C/T为定时方式/计数方式选择位。若设定C/T=0,则选择定时器工作方式;若设定

C/T=1,则选择计数器工作方式。一个定时器/计数器同一时刻或者作定时用,或者作计数

用,不能同时既作定时又作计数用。

GATE:门控位。它的状态决定了定时器/计数器启/停控制取决于TR0还是取决于TR0和引脚两个条件的组合。若GATE=0,则只由TCON中的启/停控制位TR0控制定时器/计数器的启/停。此时,只要TR0=1,则接通模拟开关,使计数器进行加法计数,定时器/计数器启动工作。而如果TR0=0,则断开模拟开关,定时器/计数器停止工作。若GATE=1,由外部中断请求信号INT0和TCON中的启/停控制位TR0组合状态控制定时器/计数器的启/停。只有TR0=1,且INT0引脚也是高电平,才能启动定时器/计数器工作,否则,定时器/计数器停止工作。

定时器/计数器的定时器/计数器范围为:

工作方式0:13位定时器/计数器方式,因此,最多可以计到213,也就是8 192次。 工作方式1:16位定时器/计数器方式,因此,最多可以计到216,也就是65 536次。 工作方式2和工作方式3:都是8位的定时器/计数器方式,因此,最多可以计到28,也说是256次。

36.使用一个定时器,如何通过软硬结合方法实现较长时间的定时? 解:

设定好定时器的定时时间,采用中断方式用软件设置计数次数,进行溢出次数累计,从而得到较长的时间。

37.利用定时器输出周期为2 ms的方波, 设单片机晶振频率为 6 MHz。试编程实现之。 解:

选用定时器/计数器T0 作定时器, 工作在方式1,输出为P1.0 引脚, 2 ms 的方波可由 1 ms的高低电平相间隔而成, 因而只要每隔1 ms对 P1.0 取反一次即可得到这个方波。

6

初值的计算如下:ST0=12/(6×10)= 2×10-6S

TC=M-T/T0=216-1×10-3/2×10-6=65536-500=65036=FE0CH 当定时器/计数器采用方式0时,初值为:

TC=M-T/T0=2-1×10/2×10=8192-500=7692=1E0CH,

则真正的16位计数初值为:F00CH(高8位,低5位)

程序如下:

ORG 0000H  LJMP START  ORG 000BH LJMP T0INT ; T0中断入口 ORG 0030H

START: MOV SP, #60H ; 初始化程序 MOV TL0, #0CH ; T0赋初值 MOV TH0, #0FEH MOV TMOD, #01H ; 定时器/计数器0工作于方式1 SETB TR0 ; 启动T0 SETB ET0 ; 开T0中断 SETB EA ; 开总允许中断 SJMP $  T0INT: PUSH ACC PUSH PSW

CPL P1.0

MOV TL0, #0CH

18

13

-3

-6

INT0 MOV TH0, #0FEH  SETB TR0 ; 启动T0 POP PSW POP ACC RETI

END 当采用查询方式时: 兰色字部分应该为:

LP1: JBC TF0, LP2

SJMP LP1

LP2: CPL P1.0

MOV TL0, #0CH MOV TH0, #0FEH

SETB TR0 SJMP LP1 END

38.已知8051单片机系统时钟频率为6MHz,请利用定时器T0和P1.2输出占空比为1:8的矩形脉冲,其波形如图3.1所示,试编程实现之。

图3.1 习题3.39的波形图

解:

程序如下:

ORG 0000H LJMP START ORG 0100H

START:MOV SP,#60H

MOV TMOD,#02H MOV TH0,#0E7H MOV TL0,#0E7H CLR P1.2 SETB TR0 HIGH0:SETB P1.2

HIGH1:JBC TF0,LOW0 ;50μs到清TF0,转LOW0 AJMP HIGH1 ;50μs未到,转HIGH1等待 LOW0:MOV R7,#7 ;350μs=7×50μs CLR P1.2 ;P1.2=0输出350μs低电平

LOW1:JBC TF0,LOW2 ;50μs到清TF0,LOW2

AJMP LOW1

LOW2:DJNZ R7,LOW1 ;7次未到转LOW1

AJMP HIGH0 ;7次到转HIGH0 END

39.在8051单片机中,已知时钟频率为12MHz,请编程使P1.0和P1.1分别输出周期为2ms

和500?s的方波。 解:

选择T0工作于方式1定时500μs

19

fosc=12MHz

机器周期T?12fosc?1212?106?1?10?6s?1?s

(216-X)×1μS=500μs X=65036=0FE0CH 程序如下:

ORG 1000H

MOV TMOD,#01H MOV TH0,#0FEH MOV TL0,#0CH SETB TR0 DEL:MOV R7,#4 ;2ms=4×500μs D500:JBC TF0,D2 ;500μs到清TF0,转移

AJMP D500 ;50μs未到,等待 D2:CPL P1.0

MOV TH0,#0FEH ;重装初值 MOV TL0,#0CH

DJNZ R7,D500 ;4次未到,转D500

CPL P1.1

AJMP DEL ;4次到,转DEL SJMP $

END

40.利用8051单片机定时器/计数器测量某正脉冲宽度,已知此脉冲宽度小于10ms,主机频率为12MHz。编程测量脉冲宽度,并把结果转换为BCD码,顺序存放在以片内50H单元为首地址的内存单元中(50H单元存个位)。 解:

程序如下:

ORG 0000H LJMP START ORG 0030H START: MOV SP,#60H

MOV TMOD,#09H ;设T0为方式1,GATE=1

MOV TL0,#00H MOV TH0,#00H MOV R0,#4EH JB P3.2,$ ;等待P3.2变低 SETB TR0 ;启动T0工作 JNB P3.2,$ ;等待P3.2变高 JB P3.2,$ ;等待P3.2再次变低 CLR TR9 ;停止计数 MOV @R0,TL0 ;存放计数的二进制数低字节入4EH INC R0 MOV @R0,TH0 ;存放计数的二进制数高字节入4EH MOV R1,#50H ;BCD码首址 MOV R5,#3 ;BCD码字节数 CLR A LOOP1: MOV @R1,A ;清存BCD码单元 INC R1 DJNZ R5,LOOP1 MOV R7,#10H ;二进制数位数 LOOP2: MOV R0,#4EH ;二进制数首址 MOV R6,#2 ;二进制数字节数 CLR C LOOP3: MOV A,@R0

20