中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)延時(shí)問(wèn)題20問(wèn)

        單片機(jī)延時(shí)問(wèn)題20問(wèn)

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

        #define uchar unsigned char //宏定義,方便以后程序的書(shū)寫(xiě)

        #define uint unsigned int

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

        void Delay(uint t)

        {

        uchar i;

        while(--t)

        {

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

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

        }

        }

        void main(void)

        {

        while(1)

        {

        P1_0 = 0; //點(diǎn)亮LED燈

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

        P1_0 = 1; //熄滅LED燈

        }

        補(bǔ)充提問(wèn):我是讓P1.0先低然后延時(shí)之后再高,即燈先亮再滅,然后開(kāi)始循環(huán)的

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

        while(1)

        {

        P1_0 = 0; //點(diǎn)亮LED燈

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

        P1_0 = 1; //熄滅LED燈

        Delay(1000);

        補(bǔ)充問(wèn)題回復(fù):?jiǎn)栴}恰恰就錯(cuò)在這了,循環(huán)完一遍之后燈由滅到亮根本沒(méi)有時(shí)間延時(shí),即第一次循環(huán)中燈還沒(méi)來(lái)的機(jī)滅呢,就進(jìn)入到第二輪循環(huán)中的亮了,所以原因就在這,這錯(cuò)誤太低級(jí)了,以后引以為鑒吧

        9、函數(shù)的問(wèn)題

        void delay(uchar i)

        {

        uchar j;

        while(i--)

        {

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

        ;

        }

        }

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

        答:這個(gè)函數(shù)中j的大小和你定義的數(shù)據(jù)類型有關(guān),因?yàn)槟愣x的為無(wú)符號(hào)字符型,為單字節(jié)數(shù)據(jù),所以最大為255。.

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

        10、請(qǐng)教一個(gè)AVR的問(wèn)題

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

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

        {

        do

        {

        delay_counter--;

        }

        while(delay_counter>1);

        }

        請(qǐng)問(wèn),為什么能延時(shí)1微秒啊?

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

        你使用的是軟件延時(shí)

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

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

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

        這都需要時(shí)間,可能你看到的就一句counter--這個(gè)指令,可能會(huì)花費(fèi)好幾個(gè)時(shí)鐘周期來(lái)實(shí)現(xiàn)

        舉個(gè)例子:

        c=a+b,只有一句,但實(shí)際上花費(fèi)的時(shí)間并不短

        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

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

        至于晶體管級(jí)的我就不解釋了,你得好好學(xué)習(xí)匯編才能理解單片機(jī)的運(yùn)作。

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

        11、PIC單片機(jī)的延時(shí)問(wèn)題 晶振4Mhz:

        void delay()

        {

        unsigned int d=1000;

        while(--d){;}

        }

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

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

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

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

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

        答:

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

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

        12、stc單片機(jī)的延時(shí)問(wèn)題 ,STC10F08XE單片機(jī),晶振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_();

        }

        }

        }

        當(dāng)uldata=1時(shí)延時(shí)多少秒?

        請(qǐng)給出具體算法…………

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

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

        while (1)

        {

        send_char('9');

        delay(n);

        }

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

        答:不做太多的串口處理分析,只順著你的問(wèn)題和你的方法說(shuō)說(shuō):

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

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

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

        while(1)

        {

        send_char('9');

        delay(n);

        }

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

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

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


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


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


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


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


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


        評(píng)論


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

        關(guān)閉