<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 關(guān)于51單片機中C語(yǔ)言編寫(xiě)的精確延時(shí)函數

關(guān)于51單片機中C語(yǔ)言編寫(xiě)的精確延時(shí)函數

作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò ) 收藏
有些特殊的應用會(huì )用到比較精確的延時(shí)(比如DS18B20等),而C不像匯編,延時(shí)精準度不好算。本人經(jīng)過(guò)反復調試,對照KEIL編譯后的匯編源文件,得出了以下幾條精確延時(shí)的語(yǔ)句(絕對精確!本人已通過(guò)實(shí)際測試),今天貼上來(lái),希望對需要的朋友有所幫助
sbit LED = P1^0; // 定義一個(gè)管腳(延時(shí)測試用)
unsigned int i = 3; // 注意i,j的數據類(lèi)型,
unsigned char j = 3; // 不同的數據類(lèi)型延時(shí)有很大不同
//-----------------各種精確延時(shí)語(yǔ)句-----------------------------------
while( (i--)!=1 ); // 延時(shí)10*i個(gè)機器周期
i = 10; while( --i ); // 延時(shí)8*i+2個(gè)機器周期
i = 10; while( i-- ); // 延時(shí)(i+1)*9+2個(gè)機器周期
j = 5; while( --j ); // 延時(shí)2*j+1個(gè)機器周期
j = 5; while( j-- ); // 延時(shí)(j+1)*6+1個(gè)機器周期

i = 5;
while( --i ) // 延時(shí)i*10+2個(gè)機器周期,在i*10+2個(gè)機器周期
if( LED==0 ) break; // 內檢測到LED管腳為低電平時(shí)跳出延時(shí)

i = 5;
while( LED ) // 每隔10個(gè)機器周期檢測一次LED管腳狀態(tài),當LED
if( (--i)==0 ) break;// 為低時(shí)或者到了10*i+2個(gè)機器周期時(shí)跳出延時(shí)
//--------------------------------------------------------------------

例如18b20的復位函數(12M晶振):
//***********************************************************************
// 函數功能:18B20復位
// 入口參數:無(wú)
// 出口參數:unsigned char x: 0:成功 1:失敗
//***********************************************************************
unsigned char ow_reset(void)
{
unsigned char x=0; // 12M晶振 1個(gè)機器周期為1us
DQ = 1; // DQ復位
j = 10; while(--j);// 稍做延時(shí)(延時(shí)10*2+1=21個(gè)機器周期,21us)
DQ = 0; // 單片機將DQ拉低
j = 85; while(j--);// 精確延時(shí)(大于480us) 85*6+1=511us
DQ = 1; // 拉高總線(xiàn)
j = 10; while(j--);// 精確延時(shí)10*6+1=61us
x = DQ; // 稍做延時(shí)后,
return x; // 如果x=0則初始化成功 x=1則初始化失敗
j = 25; while(j--);// 精確延時(shí)25*6+1=151us
}
//*********************************************************************************
再如紅外解碼程序:
(先說(shuō)傳統紅外解碼的弊端:
程序中用了while(IR_IO);while(!IR_IO);這樣的死循環(huán),如果管腳一直處于一種狀態(tài),就會(huì )一直執行while,造成“死機”現象。當然這種情況很少,但我們也的考慮到。而用以下程序則不會(huì ),在規定的時(shí)間內沒(méi)有正確的電平信號就會(huì )返回主程序,這樣就不會(huì )出現“死機”了)
//***************************外部中斷0*******************************
void int0(void) interrupt 0
{
unsigned char i,j;
unsigned int count = 800;
//--------------8.5ms低電平引導碼-------------------------------------
while( --count )
if( IR_IO==1 ) return; // 在小于8ms內出現高電平,返回
count = 100; // 延時(shí)1ms
while( !IR_IO ) // 等待高電平
if( (--count)==0 ) return; // 在9ms內未出現高電平,返回
//-------------4.5ms高電平引導碼------------------------------------
count = 410; // 延時(shí)4.1ms
while( --count ) // ...
if( IR_IO==0 ) return; // 在4.1ms內出現低電平,返回
count = 50; // 延時(shí)0.5ms
while( IR_IO ) // 等待低電平
if( (--count)==0 ) return; // 在4.7ms內未出現低電平,返回
//-----------------------------------------------------------------
//------------4個(gè)數據碼------------------------------------
for( j=0;j<4;j++ )
{
for( i=0;i<8;i++ )
{
IR_data[j] <<= 1; // 裝入數據
count = 60; // 延時(shí)0.6ms
while( !IR_IO ) // 等待高電平
if( (--count)==0 ) return; // 在0.6ms內未出現高電平,返回
count = 40; // 低電平結束,繼續
while( --count ) // 延時(shí)0.4ms
if( IR_IO==0 ) return; // 在0.4ms內出現低電平,返回
count = 100; // 延時(shí)1.4ms
while( IR_IO ) // 檢測IO狀態(tài)
if( (--count)==0 ) // 等待1.4ms到來(lái)
{ // 在1.4ms內都是高電平
IR_data[j] |= 1; // 兩個(gè)單位高電平,為數據1
break; // 跳出循環(huán)
}
count = 20; // 延時(shí)0.2ms
while( IR_IO ) // 等待低電平跳出
if( (--count)==0 ) return; // 0.2ms內未出現低電平,返回
}
}
//-------------------------------------------------------------------
flag_IR = 1; // 置位紅外接收成功標志
}


評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>