女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

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

看到了個(gè)好帖,我在此在它得基礎(chǔ)上再拋拋磚!

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


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

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

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

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

MOVR7, #1 ; #1 - 255
LCALL _Delay

0 調(diào)用則多了條指令

CLR A
MOV R7, A
LCALL _Delay
所以參數(shù)為 0 時(shí),要多加一個(gè)周期

用變量調(diào)用時(shí)(如Delay(i)之類的形式)根據(jù)變量i的存儲(chǔ)類型加上相應(yīng)的訪問(wèn)時(shí)間, 該函數(shù)的分辨率為 2個(gè)機(jī)器周期,最小延時(shí)為7個(gè)機(jī)器周期。
寫延時(shí)程序時(shí)一定要考慮系統(tǒng)使用的晶振的頻率。對(duì)于你所說(shuō)的微秒級(jí)的延時(shí),如果系統(tǒng)使用12MHZ的晶振,則一條NOP匯編指令便是延時(shí)1微秒。

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

在C中嵌入?yún)R編用下面格式
_asm
{
//在這里加入?yún)R編的程序段
}

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

有些特殊的應(yīng)用會(huì)用到比較精確的延時(shí)(比如DS18B20等),而C不像匯編,延時(shí)精準(zhǔn)度不好算。本人經(jīng)過(guò)反復(fù)調(diào)試,對(duì)照KEIL編譯后的匯編源文件,得出了以下幾條精確延時(shí)的語(yǔ)句(絕對(duì)精確!本人已通過(guò)實(shí)際測(cè)試),今天貼上來(lái),希望對(duì)需要的朋友有所幫助。

sbitLED=P1^0;//定義一個(gè)管腳(延時(shí)測(cè)試用)
unsignedinti=3;//注意i,j的數(shù)據(jù)類型,
unsignedcharj=3;//不同的數(shù)據(jù)類型延時(shí)有很大不同
//-----------------各種精確延時(shí)語(yǔ)句-----------------------------------
while((i--)!=1);//延時(shí)10*i個(gè)機(jī)器周期
i=10;while(--i);//延時(shí)8*i+2個(gè)機(jī)器周期
i=10;while(i--);//延時(shí)(i+1)*9+2個(gè)機(jī)器周期
j=5;while(--j);//延時(shí)2*j+1個(gè)機(jī)器周期
j=5;while(j--);//延時(shí)(j+1)*6+1個(gè)機(jī)器周期

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

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

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

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

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉