第05章 单片机定时计数器 习题解答
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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;直接寻址位为1转移(按键按下时SP1为0)
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
M1
M0
工作方式
方式说明
0
0
方式0
13位定时/计数器
0
1
方式1
16位定时/计数器
1
0
方式2
具有自动重装初值的8位定时/计数器
1
1
方式3
T0为两个独立的8位计数器,T1为波特率发生器
2.设MCS-51单片机的晶振频率fOSC=6MHz,分别讨论定时器/计数器0在各种工作方式下的最长定时时间。
答:由fosc =6MHz可知,一个机器周期T=2us,由于是加1计数,所以最长定时应是计数初值最小时(即为0时)的定时时间。
汇编语言参考程序如下:
ORG 0000H;在0000H单元存放转移指令
LJMPMAIN;转移到主程序
ORG 000BH;计数/定时器T0的中断入口地址
LJMPTime0;转到中断子程序Time0
ORG 0100H;主程序从0100H开始
MAIN: JB P2.0,MAIN;判按键是否按下,为0即按下,顺序执行,否则等待。
汇编源程序
TCNTAEQU 30H;时间计数
TCNTBEQU 31H
SECEQU 32H
KEYCNTEQU 33H;按键计数
SP1BIT P3.5
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0
START:MOV KEYCNT,#00H
MOV SEC,#00H
MOV A,SEC
3.编写程序3.编写程序从P1.0 引脚输出频率为1KHz的方波。设晶振频率为6MHz。
答:利用T1定时中断。
解:fosc= 6MHz。1机器周期 =2 uS。1KHz方波周期 =1mS,半个方波周期=500uS。 500uS÷2uS =250
若选择方式2 工作,计算初值:256-250=6
ORG 0000H
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
第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。
答:电路如图所示
把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。
把“单片机系统”区域中的P2.0/A8-P2.7/A15端口用8芯排线连接到“数码显示模块”区域中的任一个a-h端口上;要求:P2.0/A8对应着a,P2.1/A9对应着b,……,P2.7/A15对应着h。
MOV TCNTA,#00H
MOV TCNTB,#00H
LJMP DKN
KN1: CJNE A,#02H,KN2
CLR TR0
LJMP DKN
KN2:CJNE A,#03H,DKN;可以不要
MOV SEC,#00H
MOV A,SEC
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
second=0;
P0=dispcode[second/10];
P2=dispcode[second%10];
break;
}
while(P3_5==0);
}
}
}
}
void t0(void) interrupt 1 using 0
{
tcnt++;
if(tcnt==400)
{
tcnt=0;
second++;
LACLL DISPLY;有键按下,延时去抖动
JB P2.0,MAIN;再判有键按下
MOV P1,#0EH;确定键按下,A灯亮,开始放水定时
RETI ;中断返回
END
4.利用定时器/计数器1定时中断控制
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
AJMPMAIN
ORG001BH
AJMPPT1INT
ORG0030H
START:MOV R7,#00H
MOV TMOD,#10H
MOV TL1,#0B0H
MOV TH1,#3CH
SETB EA
SETB ET1
SETB TR1
HERE: SJMP HERE
LCALL DELY10MS
JB SP1,WT;接着SP1变为1
INC KEYCNT
MOV A,KEYCNT
CJNE A,#01H,KN1
SETB TR0;TR0置1,启动定时器T0 ,允许定时/计数器计数
MOV TH0,#06H;用于自动恢复定时初值
MOV TL0,#06H;置T0定时初值250us
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取非
把“单片机系统“区域中的P3.5/T1用导线连接到”独立式键盘“区域中的SP1端口上;
开始时,显示“00”,第1次按下SP1后就开始计时。
第2次按SP1后,计时停止。
第3次按SP1后,计时归零
选择定时工作方式2;工作方式2就具有自动重装载功能,即自动加载计数初值,在这种工作方式中,16位计数器分为两部分,即以TL0为计数器,以TH0作为预置寄存器,初始化时把计数初值分别加载至TL0和TH0中,当计数溢出时,由预置寄存器TH0以硬件方法自动给计数器TL0重新加载。
图5-6全自动洗衣机定时控制PROTUES仿真电路图
图5-6中,S表示洗衣机启动开关,开关按下洗衣机开始工作。首先是进水定时控制,表示正在进水的LED发光二极管A点亮。当进水控制的定时时间到时,进水工作停止,发光二极管A灭灯;接着开始洗涤工作定时,发光二极管B点亮;洗涤工作结束后,开始甩干工作定时,发光二极管C点亮。当洗衣功能结束时,三个指示灯都熄灭,表示洗衣工作结束,并接通扬声器LS1鸣声提醒。
END
C语言源程序
#include <AT89X51.H>
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsigned char second;
{
if(P3_5==0)
{
for(i=20;i>0;i--)
for(j=248;j>0;j--);
if(P3_5==0)
{
keycnt++;
switch(keycnt)
{
case 1:
TH0=0x06;
TL0=0x06;
TR0=1;
break;
case 2:
TR0=0;
break;
case 3:
keycnt=0;
方式2:方式2为自动重装初值的8位定时/计数器。
方式3只适用于定时/计数器T0,当T0工作在方式3时,TH0和TL0被分为两个独立的8位计数器。
TMOD用来控制定时计数器的工作方式,位结构如D2
D1
D0
GATE
M1
M0
GATA
M1
M0
←T1方式字段→
←T0方式字段→
C/T:定时或计数功能选择位。1为计数方式, 0为定时方式。
if(second==100)
{
second=0;
}
P0=dispcode[second/10];
P2=dispcode[second%10];
}
}
三、Proteus仿真
1.在Proteus下,仿真实现5.4节内容。
答:全自动洗衣机定时控制Proteus仿真
洗衣机中所需的定时功能并不复杂,可以利用单片机提供的定时器方便实现。设洗衣机有三段定时时间,分别为:进水阶段定时2秒,洗涤阶段定时4秒,甩干阶段定时2秒。并分别用三个LED发光二极管表示进水、洗涤、甩干三个环节的工作状态。其中如果发光二极管A亮,表示进水工作正在进行;发光二极管B亮,表示洗涤工作正在进行;发光二极管C亮,表示甩干工作正在进行。发光二极管熄灭时,说明相应的定时已到,工作停止。图5-7给出了Proteus仿真电路图。
二、简答题
1.定时器/计数器T0和T1各有几种工作方式?简述每种工作方式的特点。如何控制定时器/计数器的工作方式?
答:T0可以工作于方式0,1,2,3;T1可以工作于方式0,1,2
方式0:是13位定时/计数器,由TLX的低5位(TLX的高3位未用)和THX高8位组成。
方式1:TLX和THX组成16位定时/计数器。
方式0:(213–0)×2us= 214us=16384us=16.384ms
方式1:(216–0)×2us= 217us=131.072ms
方式2、3:(28–0)×2us= 29us=0.512ms
当 fosc =6MHz,即T=2us时各种方式下的定时时间,若fosc =12MHz,则最长定时时间将缩短一半。
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%10];
while(1)
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秒。
6.TMOD中的M1M0= 11时,定时器工作于方式3。
7.若系统晶振频率为6MHz,则定时器可以实现的最小定时时间为2µs。
8.MCS-51单片机工作于定时状态时,计数脉冲来自单片机内部的机器周期。
9.MCS-51单片机工作于计数状态时,计数脉冲来自单片机外部事件。
10.当GATE=0时,则当软件控制位TR0=1时启动T0开始工作。
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
GATE:门控位,用于控制定时/计数器的启动是否受外部中断请求信号的影响。
GATE=0,软件控制位TR0(TR1)=1启动定时/计数器开始计数。
GATE=1,软件控制位TR0(TR1)=1,INT0(INT1)引脚为高电平时启动定时/计数器开始计数。
M1、M0:定时/计数器工作方式选择位,如下表所示。
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;直接寻址位为1转移(按键按下时SP1为0)
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
M1
M0
工作方式
方式说明
0
0
方式0
13位定时/计数器
0
1
方式1
16位定时/计数器
1
0
方式2
具有自动重装初值的8位定时/计数器
1
1
方式3
T0为两个独立的8位计数器,T1为波特率发生器
2.设MCS-51单片机的晶振频率fOSC=6MHz,分别讨论定时器/计数器0在各种工作方式下的最长定时时间。
答:由fosc =6MHz可知,一个机器周期T=2us,由于是加1计数,所以最长定时应是计数初值最小时(即为0时)的定时时间。
汇编语言参考程序如下:
ORG 0000H;在0000H单元存放转移指令
LJMPMAIN;转移到主程序
ORG 000BH;计数/定时器T0的中断入口地址
LJMPTime0;转到中断子程序Time0
ORG 0100H;主程序从0100H开始
MAIN: JB P2.0,MAIN;判按键是否按下,为0即按下,顺序执行,否则等待。
汇编源程序
TCNTAEQU 30H;时间计数
TCNTBEQU 31H
SECEQU 32H
KEYCNTEQU 33H;按键计数
SP1BIT P3.5
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0
START:MOV KEYCNT,#00H
MOV SEC,#00H
MOV A,SEC
3.编写程序3.编写程序从P1.0 引脚输出频率为1KHz的方波。设晶振频率为6MHz。
答:利用T1定时中断。
解:fosc= 6MHz。1机器周期 =2 uS。1KHz方波周期 =1mS,半个方波周期=500uS。 500uS÷2uS =250
若选择方式2 工作,计算初值:256-250=6
ORG 0000H
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
第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。
答:电路如图所示
把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。
把“单片机系统”区域中的P2.0/A8-P2.7/A15端口用8芯排线连接到“数码显示模块”区域中的任一个a-h端口上;要求:P2.0/A8对应着a,P2.1/A9对应着b,……,P2.7/A15对应着h。
MOV TCNTA,#00H
MOV TCNTB,#00H
LJMP DKN
KN1: CJNE A,#02H,KN2
CLR TR0
LJMP DKN
KN2:CJNE A,#03H,DKN;可以不要
MOV SEC,#00H
MOV A,SEC
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
second=0;
P0=dispcode[second/10];
P2=dispcode[second%10];
break;
}
while(P3_5==0);
}
}
}
}
void t0(void) interrupt 1 using 0
{
tcnt++;
if(tcnt==400)
{
tcnt=0;
second++;
LACLL DISPLY;有键按下,延时去抖动
JB P2.0,MAIN;再判有键按下
MOV P1,#0EH;确定键按下,A灯亮,开始放水定时
RETI ;中断返回
END
4.利用定时器/计数器1定时中断控制
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
AJMPMAIN
ORG001BH
AJMPPT1INT
ORG0030H
START:MOV R7,#00H
MOV TMOD,#10H
MOV TL1,#0B0H
MOV TH1,#3CH
SETB EA
SETB ET1
SETB TR1
HERE: SJMP HERE
LCALL DELY10MS
JB SP1,WT;接着SP1变为1
INC KEYCNT
MOV A,KEYCNT
CJNE A,#01H,KN1
SETB TR0;TR0置1,启动定时器T0 ,允许定时/计数器计数
MOV TH0,#06H;用于自动恢复定时初值
MOV TL0,#06H;置T0定时初值250us
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取非
把“单片机系统“区域中的P3.5/T1用导线连接到”独立式键盘“区域中的SP1端口上;
开始时,显示“00”,第1次按下SP1后就开始计时。
第2次按SP1后,计时停止。
第3次按SP1后,计时归零
选择定时工作方式2;工作方式2就具有自动重装载功能,即自动加载计数初值,在这种工作方式中,16位计数器分为两部分,即以TL0为计数器,以TH0作为预置寄存器,初始化时把计数初值分别加载至TL0和TH0中,当计数溢出时,由预置寄存器TH0以硬件方法自动给计数器TL0重新加载。
图5-6全自动洗衣机定时控制PROTUES仿真电路图
图5-6中,S表示洗衣机启动开关,开关按下洗衣机开始工作。首先是进水定时控制,表示正在进水的LED发光二极管A点亮。当进水控制的定时时间到时,进水工作停止,发光二极管A灭灯;接着开始洗涤工作定时,发光二极管B点亮;洗涤工作结束后,开始甩干工作定时,发光二极管C点亮。当洗衣功能结束时,三个指示灯都熄灭,表示洗衣工作结束,并接通扬声器LS1鸣声提醒。
END
C语言源程序
#include <AT89X51.H>
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsigned char second;
{
if(P3_5==0)
{
for(i=20;i>0;i--)
for(j=248;j>0;j--);
if(P3_5==0)
{
keycnt++;
switch(keycnt)
{
case 1:
TH0=0x06;
TL0=0x06;
TR0=1;
break;
case 2:
TR0=0;
break;
case 3:
keycnt=0;
方式2:方式2为自动重装初值的8位定时/计数器。
方式3只适用于定时/计数器T0,当T0工作在方式3时,TH0和TL0被分为两个独立的8位计数器。
TMOD用来控制定时计数器的工作方式,位结构如D2
D1
D0
GATE
M1
M0
GATA
M1
M0
←T1方式字段→
←T0方式字段→
C/T:定时或计数功能选择位。1为计数方式, 0为定时方式。
if(second==100)
{
second=0;
}
P0=dispcode[second/10];
P2=dispcode[second%10];
}
}
三、Proteus仿真
1.在Proteus下,仿真实现5.4节内容。
答:全自动洗衣机定时控制Proteus仿真
洗衣机中所需的定时功能并不复杂,可以利用单片机提供的定时器方便实现。设洗衣机有三段定时时间,分别为:进水阶段定时2秒,洗涤阶段定时4秒,甩干阶段定时2秒。并分别用三个LED发光二极管表示进水、洗涤、甩干三个环节的工作状态。其中如果发光二极管A亮,表示进水工作正在进行;发光二极管B亮,表示洗涤工作正在进行;发光二极管C亮,表示甩干工作正在进行。发光二极管熄灭时,说明相应的定时已到,工作停止。图5-7给出了Proteus仿真电路图。
二、简答题
1.定时器/计数器T0和T1各有几种工作方式?简述每种工作方式的特点。如何控制定时器/计数器的工作方式?
答:T0可以工作于方式0,1,2,3;T1可以工作于方式0,1,2
方式0:是13位定时/计数器,由TLX的低5位(TLX的高3位未用)和THX高8位组成。
方式1:TLX和THX组成16位定时/计数器。
方式0:(213–0)×2us= 214us=16384us=16.384ms
方式1:(216–0)×2us= 217us=131.072ms
方式2、3:(28–0)×2us= 29us=0.512ms
当 fosc =6MHz,即T=2us时各种方式下的定时时间,若fosc =12MHz,则最长定时时间将缩短一半。
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%10];
while(1)
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秒。
6.TMOD中的M1M0= 11时,定时器工作于方式3。
7.若系统晶振频率为6MHz,则定时器可以实现的最小定时时间为2µs。
8.MCS-51单片机工作于定时状态时,计数脉冲来自单片机内部的机器周期。
9.MCS-51单片机工作于计数状态时,计数脉冲来自单片机外部事件。
10.当GATE=0时,则当软件控制位TR0=1时启动T0开始工作。
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
GATE:门控位,用于控制定时/计数器的启动是否受外部中断请求信号的影响。
GATE=0,软件控制位TR0(TR1)=1启动定时/计数器开始计数。
GATE=1,软件控制位TR0(TR1)=1,INT0(INT1)引脚为高电平时启动定时/计数器开始计数。
M1、M0:定时/计数器工作方式选择位,如下表所示。