微控制器延時時間計算c語言晶振頻率是

時間 2021-09-01 18:48:17

1樓:煙火夜空

對for 迴圈的 編譯,不同編譯器的編譯結果不盡 相同;對不同 微控制器系列,編譯結果也不盡相同。

以 標準51微控制器,keil 為例:(已知12mhz,12t時鐘模式,一個機械週期 t 則為 1us)

一條 賦值語句(count=1),2個機械週期 t;一條判斷(c>0)4t;一條自減(c--) 1t;一條空語句 (nop)1t(不是空函式,是 空語句);

第一個 for 迴圈:

①執行 賦初值 2t,②判斷 4t,③執行空語句 1t,④執行自減 1t,⑤執行判斷 4t,結束。

共計 12 個機械週期,12us;

第二個for 迴圈:

①執行一次 賦值 2t;

②執行 30次 判斷,4t×30=120t;

③執行 30次 空語句,30t;

④執行 30次 自減,30t;

⑤又執行 1次判斷 4t,結束。

共計 186 機械週期 186us。

2樓:做而論道

c語言的延時時間,是算不出來的。

只能自己摸索,自己記住,每個引數,代表多少時間。

c語言,給了程式設計者,自由發揮的空間。

每個人,都有自己的一套東西。

看別人的c程式,呵呵,都是密碼。

其實,都是用來忽悠老闆的。

3樓:敲響鍵盤

延長多少與微控制器的兆赫有關,不同的兆赫速度不同

這是微控制器的延時程式,晶振是12mhz,延時10ms。請問是怎麼計算的?其中,c=50。

4樓:匿名使用者

不要試圖去計算,計算不準確,軟體延時本身都不準確,這些都是試驗得來的,如果晶振頻率不同,可以調整a=130,但想剛好是10ms基本無可能,用組合語言延時準確一些,但計算也比較麻煩如果要準確延時的話,還要用定時器

假如b=38 時,剛好延時38ms的話,b=50延時不會剛好是50ms

同樣 a=130 時,剛好延時13ms的話,a=150延時不會剛好是15ms

所以一般是按比例改變a b取值,然後根據**結果再去調整,誤差不大就可以了

還有unsigned char a, b和unsigned int a, b延時結果是不一樣的

設mcs-51微控制器的晶振頻率為12mhz,試編寫10ms的延時程式(要求誤差不超過0.003ms)。

5樓:天晴電子玩家

c語言程式:

#include

void main (void)

void t1_int (void) interrupt 3彙編程式如下:

org    0000h

ajmp    main

org    001bh

ajmp    t1int

org    0100h

main:

mov    tmod, #10h

mov    th1, #high(-50000)mov    tl1, #low(-50000)mov    tcon, #40h

mov    ie, #88h

ajmp    $

t1int:

push    acc

mov th1, #high(-50000)mov tl1, #low(-50000)pop    acc

reti

6樓:匿名使用者

彙編指令驗證的 所以延時準確

void delay(void) //誤差 0us

7樓:

我們用組合語言寫微控制器延時10ms的程式(用的是12mhz晶振的 mcs-51),可以編寫下面的程式來實現:

mov r5,#5 ①

d1: mov r6,#4 ②

d2: mov r7,#248 ③

djnz r7,$ ④

djnz r6,d2 ⑤

djnz r5,d1 ⑥

ret ⑦

這個延時程式共有七條指令,現在就每一條指令執行的次數和所耗時間進行分析:

第一條, mov r5,#5 在整個程式中只執行一次,且為單週期指令,所以耗時1μs,

第二條, mov r6,#4 看⑥的指令可知,只要r5-1不為0,就會返回執行這條指令,共執行了r5次,共耗時5μs,

第三條, mov r7,#248 同第二條類似,只要r6-1不為0,就會返回執行這條指令,同時受到外部迴圈r5的控制,共耗時r5*r6*1=20μs,

第四條, djnz r7,$ 只要r7-1不為0,就執行這條指令,同時受到外部迴圈的控制,由於該指令是雙週期指令,共耗時為r7*r6*r5*2=9920μs,

第五條, djnz r6,d2 只要r6-1不為0,就反覆執行此條指令(內迴圈r6次),又受外迴圈r7的控制,共耗時r6*r5*2=40μs,

第六條, djnz r5,d1 只要r5-1不為0,就反覆執行此條指令,耗時為r5*2=10μs,

第七條, ret 此指令為雙週期指令,耗時為2μs,

我們也要考慮在呼叫子程式時用到lcall指令,耗時2μs,最後可以得到總的延時為:1+5+20+9920+40+10+2=9998μs=10ms

我們可以總結延時總時間的公式:

延時總時間=[(2*一層迴圈次數+3)*二層迴圈次數+3]*三層迴圈次數+3

注意此公式只適用於三層以內的迴圈

請問在微控制器c語言程式設計中,用delay延遲的話,1秒程式是什麼?微控制器晶振為12mhz 20

8樓:匿名使用者

一條指令需要由12個振盪週期(既晶振振盪週期)組成,即晶振頻率12分頻,也就是執行一條指令的最高頻率1mhz,則對應週期為1us。延時程式執行一次迴圈的時間為1us,則延遲1s需要迴圈1000*1000次。所以你這樣寫是做不到延遲1s的,可以讓a=1000,再第二個for迴圈1000次。

9樓:匿名使用者

這個還得跟微控制器有關係的,比如用的是cisc的微控制器和risc的演算法就不太一樣,你首先要確定一個指令週期的時間,比如pic的微控制器,一個指令週期一般為t=1/(晶振頻率/4),然後再系統無中斷程式的情況下,那你上面的 a = 1/(t*110)

10樓:

在keil裡**的話,在配置裡把晶振調成12mhz,然後在呼叫delay函式的地方設定一個斷點,開始除錯程式,執行到斷點處,注意程式左邊有一個記錄當前暫存器和一些狀態的視窗,其中,裡面有一個是專門記錄當前執行了多少時間的變數,記下當前時間t1,然後按f10(不進入子函式)除錯,再記錄當前時間t2,則延時=t2-t1。多試幾個a,差不多調到1s就夠了。我一般都這麼調。

你要想明白其中原理,想自己算的話,你就看看delay的彙編**段自己算吧。

11樓:匿名使用者

用keil** 除錯一下 如果要求精確就用中斷

速回 8051微控制器的晶振為12mhz,下面是一段延時子程式,計算出該延時子程式的延時時間,並列出計算過程

12樓:匿名使用者

org 1000h

del: mov r7,#20; 單週期1s ①這裡沒有迴圈,1t

del1:mov r6,#125; 單週期1s ②這裡迴圈20次,20t

del2:djnz r6,del2; 雙週期2s ③這裡迴圈20*125次,1000t

djnz r7,del1; 雙週期2s ④這裡迴圈20次,40t

ret; 單週期1s ⑤這裡沒有迴圈,1t

總共延時週期數=①+②+③+④+⑤=1062t

12m晶振時1t=1us,所以總延時時間=1062微妙=1.062毫秒

13樓:胖大海君

給樓上的推薦答案修正一下:

org 1000h

del: mov r7,#20; 單週期1us ( 晶振為12mhz)

del1:mov r6,#125; 單週期1us

del2:djnz r6,del2; 雙週期2us*125=250us

djnz r7,del1; 雙週期(2us+250+1)*20=5060us

ret; 不是單週期指令 應該是 雙週期2us

延時時間t=1us +(1us+250us)×20+20×2us+2us=5063us=5.063ms

14樓:匿名使用者

org 1000h

del: mov r7,#20; 單週期1us ( 晶振為12mhz)

del1:mov r6,#125; 單週期1usdel2:djnz r6,del2; 雙週期2us*125=250us

djnz r7,del1; 雙週期(2us+250+1)*20=5060us

ret; 單週期1s = 5.06 ms

15樓:匿名使用者

20*125*2=5000 us=5 ms

如果精確的話應該是 5.022 ms ,其中2us是執行org 和del的時間,20us是執行20次del1的時間。

16樓:做而論道

del: mov r7, #20 ;1tdel1: mov r6, #125 ;1tdel2: djnz r6, del2 ;2t 125 * 2 = 250

djnz r7, del1 ;2t 20 * (1 + 250 + 2) = 5060

ret ;2t 1 + 5060 + 2 = 5063

加上呼叫指令,共用 5065 t。

關於微控制器晶振的問題,關於微控制器晶振與時間關係的問題

這兩個小電容叫晶振的負載電容,分別接在晶振的兩個腳上和對地的電容,一般在幾十皮發。它會影響到晶振的諧振頻率和輸出幅度,也是使振盪頻率更穩定。實際上就是電容三點式電路的分壓電容,接地點就是分壓點。以接地點即分壓點為參考點,振盪引腳的輸入和輸出是反相的。當兩個電容量相等時,反饋係數是0.5,一般是可以滿...

微控制器晶振為12MHZ,要讓微控制器延時100ms怎麼計算

一個機器週期 12時鐘週期 不管時鐘多少,都按一個機器週期 12時鐘週期計算 關鍵 12mhz時鐘換過來就是1m機器週期 1m s 1ms就是1000機器週期 6mhz時鐘換過來就是0.5m機器週期 0.5m s 1ms就是500機器週期 8位計數器最高範圍是65536,如果我們要記時1s,可以以1...

51微控制器c語言延時函式 void delay 1ms un

杜哥是個小天才 c程式中可使用不同型別的變數來進行延時設計。經實驗測試,使用unsigned char型別具有比unsigned int更優化的 在使用時應該使用unsigned char作為延時變數。以某晶振為12mhz的微控制器為例,晶振為12mhz即一個機器週期為1us。void delay ...