• 定时器计数器的应用提高


    定时器0的应用提高

    方式0的使用:

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

    //这个程序比较简单,需要明白的是定时器0方式0是一个1
    //13位的计数器,所以最大的数为2的13次方,8192,并且TL0中的高三位没有用
    //因此除以的也不是256,而是32,定时器0方式00需要注意的是,最大数字因为是8192
    //因此定时5000为定时5ms,定时一秒要进入中断200次
    #include<reg52.h>
    #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;
        }
    
    }
    View Code

    方式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<reg52.h>
    #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++;
    }
    View Code

    方式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<reg52.h>
    #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++;
    }
    View Code

     综合程序:

    //利用计数器0工作方式1,用一根导线,连接GND引脚,用另外的一根导线   
    //去接触T0(P3^4),没接触一下,计数器技术一次,然后将说记录的数值显示在
    //数码管的前两位,然后计数满100清零
    #include<reg52.h>
    #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);
        }
    }
    View Code


    版权所有,转载请注明链接地址:http://www.cnblogs.com/fengdashen/p/3348305.html

  • 相关阅读:
    四叉树编码存储的实现
    窗体之间传递值的几种方法
    常见的六种排序算法实现
    OracleHelper类
    c#动态加载dll文件
    STL学习系列九:Map和multimap容器
    STL学习系列八:Set和multiset容器
    STL学习系列七:优先级队列priority_queue容器
    STL学习系列六:List容器
    STL学习系列五:Queue容器
  • 原文地址:https://www.cnblogs.com/fengdashen/p/3348305.html
Copyright © 2020-2023  润新知