1樓:匿名使用者
這是一個for的巢狀語句,你注意到沒有,因為兩個語句之間沒有分號,所以編譯器預設第二個for語句是第一個for語句的內部語句,怎麼理解呢?就是說你第一個for中的 i 減1一次,那第二個for中的語句將會執行110次,那麼這個110從**來呢?其實是根據你所用微控制器的晶振頻率來計算的,在這個程式當中,微控制器的晶振頻率應該是11.
0592兆hz,所以第二個for語句執行110次的時間大概就是1ms,(這裡涉及到晶振頻率和機器週期之間的那幾個公式你自己翻翻課本看)乘上第一個for中的 i 的初值就得到你要延時的時間了,如果你要延時1秒,那麼你就重新定義 i 的資料型別為unsigned int i,然後j的資料型別不變,給 i 賦值1000即可。
2樓:匿名使用者
看你延時多久,知道了之後還要看你這個“xms”是賦值的多少,然後兩重迴圈數值相乘就是你延時時間。所以“110”就是這兩個乘數之一。注意時間單位換算
3樓:瀟湘電子工程師
其實,像這樣的問題,做起來麻煩,也簡單,我每次都是用示波器測試一下。
4樓:
按照時脈頻率可以得出指令週期,這樣再計算c編譯成彙編後一個迴圈需要的指令週期數,來計算。一般軟體定時都不精確。
51微控制器c語言延時函式 void delay 1ms(unsigned int ms){un
5樓:杜哥是個小天才
c程式中可使用不同型別的變數來進行延時設計。經實驗測試,使用unsigned char型別具有比unsigned int更優化的**,在使用時應該使用unsigned char作為延時變數。 以某晶振為12mhz的微控制器為例,晶振為12mhz即一個機器週期為1us。
void delay_ms(unsigned int ms_number) // ms延時函式 (at89c51 @ 11.0592mhz) }
void delay()
void delay_ms(unsigned int ms)
}拓展資料
c語言是一門通用計算機程式語言,應用廣泛。c語言的設計目標是提供一種能以簡易的方式編譯、處理低階儲存器、產生少量的機器碼以及不需要任何執行環境支援便能執行的程式語言。
儘管c語言提供了許多低階處理的功能,但仍然保持著良好跨平臺的特性,以一個標準規格寫出的c語言程式可在許多電腦平臺上進行編譯,甚至包含一些嵌入式處理器(微控制器或稱mcu)以及超級電腦等作業平臺。
6樓:匿名使用者
delay函式是一般自己定義的一個延時函式。
c語言定義延時函式主要通過無意義指令的執行來達到延時的目的。
關於微控制器c語言的精確延時,網上很多都是大約給出延時值沒有準確那值是多少,也就沒有達到精確高的要求,而本函式克服了以上缺點,能夠精確計數出要延時值且精確達到1us,本舉例所用cpu為stc12c5412系列12倍速的微控制器,只要修改一下引數值其它系例微控制器也通用,適用範圍寬。
ms=1時,第一個for迴圈進入,然後在第二個for迴圈中執行100次
再回到第一個for迴圈中進行第二次迴圈.
就這樣你可以進入編輯器,新增斷點,自行檢視**執行過程
7樓:匿名使用者
這個延時關鍵看使用的晶振多大,比如12m晶振for(j=0;j<120;j++);大概延時1毫秒,11.0592m晶振那麼for(j=0;j<110;j++);延時1毫秒,你這裡的for(j=0;j<100;j++);延時1毫秒的話,晶振應該是10m,不太常見喲,特別是在微控制器方面。
8樓:展華威
void delay(unsigned int x) //延時 x ms
延時1ms 即為使x=1;
這程式延時約1ms(x=1時用keil測出來約 0.96831272ms,近似1ms),用c語言很難做到準確的1ms。注意晶振為11.
0592mhz的時候用~ 晶振為12mhz時 把 i=120 近似值1ms
9樓:奮鬥勇士
這是根據for迴圈的執行時間來達到延時的效果,當然不同的微控制器晶片 執行速度不同,產生的效果也不一樣
10樓:聖鸞
c的話其實時間沒有辦法完全定性地計算的
如果非得精確的話只能使用定時器了,或者彙編的也行不過時間要求精度不是很高的話使用下面的**就行了當時使用示波器把時間完全調準的,65536ms範圍內還是比較準的,已經可以滿足通常的要求了:
#include "reg51.h" //標頭檔案包含//巨集定義
#define uint unsigned int#define uchar unsigned charvoid delay(uint ms) // 毫秒級延時(at89c52 @ 11.0592mhz)
//112}}
呼叫方式如下:
delay(400); //開機延時400ms夠詳細了吧?!