第五章复习思考题答案
一、 基础题
1.B 2.A 3.B 4.C 5.B 6.C 7.B 8.A 9.A 10.C 二、 思考题与编程题
1. 简述MCS-51单片机的定时器/计数器的结构和工作原理。
答:MCS-51单片机的定时器/计数器的结构:MCS-51单片机有2个定时器/计数器,被称为定时器/计数器T0和定时器/计数器T1。定时器/计数器T0的计数器由2个8位的特殊功能寄存器TL0和TH0构成;定时器/计数器T1的计数器由特殊功能寄存器TL1和TH1构成,T0和T1有多种工作方式,由定时器/计数器方式寄存器TMOD设置。T0和T1的启动和停止由定时器/计数器控制寄存器TCON控制。
工作原理:
定时器/计数器工作在计数模式时,计数器对外部脉冲进行计数,脉冲信号发生1到0负跳变,计数器自动加1;
定时器/计数器工作在定时模式时,计数脉冲信号来自单片机的内部,每个机器周期产生一个计数脉冲,计数器自动加1,也就是每个机器周期计数器加1。
计数器计满后,再计一次,计数器溢出,溢出标志被置1。 2. MCS-51单片机的定时器/计数器T0中有哪几种工作方式?作为计数器和定时器使用时,它们的计数信号有什么不同?其最大计数和定时时间分别是多少?
答:T0有4种工作方式,方式0:13位定时器/计数器,方式1:16位定时器/计数器,方式2:8位常数自动装入的定时器/计数器,方式3:2个8位的定时器/计数器
作为计数器,计数信号由外部脉冲提供,作为定时器,计数信号由单片机内部提供; 计数模式时,方式0的最大计数次数为8192,方式1的最大计数次数为65536,方式2和方式3的最大计数次数为256。
设单片机的机器周期为最大定时为,定时模式时,方式0的最大定时为8192TM,方式1的最大定时为65536TM,方式2和方式3的最大定时为256TM。
3. 设置工作方式寄存器TMOD时,GATE位对定时器/计数器的工作有什么影响?定时器/计数器工作在方式2时,与其他几种方式有什么区别?当设置为方式3时,定时器/计数器T1将如何工作?
答:当GATE=0时,只要TR0被置1时,定时器/计数器T0启动开始计数。 当GATE=1时,定时器/计数器T0启动受INT0引脚的外部信号控制。只有当TR0被置1,且INT0引脚输入信号为高电平时,定时器/计数器T0才开始计数。
定时器/计数器工作在方式2时,与其他几种方式的区别在于当计数器TL0溢出时,TF0被置1,同时把TH0的内容装载到TL0,计数器便以该值为初始值重新开始计数,而其他几种方式计数器将清零。
当设置为方式3时,定时器/计数器T1将停止工作。
4.用内部定时方法产生10kHz的等宽脉冲并从P1.1输出,设晶振频率为12MHz。 等宽方波的高、低电平的持续时间相同。10kHz的等宽方波脉冲信号的周期为0.1ms,因此,只需在P1.1引脚输出持续时间为50μs的高低电平交替变化的信号即可,则定时时
间应为td?50μs。用方式0实现。 (1)计算计数初始值
因为系统的晶振频率为12MHz,则机器周期。设计数初始值为X:
X?213?td50?213??8142TM1
转换为二进制数得X?1111000001100B。取X的高8位赋给TH0,X的低5位赋给TL0,
则(TH0)=11110000B=0F0H,(TL0)=00001100B=0CH,TL0的高3位默认为0。 (2)设置工作方式
方式0:M1M0=00,定时器模式:C/T?0,计数器启动不受外部控制:GATE=0,因此,TMOD的内容为00H。
(3)采用查询方式的程序设计如下:
MOV TMOD,#00H
MOV TH0,#0F0H MOV TL0,#0CH SETB LOOP:
AJMP
JBC TF0,OVFLOW
LOOP
;重新设置计数初值
;重复循环
;设置计数器初始值 ;查询计数溢出
TR0 ;启动定时器/计数器
OVFLOW: MOV TH0,#0F0H MOV TL0,#0CH CPL P1.0 AJMP ORG 0000H LJMP MAIN ORG 000BH LJMP P_T0 ORG 0030H MAIN:
LOOP
(4)采用中断方式的程序设计如下:
MOV SP, #60H MOV TH0,#0F0H MOV TL0,#0CH SETB EA SETB ET0 HERE:
;开辟栈区
MOV TMOD, #00000000B ;设置工作方式0和定时器模式
;设置计数器初始值 ;计数器启动
SETB TR0
AJMP HERE ;模拟执行一段较长的主处理程序
;中断处理程序:
P_T0: PUSH ACC ;保护现场
PUSH
PSW
MOV TH0,#0F0H
MOV TL0,#0CH POP POP RETI
PSW ACC
;设置计数器初始值 ;产生方波
CPL P1.0
5.用定时器/计数器T1计数,每计1000个脉冲,从P1.1输出一个100ms单脉冲。
程序框图见图5.1
MOV TMOD,#01000000B ;设置工作方式0和计数器模式
开始初始化及装入计数初值启动计数器T0NTF0=1?Y重装计数器初值P1.1置1延时100msP1.1清0图5.1 题5 程序流程图MAIN:
MOV TH1,#11100000B ;设置计数初始值高8位
MOV TH1,#00011000B ;设置计数初始值低5位 SETB TR1 ;启动计数器
CNTING: JBC TF1,OK ;检测是否溢出,溢出,清标志 SJMP CNTING ;等待,计数 OK: SETB P1.1 ;脉冲开始输出
ACALL DL100MS ;脉冲保持100ms CLR P1.1 ;脉冲结束 RET
;延时100ms子程序,晶振频率为12MHz DL100MS:MOV R7,#100 DL1MS: MOV R6,#200 DL: NOP NOP NOP
DJNZ R6,DL DJNZ R7,DL1MS RET
6. 一批数据存放在外部RAM以data单元开始数据区,数据长度为100个,要求以50ms的间隔从外部RAM读取一个字节的数据,然后从P1口输出,设晶振频率为6MHz。要求定时用以下方式实现:(1)一个定时器;(2)两个定时器串联。
(1)一个定时器实现,程序流程图见图5.2 MAIN:
MOV R0, #100
; 数据长度
;外部数据存储首地址
??????????T0TF0=1?Y???????????,?P1???N??100???YN MOV DPTR,#8000H
MOV TMOD, #00010000B ;工作方式1和定时器模式 MOV TH1, #10011110B ;计数初始值高8位 MOV TL1, #01011000B ;计数初始值低8位 SETB TR1 ;定时器启动 CNTING: JBC TF1, OK OK:
;检测是否溢出 ;重新装入计数常数值 ;取外部数据
SJMP CNTING ;
MOV TH1, #10011110B
MOV TL1, #01011000B MOVX A,@DPTR
?5.2 ?6(1)???? MOV P1,A ;输出外部数据
;改变地址,指向下个数据 ;判断数据取完否,否则跳转 ;关定时器/计数器
INC DPTR DJNZ R0,CNTING CLR TR1
RET
(2)两个定时器串联 MAIN:
MOV R0, #100
;数据长度
;外部数据存储首地址 ;工作方式1和定时器模式 ;设置计数初始值高8位 ;设置计数初始值低8位 ;定时器启动T1 ;检测是否溢出
;设置定时初始值高8位
MOV DPTR,#8000H
MOV TMOD, #00010001B D1: MOV TH1, #11001111B MOV TL1,#00101100B SETB TR1 CNTING1:JBC TF1, D0
SJMP CNTING1 D0: MOV TH0, #11001111B CLR TR1
SETB TR0
CNTING0:JBC TF0, OK
;定时器启动T0
;检测是否溢出,若溢出,清溢出标志 ;设置计数初始值高8位 ;设置计数初始值低8位 ;定时器启动T1
MOV TL0, #00101100B ;设置定时初始值低8位
SJMP CNTING0 OK: MOV TH1, #11001111B MOV TL1,#00101100B SETB TR1
CLR TR0
MOVX A,@DPTR ;取外部数据
MOV P1,A ;输出外部数据
INC DPTR ;改变地址,指向下个数据 DJNZ R0,D1 ;判断数据取完否,否则跳转
CLR TR1 CLR TR0
RET
7. 一个声光报警器如图5.19所示。当设备运行正常时,Em为高电平,绿色指示灯L1亮;当设备运行不正常时,Em为低电平,绿色指示灯L1灭,要求声光报警,红色指示灯L2闪烁、报警器持续鸣响。当Em再次为高电平时,报警解除,恢复为正常状态。闪烁定时间隔为200ms,单片机的晶振频率为12MHz。
程序流程框图见图5.3.
0000H
主程序: ORG
STAR: AJMP MAIN
ORG 0003H ;外部事件0中断入口地址 AJMP ExtInt ;转到中断处理程序 ORG 0030H MAIN: MOV SP,#70H
;设置堆栈区
CLR IT0 SETB EX0 SETB EA CLR PX0 HERE: SETB P1.4 CLR P1.5 CLR P1.6 ; 中断处理程序: ORG 0200H ExtInt: PUSH PUSH
ACC PSW
;电平触发方式
;允许外部事件0中断源中断 ;开放CPU中断允许 ;设置中断优先级, ; 点亮L1 ;关闭L2 ;关闭警报器
;模拟执行很长的程序
???????INT0??P1.4?1,????(1)????????????,???????????T0
AJMP HERE
;入栈保护
N SETB P1.6 ;打开警报器
;
熄灭L1
CLR P1.4
??50ms??YY???4?YP1.5?P1.1??1RETIN MOV R0, #4 ;定时4次,每次50ms,共200ms MOV TMOD, #00010000B ;工式1和定时器模式 MOV TH1, #00111100B ;设置定时初始值高8位 MOV TL1, #10110000B ;设置定时初始值低8位 SETB TR1 ;定时器启动 CNTING: JBC TF1, OK OK:
;检测是否溢出
SJMP CNTING
MOV TH1, #00111100B ;重新装入计数常数值
;200ms到否,否怎跳转 ;取反,L2闪烁 ;恢复现场 ;中断返回
MOV TL1, #10110000B DJNZ R0,CNTING CPL P1.5 POP PSW
(2)??????????5.3 ?7????? POP ACC RETI
8. 一个单片机应用系统要求每隔1秒检测一次P1.0的状态,如果所读的状态为1,
从单片机的内部RAM的20H单元提取控制信息并左移一次,从P2口的输出,如果所读的状态为0,则把提取的控制信息右移一次,从P2口的输出。假定晶振频率为12MHz。
程序流程图如图5.4所示。
MOV R0, #20;
MAIN:
MOV TMOD, #00010000B ;设置为工作方式1和定时器模式 MOV TH1, #00111100B ;设置定时初始值高8位 MOV TL1, #10110000B ;设置定时初始值低8位 SETB TR1 ;定时器启动 CNTING: JBC TF1, OK ;检测是否溢出 SJMP CNTING OK: MOV TH1, #00111100B MOV TL1, #10110000B DJNZ R0,CNTING MOV C,P1.0
;重新装入计数常数值
MOV A,20H JC LESS RR A MOV P2,A RET LESS: RL A MOV P2,A RET
开始初始化及装入计数初值初始化启动计数器T0启动定时器NN定时50ms到否YY次定时够20YP1.1置?1 P1.0 Cy? 20H A(Cy)=1?YA左移一位? A P2NA右移一位? A P25.8题程序框图图5.4 题8程序流程图 9. 航标灯控制器如图5.20所示,夜晚航标灯自动启动,以亮2s灭2s的方式指示航
向,白天航标灯自动熄灭。以定时方式实现上述要求,系统晶振频率为6MHz。
程序流程框图见图5.5。 主程序:
ORG 0000H STAR: AJMP MAIN
ORG 0003H ;外部事件0中断入口地址 AJMP ExtInt ;转到中断处理程序 ORG 0030H
MAIN: MOV SP,#70H ;设置堆栈区 CLR IT0 ;电平触发方式
SETB EX0 ;允许外部事件0中断源中断 SETB EA ;开放CPU中断允许 HERE: CLR P1.7 ; 熄灭导航灯 AJMP HERE ;模拟执行很长的程序 ;中断处理程序: ORG 0200H
ExtInt: PUSH ACC ;入栈保护 PUSH PSW MOV R0, #20
图5.5 题9程序流程图
N主程序流程图中断启动计数器T0启动定时器N打开启动计数器INT0中断T0P1.7清0,关掉L1N开始初始化及装入计数初值初始化定时100ms到否YY次定时够20YP1.7P1.1取反置1RETI中断处理程序流程图 MOV TMOD, #00010000B ;设置为工作方式1和定时器模式 MOV TH1, #00111100B ;设置定时初始值高8位 MOV TL1, #10110000B ;设置定时初始值低8位 SETB TR1 ;定时器启动 CNTING: JBC TF1, OK ;检测是否溢出 SJMP CNTING OK:
MOV TH1, #00111100B ;重新装入计数常数值
;定时够2s否,否则跳转 ;恢复现场
MOV TL1, #10110000B DJNZ R0,CNTING CPL P1.7
POP PSW
;取反,使L1闪烁
POP ACC
RETI ;中断返回
开始10. 晶振频率为6MHz的MCS-51单片机系统,使用定时器T0
以定时方法,在P1.0输出周期为 400μs,占空比为90%的矩形波。
程序流程框图见图5.6。
MAIN:
MOV R0, #9 ;设置占空比为90%
初始化,定时器定时时间定为40us启动计时器T0TF0=1?Y重装计数器初值P1.0置1NN MOV TMOD, #00010000B ;设置为工作方式1和定时器模式 MOV TH1, #11111111B ;设置定时初始值高8位 MOV TL1, #11101100B ;设置定时初始值低8位 SETB TR1 ;定时器启动
CNTING: JBC TF1, OK ;检测是否溢出,若溢出,清溢出标志 SJMP CNTING
OK: MOV TH1, #11111111B ;重新装入计数常数值 MOV TL1, #11101100B SETB P1.0 MOV R0, #9
CNTING1:JBC TF1, OK1 ;检测是否溢出,若溢出,清溢出标志 SJMP CNTING1
OK1: MOV TH1, #11111111B ;重新装入计数常数值 MOV TL1, #11101100B DJNZ R0,CNTING1 CLR P1.0 SJMP CNTING
NTF0=1?Y重装计数器初值定时9次?YP1.0清0题程序框图图5.105.6 题10程序流程图
开始初始化设置为计数器装入计数器初值启动计数器T011. 用单片机的定时器/计数器对外部事件计数,每计数1000个
脉冲定时器/计数器转为定时模式,定时100μs 后,再转为计数方式,如此循环不止。设晶振频率为12MHz。
程序流程框图见图5.7。
MAIN: MOV TMOD, #01000000B ;T1设置为工作方式0和计数器模式 MOV TH1,#11100000B MOV TH1,#00011000B
;设置计数初始值高8位 ;设置计数初始值低5位
TF0=1?Y设置为定时器装入定时器初值启动定时器T0TF0=1?Y5.11题程序框图NN图5.7 题11程序流程图
SETB TR1 ;计数器启动
CNTING:JBC TF1, OK ;检测是否溢出,若溢出,清溢出标志 SJMP CNTING
OK: MOV TMOD, #00000000B ;T1设置为工作方式0和定时器模式 MOV TH1, #11111100B ;设置定时初始值高8位 MOV TL1, #00011100B ;设置定时初始值低5位 SETB TR1 ;定时器启动
CNTING1:JBC TF1, OK1 ;检测是否溢出,若溢出,清溢出标志 SJMP CNTING1 OK1: RET
12. 转速是每分钟多少转。应用系统用光电码盘为传感器测量电动机转速,它与电动机输出轴相连,电动机每转1圈,光电码盘输出256个脉冲。设计程序实现转速测量,设晶振频率为12MHz。 8051Vcc解题思路参考例题5.10,电路图见图5.8。
1KR1P1.2P1.0每按动一次开关K,测量一次方波信号x(t)的频率,使得定时器/计数器工作在受INT0引脚输入信号电平控制的计数方式,通过单片机定时产生持续时间为1秒的INT0引脚高电平输入信号。用T0统计被测信号x(t)的负跳变次数,T1实现定时在
待测信号x(t)INT01T0R2Vcc图5.8题12 测量原理1秒定时采用例5.9的方法二实现。当1秒定INT0引脚输出所需脉宽为1秒的高电平信号。
时时间到时,立即关闭定时器/计数器,转速等于计数器内容乘以60。
(1)定时器/计数器工作方式的设定
由以上分析可知,T0为受外部控制的计数模式,工作方式设置为方式1。T1为定时模式,为了实现50ms的定时,它的工作方式设置为方式1,且启停不受外部控制,TMOD设置为 00011101B,即1DH
(2)计数初始值的计算
T0从0开始计数,则(TH0)=00H,(TL0)= 00H,当T0溢出时,计数65536次,则转速为:当前计数器(TH0)(TL0)的内容乘以60。
T1需要基本定时50ms,溢出20次后实现1秒的定时。则计数初始值计算如下:
td50?10316X1?2??2??15536TM116
因此,X1?3CB0H。
(3)采用查询方法实现的程序如下
; 定义区
TIM_CNT EQU 31H FLAG EQU 20H.0 ERROR ; 程序
ORG 0000H LJMP MAIN ORG 001BH LJMP P_T1
EQU 20H.1
ORG 0030H
MAIN:
MOV SP, #60H SETB
P1.2
;设置P1.2为输入
;设置P3.2(INT0端)为输入
SETB P3.2 WAIT: JB P1.2, WAIT NEXT: MOV TH0, #00
MOV TL0, #00 MOV TH1, #3CH MOV TL1, #0B0H MOV TIM_CNT, #20 MOV TMOD, #1DH SETB EA SETB ET1 SETB TR1 SETB TR0 CLR FLAG CLR ERROR
CLR P1.0 COUNT: JBC TF0, F_OVER JB FLAG, T_OVER
SJMP COUNT
;INT0端为高电平
//=================================== F_OVER: SETB ERROR
调用出错处理程序
;计算转速,结果存入R4,R5两个单元中,高位在前
;溢出,计数出错
//========================== T_OVER: MOV A,TL0 MOV B,#60 MUL AB MOV R6,A MOV R5,B MOV A,TH0 MOV B,#60 MUL AB ADD A,R5 MOV R5,A MOV A,#00 ADDC A,B MOV R4,A DIS: 调用显示子程序
JB P1.2, DIS LJMP NEXT
;T1中断处理程序 P_T1:
PUSH ACC
;显示转速
PUSH PSW MOV TH1, #3CH MOV TL1, #0B0H DJNZ TIM_CNT, CONT SETB P1.0 SETB FLAG CLR TR1
;1s定时到, INT0端为低电平
CONT:
POP PSW POP ACC RETI
13. 单片机应用系统的晶振频率为12MHz,请用定时器/计数器输出占空比可变的方波实现PWM调速。设方波的频率为100Hz,占空比在1%~99%之间可调。
方波的频率为100Hz,则其周期为10ms,把10ms分成100份,每份为0.1ms即为定时时间。采用方式2实现。则初始常数为256-100/1μs=156 MAIN:
;占空比存入SETVALUE,取值范围为1-99.表示1%-99% ;设置计数初始值高8位 ;设置计数初始值低5位 ;定时器启动
MOV TMOD, #00100000B ;设置为工作方式1和定时模式 MOV TH1, #156 MOV TL1, #156 SETB TR1 OK2: SETB P1.0 MOV A, SETVALUE CNTING: JBC TF1, OK OK: DEC A JNZ CNTING CLR P1.0 MOV A,#100 SUBB A, SETVALUE CNTING1:JBC TF1, OK1
OK1: DEC A
JNZ CNTING1 SJMP OK2
;检测是否溢出,若溢出,清溢出标志
SJMP CNTING1
;检测是否溢出
SJMP CNTING
14. 采用定时器/计数器设计一个计时器,最大计时不大于100小时,用3个内部RAM单元Hour、Minute和Second存储时、分和秒,压缩BCD格式存储,设晶振频率为12MHz。
MAIN: MOV HOUR,#00
MOV Minute,#00 MOV Second,#00
MOV TMOD, #00010000B ;设置为工作方式1和定时器模式
MOV TH1, #00111100B ;设置定时初始值高8位,50ms定时 MOV TL1, #10110000B ;设置定时初始值低8位 SETB TR1 ;定时器启动 CONVERT:MOV R4, #20;
CNTING: JBC TF1, OK ;检测是否溢出 SJMP CNTING OK:
MOV TH1, #00111100B ;重新装入计数常数值
MOV TL1, #10110000B
DJNZ R4,CNTING ;是否定时1s,否则跳转 MOV A, Second; ADD A,#01; DA A
MOV Second,A
CJNE Second,#01100000B,CONVERT; 秒位是否等于60,否则跳转 MOV Second,#00000000B MOV A, Minute; ADD A,#01; DA A;
MOV Minute,A;
CJNE Minute,#01100000B,CONVERT;分钟位是否等于60,否则跳转 MOV Minute,#00000000B ;分钟清零 MOV A, HOUR ADD A,#01; DA A; MOV HOUR,A SJMP CONVERT
;小时加一 ;分钟加一
;秒清零
;取秒位数值 ;秒加一