[电工&电子] 51单片机定时计数器的原理与应用

[复制链接]
查看143 | 回复0 | 2024-7-28 11:04:37 | 显示全部楼层 |阅读模式
>
一、定时/计数器的结构
51单片机的定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志

二、控制寄存器TMOD与TCON

80C51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。
1、工作方式寄存器TMOD
工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:

GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。即此时定时器的启动多了一条件。
C/T:定时/计数模式选择位。=0为定时模式;=1为计数模式。
M1M0:工作方式设置位。定时/计数器有四种工作方式,由M1M0进行设置。

2、控制寄存器TCON
TCON的高4位用于控制定时/计数器的启动和中断申请。其格式如下:

TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。
TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。
TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。TR0(TCON.4):T0运行控制位,其功能与TR1类同。
三、四种工作方式
方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。

方式1的计数位数是16位,由TL0作为低8位、TH0作为高8位,组成了16位加1计数器 。

方式2为自动重装初值的8位计数方式

方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。

四、使用方法

1、设置TMOD,确定定时计数器的工作方式与定时、计数功能

设置T1为工作方式1,定时器功能,则TMOD=0X10;

2、计算并装初值TH1/TL1 TH0/TL0

设定时器T1为50000次溢出一次,因为单片机的晶振为12M,则一个机器周期为1us,50000次为50毫秒溢出溢出,初值为65536-50000=15536,计算得:

高8位为:TH1=0x3c;

低8位为:TL1=0xb0;//15536

3、运行定时器TCON TR1=1;TR0=1;

4、判断定时器是否溢出

if(TF1==1)

五、用定时器1,12M晶体,定时50ms做一个时钟程序

#include <REGX52.H>#define uchar unsigned char#define uint  unsigned intvoid delay(uint ms);//函数申明void display(uchar shu,uchar wei);uchar tab[]={0x3f,0x06,0x5b,0x4f,       0x66,0x6d,0x7d,0x07,       0x7f,0x6f,0x77,0x7c,       0x39,0x5e,0x79,0x71,0x40};//0-F -sbit bz=P1^5;//蜂鸣器void didi(uint di);void timer_init();void main(){  uint cn,miao,fen,shi;  timer_init();  while(1)  {    display(shi/10,7);    display(shi%10,6);    display(16,5);    display(fen/10,4);    display(fen%10,3);    display(16,2);    display(miao/10,1);    display(miao%10,0);     if(TF1==1)//50ms    {      TF1=0;//溢出标志位清零      TH1=0x3c;      TL1=0xb0;//重装初值      cn++;      if(cn==20)      {        cn=0;        miao++;        if(miao==60)        {          miao=0;          fen++;          didi(10);          if(fen==60)          {            fen=0;            shi++;            if(shi==24)            {              shi=0;fen=0;miao=0;            }          }        }      }    }  }}//**************定时器的初始化*********************void timer_init(){  TMOD=0X10;//GATE C/T M1 M0 GATE C/T M1 M0 T1 MODE1 16BIT        // 0    0  0  1  0    0  0  0  65535+1  TH1=0x3c;  TL1=0xb0;//15536  TR1=1;//run timer1}//**************didi***********************void didi(uint di){  while(di--)  {    bz=0;delay(1);    bz=1;delay(1);  }}//**********显示函数***********************void display(uchar shu,uchar wei){  P2=(P2&0xe3)+(wei<<2);//显示的位置0-7  P0=tab[shu];//显示数据0-F  delay(2);  P0=0x00;//消影}//**********延时函数*********************void delay(uint ms){  uint i,j;  for(i=ms;i>0;i--)    for(j=123;j>0;j--);}


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则