第四次作业解答

3 . 简述MCS-51单片机定时器/计数器四种工作方式的特点。如何选择和设定?

答: 四种工作方式的选择是通过设定工作方式寄存器TMOD 中的M1MO 两位来完成的。

1 ) 当M1M0=00时,定时/计数器工作于方式0,构成一个13 位定时/计数器。
2 ) 当M1M0=01时,定时/计数器工作于方式1,构成一个16 位定时/计数器。方式l 与方式0的区别在于方式0是13 位计数器。
3 ) 当M1M0 = 10时,定时/计数器工作于方式2,在方式2情况下,定时/计数器为8 位,能自动恢复定时/计数器初值。在方式0、方式1 时,定时/ 计数器的初值不能自动恢复, 计满后若要恢复原来的初值,须在程序中重新给TH0(TH1)、TL0(TL1)赋值,这不仅导致编程麻烦,而且影响定时时间精度。但方式2 时与方式0 、方式l 不同,方式2具有初值自动装入功能。
3 ) 当M 1M0= 11时,定时/计数器处于工作方式3, 但方式3仅适用于T0,T1无方式3 。方式3时,定时器T0 被分解成两个独立的8 位计数器TL0 和TH0。

错误:
1)回答太过简单,只回答几位的定时/计数器,没有回答特点和区别;
2)设定方法不对,回答了GATA位等的意义,而没有突出M1M0。

4. 定时/计数器对外部计数频率有何限制?

答:当定时/计数器为计数工作方式时,计数器对来自输入引脚的外部信号计数,外部脉冲的下降沿触发计数。计数器在每个机器周期的S5P2器件采样引脚输入电平,若一个机器周期采样值1,下一个机器周期的采样值为0,则计数值加1。新的计数值是检测到输入引脚电平发生1到0的负跳变沿后,于下一个机器周期的S3P1期间装入计数器中的,所以检测一个由1至0的跳变需要两个机器周期,故外部脉冲的最高计数频率为振荡频率的1/24。

错误:
1)重点是外部脉冲的最高计数频率为振荡频率的1/24;
2)对于单振荡周期的单片机不是本课的讨论范围,不要给自己增加负担。

5 . 定时/计数器初始化包括哪些步骤?

答: 初始化步骤如下:
1)根据设计要求先给工作方式寄存器TMOD送一个方式控制字,以设定定时/计数器相应的工作方式;
2)根据实际需要给定时/计数器选送定时器初值或计数器初值,以确定需要定时的时间和需要计数的初值;
3)根据需要给中断允许寄存器IE选送中断控制字,并给中断优先级寄存器IP 选送中断优先级字,以开放相应中断并设定中断优先级;
4)给控制寄存器TCON送命令字,以便启动或禁止定时器/计数器的运行。

错误:
1)未写步骤三;
2)抄袭,还抄袭一个错误的答案;
3)步骤1,初始化,什么意思,不懂?

6. 已知单片机时钟频率fosc=12MHz,当要求定时时间为2ms或5ms, 定时器分别工作在方式0、方式1和方式2时,定时器计数初值各是多少?

解: 因为单片机时钟频率fosc = 1 2MHz,所以机器周期Tcy=12/fosc=1us,根据初值公式
Count=2n-Td/Tcy

1) Td=2ms=2000us 时:
方式0时 Count=213-2000us/1us=8192-2000=6192
TH0/ TH1=6192/32=193=C1H TL0/ TL1=6192%32=16=10H
方式1时 Count=216 -2000us/1us=65536-2000=63536
TH0/ TH1=63536/256=248=F8H TL0/ TL1=63536%256=48=30H
方式2时,单次溢出最长只能延时256us,因此可设定每次溢出延时200us,累计10次溢出即可得2ms,因此初值可设置为:
Count =28-200us/1us=256-200=56=38H,TH0/ TH1=38H, TL0/ TL1=38H
2) Td=5ms=5000us时:
方式0时Count=213-5000us/1us=8192-5000=3192
TH0/ TH1=3192/32=99=63H TL0/ TL1=3192%32=24=18H
方式1时Count=216 -5000us/1us=65536-5000=60536
TH0/ TH1=60536/256=236=ECHH TL0/ TL1=60536%256=120=78H
方式2时,单次溢出最长只能延时256us ,因此可设定每次溢出延时200 us,累计25次溢出即可得5ms, 因此初值可设置为
Count =28-200us/1us=256-200=56=38H,TH0/ TH1=38H, TL0/ TL1=38H

错误:
1)未计算出最终结果:TH0/ TH1、TL0/ TL1;
2)抄袭,连错误一起抄过来,比如-2000/256,初值什么时间会出现负值;
3)抄袭严重;

7. 己知MCS-51单片机的fosc =6MHz,请利用中断技术和T0,从Pl.0端输出高电平宽度为50us、低电平宽度为200us的矩形波。

解: 设定时长度为Td=50us,高电平延时l个Td ,低电平延时4个Td,延时时间较短,可采用方式2,则初值计算为
Count =28-50us/2us=256-25=231=E7H
T0工作于方式2,有GATA=0,C/T=0, M1=1,M0=0;
Tl未使用,因此TMOD =02H

#include
sbit P1_0=P1^0;
unsigned char Td1=1;
unsigned char Td4=4;

void main ()
 {
  TMOD=0x02;
  TL0=0xe7;
  TH0=0xe7;
  ET0=l;
  EA=l;
  TR0=l :
  P1_0=l :
  while(1);
 }
void int0 () interrupt 1
 {
  Td1--;
  Td4--;
  if (Td1==0)
   {
    P1_0=0;
    Td4=4;
   }
  if (Td4==0)
   {
    P1_0=1;
    Td1=1;
   }
 }
错误: 1)抄袭,而且抄错,比如特殊功能寄存名写错; 2)变量使用前未定义; ## 11. 设计一个8 灯闪烁的控制电路,系统晶振为12MHz,编程实现8灯轮流闪烁,每盏灯点亮时间为2s。 解:采用定时计数器T0工作于方式l,TMOD=0x0l: 初值计算: 周期为4s,则延时时间长度需2s 因为工作在方式1下,且机器周期为l us,最长延时时间长度为65536us,即65. 536ms 因此我们可以让定时计数器每次延时50ms,并且让其溢出40次,则延时时间长度 Td=50ms*40=2000ms=2s 因此初值为Count=65536-50000us/ 1us =15536 TH0=15536/256=60=3CH TL0=15536%256=176=b0H
#include 
#include 
unsigned char i =40, j=0;
void main()
  {
    TMOD=0x01:
    TH0=0x3c:
    TL0=0xb0;
    ET0=1;
    EA=1 :
    TR0=1:
    while(1) ;
  }

void timer0() interrupt 1
 {
  TH0=0x3c:
  TL0=0xb0;
  i-- ;
  if (i==0)
   {
    i=40:
    P1=_crol_ (0x0l, j)
    j ++;
    if (j==8) j=0;
  }
 }

错误:
1)初值计算错误;
2)抄袭,而且抄错,比如特殊功能寄存名写错;