在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 用單片機(jī)C語言精確延時(shí)(定時(shí))的方法

            用單片機(jī)C語言精確延時(shí)(定時(shí))的方法

            作者: 時(shí)間:2012-11-10 來源:網(wǎng)絡(luò) 收藏

            本人在閑暇的時(shí)候?qū)?a class="contentlabel" href="http://www.biyoush.com/news/listbylabel/label/單片機(jī)">單片機(jī)下的各類延時(shí)程序做了下總結(jié)。由于下利用軟件延時(shí)不容易做到精確的定時(shí),所以很多人在編寫延時(shí)子程序的時(shí)候不能好好的把握延時(shí)的具體時(shí)間。下,延時(shí)程序主要有以下幾種:

            一:

            void delay(unsigned char k)
            {

             unsigned char i,k; //定義變量
             for(i=0;ik;i++); //for循環(huán)語句

            }

            該程序在Keil環(huán)境下,會(huì)先將C語言轉(zhuǎn)化成匯編語言那么我們就可以根據(jù)匯編語言來計(jì)算出精確的時(shí)間,轉(zhuǎn)化具體步驟如下:

             CLR A  ?。恢噶?
             MOV R7,A??;指令2  
            LOOP:
            INC R7 ?。恢噶?
            CJNE  R7,k,LOOP   ??;指令4

            這里,指令1,指令2和指令3各消耗1個(gè)機(jī)器周期,指令4消耗兩個(gè)機(jī)器周期(可查此表得知:http://www.51hei.com/mcuteach/1312.html),而在12M的晶振下一個(gè)機(jī)器周期是1us,在這個(gè)過程中,指令1和指令2分別執(zhí)行1次,即消耗1+1us,而指令3和指令4分別執(zhí)行了k次,那么這樣加起來,這個(gè)延時(shí)子程序所消耗的具體時(shí)間就是t=1+1+(1+2)*k=3k+2us。

            呵呵,這樣說來,如果我們定義的k為100的話,這個(gè)延時(shí)子程序的精確時(shí)間就是302us?! ?/FONT>

            二:

            void delay(unsigned char i)
            {
            while(--i)
            {;}
            } 

            同樣的道理,將其反匯編,可以看到,只有一條語句:DJNZ  i,$;

            該語句消耗2us,一共執(zhí)行i次,所以總共消耗時(shí)間t=i*2us。

            三:

            下面的將形參換為整形int,這樣的話,反匯編所執(zhí)行的語句完全不同,用個(gè)具體的數(shù)字做例子:

            void delay()
            {
            unsigned int i=10000;
            while(--i)
            ;
            }

            反匯編后:

            4: unsigned int i=10000;

            C:0x0003 7F10 MOV R7,#0x10
            C:0x0005 7E27 MOV R6,#0x27

            5: while(--i)
            6: ;
            C:0x0007 EF MOV A,R7
            C:0x0008 1F DEC R7
            C:0x0009 7001 JNZ C:000C
            C:0x000B 1E DEC R6
            C:0x000C 14 DEC A
            C:0x000D 4E ORL A,R6
            C:0x000E 70F7 JNZ C:0007

            具體計(jì)算如下

            1.R7經(jīng)過10H(16)次循環(huán)減為0:
            t1=10H*(1+1+2+1+1+2)
            2.R6經(jīng)過27H*256次循環(huán)減為0:
            t2=27H*256*(1+1+2+1+1+2)+27H*1
            3.最后R7的是變?yōu)?55,因此還要多出255次的循環(huán):
            t3=255*(1+1+2+1+1+2)
            4.加上之前消耗的2us,總消耗時(shí)間:
            T=2+10H*(1+1+2+1+1+2)+27H*256*(1+1+2+1+1+2)+27H*1+255*(1+1+2+1+1+2)
            =2+16*7+39*256*7+39*1+255*7
            =71826us
            大約為72ms吧
            如果定義一個(gè)unsigned int i,那么延時(shí)計(jì)算公式為T=2+(i%256)*7+(i/256)*256*7+i/256+255*7

            關(guān)于其他類型的延時(shí)程序都可以按照這個(gè)方法對時(shí)間進(jìn)行較為精確的計(jì)算。

            如果你懶得計(jì)算我還給大家推薦一個(gè)簡單的方法:就是用keil的軟件仿真功能來仿真出C語句執(zhí)行的時(shí)間,具體方法可以看這里:http://www.51hei.com/bbs/dispbbs.asp?boardid=10Id=4711

            昨天熬夜整理的,從這個(gè)程序中可以看出C語言和匯編語言的一些區(qū)別,希望對大家有幫助!

            c語言相關(guān)文章:c語言教程




            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉