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