单片机
返回首页

定时器计数器的应用提高

2017-01-09 来源:eefocus

定时器0的应用提高


方式0的使用:


示例代码:使用方式0使得led灯一秒钟闪烁



//这个程序比较简单,需要明白的是定时器0方式0是一个1

//13位的计数器,所以最大的数为2的13次方,8192,并且TL0中的高三位没有用

//因此除以的也不是256,而是32,定时器0方式00需要注意的是,最大数字因为是8192

//因此定时5000为定时5ms,定时一秒要进入中断200次

#include

#define uint unsigned int

#define uchar unsigned char

uchar num;

sbit led = P1^0;

void main()

{

    TMOD = 0x0;

    TH0 = (8192-5000)/32;

    TL0 =(8192-5000)%32;

    EA = 1;

    ET0 = 1;

    TR0 = 1;

    while(1);

}


void t0()interrupt 1

{

    TH0= (8192-5000)/32;

    TL0= (8192-5000)%32;

    num++;

    if(num==200)

    {

        num=0;

        led = ~led;

    }


}


方式2的使用:(8位自动重装的8位定时器)


使用方式2的优点:方式2适合用来做特别精确的脉冲信号发生器,因为其中只有一个8位计数器,THX高八位常数缓冲器,当TLX八位溢出的适合,THX将自动的填充到TLX中,从而避免了反复重装初值带来的精度误差,由于使用方式2要求高精度,所以晶振也必须是12M的晶振,这样才能精确的计时;


示例代码:使用方式2使得led灯一秒钟闪烁



//因为定时器0方式2是一个8位自动重装的定时器,所以初值一般是6   

//这是因为装入6的话,THX=250,TLX=250,这样一次定时的时间是2.5毫秒

//由于是自动重装,所以,定时器0方式-不用重装初值

//这里的num是uint的类型,这里要注意

#include

#define uint unsigned int

#define uchar unsigned char

uint num;

sbit led = P1^0;

void main()

{

    TMOD = 0x02;

    TH0 = 6;

    TL0 =6;

    EA = 1;

    ET0 = 1;

    TR0 = 1;

    while(1)

    {

        if(num==4000)

        {

            num=0;

            led = ~led;

        }


    }

}


void t0()interrupt 1

{

    num++;

}


方式3的使用:

方式3只适用于定时器T0,当T1设置位方式3时,定时器T1不计数,方式3将T0分成两个独立的8位计数器TL0和TH0,这里注意的是,由于定时器方式3相当于是两个计数器,所以,这时候TH0这个计数器将占用T1的中断请求位,所以方式3使用的时候,T1不要使用中断,在这种情况下,T1通常是用来当作是串行口的波特率发生器


示例代码:使用方式3中的低8位使得led灯一秒钟闪烁,高八位使得led灯0.5秒闪烁



/*方式3只适用于定时器T0,当T1设置位方式3时,

定时器T1不计数,方式3将T0分成两个独立的8位计数器TL0和TH0o注意的是,?

哨定时器方式3相当于是两个计数器,所以,这时候TH0这个计数器将占用T1的中断请求位,所

苑绞?使用的时候,T1不要使用中断,在这种情况下,T1通常是用来当作是串行口的波特率发生器*/

#include

#define uint unsigned int

#define uchar unsigned char

uint num1,num2;

sbit led1 = P1^0;

sbit led2 = P1^1;

void main()

{

    TMOD = 0x03;

    TH0 = 6;

    TL0 =6;


    EA = 1;

    ET0 = 1;

    ET1 =1;

    TR0 = 1;

    TR1 = 1;

    while(1)

    {

        if(num1>=4000)

        {

            num1=0;

            led1 = ~led1;

        }

        if(num2 >= 2000)

        {

            num2=0;

            led2 = ~led2;

        }


    }

}


void TL0_timer()interrupt 1

{

    TL0 = 6;

    num1++;

}


void TH0_timer() interrupt 3

{

    TH0 = 6;

    num2++;

}



综合程序:


//利用计数器0工作方式1,用一根导线,连接GND引脚,用另外的一根导线   

//去接触T0(P3^4),没接触一下,计数器技术一次,然后将说记录的数值显示在

//数码管的前两位,然后计数满100清零

#include

#define uchar unsigned char 

#define uint unsigned int

sbit dula = P2^6;

sbit wela = P2^7;

uchar code table[] ={0x3f,0x06,0x5b,0x4f,

                    0x66,0x6d,0x7d,0x07,

                    0x7f,0x6f,0x77,0x7c,

                    0x39,0x5e,0x79,0x71};

void delayms(uint);

void display(uchar shi,uchar ge)

{

    dula =1;

    P0 = table[shi];

    dula =0;

    P0 = 0xff;

    wela = 1;

    P0 = 0xfe;

    wela = 0;

    delayms(5);


    dula = 1;

    P0 = table[ge];

    dula = 0;

    P0 = 0xff;

    wela = 1;

    P0 = 0xfd;

    wela = 0;

    delayms(5);

}


void delayms(uint xms)

{

    uint i,j;

    for(i = xms;i>0;i--)

        for(j=110;j>0;j--);

}



uint read()

{

    uchar t1,th1,th2;

    uint val;

    while(1)

    {

        th1 = TH0 ;

        t1 = TL0;

        th2 = TH0 ;

        if(th1 == th2)

            break;

            

    }


    val = th1*256+t1;

    return val;

}


void main()

{

    uchar a,b;

    uint num;

    TMOD = 0x05;

    TH0 = 0;

    TL0 = 0;

    TR0 = 1;

    while(1)

    {

        num = read();

        if(num>100)

            {

                num = 0;

                TH0 = 0;

                TL0 = 0;

            }

         a = num/10;

         b = num%10;

         display(a,b);

    }

}


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

最新器件
精选电路图
  • 基于IC555的可变PWM振荡器电路

  • 优化电路板布局的简单方法

  • 如何使用LED驱动器LM3915制作振动计

  • 使用NE555和磁簧开关的橱柜照明电路

  • 电谐波图形均衡器示意图

  • 一种构建12V和230V双直流电源的简单方法

    相关电子头条文章