单片机原理与运用-第六章答案

第六章 MCS-51的定时器/计数器

1.MCS-51系列的AT89C51单片机内有几个定时/计数器?每个定/计数器有几种工作方式?如何选择和设定?当作定时器或计数器应用时,它们的速率分别为晶振频率的多少倍?

解:AT89C51单片机内有2个定时/计数器(即T0和T1)。

T0有四种工作方式(方式0—13位、方式1—16位、方式2-可自动装入初值的8位、方式3-两个8位)。

T1有三种工作方式(与T0相同的前三种)。

选择和设定:通过对TMOD的设置选择,其高四位选择T1,低四位选择T0。其中M1,M2用来确定所选的工作方式。

当作定时器或计数器应用时,T0 ,T1的速率分别为晶振频率的1/12,1/12。

2.如果采用的晶振频率为3MHz,定时/计数器T0分别工作在方式0、1和2下,其最大的定时时间各为多少?

解:若晶振频率为3MHz时 T=(TM-TC)12/fosc(us)可知,若设TC=0

方式0时:Tmax=2^13*4us=32.768ms 方式1时:Tmax=2^16*4us=262.144ms 方式2时:Tmax=2^8*4us=1.024ms

3.定时/计数器T0作为计数器使用时,其计数频率不能超过晶振频率的多少?

解:由于定时/计数器TO作为计数器使用时,是对外部引脚输入的脉冲进行计数, CPU在每个机器周期采样一次引脚,当前一次采样为高电平,后一次采样为低电平,则为一次有效计数脉冲,所以如果晶振频率为fosc,则其采样频率fosc/12,两次采样才能决定一次计数有效,所以计数频率不能超过fosc/24。

4.简单说明定时/计数器在不同工作模式下的特点。

解:方式0为13位的定时/计数器,由THx的8位和TLx的低5位构成、

方式1为16位的定时/计数器,由THx的8位和TLx的8位构成, 方式2为8位的定时/计数器,TLx为加1计数器,THx为计数初值寄存器。

方式3只能用于T0,是将T0的低8位用作一个独立的定时/计数器,而高8位的TH0用作一个独立的定时器,并借用T1的TR1和TF1作为高8位定时器的启停控制位和溢出标志位。

5.定时器工作在方式2时有何特点,试用于什么应用场合? 解:定时器工作在方式2时是一个可自动装入时间常数初值的8位定时/计数器,TLx为加1计数器,THx为计数初值寄存器。由于其恢复初值由硬件自动完成,所以当需要反复计数时,用方式2可以方便地实现精确的定时。

6.一个定时器的定时时间有限,如何采用两个定时器的串行定时来实现较长时间的定时?

解:一个定时器的定时时间有限,可采用两个定时器的串行定时来实现较长时间的定时,比如,当晶振频率fosc=12MHz时,单个定时/计数器采用方式1的最大定时时间为65.536ms,此时若用另一个定时/计数器按方式1进行溢出次数计数,在定时器溢出中断时,给计数器发一个计数脉冲,且两者均为方式一,则两者串行可达到的定时时间为65536×65.536ms=4294967.296ms。

7.设MCS-51单片机的晶振频率为12MHz,请编程使P1.0端输出频率为20kHz的方波。

解:fosc = 12MHz,所以机器周期为1us。20kHz的方波周期为1/(20×1000)=50us,方波即高电平和低电平和时间相等,所以只需设一个定时器定时25us将P1.O求反一次即可。 程序如下:

#include

sbit P1_0=P1^0;//定义输出引脚变量 void main() {

P1_0=0; //输出初值为0

TMOD=0x02; //T0方式2定时

TH0=256-25; //计25次,计数初值为模256减25 TL0=TH0;

TR0=1; //启动T0 while(1) //无限循环 if(TF0)

{ //查询T0溢出标志 TF0=0; //溢出标志复位 P1_0=!P1_0; //输出求反 }

}

8.采用定时/计数器T0对外部脉冲进行计数,每计数100个脉冲,T0切换为定时工作方式。定时1ms后,又转为计数方式,如此循环不止。假定MCS-51单片机的晶体振荡器的频率为6MHz,要求T0工作在方式1状态,请编写出相应程序。 解:晶体振荡器的频率为6MHz,则机器周期为12×1/(6*106)= 2us, 要定时1ms,需计数次数为1000/2=500次 #include sbit P1_0=P1^0; void main(){ while(1){

TMOD=0x05;//T0计数,方式一 TH0=(65536-100)/256;//计数100次 TL0=(65536-100)%6; TR0=1;

while(!TF0);//等待计数100次的溢出 TF0=0; //溢出标志复位

TMOD=0x01;//T0定时,方式一 TH0=(65536-500)/256;//计数100次 TL0=(65536-500)%6; TR0=1; //启动T0

while(!TF0); //等待定时时间到1ms的溢出 TF0=0; //溢出标志复位 } }

9.设单片机的fosc=12MHz,使P1.0和P1.1分别输出周期为1ms和10ms的方波,请用定时器T0方式2编程实现。 解:fosc = 12MHz,所以机器周期为1us。 要使P1.0输出周期为400us的方波,可以通过定时中断方式实现,定时时间为200us,当时间到时,对P1.0求反即可。

#include

sbit P1_0=P1^0;//输出周期为400us的方波的引脚 sbit P1_1=P1^1; //输出周期为10ms的方波的引脚 unsigned char num=0;//中断次数计数器,初值为0 void main() {

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4