51微控制器延時函式

2021-06-21 17:18:29 字數 1403 閱讀 3590

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

一. 500ms延時子程式

程式:void delay500ms(void)

計算分析:

程式共有三層迴圈

一層迴圈n:r5*2 = 81*2 = 162us djnz 2us

二層迴圈m:r6*(n+3) = 202*165 = 33330us djnz 2us + r5賦值 1us = 3us

三層迴圈: r7*(m+3) = 15*33333 = 499995us djnz 2us + r6賦值 1us = 3us

迴圈外: 5us 子程式呼叫 2us + 子程式返回 2us + r7賦值 1us = 5us

延時總時間 = 三層迴圈 + 迴圈外 = 499995+5 = 500000us =500ms

計算公式:延時時間=[(2*r5+3)*r6+3]*r7+5

二. 200ms延時子程式

程式:void delay200ms(void)

三. 10ms延時子程式

程式:void delay10ms(void)

四. 1s延時子程式

程式:void delay1s(void)

關於微控制器c語言的精確延時,網上很多都是大約給出延時值沒有準確那值是多少,也就沒有達到精確高的要求,而本函式克服了以上缺點,能夠精確計數出要延時值且精確達到1us,本舉例所用cpu為stc12c5412系列12倍速的微控制器,只要修改一下引數值其它系例微控制器也通用,適用範圍寬。

共有三條延時函式說明如下:

函式呼叫分兩級:一級是小於10us的延時,二級是大於10us的延時

//********************小於10us的【用1us級延時】********************

//----------微秒級延時---------

for(i=x;i>x;i--) 延時時間=(3+5*x)/12 提示(單位us, x不能大於255)

//***************=大於10us《小於21.9955ms的可用【10us級延時函式】**********=

void delay10us(uchar ms)

i=[(延時值-1.75)*12/ms-15]/4

如想延時60us則 i=[(60-1.75)*12/6-15]/4=25.375≈26; 修改i的值=26,再呼叫上面的【10us級延時函式】delay10us(6); 則就精確延時60us;

如果想延時64us可以用這二種函式組合來用: delay10us(6); for(i=9;i>x;i--) 共延時64us。

**:

51微控制器延時函式

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

51微控制器C語言延時函式

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

微控制器延時函式

精確的微控制器常用延時函式 c 誤差0us 12m 並未驗證 1 延時0.5ms void delay0.5ms void 誤差0us 2 延時1ms void delay1ms void 誤差0us 3 延時2ms void delay2ms void 誤差0us 4 延時3ms void del...