1樓:匿名使用者
一條指令需要由12個振盪週期(既晶振振盪週期)組成,即晶振頻率12分頻,也就是執行一條指令的最高頻率1mhz,則對應週期為1us。延時程式執行一次迴圈的時間為1us,則延遲1s需要迴圈1000*1000次。所以你這樣寫是做不到延遲1s的,可以讓a=1000,再第二個for迴圈1000次。
2樓:匿名使用者
這個還得跟微控制器有關係的,比如用的是cisc的微控制器和risc的演算法就不太一樣,你首先要確定一個指令週期的時間,比如pic的微控制器,一個指令週期一般為t=1/(晶振頻率/4),然後再系統無中斷程式的情況下,那你上面的 a = 1/(t*110)
3樓:
在keil裡**的話,在配置裡把晶振調成12mhz,然後在呼叫delay函式的地方設定一個斷點,開始除錯程式,執行到斷點處,注意程式左邊有一個記錄當前暫存器和一些狀態的視窗,其中,裡面有一個是專門記錄當前執行了多少時間的變數,記下當前時間t1,然後按f10(不進入子函式)除錯,再記錄當前時間t2,則延時=t2-t1。多試幾個a,差不多調到1s就夠了。我一般都這麼調。
你要想明白其中原理,想自己算的話,你就看看delay的彙編**段自己算吧。
4樓:匿名使用者
用keil** 除錯一下 如果要求精確就用中斷
微控制器程式延時時間,晶振為12mhz
5樓:志當存高遠
函式的入口引數,當你呼叫延時函式時,... delayms(10);...
目的要延時10ms,這是這個uint的無符號整形變數xms就被賦值為10,
在進入delayms();函式後,i=xms即i=10,然後做for迴圈,
根據系統的時鐘週期做出相應時間的延時。如果沒有xms,你的延時函式只能寫成固定延時的,即在delayms內部確定好i的值,很不方便。有了入口引數,就能像上面說的那樣隨意延時了(數值範圍要在uint定義內,即小於65536)。
51微控制器c語言延時函式 void delay 1ms(unsigned int ms){un
6樓:杜哥是個小天才
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)以及超級電腦等作業平臺。
7樓:匿名使用者
delay函式是一般自己定義的一個延時函式。
c語言定義延時函式主要通過無意義指令的執行來達到延時的目的。
關於微控制器c語言的精確延時,網上很多都是大約給出延時值沒有準確那值是多少,也就沒有達到精確高的要求,而本函式克服了以上缺點,能夠精確計數出要延時值且精確達到1us,本舉例所用cpu為stc12c5412系列12倍速的微控制器,只要修改一下引數值其它系例微控制器也通用,適用範圍寬。
ms=1時,第一個for迴圈進入,然後在第二個for迴圈中執行100次
再回到第一個for迴圈中進行第二次迴圈.
就這樣你可以進入編輯器,新增斷點,自行檢視**執行過程
8樓:匿名使用者
這個延時關鍵看使用的晶振多大,比如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,不太常見喲,特別是在微控制器方面。
9樓:展華威
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
10樓:奮鬥勇士
這是根據for迴圈的執行時間來達到延時的效果,當然不同的微控制器晶片 執行速度不同,產生的效果也不一樣
11樓:聖鸞
c的話其實時間沒有辦法完全定性地計算的
如果非得精確的話只能使用定時器了,或者彙編的也行不過時間要求精度不是很高的話使用下面的**就行了當時使用示波器把時間完全調準的,65536ms範圍內還是比較準的,已經可以滿足通常的要求了:
#include "reg51.h" //標頭檔案包含//巨集定義
#define uint unsigned int#define uchar unsigned charvoid delay(uint ms) // 毫秒級延時(at89c52 @ 11.0592mhz)
//112}}
呼叫方式如下:
delay(400); //開機延時400ms夠詳細了吧?!
微控制器C語言程式設計,微控制器C語言程式設計題
按你的程式的結構,不做大的變動,又能理解的方法 四個程式合併成一個,當然就只能有一個主程式了,一個while 1 了,凡是while 1 以上的程式只保留一個就行了。四個程式的while 1 以下的都合併寫在一個while 1 下面,分為四段。有四個按鍵,判斷按鍵被按下的程式會寫吧?那判斷每個按鍵的...
微控制器C語言程式設計,51微控制器C語言程式設計
使用兩個定時器或一個定時器中使用兩個計數都能滿足你的要求。建議使用一個定時器和一個計數器即可,如計數器為i,則if i 測溫定時 0 溫度測量 if i 步進電機定時 0 步進電機控制 注 此時要求兩個控制模組的定時步長是一致,比如都是1ms 設定一個比較小的定時間隔,例如1ms,用靜態變數累加,比...
C 微控制器高手,微控制器為什麼不用C 語言程式設計呢
相信很多初學者都有同樣的疑問,也有同樣的希望。就是用c 語言來寫微控制器程式的源 現在我來解釋一下微控制器的源 程式幾乎沒有人用c 來寫的。1.假設一下你現在用c 寫完了一個程式 那麼你要讓微控制器認識必須要編譯吧,對吧 請問你有合適的編譯軟體來編譯你的 嗎?2.就算有編譯器能編譯,你能保證它的 效...