久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2328|回復: 0
收起左側

C語言精確延時方法

[復制鏈接]
ID:104287 發表于 2016-1-30 03:06 | 顯示全部樓層 |閱讀模式

有些特殊的應用會用到比較精確的延時(比如DS18B20等),而C不像匯編,延時精準度不好算。本人經過反復調試,對照KEIL編譯后的匯編源文件,得出了以下幾條精確延時的語句(絕對精確!本人已通過實際測試),今天貼上來,希望對需要的朋友有所幫助。

sbit LED  =  P1^0;      // 定義一個管腳(延時測試用)
unsigned int i = 3;     // 注意i,j的數據類型,
unsigned char j = 3;    // 不同的數據類型延時有很大不同
//-----------------各種精確延時語句-----------------------------------
while( (i--)!=1 );      // 延時10*i個機器周期
i = 10; while( --i );   // 延時8*i+2個機器周期
i = 10; while( i-- );   // 延時(i+1)*9+2個機器周期
j = 5;  while( --j );   // 延時2*j+1個機器周期
j = 5;  while( j-- );   // 延時(j+1)*6+1個機器周期

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

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

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

評分

參與人數 1黑幣 +12 收起 理由
紅塵有你 + 12 很給力!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 丁香久久 | 日韩视频一区二区 | 欧美成年视频 | 国产精品不卡 | tube国产 | 91国内在线观看 | 成人av影院 | 国产精品久久久久久久 | 亚洲一区二区三区四区五区午夜 | 欧美激情国产精品 | www.天天操.com | 成人免费视频网站在线看 | 亚洲成人免费视频 | www.国产精 | 9999精品视频 | 国产日产精品一区二区三区四区 | 日本免费黄色一级片 | www.色.com| 韩国av一区二区 | 99久久精品国产一区二区三区 | 一区二区成人 | 在线亚洲一区二区 | 国产免费一区二区 | av第一页 | 精品久久电影 | 在线免费观看黄色 | 国产精品爱久久久久久久 | 久久久成人精品 | 亚洲成人黄色 | 国产精品1区2区 | 91在线看 | 国产成人99久久亚洲综合精品 | 亚洲自拍偷拍av | 久久久久一区二区 | 欧美精品久久久久久 | 亚洲精品二区 | cao在线| 日本三级网站在线观看 | 激情欧美一区二区三区 | 精品久 | 成人黄在线观看 |