51单片机 定时器及其应用 您所在的位置:网站首页 定时器的应用举例 51单片机 定时器及其应用

51单片机 定时器及其应用

2024-06-25 04:17| 来源: 网络整理| 查看: 265

89c51单片机内部有两个16位的定时/计数器,即定时器T0和定时器T1,单片机的定时功能其实就是通过计数来实现的,当单片机每一个机器周期产生一个脉冲时,计数器就加一。定时器的应用涉及到中断方面的知识,可以先了解中断的概念再来看定时器

如,一个16位的定时器,它所能计数的范围是0~65535,如果单片机采用的是12M的晶振,那么定时器单次最长的时间为65535*((1/12)*12),因为一个一个机器周期等于12个振荡周期,那么定时器加一所用的时间是1/12M*12是1us,也就是一个12MHz晶振的51单片机单次最长时间约为65ms.

定时器的控制

89c51的定时器由两个寄存器控制,分别是工作模式寄存器TMOD和控制寄存器TCON

工作模式寄存器TMOD是用于控制定时器0/1的工作模式,通过对TMOD进行赋值,则可以改变定时器的工作模式

具体各位的定义如下

当我们使用定时器功能时,就只用设置D0、D1、D4、D5的的值就可以了,其余位置0即可

我们在使用定时器时基本使用的是模式1和模式2,模式0与模式3基本不用,我就不进行描述了。

模式1

当TMOD的D5位置0,D4位置1时,即为定时器T1的模式一,该模式对应的是一个16位的定时器,寄存器TH1和TL1即为T1初值的高8位和低8位,定时时间为:(65536-T1的初值)*振荡周期*12

模式二

当TMOD的D5位置1,D4位置0时,即为定时器T1的模式二,该模式对应的是一个可以自动装载的8位定时器,当定时器计数满了(计数溢出时),会自动把TH1中的内容重新装载到TL1中,那么模式二计数的最长时间即为(257-T1的初值)*振荡周期*12

 定时器的控制寄存器TCON

TCON的各位定义如下

TF1:T1的溢出标志位,当T1溢出时,由硬件自动使TF1位置1,并向CPU申请中断。当CPU响应中断进入中断服务子程序后,TF1又被硬件自动清0,也可以用软件清0.

TF0:T0溢出标志位。其功能和操作情况同TF1

TR1:T1的运行控制位,当该位置1时,即启动定时器1当该位置0时,即关闭

TR0:T0的运行控制位,其功能及操作情况同TR1。

接下来我将用定时器来结合数码管制作一个0-9计时器

具体操作如下(定时器的初始化在程序最下面)

include  //引用了51单片机的官方库文件 

void T0INI() ;                           //定时器0初始化函数声明                        unsigned int temp = 0,i = 0;    //中间变量 unsigned char leddata[]={        //定义一个字符型数组用来存放共阳极数码管数字显示                   0xC0,  //"0"                 0xF9,  //"1"                 0xA4,  //"2"                 0xB0,  //"3"                 0x99,  //"4"                 0x92,  //"5"                 0x82,  //"6"                 0xF8,  //"7"                 0x80,  //"8"                 0x90,  //"9"                 0x88,  //"A"                 0x83,  //"B"                 0xC6,  //"C"                 0xA1,  //"D"                 0x86,  //"E"                 0x8E,  //"F"                 0x89,  //"H"                 0xC7,  //"L"                 0xC8,  //"n"                 0xC1,  //"u"                 0x8C,  //"P"                 0xA3,  //"o"                 0xBF,  //"-"                 0xFF,  //熄灭                 0xFF  //自定义                            };

void main() {        T0INI();         while(1)         {             P2 = 0x0e;                  //位选段P20置0             P0 = leddata[i];         //数码管显示             if(TF0 == 1)             //当定时器计数溢出时                     {                             TH0 = 0X3c;                                        TL0 = 0xb0;            //给定时器高8位和低8位重新赋值                             temp++;                 //50ms加1                     }                              if(temp == 20)               //计数到20次也就是一秒                          i++;                      //数码管显示值加一                     if(i == 10)                          i = 0;                    } }  

void T0INI()    //定时器T0初始化 {     IE = 0x82;                //cpu开总中断  ,定时器T0溢出中断允许      TCON = 0x10;        //打开定时器T0     TMOD = 0x01;        //设置T0为工作模式1,16位定时计数器     TH0 = 0X3c;     TL0 = 0xb0;            //12Mhz定时50ms }



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有