久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2864|回復: 6
收起左側

新手弄的單片機定時器延時代碼

[復制鏈接]
ID:260656 發表于 2022-10-29 11:33 | 顯示全部樓層 |閱讀模式
新手弄的定時器延時代碼歡迎高手指點

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

         #define uchar unsigned char // 數據類型簡化-起別名
        #define uint unsigned int        // 數據類型簡化-起別名
        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;                                  //關閉總中斷
                ET0=0;                                  //關閉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;                                  //關閉總中斷
                ET0=0;                                  //關閉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;                                  //關閉總中斷
                ET0=0;                                  //關閉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;                                  //關閉總中斷
                ET0=0;                                  //關閉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;                                  //關閉總中斷
                ET0=0;                                  //關閉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;                                  //關閉總中斷
                ET0=0;                                  //關閉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;                                  //關閉總中斷
                ET0=0;                                  //關閉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;                                  //關閉總中斷
                ET0=0;                                  //關閉T0中斷
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暫停定時器T0
           }
//*************************************************************************
void delay(n)           //定時1ms的n(n<10)倍數  ***************************
          {
           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;                                  //關閉總中斷
                ET0=0;                                  //關閉T0中斷
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暫停定時器T0
           }
          }
//*************************************************************************
void delay(m)           //定時50ms的m(m<=20)倍數  **************************
          {
           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;                                  //關閉總中斷
                ET0=0;                                  //關閉T0中斷
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暫停定時器T0
           }
          }
//*************************************************************************



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:1044091 發表于 2022-10-29 21:35 | 顯示全部樓層
STC-ISP 軟件里也有一個定時器計算器,直接復制代碼就行。

捕獲.JPG

回復

使用道具 舉報

ID:496636 發表于 2022-10-29 21:46 | 顯示全部樓層
定時1毫秒,如果單片機的頻率是11059200HZ,這個就是單片機的時鐘頻率,而機器工作頻率則為時鐘頻率的12分之一,即921600HZ,我們關注的計數頻率就是機器工作頻率,意味著每1秒鐘它可以數數921600,如果要定時1毫秒,那么在這1毫秒時間內,可以數數921.6。算它是922。而二個字節的最大數是65535,再加1就是65536(十六進制數就是0XFFFF,再加1就是0X10000)所以要讓計數器數數922下,能產生溢出那么這個數就是65536-922=64614,轉成十六進制數為FC66,其實要想讓它精確點,應該比這個值大點,如是FC67,使定時微小于1毫秒,因為產生中斷后,重載定時器等操作都需要額外的時間,如果前頭定時剛好1毫秒,那么加上額外的時間,就會超過1毫秒了。
定時器的初始化,開總中斷,還是開定時中斷,還是開啟定時器都是在main函數的除while(1)以前的語句執行的,這樣之前的語句只執行一次,然后while(1)一直執行,在while(1)的循環體里,對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;                //復位定時器0中斷標志位
                   執行你要執行的語句,如計時,如某個變量加1

                }                                 
               
               
           }
回復

使用道具 舉報

ID:496636 發表于 2022-10-29 22:00 | 顯示全部樓層
在西門子S7-200PLC中,有系統特殊寄存器,如SM0.1和SM0.0還是SM0.5,都是特殊意義,SM0.1就是PLC開機首次掃描執行一次,然后就不執行了,它是起到初始化的作用,在單片機里實現,你可以在單片機開頭書寫,然后加個while(1)循環體,while(1)之前就是初始化,while(1)之后就是循環體內一直執行下去,它是不斷往復執行下去。在PLC中編程,我一條語句只要開機執行一次,那只要在繪制梯形圖時,在其能流左端加上sm0.1的常開觸點即可。
而SM0.5,就是半秒ON(1),半秒OFF(0)的布爾變量,用它就能得到秒計數器,用它來使能一個計數器,就能得到一個秒表。
學習知識要懂得融匯貫通。
回復

使用道具 舉報

ID:496636 發表于 2022-10-29 22:13 | 顯示全部樓層
漏了二條語句
定時1毫秒,如果單片機的頻率是11059200HZ,這個就是單片機的時鐘頻率,而機器工作頻率則為時鐘頻率的12分之一,即921600HZ,我們關注的計數頻率就是機器工作頻率,意味著每1秒鐘它可以數數921600,如果要定時1毫秒,那么在這1毫秒時間內,可以數數921.6。算它是922。而二個字節的最大數是65535,再加1就是65536(十六進制數就是0XFFFF,再加1就是0X10000)所以要讓計數器數數922下,能產生溢出那么這個數就是65536-922=64614,轉成十六進制數為FC66,其實要想讓它精確點,應該比這個值大點,如是FC67,使定時微小于1毫秒,因為產生中斷后,重載定時器等操作都需要額外的時間,如果前頭定時剛好1毫秒,那么加上額外的時間,就會超過1毫秒了。
定時器的初始化,開總中斷,還是開定時中斷,還是開啟定時器都是在main函數的除while(1)以前的語句執行的,這樣之前的語句只執行一次,然后while(1)一直執行,在while(1)的循環體里,對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位
                //復位定時器0中斷標志位
                   執行你要執行的語句,如計時,如某個變量加1

                }                                 
               
               
           }

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:260656 發表于 2022-10-30 16:01 | 顯示全部樓層
ningsy 發表于 2022-10-29 21:35
STC-ISP 軟件里也有一個定時器計算器,直接復制代碼就行。

看了一下,真的有啊,才知道
回復

使用道具 舉報

ID:123289 發表于 2022-11-1 16:38 | 顯示全部樓層
寫出公式,做個EXCEL表貼出來就行了。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品一区二区三区在线观看 | 欧美日韩中文字幕在线 | 成人国产精品免费观看视频 | 日韩精品成人网 | 人人干人人玩 | 亚洲精品国产第一综合99久久 | 免费观看成人鲁鲁鲁鲁鲁视频 | 国产精品久久久久久52avav | 免费三级av | 中文字幕亚洲一区二区三区 | 精品久久久久久久 | 久草影视在线 | 久久国内 | 久久久久国产一级毛片高清网站 | 色婷婷综合久久久久中文一区二区 | 人人看人人草 | 日韩色图视频 | 久久久久电影 | 欧美日韩精品中文字幕 | 日本一区二区不卡 | 日韩视频一区二区三区 | 午夜视频精品 | 国产欧美综合在线 | 久久网站黄 | 国产又色又爽又黄又免费 | 欧美成人一区二区 | 在线免费观看a级片 | av小说在线 | 久久国色| 国产精品国产三级国产aⅴ中文 | 天天操天天天干 | 日本中文字幕在线观看 | 欧美1区2区 | 夜夜夜夜草| 91精品国产一区 | 日韩在线精品视频 | 一区二区三区四区免费观看 | 亚洲精品一区二区在线观看 | 91在线 | 97免费在线观看视频 | 国产婷婷在线视频 |