51单片机的定时器/计数器

时间:2022-08-30 19:43:55

   以前写过单片机的计数器/定时器的相关程序。今天来系统总结下。借助网络和书本又把相关的知识复习了一遍。下面这个链接就计数器/定时器做了详细的介绍。http://hi.baidu.com/at_this_time/blog/item/6fb0fba169bd5e804610640c.html

对于系统学习计数器/定时器很有帮助。如果要用单片机对外部信号进行计数或者利用单片机对外部设备进行定时控制,就需要用到单片机的定时器/计数器。日常生活中也有很多地方需要用到计数,如流水线上生产药品,当药品瓶经过某处时有红外扫面从而对药物数量进行统计。而定时器用处也广泛,闹钟就是一个例子。设定时间,时间到了进行处理。51单片机有两个定时器/计数器T0和T1,当T0做计数器时(P3.4用来做输入信号)当T1用来做计数器时(P3.5引脚作为输入信号)。当检测到有脉冲信号输入时,则会技术,当计数达到65536时,则计数器会溢出且会发送给CPU一个信号,CPU会停止当前的任务去处理规定的任务。即产生定时器/计数器中断。联系52单片机的中断:52单片机有六个中断源。

T0:定时器/计数器0中断,由T0计数器计满回0引起。中断级别为1,中断入口地址为:000BH

T1定时器/计数器1中断,由T1计数器计满回0引起。中断级别为3,中断入口地址为:001BH

当需要用到计数器时则单片机需要外接信号,而计数器则通过时钟振荡器12分频后产生技术信号。如时钟振荡器为12MHZ,则12分频后得到1MHZ信号,1MHZ每个脉冲的持续时间(1个周期为)1uS.

利用计数器,编写发光二极管闪烁的程序,定时1M需要计算,这里随便写了一个数。能看到法官二极管闪烁。程序如下,这里选择模式2自动装载数据。

#include<reg52.h>
#define uint unsigned int
sbit led=P1^0;
uint count;

void main()
{
  count=0;
  TMOD=0x02;//选择计数器TO模式2自动再装入计数器
  //TH0=0;    //(256-256)/256
  TL0=0;   //(256-256)%256
  EA=1;    // 开总中断
  ET0=1;  //开计数器0中断
  TR0=1; //   开始计数
  while(1); //等待中断产生

}

void t0() interrupt 1
{
 count++;
 if(count==168)
    {
     count=0;
     led=~led;

 }

}

单片机的几个周期:

1:时钟周期 也是振荡周期,是单片机频率的倒数。如单片机的晶振是12MHZ,则其时钟周期为1/12us.它是单片机最基本最小的时间单位。

2:状态周期:定义为时钟周期的两倍。

3:机器周期:单片机的基本操作周期,在一个操作周期内,完成一项基本的操作,如取指令,读/写存取器等。由12个时钟周期(6个状态周期)组成。

4:指令周期:CPU执行一条指令所需要的时间,一般一个指令周期犹1到4个机器周期组成。

计算定时器初值:假如12MHZ的晶振,则其机器周期为12*  1/12us= 1us.定时器初始时TH0和TH1都为0,一旦开始计数则在原来的数值上加1.计满THO,TH1(16位)要2的16方-1个数再来一个计数脉冲则像CPU发送中断。因此溢出一次需65536us。

下面用定时器T0选择模式1(自动再装入8位计数器)实现1秒定时,使得发光二极管以500HZ闪烁,亮灭各1s.晶振为11.0592MHZ,则其时钟周期为1/11.0592US,所以其机器周期为12*1/11.0592,计满256耗时为256*其机器周期。计时50MS需要定时器计满256,18次。定时1秒需要18*20=360次。程序如下:

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit led=P1^0;
uint count;
uchar num;

void main()
{
  count=0;
  TMOD=0x02;//选择计数器TO模式2
  TL0=0;//(256-256)%256  则计数256次耗时23.148148MS
  EA=1;//开总中断
  ET0=1;//开定时器中断
  TR0=1; //开始计数
  while(1);//等待中断

}

void t0() interrupt 1
{
 count++;
 if(count==18)//50MS
    {
 count=0;
 num++;
 if(num==20)//定时满1s
    {
     num=0;
     led=~led;
  }

 }

}