第05章单片机定时计数器习题集解答.docx
- 文档编号:12696410
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:21
- 大小:231.20KB
第05章单片机定时计数器习题集解答.docx
《第05章单片机定时计数器习题集解答.docx》由会员分享,可在线阅读,更多相关《第05章单片机定时计数器习题集解答.docx(21页珍藏版)》请在冰点文库上搜索。
第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或模
6.TMOD中的M1M0=11时,定时器工作于方式3
7.若系统晶振频率为6MHz则定时器可以实现的最小定时时间为2卩s。
8.
单片机内部的机器周
单片机外部事件
启动T0开始工作。
MCS-51单片机工作于定时状态时,计数脉冲来自期_。
9.MCS-51单片机工作于计数状态时,计数脉冲来自
10.当GATE=0寸,则当软件控制位TR0=1时
简答题
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用来控制定时计数器的工作方式,位结构如下:
D7
D6
D5
D4
D3
D2
D1
D0
GATE
C/T
M1
M0
GAT
C/T
M1
M0
1
A
JT1方式子段t
JT0方式字段
C/T:
定时或计数功能选择位。
1为计数方式,0为定时方式。
GATE门控位,用于控制定时/计数器的启动是否受外部中断请求信号的影响。
GATE=0软件控制位TR0(TR1)=1启动定时/计数器开始计数。
GATE=1软件控制位TR0(TR1)=1,INTO(INT1)引脚为高电平时启动定时/计数器开始计数。
M1、M0定时/计数器工作方式选择位,如下表所示。
M1
M0
工作
方式
方式说明
0
0
方式0
13位定时/计数器
0
1
方式1
16位定时/计数器
1
0
方式2
具有自动重装初值的8位定时/计数器
1
1
方式3
T0为两个独立的8位计数器,T1为波特率发生器
2.设MCS-51单片机的晶振频率fOS=6MHz分别讨论定时器/计数器0在各种工作方式下的最
长定时时间。
答:
由fosc=6MHz可知,一个机器周期T=2us,由于是加1计数,所以最长定时应是
计数初值最小时(即为0时)的定时时间。
方式0:
(213-0)x2us=214us=16384us=16.384ms
方式1:
(216-0)X2us=217us=131.072ms
方式2、3:
(28-0)x2us=29us=0.512ms当fosc=6MHz即T=2us时各种方式下的定时时间,若fosc=12MHz,则最长定时时间将缩短一半。
3.编写程序从P1.0引脚输出频率为1KHz的方波。
设晶振频率为6MHz
答:
禾U用T1定时中断。
fosc=6MHz1机器周期=2uS。
1KHz方波周期=1mS,半个方波周期=500uS。
500uS-2uS=250
若选择方式2工作,计算初值:
256-250=6
AJMPMAIN
ORG001BH;T1的中断矢量
LJMPT1INT
MAIN:
MOVTMOD#20H
MOVTH0,#6
MOVTL0,#6
SETBET1
SETBEA
SETBTR1
HERE:
AJMPHERE;原地等待中断
T1INT:
CPLP1.0;中断服务:
P1.0取非
RETI;中断返回
END
4.利用定时器/计数器1定时中断控制P1.7驱动LED发光二极管亮1秒灭1秒地闪烁,设时
钟频率为12MHz
答:
时钟频率为12MHz1个机器周期1us,1秒闪烁一次,0.5秒P1.7求反1次。
0.5S=500ms=500000us,方式1最大计数65536,让T1工作于方式1,计数50000次中断一次,初值=65536-50000=15536=3CB0H
用R7记录中断次数,计满10个中断为500ms秒。
ORG0000H
AJMPMAIN
ORG001BH
AJMPPT1INT
ORG0030H
MOVTMOD,#10H
MOVTL1,#0B0H
MOVTH1,#3CH
SETBEA
SETBET1
SETBTR1
HERE:
SJMPHERE
PT1INT:
MOVTL1,#0B0H
MOVTH1,#03CH
INCR7
CJNER7,#10,PEND
MOVR7,#00H
CPLP1.7
PEND:
RETI
END
5.利用MCS-51单片机定时器/计数器设计一个数字秒表。
定时范围:
00-99秒;两位LED
数码管显示。
设时钟频率为6MHz基本原理:
利用定时器方式2产生0.5毫秒时间基准,
循环2000次,定时1秒。
答:
电路如图所示
把“单片机系统”区域中的PO.O/ADO—P0.7/AD7端口用8芯排线连接到“数
码显示模块”区域中的任一个a—h端口上;要求:
PO.O/ADO对应着a,P0.1/AD1
对应着b,……,PO.7/AD7对应着h0
把“单片机系统”区域中的P2.O/A8—P2.7/A15端口用8芯排线连接到“数
码显示模块”区域中的任一个a—h端口上;要求:
P2.O/A8对应着a,P2.1/A9
对应着b,……,P2.7/A15对应着ho
把“单片机系统“区域中的P3.5/T1用导线连接到”独立式键盘“区域中的
SP1端口上;
开始时,显示“OO”,第1次按下SP1后就开始计时。
第2次按SP1后,计时停止。
第3次按SP1后,计时归零
选择定时工作方式2;工作方式2就具有自动重装载功能,即自动加载计数初值,在这
始化时把计数初值分别加载至TL0和TH0中,当计数溢出时,由预置寄存器TH0以硬件方法自动给计数器TL0重新加载。
汇编源程序
TCNTA
EQU30H
;时间计数
TCNTB
EQU31H
SEC
EQU32H
KEYCNT
EQU33H
;按键计数
SP1
BITP3.5
ORG00H
LJMPSTART
ORG0BH
LJMPINT_T0
START:
MOVKEYCNT,#00H
MOVSEC,#00H
MOVA,SEC
MOVB,#10
DIVAB
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP0,A
MOVA,B
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP2,A
MOVTMOD,#02H
SETBET0
SETBEA
LCALLDELY10MS
JBSP1,WT
INCKEYCNT
MOVA,KEYCNT
CJNEA,#01H,KN1
SETBTR0
MOVTH0,#06H
MOVTL0,#06H
MOVTCNTA,#00H
MOVTCNTB,#00H
LJMPDKN
KN1:
CJNEA,#02H,KN2
CLRTR0
LJMPDKN
KN2:
CJNEA,#03H,DKN
MOVSEC,#00H
MOVA,SEC
MOVB,#10
DIVAB
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP0,A
MOVA,B
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP2,A
MOVKEYCNT,#00H
DKN:
JNBSP1,$
LJMPWT
;接着SP1变为1
;TR0置1,启动定时器T0,允许定时/计数器计数
;用于自动恢复定时初值
;置T0定时初值250us
;可以不要
;可以不要
;直接寻址为0转移
D1:
INT_T0:
DONE:
NEXT:
MOVR6,#20
MOVR7,#248
DJNZR7,$
DJNZR6,D1
RET
INCTCNTA
MOVA,TCNTA
CJNEA,#100,NEXT
MOVTCNTA,#00H
INCTCNTB
MOVA,TCNTB
CJNEA,#4,NEXT
MOVTCNTB,#00H
INCSEC
MOVA,SEC
CJNEA,#100,DONE
MOVSEC,#00H
MOVA,SEC
MOVB,#10
DIVAB
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP0,A
MOVA,B
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP2,A
RETI
;子程序返回
;可以不要
;可以不要
END
C语言源程序
#include
unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};unsignedcharsecond;
unsignedcharkeycnt;
unsignedinttcnt;
voidmain(void)
{
unsignedchari,j;
TMOD=0x02;
ET0=1;
EA=1;
second=0;
P0=dispcode[second/10];
P2=dispcode[second%10];
while
(1)
{
if(P3_5==0)
{
for(i=20;i>0;i--)
for(j=248;j>0;j--);
if(P3_5==0)
keycnt++;
switch(keycnt)
{
case1:
TH0=0x06;
TL0=0x06;
TR0=1;
break;
case2:
TR0=0;
break;
case3:
keycnt=0;
second=0;
P0=dispcode[second/10];
P2=dispcode[second%10];break;
}
while(P3_5==0);
}
}
}
}
voidt0(void)interrupt1using0
{
tcnt++;
if(tcnt==400)
{
tcnt=0;
second++;
if(second==100)
{
second=0;
}
PO=dispcode[second/10];
P2=dispcode[second%10];
}
}
三、Proteus仿真
1.在Proteus下,仿真实现5.4节内容。
答:
全自动洗衣机定时控制Proteus仿真
5-7
亮,表示甩干工作正在进行。
发光二极管熄灭时,说明相应的定时已到,工作停止。
图
给出了Proteus仿真电路图。
图5-6全自动洗衣机定时控制PROTUE仿真电路图
图5-6中,S表示洗衣机启动开关,开关按下洗衣机开始工作。
首先是进水定时控制,
表示正在进水的LED发光二极管A点亮。
当进水控制的定时时间到时,进水工作停止,发光
二极管A灭灯;接着开始洗涤工作定时,发光二极管B点亮;洗涤工作结束后,开始甩干工
作定时,发光二极管C点亮。
当洗衣功能结束时,三个指示灯都熄灭,表示洗衣工作结束,并接通扬声器LS1鸣声提醒。
汇编语言参考程序如下:
ORG0000H;
在0000H单元存放转移指令
LJMPMAIN;
转移到主程序
ORG000BH;
计数/定时器TO的中断入口地址
LJMPTime0
;转到中断子程序Time0
ORG0100H;
主程序从O1OOH开始
MAIN:
JBP2.0,MAIN;
判按键是否按下,为O即按下,顺序执行,否则等待。
LACLLDISPLY;
有键按下,延时去抖动
JBP2.0,MAIN;
再判有键按下
MOVP1,#0EH;
确定键按下,A灯亮,开始放水定时
MOVR0,#00H;R0
放3个阶段的工作标志
MOVR1,#00H;R1
放定时器的中断计数
SETBEA;
开中断总开关
SETBET0;
开定时器TO的中断开关
MOVTMOD,#01H;
设定时器TO工作方式1
MOVTH0,#3CH;
定时50ms高8位初值
MOVTL0,#0B0H;
定时50ms低8位初值
SETBTR0;
允许计数
SIMP$;
循环等待
END
;汇编结束
Time0:
;
定时器T0中断子程序
CJNER0,#00H,L1;R0的内容为标志,若R0=0,执行第1阶段定时(放水功能)
INCR1;R1
内容加1
CJNER1,#40H,L4;
若累计满40次,即计时满2s
MOVP1,#0DH;A
灯灭,结束放水,B灯亮,开始洗涤
MOVR1,#00H;R1
内容清0,重新从0开始计数
INCR0;R0
内容加1,准备第2阶段的定时
SJMPL4;
转L4,送初值,中断返回
L1:
CJNER0,#01H,L2;
若R0=1,执行第2阶段定时(洗涤功能)
INCR1;R1
内容加1
CJNER1,#80H,L4;
若累计满80次,即计时满4s
MOVP1,#0BH;B
灯灭,结束洗涤,C灯亮,开始甩干
MOVR1,#00H;R1
内容清0,重新从0开始计数
INCR0;R0
内容加1,准备第3阶段的定时
SJMPL4
;转L4,送初值,中断返回
L2:
CJNER0,#02H,L3;
若R0=2,执行第3阶段定时(甩干功能)
INCR1;R1
内容加1
CJNER1,#40H,L4;
若累计满40次,即计时满2s
MOVR1,#00H
;将Countor清0,重新从0开始计数
INCR0;R0
内容加1,准备第4阶段的工作
L3:
MOVP1,#07H;
灯全灭,洗衣机结束工作
CPLP3.7;
扬声器提醒
L4:
MOVTH0,#3CH;
定时器T1的高8位重新赋初值
MOVTL0,#0B0H
;定时器T1的低8位重新赋初值
RETI;
中断返回
C语言参考程序如下:
#include
//包含51单片机寄存器定义的头文件
sbitP20=P2A0;
//将P20位定义为P2.0弓I脚
sbitP37=P3A7;
//将P37位定义为P3.7弓|脚
unsignedcharCountor;//
设置全局变量,储存定时器T1中断次数
unsignedcharf=0;
//设置全局变量,作为区分不同阶段的定时
voiddelay1()
//延时函数
{
intq;
for(q=0;q<500;q++);
}
voidmain(void)//
主函数
if(P20==0)//
若P2.0=0,说明键按下,执行语句,否则一直等待。
{
delay1();
if(P20==0)
{
P1=0x0e;
EA=1;//
ET0=1;
//有键按下,延时去抖动
//再判有键按下
//A灯亮,开始放水定时开总中断
TMOD=0x01;//
使用定时器T0的模式1
TH0=(65536-46083)/256;
//定时器TO的高8位赋初值,定时50ms
TL0=(65536-46083)%256;
//定时器T0的高8位赋初值
TR0=1;
//启动定时器T0
//定时器T0中断允许
}
while
(1);
//无限循环等待中断
voidTime0(void)interrupt1using0//interrupt”声明函数为中断服务函数
{
if(f==0)//f
{
Countor++;
if(Countor==40)
为标志变量,若f=0,执行第1阶段定时(放水功能)
//Countor加1
//若累计满40次,即计时满2s
{
P1=0x0d;
//A灯灭,结束放水,B灯亮,开始洗涤
Countor=0;
//将Countor清0,重新从0开始计数
f++;
//f加1,准备第2阶段的定时
}
if(f==1)
//若f=1,执行第2阶段定时(洗涤功能)
{
Countor++;
if(Countor==80)
{
P1=0x0B;
Countor=0;
f++;
}
}
if(f==2)
{
Countor++;
if(Countor==40)
{
P1=0x07;
Countor=0;
f++;
}
}
if(f==3)
{
P1=0x07;
P37=~P37;
Countor=0;
}
TH1=(65536-46083)/256;
TL1=(65536-46083)%256;}
//Countor加1
//若累计满80次,即计时满4S
//B灯灭,结束洗涤,C灯亮,开始甩干
//将Countor清0,重新从0开始计数
//f加1,准备第3阶段的定时
//若f=2,执行第3阶段定时(甩干功能)
//Countor加1
//若累计满60次,即计时满3S
//灯全灭,洗衣机结束工作
//将Countor清0,重新从0开始计数;
//f加1,准备进入第4阶段。
//若f=3,执行进入第4阶段工作(扬声器提醒)
//灯全灭,洗衣机结束工作
//扬声器提醒
//将Countor清0,重新从0开始计数;
//定时器T1的高8位重新赋初值
//定时器T1的低8位重新赋初值
2.在Proteus下,仿真实现简答题第5题内容。
.\
答:
请参考第5题答案。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 05 单片机 定时 计数器 习题集 解答