日本高清不卡中文字幕-一起草草视频在线观看-亚洲精品一区二区三区色-国产亚洲精品免费视频

你好!歡迎來(lái)到深圳市穎特新科技有限公司!
語(yǔ)言
當(dāng)前位置:首頁(yè) >> 技術(shù)中心 >> 單片機(jī)入門(mén) >> 單片機(jī)延時(shí)問(wèn)題20問(wèn)

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

關(guān)鍵字:單片機(jī) 延時(shí) 作者:admin 來(lái)源:不詳 發(fā)布時(shí)間:2018-05-19  瀏覽:12

延時(shí)與中斷出錯(cuò),是單片機(jī)新手在單片機(jī)開(kāi)發(fā)應(yīng)用過(guò)程中,經(jīng)常會(huì)遇到的問(wèn)題,本文匯總整理了包含了MCS-51系列單片機(jī)、MSP430單片機(jī)、C51單片機(jī)、8051F的單片機(jī)、avr單片機(jī)、STC89C52、PIC單片機(jī)…..在內(nèi)的各種單片機(jī)常見(jiàn)的延時(shí)與中斷問(wèn)題及解決方法,希望對(duì)單片機(jī)新手們,有所幫助!

擴(kuò)展閱讀:單片機(jī)延時(shí)程序分析

1、單片機(jī)延時(shí)程序的延時(shí)時(shí)間怎么算的?

答:如果用循環(huán)語(yǔ)句實(shí)現(xiàn)的循環(huán),沒(méi)法計(jì)算,但是可以通過(guò)軟件仿真看到具體時(shí)間,但是一般精精確延時(shí)是沒(méi)法用循環(huán)語(yǔ)句實(shí)現(xiàn)的。

如果想精確延時(shí),一般需要用到定時(shí)器,延時(shí)時(shí)間與晶振有關(guān)系,單片機(jī)系統(tǒng)一般常選用11.059 2 MHz、12 MHz或6 MHz晶振。第一種更容易產(chǎn)生各種標(biāo)準(zhǔn)的波特率,后兩種的一個(gè)機(jī)器周期分別為1 μs和2 μs,便于精確延時(shí)。本程序中假設(shè)使用頻率為12 MHz的晶振。最長(zhǎng)的延時(shí)時(shí)間可達(dá)216=65 536 μs。若定時(shí)器工作在方式2,則可實(shí)現(xiàn)極短時(shí)間的精確延時(shí);如使用其他定時(shí)方式,則要考慮重裝定時(shí)初值的時(shí)間(重裝定時(shí)器初值占用2個(gè)機(jī)器周期)。

2、求個(gè)單片機(jī)89S51 12M晶振 用定時(shí)器延時(shí)10分鐘,控制1個(gè)燈就可以

答:可以設(shè)50ms中斷一次,定時(shí)初值,TH0=0x3c、TL0=0xb0。中斷20次為1S,10分鐘的話,需中斷12000次。計(jì)12000次后,給一IO口一個(gè)低電平(如功率不夠,可再加擴(kuò)展),就可控制燈了。

而且還要看你用什么語(yǔ)言計(jì)算了,匯編延時(shí)準(zhǔn)確,知道單片機(jī)工作周期和循環(huán)次數(shù)即可算出,但不具有可移植性,在不同種類(lèi)單片機(jī)中,匯編不通用。用c的話,由于各種軟件執(zhí)行效率不一樣,不會(huì)太準(zhǔn),通常用定時(shí)器做延時(shí)或做一個(gè)不準(zhǔn)確的延時(shí),延時(shí)短的話,在c中使用匯編的nop做延時(shí)

3、51單片機(jī)C語(yǔ)言for循環(huán)延時(shí)程序時(shí)間計(jì)算 ,設(shè)晶振12MHz,即一個(gè)機(jī)器周期是1us。

for(i=0,i<100;i++)

for(j=0,j<100;j++)

我覺(jué)得時(shí)間是100*100*1us=10ms,怎么會(huì)是100ms

答:

不可能的,是不是你的編譯有錯(cuò)的啊

我改的晶振12M,在KEIL 4.0 里面編譯的,為你得出的結(jié)果最大也就是40ms,這是軟件的原因,

不可能出現(xiàn)100ms那么大的差距,是你的軟件的原因。

不信你實(shí)際編寫(xiě)一個(gè)秒鐘,利用原理計(jì)算編寫(xiě)一個(gè)燒進(jìn)單片機(jī)和利用軟件測(cè)試的秒程序燒進(jìn)單片機(jī),你會(huì)發(fā)現(xiàn)原理計(jì)算的程序是正確的

4 、51單片機(jī)c語(yǔ)言 _nop_()是一個(gè)空指令?短時(shí)間延時(shí)的?空幾個(gè)機(jī)器周期?

答:這個(gè)_nop_()等效與匯編里面的,NOP指令,也就是空一個(gè)機(jī)器周期,如果是傳統(tǒng)51單片機(jī)的話,等于空12個(gè)時(shí)鐘周期【即一個(gè)機(jī)器周期】

5、51單片機(jī) 延時(shí)500ms 用機(jī)器周期疊加怎么算?

答:DELAY:

MOV R7,#4

D2:MOV R6,#250

D1:MOV R5,#250

DJNZ R5,$

DJNZ R6,D1

DJNZ R7,D2

RET

假設(shè)晶振為12MHz

剛延時(shí)時(shí)間為:

250*250*4*2=500MS

6、51單片機(jī)C語(yǔ)言程序中延時(shí)函數(shù)delay的原理是什么?

現(xiàn)在找到兩個(gè)函數(shù)

第一:

void delay(void)

{ unsigned int i,j;

for(i=0;i<500;i++)

{ for(j=0;j<121;j++)

{;}

}

}

第二:

void delay(unsigned int k)

{ unsigned int i,j;

for(i=0;i

{ for(j=0;j<121;j++)

{;}

}

}

現(xiàn)有幾個(gè)疑問(wèn):

(1):延時(shí)函數(shù)的原理?

(2):兩個(gè)for循環(huán)的作用?

(3):i、j的取值有什么規(guī)律和依據(jù)?是不是和單片機(jī)接的晶振頻率有關(guān)?所能延時(shí)的最小單位時(shí)間是怎么計(jì)算的?

延時(shí)時(shí)間怎么計(jì)算啊!假如用的是AT89C51RC+11.0592M的晶振呢?

答:

1:原理:僅僅執(zhí)行一些,沒(méi)有實(shí)質(zhì)性影響的所謂“無(wú)意義指令”,比如做比大小啊,做某個(gè)int的自加運(yùn)算啊之類(lèi)的

2:兩重for的作用:簡(jiǎn)單的說(shuō),就像高中數(shù)學(xué)中的“乘法原理”一樣,這樣可以很輕易的迅速增加上述“無(wú)意義指令”的數(shù)目

3:關(guān)于取值大。哼@個(gè)如果是在C下變成,這個(gè)值不僅僅與晶振、單片機(jī)本身運(yùn)算速度有關(guān),而且還與C的編譯器有關(guān),所以說(shuō),這個(gè)值雖說(shuō)是可以精確計(jì)算的,但大多數(shù)情況下,程序員用的都是“經(jīng)驗(yàn)值”——當(dāng)然,如果用匯編編程,情況就不一樣了,因?yàn)槊恳粭l指令所使用的機(jī)器周期是一定的,你當(dāng)然可以根據(jù)所有指令使用的總時(shí)間,精確的算出具體延時(shí)的總時(shí)間

綜合你的的問(wèn)題,我給你一點(diǎn)建議,就是剛學(xué)單片機(jī)的時(shí)候,還是一定要老老實(shí)實(shí)的從匯編編程學(xué)起——這樣,在你以后接觸到C之后,你才能明白,這中間實(shí)際上經(jīng)歷了一個(gè)什么樣的過(guò)程,只有這樣你才能真正理解單片機(jī)。當(dāng)然,等最終你完全拿下一種單片機(jī)之后,盡量使用C編程,無(wú)疑是歷史所肯定的。

7、51單片機(jī),晶振為6M,求一個(gè)10ms的延時(shí)程序

答:延時(shí)有很多種方法,有一種是讓單片機(jī)去做無(wú)聊的循環(huán),還有一種是用定時(shí)器。

第一種的算法是:

晶振的周期T1=1/f; 這里f=6MHz 所以T1=1/6 us;(微秒)

單片機(jī)花12個(gè)T1去執(zhí)行一個(gè)指令,

所以一個(gè)機(jī)器周期等于12個(gè)晶振周期,

T2=12*T1=2us

10ms=1000 0us

所以你要得到10ms的延時(shí)就要想辦法讓機(jī)器去做5000條“無(wú)聊的指令”

所以

DEL: MOV R5,#05H

F1: MOV R6,#05H

F2: MOV R7,#32H

F3: DJNZ R7,F3

DJNZ R6,F2

DJNZ R5,F1

RET

這種方法是用于對(duì)時(shí)間要求不高的地方,我說(shuō)的是其思想,程序中可能有錯(cuò)的地方

用定時(shí)器的方法我不太會(huì)就不誤人了 (補(bǔ)充一下就是這個(gè)是用匯編寫(xiě)的,你在主程序中用ACALL DEL調(diào)用就延時(shí)了。

8、今天我用單片機(jī)做“眨眼的LED”實(shí)驗(yàn)時(shí),程序運(yùn)行,每次只令燈亮或滅都沒(méi)問(wèn)題,但是一開(kāi)延時(shí)不能出現(xiàn)期盼的燈亮燈滅的現(xiàn)象,這是怎么回事?

實(shí)驗(yàn)的硬件條件是:STC89C52,編譯環(huán)境:keil 3。

下面是我寫(xiě)的程序,請(qǐng)教高手!!!

#include // 文件包含處理

#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、單片機(jī)延時(shí)函數(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ù)類(lèi)型有關(guān),因?yàn)槟愣x的為無(wú)符號(hào)字符型,為單字節(jié)數(shù)據(jù),所以最大為255。.

如果你需要增大,可以改變j的數(shù)據(jù)類(lèi)型定義,如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單片機(jī)延時(shí)的問(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;x<100;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;j<5;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ā)就行了。

14、一個(gè)單片機(jī)延時(shí)子程序的問(wèn)題,在延時(shí)子程序那里,一直搞不明白,給r7和r6賦予0,然后下面的djnz r7,delayloop不就一直循環(huán)了,那還怎么接下去的程序?

org 0000h

ljmp start

org 0030h

start: mov a,#0feh

mov r5,#8

output: mov p1,a

rl a

call delay

djnz r5,output

ljmp start

delay: mov r6,#0

mov r7,#0

delayloop:djnz r7,delayloop

djnz r6,delayloop

ret

end

答: 你的延時(shí)程序不是因?yàn)橹禐?,而是跳轉(zhuǎn)位置不對(duì),改為如下:

delay: mov r6,#0

delayloop:mov r7,#0

:djnz r7,$

djnz r6,delayloop

ret

R7,R6初值為0,但是當(dāng)DJNZ執(zhí)行時(shí),這條指令是先減1再判斷,所以0-1=255,判斷的話也不為0,仍然循環(huán)256次。

0-1=255的解釋?zhuān)?/p>

0000 0000

- 0000 0001

-------------------------

1111

15、我想提兩個(gè)單片機(jī)延時(shí)與按鍵的問(wèn)題

1:如果一個(gè)程序中延時(shí)和按鍵,如果延時(shí)子程序比較長(zhǎng)(假如2秒),怎樣確保按鍵能夠得到及時(shí)響應(yīng)(假如PC正在執(zhí)行延時(shí)子程序,正在這時(shí)候有按鍵輸入,不是響應(yīng)不了)——,,,前提是不能用定時(shí)器定時(shí)掃描,和中斷來(lái)做,因?yàn)槎〞r(shí)器和中斷我另有其他用途

2:?jiǎn)纹瑱C(jī)沒(méi)有串口。怎樣才能使得他與24C02進(jìn)行通信(24C02是具有2K內(nèi)存的EEPROM)

答:

首先明確一點(diǎn)你說(shuō)單片機(jī)沒(méi)有串口,應(yīng)該是指沒(méi)有I2C口吧。

1 在延時(shí)程序里面加入按鍵的檢測(cè)

2 用IO口模擬I2C時(shí)序讀寫(xiě)

16、51單片機(jī)延時(shí)小程序,求高手解釋什么意思?

delay200ms:

mov r2,#82

l0:mov r1,#116

l1:mov r0,#9

djnz r0,$

djnz r1,l1

djnz r2,l0

ret

答:以下是每條指令的時(shí)間,T為一個(gè)機(jī)器周期

delay200ms:

mov r2,#82;1T

l0:mov r1,#116;1T

l1:mov r0,#9;1T

djnz r0,$;2T

djnz r1,l1;2T

djnz r2,l0;2T

ret;2T

以上共三層循環(huán),忽略部分指令,最簡(jiǎn)單算法是:

2*9*116*82=171216

不忽略指令是:

1+(1+(1+2*9+2)*116+2)*82+2=200001

因此延時(shí)時(shí)間大約為200ms

17、于51單片機(jī)延遲時(shí)間的問(wèn)題

uchar i;i--;

uint i;i--;

這兩條語(yǔ)句在12M晶振下運(yùn)行時(shí)間分別是多少??

答:一個(gè)時(shí)鐘周期,2us,共4us

18、周期為6MHZ的單片機(jī)延時(shí)10秒的子程序的怎么編?

答:/********************************************************************

* 名稱(chēng) : Delay()

* 功能 : 延時(shí),延時(shí)時(shí)間為 10ms * del。這是通過(guò)軟件延時(shí),有一定誤差。

* 輸入 : del

* 輸出 : 無(wú)

***********************************************************************/

void Delay(uint del)

{

uint i,j;

for(i=0; i

for(j=0; j<1827; j++) //這個(gè)是通過(guò)軟件仿真得出的數(shù)

;

}

這個(gè)是晶振為12mhz的單片機(jī)延時(shí)10ms的程序,你只要在這個(gè)基礎(chǔ)上減小一倍就行了,當(dāng)然至于具體值還是要調(diào)試下的。

19、片機(jī)的有些程序需要調(diào)用延時(shí)程序,如何能合理的安排循環(huán)次數(shù)以及空操作的個(gè)數(shù)?

答:用匯編的話就根據(jù)你的當(dāng)前晶振頻率去推算你的指令周期,然后結(jié)合你需要延遲的時(shí)間,編寫(xiě)延遲程序,用C的話還是要看最后生成的匯編碼是什么樣的了。最簡(jiǎn)單的方法就是寫(xiě)好程序以后再編譯器里軟仿真看時(shí)間。贊同2| 評(píng)論(1)

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

延時(shí)程序 void delay(uint dt)

{

uchar bt;

for(;dt;dt--);

for(bt=0;bt<255;bt++);

}

編譯時(shí)有警告C:DOCUMENTS AND SETTINGSADMINISTRATOR桌面字 310 點(diǎn)陣LED顯示.C(46): warning C235: parameter 1: different types

為什么?求大俠指點(diǎn)

答:某個(gè)函數(shù)傳參類(lèi)型與聲明類(lèi)型不符。

另外你這個(gè)for(;dt;dt--);沒(méi)有起到外層循環(huán)的作用……


編輯:admin  最后修改時(shí)間:2018-05-23

聯(lián)系方式

0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬(wàn)眾潤(rùn)豐創(chuàng)業(yè)園A棟2樓A08

Copyright © 2014-2023 穎特新科技有限公司 All Rights Reserved.  粵ICP備14043402號(hào)-4

和平区| 宁阳县| 崇义县| 满城县| 安远县| 祁门县| 舒兰市| 维西| 巴马| 光山县| 安庆市| 亚东县| 荣成市| 民勤县| 灌云县| 台江县| 津南区| 岳阳县| 和平区| 进贤县| 运城市| 涪陵区| 克什克腾旗| 古丈县| 奈曼旗| 嘉荫县| 宁陕县| 明水县| 大余县| 苍溪县| 昭觉县| 邹城市| 炉霍县| 麟游县| 宣威市| 绥宁县| 赤壁市| 昭平县| 多伦县| 那曲县| 大连市|