<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        89C51單片機定時/計數器0

        作者:huqin   來源:本站原創   點擊數:  更新時間:2014年05月01日   【字體:

        89C51單片機的定時計數功能由特殊功能寄存器TMOD和TCON共同控制。
        TMOD沒有位地址,不能進行位操作,其每位的名稱和功能如下:
        TMOD:GATE C/T1  M1 M0 GATE  C/T1   M1  M0
                                 D7          D6           D5    D4       D3          D2         D1      D0
         GATE      
        C/T1      M1     M0    控制定時計時器1;
         
        GATE       C/T0      M1     M0   控制定時計時器0;
        GATE=0時,定時計數信號是T0腳狀態(P3.4)或機器周期(C/T=0計機器周期,即定時,C/T=1,計T0腳的狀態,即計數),計數開始開關是TR0(0關閉計數,1開始計數)。
        GATE=1時,定時計數功能由T0腳(P3.4)或者機器周期確定(C/T=0計數機器周期,即定時,C/T=1,計數T0腳的變化狀態,即計數),計數開始開關由TR0(0關閉計數,1開始計數)和INT0(管腳P3.2共同確定。
         M1M0是計數方式選擇:計數在TH0和TL0進行。
         00為方式0,13位(TH0的8位和TL0的低5位)二進制計數器,由0可數到2的13次方-1;
         01為方式1,16位二進制計數器,由0可數到2的16次方-1;
         10為方式2,8位二進制計數器,TH0放計數初值,計數在TL0進行,溢出后自動將 
                             TH0中的初值裝入TL0;
        11為方式3,TH0是個8為計數器,HL0是個8位計數器。兩個計數器相互獨立。
        T1和T0功能相同。
        特殊功能寄存器TCON,可以位操作,但一般不用位地址,而用位的功能名稱:
        位地址:8FH  8EH  8DH  8Ch  8Bh  8Ah  89H  88H
        TCON :TF1  TR1  TF0   TR0   IE1   IT1   IE0   IT0 

                       D7    D6    D5    D4    D3   D2   D1    D0 
        TF0是T0計數標志位:定時計數溢出時,該位被自動置1,中斷計數結束后自動清0.
        TR0是計數開關,GATE=0時,TR0=1打開計數,0關閉。當GATE=1時,和INT0一起控制計數器打開,即GATE=1,TR0=1,INT0=1才可打開計數,否則關閉。
        定時/計數時,由TH0 TL0的值開始加1計數到FFFFH滿,再計數就溢出,如果是定時/計數模式,溢出后將TF0置1,計數定時結束,如果是中斷模式,中斷請求由硬件給TF0置1,計數結束后,也就是中斷結束后,自動將TF0清0。
        /***************定時器定時50ms,在計數20下為1秒,顯示60秒計時(查詢模式)***********/
        #include<reg51.h>
        #include<intrins.h>
        #define uchar unsigned char
        #define uint unsigned int

        int yu[]={
                       0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
                     };
        int t,k,dat;
        void delay(int ms)
        {
         while(ms--)
           {
            int i;
            for(i=0;i<30;i++);
           }
        }
        void Timer0()
           {       
             if(TF0==1)//查詢TF0為1,說明計數滿了,計數結束。
                 {
                  t++;
                  TH0=0x3c;//這里是計數滿后重新裝入計數初值.也可TH0=(65536-5000)/256
                  TL0=0xb0;//計數溢出后再次計數從這里開始,
        也可TL0=(65536-5000)%256
               /*如果先計算初值麻煩,還可以用16位二進制的最大值65536-定時計數次數賦值給TH0和TL0,例如定時40ms,需對機器周期計數4000下,可以
                    TH0=(65536-4000)/256;TL0=(65536-4000)%*/

                  TF0=0;
                 }
                    //清除溢出標志
           }
        void T1s()
        {
          if(t==20)//計數一次50ms,20次為1秒
              {t=0;
               dat++;
               if(dat==60)//60次為1分鐘
                dat=0;
              }
        }
        void main()
        {
          TMOD=0x01;
           /*此設置(0000 0101)T0的GATE=0,C/T為0,M1M0為01。
            GATE=0,關閉INT0(P3.2)腳對計數開始的控制,只由TR0控制開始。
            C/T=0,定時功能,計數機器周期的個數。
            M1M0=01,計數方式選擇方式1,16位二進制計數器,由TH0 TL0開始計數到FFFFH滿
            再計數就溢出,如果是定時/計數模式,溢出后將TF0置1,計數定時結束,如果是中
            斷模式清0,有硬件給TF0置1,計數結束,也就是中斷結束,自動將TF0清0.
            打開計數器0中斷將ET0=1,EA=1 */
          TH0=0x3c;//設置計數器計數初值50ms從3CB0H開始計數
          TL0=0xb0;//第一次從這里的設置開始計數
          TR0=1; 
          while(1)
           { 
              Timer0();
              T1s();     
             P0=yu[dat%10];
              delay(1);
              P2=0x01;   
              delay(1);
              P2=0x00;
             P0=yu[dat/10];
              delay(1);
              P2=0x02;
              delay(1);
              P2=0x00;   
           }

        /*******定時/計數器0中斷應用,按鍵沒按一次數碼管顯示加1(中斷模式)*************/
        #include<reg51.h>
        #include<intrins.h>
        #define uchar unsigned char
        #define uint unsigned int
        int yu[]={
                       0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
                     };
        int k;
        void delay(int ms)
        {
         while(ms--)
           {
            int i;
            for(i=0;i<30;i++);
           }
        }
        void ddd() interrupt 1
           {
             TH0=0xff;//這里是計數滿后重新裝入計數初值
             TL0=0xfa;//計數溢出后再次計數從這里開始
             delay(5);
             if(TF0==0)//計數中斷時TF0由硬件置1,響應中斷并開始計數,計數產生溢出后自動清0,結束計數。
                    {        //所以,響應中斷后,查詢TF0的狀態可以判斷中斷計數是否結束
                       if(k==99)
                       k=0;
                      else
                       k++;
                   }        
           }
        void main()
        {
          TMOD=0x05;
        /*此設置(0000 0101)T0的GATE=0,C/T為1,M1M0為01。
           GATE=0,關閉INT0(P3.2)腳對計數開始的控制,只由TR0控制開始。
            C/T=1,計數功能,計數管腳T0(P3.4)的狀態變化。
           M1M0=01,計數方式選擇方式1,16位二進制計數器,由TH0 TL0開始計數到FFFFH滿,再計數就溢出,如果是定時/計數模式,溢出后將TF0置1,計數定時結束,如果是中斷模式清0,有硬件給TF0置1,計數結束,也就是中斷結束,自動將TF0清0.打開計數器0中斷將ET0=1,EA=1 */

          TH0=0xff;//設置計數器計數初值
          TL0=0xfc;//第一次從這里的設置開始計數
          ET0=1;

          TR0=1;
          EA=1;
          while(1)
           {
           P0=yu[k%10];
              delay(1);
              P2=0x01;   
              delay(1);
              P2=0x00;
              P0=yu[k/10];
              delay(1);
              P2=0x02;
              delay(1);
              P2=0x00;   
           }
        }



        /******用查詢模式計數
        #include<reg51.h>
        #include<intrins.h>
        #define uchar unsigned char
        #define uint unsigned int
        int yu[]={
                       0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
                     };
        int k;
        void delay(int ms)
        {
         while(ms--)
           {
            int i;
            for(i=0;i<30;i++);
           }
        }
        void jishu()
           {     
             if(TF0==1)//查詢TF0,為1,說明計數滿了,計數結束。
                 {
                   TH0=0xff;//這里是計數滿后重新裝入計數初值
                   TL0=0xff;//計數溢出后再次計數從這里開始
                   delay(5);
                   if(k==99)
                   k=0;
                   else
                   k++;
                 }
                TF0=0;     //清除溢出標志
           }
        void main()
        {
          TMOD=0x05;
        /*此設置(0000 0101)T0的GATE=0,C/T為1,M1M0為01。
           GATE=0,關閉INT0(P3.2)腳對計數開始的控制,只由TR0控制開始。
            C/T=1,計數功能,計數管腳T0(P3.4)的狀態變化。
           M1M0=01,計數方式選擇方式1,16位二進制計數器,由TH0 TL0開始計數到FFFFH滿,再計數就溢出,如果是定時/計數模式,溢出后將TF0置1,計數定時結束,如果是中斷模式清0,有硬件給TF0置1,計數結束,也就是中斷結束,自動將TF0清0.打開計數器0中斷將ET0=1,EA=1 */

          TH0=0xff;//設置計數器計數初值
          TL0=0xff;//第一次從這里的設置開始計數
          TR0=1;
          while(1)
           { 
              jishu();
           P0=yu[k%10];
              delay(1);
              P2=0x01;   
              delay(1);
              P2=0x00;
             P0=yu[k/10];
              delay(1);
              P2=0x02;
              delay(1);
              P2=0x00;   
           }
        }
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮