在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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>

            新聞中心

            單片機延時問題20問

            作者: 時間:2013-01-30 來源:網(wǎng)絡(luò) 收藏

            #define uchar unsigned char //宏定義,方便以后程序的書寫

            #define uint unsigned int

            sbit P1_0 = P1 ^ 0; //位變量定義

            void Delay(uint t)

            {

            uchar i;

            while(--t)

            {

            for(i = 0; i 125; i++) //延時1MS,在這里我們用的晶振是是12M,根據(jù)機器周期的計算,我們

            {;} //可算得本次循環(huán)延時約1MS

            }

            }

            void main(void)

            {

            while(1)

            {

            P1_0 = 0; //點亮LED燈

            Delay(1000); //應(yīng)單片執(zhí)行程序的時間很快,所以必須延時,要不看不到實驗現(xiàn)象

            P1_0 = 1; //熄滅LED燈

            }

            補充提問:我是讓P1.0先低然后延時之后再高,即燈先亮再滅,然后開始循環(huán)的

            答:應(yīng)該這樣寫

            while(1)

            {

            P1_0 = 0; //點亮LED燈

            Delay(1000); //應(yīng)單片執(zhí)行程序的時間很快,所以必須延時,要不看不到實驗現(xiàn)象

            P1_0 = 1; //熄滅LED燈

            Delay(1000);

            補充問題回復(fù):問題恰恰就錯在這了,循環(huán)完一遍之后燈由滅到亮根本沒有時間延時,即第一次循環(huán)中燈還沒來的機滅呢,就進入到第二輪循環(huán)中的亮了,所以原因就在這,這錯誤太低級了,以后引以為鑒吧

            9、函數(shù)的問題

            void delay(uchar i)

            {

            uchar j;

            while(i--)

            {

            for(j=125;j>0;j--)

            ;

            }

            }

            這個函數(shù)中的i,j的大小有**嗎?

            答:這個函數(shù)中j的大小和你定義的數(shù)據(jù)類型有關(guān),因為你定義的為無符號字符型,為單字節(jié)數(shù)據(jù),所以最大為255。.

            如果你需要增大,可以改變j的數(shù)據(jù)類型定義,如unsigned int (2字節(jié))可以到65535;無符號長整形unsigned long(4字節(jié)) 可以到4294967295。 而上面所所256是-1,而你定義的是無符號字符型。

            10、請教一個AVR的問題

            外部晶振用的是8MHz,延時1微秒的程序如下:

            void delay_us(unsigned int delay_counter)//延時1us

            {

            do

            {

            delay_counter--;

            }

            while(delay_counter>1);

            }

            請問,為什么能延時1微秒啊?

            答:8MHZ表示單片機的運行周期為1/8us,也就是0.125us執(zhí)行一步

            你使用的是軟件延時

            那么包括程序的提取,執(zhí)行等都要花費時間

            比如,你提取這個函數(shù)可能花去一步,那現(xiàn)在就使用了0.125us啦

            接著你執(zhí)行這個函數(shù),在單片機內(nèi)部,運算是通過寄存器的移來移去實現(xiàn)的

            這都需要時間,可能你看到的就一句counter--這個指令,可能會花費好幾個時鐘周期來實現(xiàn)

            舉個例子:

            c=a+b,只有一句,但實際上花費的時間并不短

            mov a,#data1;//數(shù)據(jù)data1放入a寄存器

            mov b,#data2;//數(shù)據(jù)data2放入b寄存器

            add a,b;//寄存器a的值與b相加,結(jié)果放入a

            mov c,a;//將a的值放入c

            這樣才是單片機內(nèi)部真正執(zhí)行的指令,這需要花費至少4個時鐘周期,而不是1個

            至于晶體管級的我就不解釋了,你得好好學習匯編才能理解單片機的運作。

            至于這個函數(shù)為什么能延時1ms,這個是靠經(jīng)驗來判斷的,最直接的方法就是用示波器看,以上均為推論。

            11、PIC單片機的延時問題 晶振4Mhz:

            void delay()

            {

            unsigned int d=1000;

            while(--d){;}

            }

            此函數(shù)在4M晶體下產(chǎn)生10003us的延時,也就是10MS。

            問題:我剛算了一下他應(yīng)該執(zhí)行了999條指令,1條單周期的指令也才1US,那就是999us,為什么會有10ms的延時?

            1:for(x=100;--x;){;} : 2: for(x=0;x100;x++){;} 2句話相同

            第一句:X的值范圍是不是 1~99?為什么?

            第二句:X的范圍是不是0~99?為什么?這么算的。我知道符號在前在后的區(qū)別。2句話應(yīng)該是不一樣的才對啊!

            答:

            問題1:“我剛算了一下他應(yīng)該執(zhí)行了999條指令”因為你算錯了。延時時間是由產(chǎn)生的匯編代碼所決定的,C語言語句只是個假象,千萬不要以為C語言一行就是一條指令!此處由于涉及到雙字節(jié)減法,因此會有額外的判斷,編譯結(jié)果每次循環(huán)耗費幾十個周期毫不奇怪。

            問題2:前一句x從100開始遞減,遞減至1時退出循環(huán)。后一句x從0開始遞增,遞增到100時退出循環(huán)。所謂“2句話”相同僅僅是指這兩個循環(huán)體的循環(huán)次數(shù)相同。實際上兩個循環(huán)的執(zhí)行過程是完全不同的,所消耗時間也有可能不同。

            12、stc單片機的延時問題 ,STC10F08XE單片機,晶振22.1184M

            void delay(unsigned long uldata)

            {

            unsigned int j = 0;

            unsigned int g = 0;

            for (j=0;j5;j++)

            {

            for (g=0;g

            {

            _nop_();

            _nop_();

            _nop_();

            }

            }

            }

            當uldata=1時延時多少秒?

            請給出具體算法…………

            答:用keil轉(zhuǎn)換成匯編語句,然后對照指令表計算就行了

            13、我想用單片機連接不斷地向電腦發(fā)數(shù),如下:

            while (1)

            {

            send_char('9');

            delay(n);

            }

            如每發(fā)送一個數(shù),應(yīng)延時多少微妙好呢?即一般最短能延時多少微米呢?如延時太長的話,那發(fā)送很多數(shù)據(jù)不就用很長時間嗎?

            答:不做太多的串口處理分析,只順著你的問題和你的方法說說:

            先考慮下串口的速率 假設(shè)9600,那么發(fā)送一個字符要多久?

            (9600bit/S) / 10bit(一個字符1+8+1) = 960字符/秒 約 1ms/byte

            也就是說你如果在1ms內(nèi)發(fā)送超過一個字符就沒意義了,硬件速度達不到。

            while(1)

            {

            send_char('9');

            delay(n);

            }

            這個循環(huán)是執(zhí)行周期也就十幾微秒+delay()的延遲,所以任何小于1040微秒的延遲對串口硬件來說沒意義,上一個還沒處理完,下一個就來了根本執(zhí)行不了嘛。

            如果你send_char()里面有while(!TI);TI = 0;這樣的語句或有串口中斷TI的處理的話,那么實際上你的delay()已經(jīng)在發(fā)送函數(shù)里了,while(!TI);這部就是延遲等待嗎?那根本不需要主函數(shù)去延遲了,直接發(fā)就行了。

            51單片機相關(guān)文章:51單片機教程


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


            單片機相關(guān)文章:單片機教程


            單片機相關(guān)文章:單片機視頻教程


            單片機相關(guān)文章:單片機工作原理


            晶振相關(guān)文章:晶振原理


            評論


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

            關(guān)閉