微控制器 巢狀迴圈 節約 時間是怎麼回事 20

2025-01-01 22:50:13 字數 4152 閱讀 9861

微控制器 巢狀迴圈 節約 時間是怎麼回事

1樓:三天刀的資料庫

/例項8:用不同資料型別控制燈閃爍時間。

#include//包含微控制器暫存器的標頭檔案。

函式功能:用整形資料延時一段時間。

void int_delay(void) /延時一段較長的時間。

unsigned int m; /定義無符號整形變數,雙位元組資料,值域為0~65535

for(m=0;m<36000;m++)

空操作。函式功能:用字元型資料延時一段時間。

void char_delay(void) /延時一段較短的時間。

函式功能:主函式。

void main(void)

unsigned char i;

while(1)

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

p1=0xfe; /口的燈點亮。

int_delay();延時一段較短的時間。

p1=0xff; /熄滅。

int_delay();延時一段較短的時間。

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

p1=0xef; /口的燈點亮。

int_delay();延時一段較長的時間。

p1=0xff; /熄滅。

int_delay();延時一段較長的時間。

不行?你說的是不是延時的時候呼叫同乙個函式還是頻率不同?就是我複製改的這種。

你是不是沒燒寫?

微控制器多重迴圈延時程式(**等)

2樓:做而論道

題目中的答案是錯的。應該是:19960606 us本題目的程式,共有三重迴圈,耗時的精確計算方法,可見下圖。

圖中,還給出了用 keil 除錯結果的畫面。

包括呼叫指令的時間,共用了19960610 us。

3樓:網友

del: mov r5,#100 單週期,執行1次。

del0: mov r6,#200 單週期,執行1+99=100次。

del1: mov r7,#248 單週期,執行1+199*100=19901次。

del2: djnz r7,del2 雙週期,執行248*200*100=4960000次。

djnz r6,del1 雙週期,執行200*100=20000次。

djnz r5,del0 雙週期,執行100次。

ret 雙週期,執行1次。

t=(1+100+19901+(4960000+20000+100+1)*2)*2=19960408us

4樓:士多啤梨啤

這個不用精確的算出來吧~大概就是巢狀的迴圈每個數字減到靈就跳出迴圈,那麼大概就是【(248+2)*200*100+3】*2=

5樓:網友

延時時間t=2(100*200*248)*2us

你的答案肯定是錯的。

c語言for迴圈巢狀延時問題

6樓:淒涼赤

加入預處理語句。

#include

再呼叫sleep()函式。

比如#include

#include

int main()

裡面的引數為毫秒。

7樓:德昂當

這說明是你的延時時間不足,造成的錯誤。

這個延時函式是個指令延時,指令多了,延時時間就長。

for(x=0;x<120;x++)這個迴圈裡,每一次迴圈,都會有乙個 加一 和 判斷跳轉指令。

x為char 時是單位元組,這些指令都是一條指令,當改為 int時 x就成了雙位元組了,這些操作就需要多幾條指令來完成。這就相當於,每次迴圈的時間加長了。

微控制器裡的for迴圈延時函式怎樣理解

8樓:網友

第乙個for完成對delay_time引數的控制,即共迴圈多少次內部迴圈。

第二個for(內部迴圈),完成對j從0到199的控制,共迴圈200次。

翻譯成彙編就是:

r0為傳遞引數)

delay:

mov r1,#

djnz r1,$

djnz r0,delayret

9樓:淺水戲東風

你的第乙個for是條件語句吧for(delay_time > 0;delay_time--)第二個forfor(j=0;j < 200;j++)是乙個計數迴圈!可以這麼理解:

10樓:網友

就是乙個死等待執行完乙個時間段,類似n個nop即可。

微控制器中,迴圈裡面再套迴圈,是不是會容易把程式跑飛?

11樓:伽羅林克

迴圈巢狀是不會跑飛程式的,合理並能成功編譯的程式都能正常執行,當然要排除彙編程式一些不合理的堆疊的程式,比如移植作業系統:ucos,稍稍不當就跑飛。

跑飛程式的主要因素是一些干擾,如電源的干擾:電壓不穩定;電磁的干擾;靜電干擾,以及一些io口引入的訊號幅值範圍不當等等一些外部因素的干擾。

12樓:鐵書包

要看巢狀的深度與迴圈的次數,總之對微控制器堆疊是考驗。

微控制器3層for迴圈延時和2層for迴圈延時的區別

13樓:網友

根據延時時間的長短來決定採用3層for迴圈延時或2層for迴圈延時。

51微控制器8路累積流水燈程式程式 用兩個for迴圈巢狀!外迴圈迴圈一次!內迴圈減少一次!

14樓:猥瑣的駱駝

是需要亮乙個滅乙個還是需要依次亮起然後依次熄滅?

關於微控制器中斷函式內巢狀迴圈

15樓:網友

不知道 為什麼不正常。

不過中斷裡是不應該放這麼多東西的。

51微控制器使用組合語言迴圈延遲時間怎麼算?

16樓:網友

舉例來說明吧:

delay:

mov r0,#

delay1:

mov r1,#100 ;1*10djnz r1,$ 2*100*10djnz r0,delay1 ;2*10ret ;2total=1+1*10+2*100*10+2*10+2=2033time=total*1/(focse/12)總結:第一步:在延時程式沒行後邊標註該指令執行的機器週期第二步:

在機器週期後邊乘以該指令迴圈的次數第三步:計算總共用的機器週期數。

第四步:計算總延時時間。

17樓:向廣川

第一步:在延時程式沒行後邊標註該指令執行的機器週期。

第二步:在機器週期後邊乘以該指令迴圈的次數第三步:計算總共用的機器週期數第四步:計算總延時時間。 有的軟體也能算、、、

18樓:網友

時間精確的延時程式要用組合語言來編寫。

計算延遲時間要查詢每一條程式的執行週期數,然後加起來就是了。

在12m晶振的系統中,每個機器週期是1微秒借用一下:

舉例來說明吧:

delay:

mov r0,#10 ;1(週期)delay1:

mov r1,#100 ;1djnz r1,$ 2djnz r0,delay1 ;2ret ;2週期數=1+((1+(2*100)+2)*10)+2=2033延遲時間=2033週期*1微秒=2033微秒從到這個程式開始到返回到呼叫的那個程式用了2033微秒。

19樓:網友

;**********《延時子程式》*****====882usdelay882: ;r7,#202delay882_a:nopnopdjnz r7,delay882_aret

*****====《延時子程式》*****===1000usdelay1000: ;r7,#229delay1000_a:nopnopdjnz r7,delay1000_aret

*****====《延時子程式》*****===2400usdelay2400: ;r7,#245delay2400_a:nopnopnopnopnopnopnopdjnz r7,delay2400_aret

微控制器中斷程式怎麼讀啊,什麼是微控制器的中斷

讀懂中斷服務程式很容易的。首先你要搞懂這是什麼中斷,從中斷服務程式第一行可以看出來。void int time void interrupt 1這是中斷名,可以隨便取 這是中斷號,從0 開始往上排,1表示定時器0中斷。分別是 0 外部中斷0 1 定時器0中斷。2 外部中斷1 3 定時器1 4 串列埠中...

微控制器時間中斷,51微控制器中的定時器中斷是怎麼用的 ?

while 1 在那 會使微控制器停在那 相當於是等待當中斷來臨時 執行中斷 下面那個就是當到50ms的時候 執行計時器1中斷如果沒有那個while 1 則主程式就執行完了 中斷會沒有作用中斷和程式主程式各個執行是同步的 因為你把那個et0開了 則就有時鐘中斷了 當到了50ms 中斷就會自動作用 停...

51微控制器中的定時器中斷是怎麼用的

如下 實現led燈一秒亮滅閃爍 void main tmod 0x01 設定定時器0為工作方式1 m1 m0為01 th0 65536 45872 256 裝初值11.0582晶振定時50ms數為45872 tl0 65536 45872 256 ea 1 開總中斷 et0 1 開定時器0中斷 tr...