www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 單片機 > 單片機
[導讀]看到了個好帖,我在此在它得基礎上再拋拋磚!有個好帖,從精度考慮,它得研究結果是: void delay2(unsigned char i) { while(-i); } 為最佳方法。 分析:假設外掛12M(之后都是在這基礎上討論) 我編譯了下,傳

看到了個好帖,我在此在它得基礎上再拋拋磚!

有個好帖,從精度考慮,它得研究結果是:
void delay2(unsigned char i)
{
while(-i);
}
為最佳方法。
分析:假設外掛12M(之后都是在這基礎上討論)
我編譯了下,傳了些參數,并看了匯編代碼,觀察記錄了下面的數據:
delay2(0):延時518us 518-2*256=6
delay2(1):延時7us(原帖寫“5us”是錯的,^_^)
delay2(10):延時25us 25-20=5
delay2(20):延時45us 45-40=5
delay2(100):延時205us 205-200=5
delay2(200):延時405us 405-400=5
見上可得可調度為2us,而最大誤差為6us。
精度是很高了!
但這個程序的最大延時是為518us顯然不
能滿足實際需要,因為很多時候需要延遲比較長的時間。
那么,接下來討論將t分配為兩個字節(jié),即uint型的時候,會出現什么情況。
void delay8(uint t)
{
while(-t);
}
我編譯了下,傳了些參數,并看了匯編代碼,觀察記錄了下面的數據:
delay8(0):延時524551us 524551-8*65536=263
delay8(1):延時15us
delay8(10):延時85us 85-80=5
delay8(100):延時806us 806-800=6
delay8(1000):延時8009us 8009-8000=9
delay8(10000):延時80045us 80045-8000=45
delay8(65535):延時524542us 524542-524280=262
如果把這個程序的可調度看為8us,那么最大誤差為263us,但這個延時程序還是不能滿足要求的,因為延時最大為524.551ms。
那么用ulong t呢?
一定很恐怖,不用看編譯后的匯編代碼了。。。
那么如何得到比較小的可調度,可調范圍大,并占用比較少得RAM呢?請看下面的程序:
/*-
程序名稱:50us延時
注意事項:基于1MIPS,AT89系列對應12M晶振,W77.W78系列對應3M晶振
例子提示:調用delay_50us(20),得到1ms延時
全局變量:無
返回:無
-*/
void delay_50us(uint t)
{
uchar j;
for(;t>0;t-)
for(j=19;j>0;j-)
;
}
我編譯了下,傳了些參數,并看了匯編代碼,觀察記錄了下面的數據:
delay_50us(1):延時63us 63-50=13
delay_50us(10):延時513us 503-500=13
delay_50us(100):延時5013us 5013-5000=13
delay_50us(1000):延時50022us 50022-50000=22
赫赫,延時50ms,誤差僅僅22us,作為C語言已經是可以接受了。再說要求再精確的話,就算是用匯編也得改用定時器了。
/*-
程序名稱:50ms延時
注意事項:基于1MIPS,AT89系列對應12M晶振,W77.W78系列對應3M晶振
例子提示:調用delay_50ms(20),得到1s延時
全局變量:無
返回:無
-*/
void delay_50ms(uint t)
{
uint j;
/****
可以在此加少許延時補償,以禰補大數值傳遞時(如delay_50ms(1000))造成的誤差,
但付出的代價是造成傳遞小數值(delay_50ms(1))造成更大的誤差。
因為實際應用更多時候是傳遞小數值,所以補建議加補償!
****/
for(;t>0;t-)
for(j=6245;j>0;j-)
;
}
我編譯了下,傳了些參數,并看了匯編代碼,觀察記錄了下面的數據:
delay_50ms(1):延時50 010 10us
delay_50ms(10):延時499 983 17us
delay_50ms(100):延時4 999 713 287us
delay_50ms(1000):延時4 997 022 2.978ms
赫赫,延時50s,誤差僅僅2.978ms,可以接受!
上面程序沒有才用long,也沒采用3層以上的循環(huán),而是將延時分拆為兩個程序以提高精度。應該是比較好的做法了。


C51延時從精度考慮,下面的方法為最佳方法:
voiddelay(unsignedchari)
{
while(--i);
}

功能:延時
參數:c的范圍為:0 -255
當 C=0時,延時為 2 *256+6=518個機器周期
C為其它值時,延時為 2* C+5個機器周期
注釋:① 以上是以常數調用的計算值,如果用變量調用,根據變量的存
儲類型的不同可能要增加一到三個周期
② 編譯環(huán)境:KeilC

voiddelay(unsigned char i)
{
while(--i); //不可寫成i--,否則生成的代碼很難看
}

編譯后的子程序內是一條DJNZ指令,耗時2個周期,由于準備到R7中,調用LCALL,還有返回RET等要消耗時間,所以要加上5個周期。
用0調用時有點特別,0減1后變作0xFF,所以循環(huán)次數為256次,另外一點很有意思:
當用 1-255的常數調用時,生成的代碼如下

MOVR7, #1 ; #1 - 255
LCALL _Delay

0 調用則多了條指令

CLR A
MOV R7, A
LCALL _Delay
所以參數為 0 時,要多加一個周期

用變量調用時(如Delay(i)之類的形式)根據變量i的存儲類型加上相應的訪問時間, 該函數的分辨率為 2個機器周期,最小延時為7個機器周期。
寫延時程序時一定要考慮系統使用的晶振的頻率。對于你所說的微秒級的延時,如果系統使用12MHZ的晶振,則一條NOP匯編指令便是延時1微秒。

在做ms級以下的延時時,一定要用匯編,那樣才能夠很精確的控制!其他主控程序可以使用c語言!

在C中嵌入匯編用下面格式
_asm
{
//在這里加入匯編的程序段
}

如果是單片機,我想可以用_nop_指令!一個_nop指令是12*1/12MHz=1us,所以,當然如果采用循環(huán)這也會消耗掉一定的時間,可以實機調試,用示波器觀察!

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

sbitLED=P1^0;//定義一個管腳(延時測試用)
unsignedinti=3;//注意i,j的數據類型,
unsignedcharj=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管腳狀態(tài),當LED
if((--i)==0)break;//為低時或者到了10*i+2個機器周期時跳出延時
//--------------------------------------------------------------------

例如18b20的復位函數(12M晶振):
//***********************************************************************
//函數功能:18B20復位
//入口參數:無
//出口參數:unsignedcharx:0:成功1:失敗
//***********************************************************************
unsignedcharow_reset(void)
{
unsignedcharx=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; //稍做延時后,
returnx; //如果x=0則初始化成功x=1則初始化失敗
j=25;while(j--);//精確延時25*6+1=151us
}
//*********************************************************************************
再如紅外解碼程序:
(先說傳統紅外解碼的弊端:
程序中用了while(IR_IO);while(!IR_IO);這樣的死循環(huán),如果管腳一直處于一種狀態(tài),就會一直執(zhí)行while,造成“死機”現象。當然這種情況很少,但我們也的考慮到。而用以下程序則不會,在規(guī)定的時間內沒有正確的電平信號就會返回主程序,這樣就不會出現“死機”了)
//***************************外部中斷0*******************************
voidint0(void)interrupt0
{
unsignedchari,j;
unsignedintcount=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;//低電平結束,繼續(xù)
while(--count)//延時0.4ms
if(IR_IO==0)return;//在0.4ms內出現低電平,返回
count=100;//延時1.4ms
while(IR_IO)//檢測IO狀態(tài)
if((--count)==0)//等待1.4ms到來
{//在1.4ms內都是高電平
IR_data[j]|=1;//兩個單位高電平,為數據1
break;//跳出循環(huán)
}
count=20;//延時0.2ms
while(IR_IO)//等待低電平跳出
if((--count)==0)return;//0.2ms內未出現低電平,返回
}
}
//-------------------------------------------------------------------
flag_IR=1;//置位紅外接收成功標志
}

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯合牽頭組建的NVI技術創(chuàng)新聯盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現場 NVI技術創(chuàng)新聯...

關鍵字: VI 傳輸協議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉