计数器定时器的应用

来源:互联网 发布:java微信商城源码下载 编辑:程序博客网 时间:2024/04/30 21:39
 

任务一:

1、五个中断要求:2个定时器中断、2个外部中断、1个串行端口中断

2、中断控制寄存器

(1)IE(中断使能寄存器)

EA

ES

ET1

EX1

ET0

EX0

EX0:使能外部/INT0的中断;

ET0:使能TIMER0的中断;

EX1: 使能外部/INT1的中断;

ET1: 使能TIMER1的中断;

ES:使能串行口的中断。

EA:如果EA=0时,屏蔽所有中断;如果EA=1,则各中断由各中断为加以设定;

(2)IP(中断优先权控制寄存器)

PS

PT1

PX1

PT0

PX0

PX0:定义外部/INT0的优先权;

PT0:定义外部TIMER0的优先权;

PX1:定义外部/INT1的优先权;

PT1:定义外部TIMER1的优先权;

PS:定义串行端口的优先权;

3、定时器0和定时器1和外部中断

定时器或计数器的功能是由特殊功能寄存器内TMODC/T位所决定的。这两个定时器有4种工作方式,它是由TMOD内的两个位M1M0加以选择。

(1)TMOD(定时器模式控制寄存器)说明如下:

TIMER1

TIMER0

GATE

C/T

M1

M0

GATE

C/T

M1

M0

定时器模式控制器各位名称

M1 M0:工作方式,如下表所示:

M1

M0

工作方式

  

0

0

MODE0

13位定时器/计数器

0

1

MODE1

16位定时器/计数器

1

0

MODE2

8位定时器/计数 自动载入

1

1

MODE3

(TIMER0)TL08位定时器/计数器,由T0控制;TH0为另一个8位定时器,由T1控制

1

1

MODE3

(TIMER1) 定时器/计数器1停止定时计数

GATE:当TRX=1GATE=1时,定时器只在/INTX引脚为高电平时才会计时;当GATE=0时,则定时器只在TRX=1时会计时;

C/TC/T=0时为定时器,C/T=1时为计数器。

(2)TCON(定时器控制寄存器)

TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0

TCON定时器控制寄存器各位名称

IT0/INT0的中断电位控制,IT0=1时为下降沿触发,IT0=0时为低电平触发;

IE0/INT0的中断标志位,当中断发生时,硬件会设定此位;当中断被处理时,硬件会清除此位。

IT1/INT0的中断电位控制,IT1=1时为下降沿触发,IT1=0时为低电平触发;

IE1/INT0的中断标志位,当中断发生时,硬件会设定此位;当中断被处理时,硬件会清除此位。

TR0TIMER0的启动位,TR0=1时为启动,0时为停止;

TF0TIMER0的溢出标志位,当TIMER0溢出时,会设定为1;当执行中断子程序时会清除为0。

TR1TIMER1的启动位,TR1=1时为启动,0时为停止;

TF1TIMER1的溢出标志位,当TIMER1溢出时,会设定为1;当执行中断子程序时会清除为0。

任务二:

1、打开WAVE软件,新建一个文件,输入以下程序:

#include<reg52.h>

sbit a0=P3^5;

sbit a1=P3^4;

char date[3];

int C100us;

int m=0,n=0,o=0;

void T0Int(void) interrupt 1 using 0   //T0中断服务函数

{

 C100us--;

 if(C100us==0)               //100us计数器为0,重置计数器

 {C100us=20000;

  m++;

  date[0]=date[0]+1;

  if(m==10)

  {n++;

   m=0;

   date[0]=0x00;

  date[1]=date[1]+1;

  }

  if(n==6)

  {o++;

   n=0;

  date[1]=0x10;

  date[2]=date[2]+1;

  }

  if(n==10){n=0;  date[1]=0x20;}

 }

}

void main(void)         //主函数

{unsigned int i,j=0;

 TMOD=0X02;         //设置T0工作方式与初值

 TH0=0xd2;

 TL0=0x00;

 IE=0X82;           //开中断

 date[0]=0x00;

 date[1]=0x10;

 date[2]=0x20;

 C100us=20000;

 while(1)

 {TR0=0;

  P0=date[0];

  for(i=0;i<100;i++);

  P0=date[1];

  for(i=0;i<100;i++);

  P0=date[2];

  for(i=0;i<100;i++);

  if(a0==0)

  {j=1;

   TR0=1;            //启动定时器0

   while(j)

   {P0=date[0];

    for(i=0;i<100;i++);

    P0=date[1];

    for(i=0;i<100;i++);

    P0=date[2];

    for(i=0;i<100;i++);

    if(a1==0){j=0;TR0=0;}

   

   }

  }

  if(a1==0)

  {if(a0==0)

   {

    date[0]=0x00;

    date[1]=0x10;

    date[2]=0x20;

   }

  }

 }

}