第05章 单片机定时计数器 习题解答

第05章 单片机定时计数器 习题解答
第05章 单片机定时计数器 习题解答

第05章单片机定时计数器习题解答

一、填空题

1.MCS-51单片机中有 2 个 16 位的定时器/计数

器。

2.定时器/计数器T0可以工作于方式 0、1、2、3 。

3.方式0为 13 位定时器/计数器。

4.若系统晶振频率为12MHz,则T0工作于定时方式1时最多可以定时 65536 μs。

5.欲对300个外部事件计数,可以选用定时器/计数器T1的模式 0 或模式1 。

6.TMOD中的M1M0= 11时,定时器工作于方式 3 。

7.若系统晶振频率为6MHz,则定时器可以实现的最小定时时间为 2 μs。

8.MCS-51单片机工作于定时状态时,计数脉冲来自单片机内部的机器周

期。

9.MCS-51单片机工作于计数状态时,计数脉冲来自单片机外部事件。

10.当GATE=0时,则当软件控制位TR0=1时启动T0开始工作。

二、简答题

1.定时器/计数器T0和T1各有几种工作方式?简述每种工作方式的特点。如何控制定时器/计数器的工作方式?

答:T0可以工作于方式0,1,2,3;T1可以工作于方式0,1,2

方式0:是13位定时/计数器,由TLX的低5位(TLX的高3位未用)和THX高8位组成。

方式1:TLX和THX组成16位定时/计数器。

方式2:方式2为自动重装初值的8位定时/计数器。

方式3只适用于定时/计数器T0,当T0工作在方式3时,TH0和TL0被分为两个独立的8位计数器。

TMOD用来控制定时计数器的工作方式,位结构如下:

D0M0

为定时方式。1为计数方式, 0C/T:定时或计数功能选择位。计数器的启动是否受外部中断请求信号的影响。GATE:门控位,用于控制定时/ 计数器开始计数。1启动定时/GATE=0,软件控制位TR0(TR1)=计数器开始/1,INT0(INT1)引脚为高电平时启动定时

TR0(TR1)GATE=1,软件控制位=计数。计数器工作方式选择位,如下表所示。M1、M0:定时/

在各种工作方式下的最计数器=6MHzfMCS-512.设单片机的晶振频率,分别讨论定时器/0OSC长定时时间。计数,所以最长定时应是1,由于是加T答:由fosc =6MHz可知,一个机器周期=2us 计数初值最小时(即为0时)的定时时间。1413us=16384us=16.384ms (0方式:20–)×2us= 21716us=131.072ms

)×2us= 20(1方式:2–98时各种方式下的,即 fosc 2)×232方式、:(–02us= us=0.512ms 当=6MHz T=2us 定时时间,若fosc =12MHz,则最长定时时间将缩短一半。引脚输出频率为

6MHz1KHz的方波。设晶振频率为。P1.0 3.编写程序从,半个方方波周期 =1mS1KHz。uS机器周期1。fosc= 定时中断。T1答:利用6MHz =2

2uS =250

500uS。=500uS波周期÷250=6 工作2 若选择方式256计算初值:,-ORG 0000H

AJMP MAIN

ORG 001BH ;T1的中断矢量

LJMP T1INT

MAIN: MOV TMOD,#20H

MOV TH0, #6

MOV TL0, #6

SETB ET1

SETB EA

SETB TR1

HERE: AJMP HERE ;原地等待中断

T1INT:CPL P1.0 ;中断服务:P1.0取非

RETI ;中断返回

END

4.利用定时器/计数器1定时中断控制P1.7驱动LED发光二极管亮1秒灭1秒地闪烁,设时钟频

率为12MHz。

答:时钟频率为12MHz,1个机器周期1 us,1秒闪烁一次,0.5秒 P1.7求反1次。

0.5S=500ms=500000 us,方式1最大计数65536,让T1工作于方式1,计数50000次中断一次,初值=65536-50000=15536=3CB0H

用R7记录中断次数,计满10个中断为500ms秒。

ORG 0000H

AJMP MAIN

ORG 001BH

AJMP PT1INT

ORG 0030H

START:MOV R7,#00H

MOV TMOD,#10H

MOV TL1,#0B0H

MOV TH1 ,#3CH

SETB EA

SETB ET1

SETB TR1

HERE: SJMP HERE

PT1INT: MOV TL1,#0B0H

MOV TH1,#03CH

INC R7

CJNE R7,#10, PEND

MOV R7, #00H

CPL P1.7

PEND: RETI

END

5.利用MCS-51单片机定时器/计数器设计一个数字秒表。定时范围:00-99秒;两位LED数码管显示。设时钟频率为6MHz。基本原理:利用定时器方式2产生0.5毫秒时间基准,循环2000次,定时 1秒。

答:电路如图所示

“数芯排线连接到P0.7/AD7端口用8P0.0/AD0把“单片机系统”区域中的-

P0.1/AD1,P0.0/AD0对应着aa-h端口上;要求:区域中的任一个码显示模块”。对应着h对应着b,……,P0.7/AD7“数8芯排线连接到P2.7/A15区域中的P2.0/A8-端口用把“单片机系统”P2.1/A9a,端口上;要求:P2.0/A8对应着h码显示模块”区域中的任一个a-。P2.7/A15对应着hb对应着,……,用导线连接到”独立式键盘“区域中的P3.5/T1把“单片机系统“区域中的端口上;SP1 SP1后就开始计时。1开始时,显示“00”,第次按下后,计时停止。次按第2SP1后,计时归零次按SP1第3就具有自动重装载功能,即自动加载计数初值,在这2;选择定时工作方式2工作方式作为预置寄存器,初为计数器,以位计数器分为两部分,即以种工作方式中,16TL0TH0

始化时把计数初值分别加载至TL0和TH0中,当计数溢出时,由预置寄存器TH0以硬件方法自动给计数器TL0重新加载。

汇编源程序

TCNTA EQU 30H ;时间计数

TCNTB EQU 31H

SEC EQU 32H

KEYCNT EQU 33H ;按键计数

BIT P3.5 SP1

ORG 00H

LJMP START

ORG 0BH

LJMP INT_T0

MOV KEYCNT,#00H START:

MOV SEC,#00H

MOV A,SEC

MOV B,#10

DIV AB

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

MOV A,B

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P2,A

;MOV TMOD,#02H

SETB ET0

SETB EA

WT: JB SP1,WT )0为SP1转移(按键按下时1;直接寻址位为

LCALL DELY10MS

JB SP1,WT ;接着SP1变为1

INC KEYCNT

MOV A,KEYCNT

CJNE A,#01H,KN1

SETB TR0 ;TR0置1,启动定时器T0 ,允许定时/计数器计数

MOV TH0,#06H ;用于自动恢复定时初值

250us ;置T0定时初值MOV TL0,#06H

MOV TCNTA,#00H

MOV TCNTB,#00H

LJMP DKN

KN1: CJNE A,#02H,KN2

CLR TR0

LJMP DKN

;可以不要CJNE A,#03H,DKN KN2: MOV SEC,#00H

MOV A,SEC

MOV B,#10

DIV AB

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

MOV A,B

;可以不要MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P2,A

MOV KEYCNT,#00H

DKN: JNB SP1,$ 转移0;直接寻址为

LJMP WT

DELY10MS:

MOV R6,#20

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

RET ;子程序返回INT_T0:

INC TCNTA

MOV A,TCNTA

CJNE A,#100,NEXT

MOV TCNTA,#00H

INC TCNTB

MOV A,TCNTB

CJNE A,#4,NEXT

MOV TCNTB,#00H

INC SEC

MOV A,SEC

CJNE A,#100,DONE

MOV SEC,#00H

DONE: MOV A,SEC

MOV B,#10

DIV AB

MOV DPTR,#TABLE ;可以不要

MOVC A,@A+DPTR

MOV P0,A

MOV A,B

MOV DPTR,#TABLE ;可以不要

MOVC A,@A+DPTR

MOV P2,A

NEXT: RETI

TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

END

C语言源程序

#include

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00};

unsigned char second;

unsigned char keycnt;

unsigned int tcnt;

void main(void)

{

unsigned char i,j;

TMOD=0x02;

ET0=1;

EA=1;

second=0;

P0=dispcode[second/10];

P2=dispcode[second_x0010_];

while(1)

{

if(P3_5==0)

{

for(i=20;i>0;i--)

for(j=248;j>0;j--);

if(P3_5==0)

{

keycnt++;

相关主题
相关文档
最新文档