第05章 单片机定时计数器 习题解答.docx
- 文档编号:12480381
- 上传时间:2023-04-19
- 格式:DOCX
- 页数:18
- 大小:73.14KB
第05章 单片机定时计数器 习题解答.docx
《第05章 单片机定时计数器 习题解答.docx》由会员分享,可在线阅读,更多相关《第05章 单片机定时计数器 习题解答.docx(18页珍藏版)》请在冰豆网上搜索。
第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用来控制定时计数器的工作方式,位结构如下:
D7
D6
D5
D4
D3
D2
D1
D0
GATE
M1
M0
GATA
M1
M0
←T1方式字段→
←T0方式字段→
C/T:
定时或计数功能选择位。
1为计数方式,0为定时方式。
GATE:
门控位,用于控制定时/计数器的启动是否受外部中断请求信号的影响。
GATE=0,软件控制位TR0(TR1)=1启动定时/计数器开始计数。
GATE=1,软件控制位TR0(TR1)=1,INT0(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单片机的晶振频率fOSC=6MHz,分别讨论定时器/计数器0在各种工作方式下的最长定时时间。
答:
由fosc=6MHz可知,一个机器周期T=2us,由于是加1计数,所以最长定时应是计数初值最小时(即为0时)的定时时间。
方式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,则最长定时时间将缩短一半。
3.编写程序3.编写程序从P1.0引脚输出频率为1KHz的方波。
设晶振频率为6MHz。
答:
利用T1定时中断。
解:
fosc=6MHz。
1机器周期=2uS。
1KHz方波周期=1mS,半个方波周期=500uS。
500uS÷2uS=250
若选择方式2工作,计算初值:
256-250=6
ORG0000H
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定时中断控制
1.编写程序用P1.7驱动LED发光二极管亮1秒灭1秒地闪烁,设时钟频率为12MHz。
答:
时钟频率为12MHz,1个机器周期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
START:
MOVR7,#00H
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秒。
答:
电路如图所示
把“单片机系统”区域中的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。
把“单片机系统“区域中的P3.5/T1用导线连接到”独立式键盘“区域中的SP1端口上;
开始时,显示“00”,第1次按下SP1后就开始计时。
第2次按SP1后,计时停止。
第3次按SP1后,计时归零
选择定时工作方式2;工作方式2就具有自动重装载功能,即自动加载计数初值,在这种工作方式中,16位计数器分为两部分,即以TL0为计数器,以TH0作为预置寄存器,初始化时把计数初值分别加载至TL0和TH0中,当计数溢出时,由预置寄存器TH0以硬件方法自动给计数器TL0重新加载。
汇编源程序
TCNTAEQU30H;时间计数
TCNTBEQU31H
SECEQU32H
KEYCNTEQU33H;按键计数
SP1BITP3.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
WT:
JBSP1,WT;直接寻址位为1转移(按键按下时SP1为0)
LCALLDELY10MS
JBSP1,WT;接着SP1变为1
INCKEYCNT
MOVA,KEYCNT
CJNEA,#01H,KN1
SETBTR0;TR0置1,启动定时器T0,允许定时/计数器计数
MOVTH0,#06H;用于自动恢复定时初值
MOVTL0,#06H;置T0定时初值250us
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,$;直接寻址为0转移
LJMPWT
DELY10MS:
MOVR6,#20
D1:
MOVR7,#248
DJNZR7,$
DJNZR6,D1
RET;子程序返回
INT_T0:
INCTCNTA
MOVA,TCNTA
CJNEA,#100,NEXT
MOVTCNTA,#00H
INCTCNTB
MOVA,TCNTB
CJNEA,#4,NEXT
MOVTCNTB,#00H
INCSEC
MOVA,SEC
CJNEA,#100,DONE
MOVSEC,#00H
DONE:
MOVA,SEC
MOVB,#10
DIVAB
MOVDPTR,#TABLE;可以不要
MOVCA,@A+DPTR
MOVP0,A
MOVA,B
MOVDPTR,#TABLE;可以不要
MOVCA,@A+DPTR
MOVP2,A
NEXT:
RETI
TABLE:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
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;
}
P0=dispcode[second/10];
P2=dispcode[second%10];
}
}
三、Proteus仿真
1.在Proteus下,仿真实现5.4节内容。
答:
全自动洗衣机定时控制Proteus仿真
洗衣机中所需的定时功能并不复杂,可以利用单片机提供的定时器方便实现。
设洗衣机有三段定时时间,分别为:
进水阶段定时2秒,洗涤阶段定时4秒,甩干阶段定时2秒。
并分别用三个LED发光二极管表示进水、洗涤、甩干三个环节的工作状态。
其中如果发光二极管A亮,表示进水工作正在进行;发光二极管B亮,表示洗涤工作正在进行;发光二极管C亮,表示甩干工作正在进行。
发光二极管熄灭时,说明相应的定时已到,工作停止。
图5-7给出了Proteus仿真电路图。
图5-6全自动洗衣机定时控制PROTUES仿真电路图
图5-6中,S表示洗衣机启动开关,开关按下洗衣机开始工作。
首先是进水定时控制,表示正在进水的LED发光二极管A点亮。
当进水控制的定时时间到时,进水工作停止,发光二极管A灭灯;接着开始洗涤工作定时,发光二极管B点亮;洗涤工作结束后,开始甩干工作定时,发光二极管C点亮。
当洗衣功能结束时,三个指示灯都熄灭,表示洗衣工作结束,并接通扬声器LS1鸣声提醒。
汇编语言参考程序如下:
ORG0000H;在0000H单元存放转移指令
LJMPMAIN;转移到主程序
ORG000BH;计数/定时器T0的中断入口地址
LJMPTime0;转到中断子程序Time0
ORG0100H;主程序从0100H开始
MAIN:
JBP2.0,MAIN;判按键是否按下,为0即按下,顺序执行,否则等待。
LACLLDISPLY;有键按下,延时去抖动
JBP2.0,MAIN;再判有键按下
MOVP1,#0EH;确定键按下,A灯亮,开始放水定时
MOVR0,#00H;R0放3个阶段的工作标志
MOVR1,#00H;R1放定时器的中断计数
SETBEA;开中断总开关
SETBET0;开定时器T0的中断开关
MOVTMOD,#01H;设定时器T0工作方式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
sbitP20=P2^0;//将P20位定义为P2.0引脚
sbitP37=P3^7;//将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;//A灯亮,开始放水定时
EA=1;//开总中断
ET0=1;//定时器T0中断允许
TMOD=0x01;//使用定时器T0的模式1
TH0=(65536-46083)/256;//定时器T0的高8位赋初值,定时50ms
TL0=(65536-46083)%256;//定时器T0的高8位赋初值
TR0=1;//启动定时器T0
}
while
(1);//无限循环等待中断
}
}
voidTime0(void)interrupt1using0//“interrupt”声明函数为中断服务函数
{
if(f==0)//f为标志变量,若f=0,执行第1阶段定时(放水功能)
{
Countor++;//Countor加1
if(Countor==40)//若累计满40次,即计时满2s
{
P1=0x0d;//A灯灭,结束放水,B灯亮,开始洗涤
Countor=0;//将Countor清0,重新从0开始计数
f++;//f加1,准备第2阶段的定时
}
}
if(f==1)//若f=1,执行第2阶段定时(洗涤功能)
{
Countor++;//Countor加1
if(Countor==80)//若累计满80次,即计时满4S
{
P1=0x0B;//B灯灭,结束洗涤,C灯亮,开始甩干
Countor=0;//将Countor清0,重新从0开始计数
f++;//f加1,准备第3阶段的定时
}
}
if(f==2)//若f=2,执行第3阶段定时(甩干功能)
{
Countor++;//Countor加1
if(Countor==40)//若累计满60次,即计时满3S
{
P1=0x07;//灯全灭,洗衣机结束工作
Countor=0;//将Countor清0,重新从0开始计数;
f++;//f加1,准备进入第4阶段。
}
}
if(f==3)//若f=3,执行进入第4阶段工作(扬声器提醒)
{
P1=0x07;//灯全灭,洗衣机结束工作
P37=~P37;//扬声器提醒
Countor=0;//将Countor清0,重新从0开始计数;
}
TH1=(65536-46083)/256;//定时器T1的高8位重新赋初值
TL1=(65536-46083)%256;//定时器T1的低8位重新赋初值
}
2.在Proteus下,仿真实现简答题第5题内容。
答:
请参考第5题答案。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第05章 单片机定时计数器 习题解答 05 单片机 定时 计数器 习题 解答