標題: 新手弄的單片機定時器延時代碼 [打印本頁]

作者: zzzzz8840    時間: 2022-10-29 11:33
標題: 新手弄的單片機定時器延時代碼
新手弄的定時器延時代碼歡迎高手指點

         #include <reg52.h>                        //頭文件                        
         #include <intrins.h>

         #define uchar unsigned char // 數(shù)據(jù)類型簡化-起別名
        #define uint unsigned int        // 數(shù)據(jù)類型簡化-起別名
        uint n,i,j,m;


          //定時1ms ***************************************************
        {
           TMOD |= 0x01;                //定時器0,工作方式1,16位
            TH0 = 0xfc;                //初值高8位
            TL0 =0x66;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打開定時器T0
                  EA=0;                                  //關(guān)閉總中斷
                ET0=0;                                  //關(guān)閉T0中斷
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暫停定時器T0
           }
//*************************************************************************
          //定時10ms ***************************************************
        {
           TMOD |= 0x01;                //定時器0,工作方式1,16位
            TH0 = 0xdc;                //初值高8位
            TL0 =0x00;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打開定時器T0
                  EA=0;                                  //關(guān)閉總中斷
                ET0=0;                                  //關(guān)閉T0中斷
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暫停定時器T0
           }
//*************************************************************************
          //定時20ms ***************************************************
        {
           TMOD |= 0x01;                //定時器0,工作方式1,16位
            TH0 = 0xb8;                //初值高8位
            TL0 =0x00;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打開定時器T0
                  EA=0;                                  //關(guān)閉總中斷
                ET0=0;                                  //關(guān)閉T0中斷
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暫停定時器T0
           }
//*************************************************************************
          //定時30ms ***************************************************
        {
           TMOD |= 0x01;                //定時器0,工作方式1,16位
            TH0 = 0x94;                //初值高8位
            TL0 =0x00;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打開定時器T0
                  EA=0;                                  //關(guān)閉總中斷
                ET0=0;                                  //關(guān)閉T0中斷
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暫停定時器T0
           }
//*************************************************************************
          //定時40ms ***************************************************
        {
           TMOD |= 0x01;                //定時器0,工作方式1,16位
            TH0 = 0x70;                //初值高8位
            TL0 =0x00;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打開定時器T0
                  EA=0;                                  //關(guān)閉總中斷
                ET0=0;                                  //關(guān)閉T0中斷
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暫停定時器T0
           }
//*************************************************************************
//定時50ms ***************************************************
        {
           TMOD |= 0x01;                //定時器0,工作方式1,16位
            TH0 = 0x4c;                //初值高8位
            TL0 =0x00;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打開定時器T0
                  EA=0;                                  //關(guān)閉總中斷
                ET0=0;                                  //關(guān)閉T0中斷
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暫停定時器T0
           }
//*************************************************************************
//定時60ms ***************************************************
        {
           TMOD |= 0x01;                //定時器0,工作方式1,16位
            TH0 = 0x28;                //初值高8位
            TL0 =0x00;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打開定時器T0
                  EA=0;                                  //關(guān)閉總中斷
                ET0=0;                                  //關(guān)閉T0中斷
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暫停定時器T0
           }
//*************************************************************************

//定時70ms ***************************************************
        {
           TMOD |= 0x01;                //定時器0,工作方式1,16位
            TH0 = 0x04;                //初值高8位
            TL0 =0x00;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打開定時器T0
                  EA=0;                                  //關(guān)閉總中斷
                ET0=0;                                  //關(guān)閉T0中斷
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暫停定時器T0
           }
//*************************************************************************
void delay(n)           //定時1ms的n(n<10)倍數(shù)  ***************************
          {
           for(i=0;i<n;i++)                  
           {
            TMOD |= 0x01;                //定時器0,工作方式1,16位
            TH0 = 0xfc;                //初值高8位
            TL0 =0x66;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打開定時器T0
                  EA=0;                                  //關(guān)閉總中斷
                ET0=0;                                  //關(guān)閉T0中斷
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暫停定時器T0
           }
          }
//*************************************************************************
void delay(m)           //定時50ms的m(m<=20)倍數(shù)  **************************
          {
           for(j=0;j<m;j++)                  
           {
            TMOD |= 0x01;                //定時器0,工作方式1,16位
            TH0 = 0x4c;                //初值高8位
            TL0 =0x00;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打開定時器T0
                  EA=0;                                  //關(guān)閉總中斷
                ET0=0;                                  //關(guān)閉T0中斷
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暫停定時器T0
           }
          }
//*************************************************************************




作者: ningsy    時間: 2022-10-29 21:35
STC-ISP 軟件里也有一個定時器計算器,直接復(fù)制代碼就行。




作者: 新昌小徐    時間: 2022-10-29 21:46
定時1毫秒,如果單片機的頻率是11059200HZ,這個就是單片機的時鐘頻率,而機器工作頻率則為時鐘頻率的12分之一,即921600HZ,我們關(guān)注的計數(shù)頻率就是機器工作頻率,意味著每1秒鐘它可以數(shù)數(shù)921600,如果要定時1毫秒,那么在這1毫秒時間內(nèi),可以數(shù)數(shù)921.6。算它是922。而二個字節(jié)的最大數(shù)是65535,再加1就是65536(十六進制數(shù)就是0XFFFF,再加1就是0X10000)所以要讓計數(shù)器數(shù)數(shù)922下,能產(chǎn)生溢出那么這個數(shù)就是65536-922=64614,轉(zhuǎn)成十六進制數(shù)為FC66,其實要想讓它精確點,應(yīng)該比這個值大點,如是FC67,使定時微小于1毫秒,因為產(chǎn)生中斷后,重載定時器等操作都需要額外的時間,如果前頭定時剛好1毫秒,那么加上額外的時間,就會超過1毫秒了。
定時器的初始化,開總中斷,還是開定時中斷,還是開啟定時器都是在main函數(shù)的除while(1)以前的語句執(zhí)行的,這樣之前的語句只執(zhí)行一次,然后while(1)一直執(zhí)行,在while(1)的循環(huán)體里,對TF溢出標志不斷判斷,來確定定時時間是否已到。

//定時1ms ***************************************************
        
           TMOD |= 0x01;                //定時器0,工作方式1,16位
            TH0 = 0xfc;                //初值高8位
            TL0 =0x66;                 //初值低8位
            EA=1;                        //開總中斷
            ET0=1;                          //開定時器中斷
            TR0 = 1;                          //打開定時器T0
            while(1)
        {
                 if(TF0==1)                    //判斷定時器1是否溢出         
                {
                   TF0=0;                //復(fù)位定時器0中斷標志位
                   執(zhí)行你要執(zhí)行的語句,如計時,如某個變量加1

                }                                 
               
               
           }
作者: 新昌小徐    時間: 2022-10-29 22:00
在西門子S7-200PLC中,有系統(tǒng)特殊寄存器,如SM0.1和SM0.0還是SM0.5,都是特殊意義,SM0.1就是PLC開機首次掃描執(zhí)行一次,然后就不執(zhí)行了,它是起到初始化的作用,在單片機里實現(xiàn),你可以在單片機開頭書寫,然后加個while(1)循環(huán)體,while(1)之前就是初始化,while(1)之后就是循環(huán)體內(nèi)一直執(zhí)行下去,它是不斷往復(fù)執(zhí)行下去。在PLC中編程,我一條語句只要開機執(zhí)行一次,那只要在繪制梯形圖時,在其能流左端加上sm0.1的常開觸點即可。
而SM0.5,就是半秒ON(1),半秒OFF(0)的布爾變量,用它就能得到秒計數(shù)器,用它來使能一個計數(shù)器,就能得到一個秒表。
學(xué)習(xí)知識要懂得融匯貫通。
作者: 新昌小徐    時間: 2022-10-29 22:13
漏了二條語句
定時1毫秒,如果單片機的頻率是11059200HZ,這個就是單片機的時鐘頻率,而機器工作頻率則為時鐘頻率的12分之一,即921600HZ,我們關(guān)注的計數(shù)頻率就是機器工作頻率,意味著每1秒鐘它可以數(shù)數(shù)921600,如果要定時1毫秒,那么在這1毫秒時間內(nèi),可以數(shù)數(shù)921.6。算它是922。而二個字節(jié)的最大數(shù)是65535,再加1就是65536(十六進制數(shù)就是0XFFFF,再加1就是0X10000)所以要讓計數(shù)器數(shù)數(shù)922下,能產(chǎn)生溢出那么這個數(shù)就是65536-922=64614,轉(zhuǎn)成十六進制數(shù)為FC66,其實要想讓它精確點,應(yīng)該比這個值大點,如是FC67,使定時微小于1毫秒,因為產(chǎn)生中斷后,重載定時器等操作都需要額外的時間,如果前頭定時剛好1毫秒,那么加上額外的時間,就會超過1毫秒了。
定時器的初始化,開總中斷,還是開定時中斷,還是開啟定時器都是在main函數(shù)的除while(1)以前的語句執(zhí)行的,這樣之前的語句只執(zhí)行一次,然后while(1)一直執(zhí)行,在while(1)的循環(huán)體里,對TF溢出標志不斷判斷,來確定定時時間是否已到。

//定時1ms ***************************************************
        
           TMOD |= 0x01;                //定時器0,工作方式1,16位
            TH0 = 0xfc;                //初值高8位
            TL0 =0x66;                 //初值低8位
            EA=1;                        //開總中斷
            ET0=1;                          //開定時器中斷
            TR0 = 1;                          //打開定時器T0
            while(1)
        {
                 if(TF0==1)                    //判斷定時器1是否溢出         
                {
                   TF0=0;
                TH0 = 0xfc;                //初值高8位
                    TL0 =0x66;                 //初值低8位
                //復(fù)位定時器0中斷標志位
                   執(zhí)行你要執(zhí)行的語句,如計時,如某個變量加1

                }                                 
               
               
           }
作者: zzzzz8840    時間: 2022-10-30 16:01
ningsy 發(fā)表于 2022-10-29 21:35
STC-ISP 軟件里也有一個定時器計算器,直接復(fù)制代碼就行。

看了一下,真的有啊,才知道
作者: yzwzfyz    時間: 2022-11-1 16:38
寫出公式,做個EXCEL表貼出來就行了。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1