找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2772|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

新手弄的單片機(jī)定時(shí)器延時(shí)代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:260656 發(fā)表于 2022-10-29 11:33 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
新手弄的定時(shí)器延時(shí)代碼歡迎高手指點(diǎn)

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

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


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

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



評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1044091 發(fā)表于 2022-10-29 21:35 | 只看該作者
STC-ISP 軟件里也有一個(gè)定時(shí)器計(jì)算器,直接復(fù)制代碼就行。



回復(fù)

使用道具 舉報(bào)

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

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

                }                                 
               
               
           }
回復(fù)

使用道具 舉報(bào)

地板
ID:496636 發(fā)表于 2022-10-29 22:00 | 只看該作者
在西門子S7-200PLC中,有系統(tǒng)特殊寄存器,如SM0.1和SM0.0還是SM0.5,都是特殊意義,SM0.1就是PLC開機(jī)首次掃描執(zhí)行一次,然后就不執(zhí)行了,它是起到初始化的作用,在單片機(jī)里實(shí)現(xiàn),你可以在單片機(jī)開頭書寫,然后加個(gè)while(1)循環(huán)體,while(1)之前就是初始化,while(1)之后就是循環(huán)體內(nèi)一直執(zhí)行下去,它是不斷往復(fù)執(zhí)行下去。在PLC中編程,我一條語(yǔ)句只要開機(jī)執(zhí)行一次,那只要在繪制梯形圖時(shí),在其能流左端加上sm0.1的常開觸點(diǎn)即可。
而SM0.5,就是半秒ON(1),半秒OFF(0)的布爾變量,用它就能得到秒計(jì)數(shù)器,用它來使能一個(gè)計(jì)數(shù)器,就能得到一個(gè)秒表。
學(xué)習(xí)知識(shí)要懂得融匯貫通。
回復(fù)

使用道具 舉報(bào)

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

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

                }                                 
               
               
           }

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

6#
ID:260656 發(fā)表于 2022-10-30 16:01 | 只看該作者
ningsy 發(fā)表于 2022-10-29 21:35
STC-ISP 軟件里也有一個(gè)定時(shí)器計(jì)算器,直接復(fù)制代碼就行。

看了一下,真的有啊,才知道
回復(fù)

使用道具 舉報(bào)

7#
ID:123289 發(fā)表于 2022-11-1 16:38 | 只看該作者
寫出公式,做個(gè)EXCEL表貼出來就行了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表