單片機(jī)一些常用的延時(shí)與中斷問(wèn)題及解決方法_第1頁(yè)
單片機(jī)一些常用的延時(shí)與中斷問(wèn)題及解決方法_第2頁(yè)
單片機(jī)一些常用的延時(shí)與中斷問(wèn)題及解決方法_第3頁(yè)
單片機(jī)一些常用的延時(shí)與中斷問(wèn)題及解決方法_第4頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

單片機(jī)一些常用的延時(shí)與中斷問(wèn)題及解決方法單片機(jī)一些常用的延時(shí)與中斷問(wèn)題及解決方法單片機(jī)一些常用的延時(shí)與中斷問(wèn)題及解決方法V:1.0精細(xì)整理,僅供參考單片機(jī)一些常用的延時(shí)與中斷問(wèn)題及解決方法日期:20xx年X月單片機(jī)一些常用的延時(shí)與中斷問(wèn)題及解決方法延時(shí)與中斷出錯(cuò),是單片機(jī)新手在單片機(jī)開發(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ī)新手們,有所幫助!

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

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

2、求個(gè)單片機(jī)89S5112M晶振用定時(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ù)即可算出,但不具有可移植性,在不同種類單片機(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里面編譯的,為你得出的結(jié)果最大也就是40ms,這是軟件的原因,

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

不信你實(shí)際編寫一個(gè)秒鐘,利用原理計(jì)算編寫一個(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:

MOVR7,#4

D2:MOVR6,#250

D1:MOVR5,#250

DJNZR5,$

DJNZR6,D1

DJNZR7,D2

RET

假設(shè)晶振為12MHz

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

250*250*4*2=500MS

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

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

第一:

voiddelay(void)

{

unsignedinti,j;

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

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

{;}

}

}

第二:

voiddelay(unsignedintk)

{

unsignedinti,j;

for(i=0;i<k;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+的晶振呢?

答:

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

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/6us;(微秒)

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

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

T2=12*T1=2us

10ms=10000us

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

所以

DEL:MOVR5,#05H

F1:

MOVR6,#05H

F2:

MOVR7,#32H

F3:DJNZR7,F3

DJNZR6,F2

DJNZR5,F1

RET

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

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

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

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

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

#include<>

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

10、請(qǐng)教一個(gè)AVR單片機(jī)延時(shí)的問(wèn)題

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

voiddelay_us(unsignedintdelay_counter)//延時(shí)1us

{

do

{

delay_counter--;

}

while(delay_counter>1);

}

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

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

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

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

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

接著你執(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í)間并不短

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

movb,#data2;//數(shù)據(jù)dat

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論