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

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]在嵌入式C編程中,免不了要用到軟件延時(shí)。這一般通過(guò)循環(huán)語(yǔ)句實(shí)現(xiàn)。通過(guò)控制循環(huán)語(yǔ)句的循環(huán)次數(shù),便可獲得多種不同的延時(shí)時(shí)間。為了便于使用和提高程序代碼的復(fù)用率,一般又將循環(huán)語(yǔ)句封裝成一個(gè)帶參數(shù)的函數(shù),稱為延時(shí)函數(shù)。

在嵌入式C編程中,免不了要用到軟件延時(shí)。這一般通過(guò)循環(huán)語(yǔ)句實(shí)現(xiàn)。通過(guò)控制循環(huán)語(yǔ)句的循環(huán)次數(shù),便可獲得多種不同的延時(shí)時(shí)間。為了便于使用和提高程序代碼的復(fù)用率,一般又將循環(huán)語(yǔ)句封裝成一個(gè)帶參數(shù)的函數(shù),稱為延時(shí)函數(shù)。如:

void wait(unsigned int n)

{

unsigned int i;

for(i=0;i

}

延時(shí)函數(shù)的參數(shù)(形參,如上例中的變量 n ),即為控制循環(huán)語(yǔ)句循環(huán)次數(shù)的變量。這樣,在需要軟件延時(shí)的時(shí)候,只需要調(diào)用延時(shí)函數(shù),并將實(shí)際參數(shù)(實(shí)參,即n的實(shí)際值)代入形參,便可獲得與該實(shí)際參數(shù)對(duì)應(yīng)的延時(shí)時(shí)間。

這便是經(jīng)典的軟件延時(shí)的實(shí)現(xiàn)方法,非常簡(jiǎn)單。

但細(xì)心的讀者會(huì)發(fā)現(xiàn):延時(shí)函數(shù)的參數(shù)(比如上面的 n ),表征的是循環(huán)語(yǔ)句的“循環(huán)次數(shù)”,而不是“實(shí)際的延時(shí)時(shí)間”。一般來(lái)說(shuō),假令循環(huán)語(yǔ)句每循環(huán)一次的時(shí)間為 b(注意,單位是“步”,即一個(gè)時(shí)鐘周期,下同),函數(shù)調(diào)用、傳值和返回所需的固有時(shí)間為 a ,那么,給定參數(shù) n 時(shí),調(diào)用一次延時(shí)函數(shù)實(shí)際實(shí)現(xiàn)的延時(shí)時(shí)間應(yīng)為 t = a + b*n , ——而不是 n !

這就意味著,當(dāng)需要的延時(shí)時(shí)間為 t 時(shí),應(yīng)當(dāng)傳入的實(shí)參為 n = (t-a)/b,而不是 t 。這樣,為了獲得比較準(zhǔn)確的延時(shí),每次調(diào)用函數(shù)之前,都要手工計(jì)算實(shí)際參數(shù),很不方便;其次,當(dāng)需要改變晶振頻率的時(shí)候,程序中所有的延時(shí)參數(shù)都要重新計(jì)算,這顯然不利于程序的移植。

為了解決這兩個(gè)問(wèn)題,提高程序的可移植性,可以利用宏定義的方式,對(duì)延時(shí)函數(shù)進(jìn)行參數(shù)預(yù)修正。例如,對(duì)上面給出的wait延時(shí)函數(shù),可以使用下面的宏定義:

#define delay(n) wait( ( (n) - a ) / b )

這樣,調(diào)用 delay(t) 就意味著調(diào)用 wait( (t-a)/b ) ,從而得到時(shí)間為t的延時(shí),實(shí)現(xiàn)了參數(shù)與延時(shí)時(shí)間的同步,使用起來(lái)更加方便。

為了進(jìn)一步提高可移植性,使軟件延時(shí)能夠適應(yīng)不同的晶振頻率,應(yīng)當(dāng)順著上面的思路選擇尋找更優(yōu)方案。那么,應(yīng)當(dāng)怎樣做呢?其實(shí)方法很簡(jiǎn)單。假設(shè)調(diào)用某個(gè)延時(shí)函數(shù) wait_step(n) 可以獲得 n 步的延時(shí),又設(shè)工作頻率為 f1,即每步的運(yùn)行時(shí)間為 T=1/f1,則實(shí)際獲得的延時(shí)時(shí)間為 t= n*T=n/f1。當(dāng)工作頻率變?yōu)?f2=C*f1 時(shí),程序運(yùn)行速度快了C倍,為了仍然獲得時(shí)間為t的延時(shí),程序運(yùn)行的步數(shù)應(yīng)當(dāng)是原來(lái)的C倍,即要調(diào)用wait_step(n*C)。這樣,我們就可以定義下面的宏,來(lái)完成(n*C)的運(yùn)算:

#define C 4

#define delay_t(n) wait_step( n*C )

第一行一般寫在文件開(kāi)頭,當(dāng)修改晶振頻率時(shí),只需修改這一處就行了,不必在程序中對(duì)各個(gè) wait_step(n)的參數(shù)一一修改,大為方便。

按照上面介紹的方法,可以編寫出準(zhǔn)確、易用、通用的延時(shí)驅(qū)動(dòng)。

下面給出一個(gè)完整的延時(shí)驅(qū)動(dòng)程序。這是筆者早期編寫的版本,最近重新整理過(guò)。編繹器是ICC AVR V7.13A,運(yùn)行環(huán)境是AVR系列的所有芯片。使用的語(yǔ)句有三個(gè):

微秒級(jí)延時(shí):delay_us(n); 延時(shí)n微秒

毫秒級(jí)延時(shí):delay_ms(n); 延時(shí)n毫秒

秒級(jí)延時(shí): delay_s(n); 延時(shí)n秒 (最大65秒)

/*********************************************************************

文件名 : DELAY.H

功 能 : 通用的 軟件延時(shí) 驅(qū)動(dòng)文件。

版 本 : 2009.11.27

創(chuàng)建者 : 白羽

聯(lián) 系 :

說(shuō) 明 : 使用時(shí)修改“配置信息”即可;其他地方請(qǐng)不要改

*********************************************************************/

#ifndef _DELAY_H_

#define _DELAY_H_

#define uchar unsigned char

#define uint unsigned int

/***************** ★○★ 配 置 信 息 ★○★ ******************/

#define CRYSTAL 8.0 //設(shè)置晶振頻率。單位是 MHZ

/************************************************************************/

#define delay_us(T) \

wait_us( (T) > 14.0/CRYSTAL ? ((T)*CRYSTAL-8)/6.0 : 1 )

#define delay_ms(T) wait_ms( T )

#define delay_s(n) delay_ms(1000*(n))

/*********************************************************************

函數(shù)名 : wait_us

功 能 : 微秒(us)級(jí)的延時(shí)(粗糙)

說(shuō) 明 : 延時(shí)時(shí)間為:T = 8 + 6 * n (步)

/********************************************************************/

void wait_us( unsigned int n )

{

do{

n--;

}while(n);

}

/*********************************************************************

函數(shù)名 : wait_ms

功 能 : 毫秒(us)級(jí)的延時(shí)

說(shuō) 明 : 當(dāng)do...while內(nèi)部為992us延時(shí)的時(shí)候,誤差為17步。

/********************************************************************/

void delay_ms( unsigned int n )

{

do {

delay_us(992);

}while(--n);

}

#endif

本站聲明: 本文章由作者或相關(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)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

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

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

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

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

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

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

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

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

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

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

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

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉