<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è) > 嵌入式系統 > 設計應用 > Avr單片機編程---延遲函數

Avr單片機編程---延遲函數

作者: 時(shí)間:2016-11-23 來(lái)源:網(wǎng)絡(luò ) 收藏
avr-gcc提供了兩個(gè)延遲函數,可以在用戶(hù)的程序中使用,前提--加入avr/delay.h這個(gè)頭文件:

_delay_us(double __us)
_delay_ms(double __ms)
而這兩個(gè)延遲函數在實(shí)際工作的時(shí)候,調用了另兩個(gè)函數,位于delay_basic.h中:
a, _delay_loop_1(uint8_t __count)
b,_delay_loop_2(uint16_t __count)
a 函數可以看出,_count的最大值是256,b 函數中_count的最大值是65536。在delay_basic.h中有說(shuō)明,也可以結合a,b兩個(gè)函數的具體定義看,a 函數執行一次的時(shí)間是3個(gè)指令周期,b 執行一次的時(shí)間是4個(gè)指令周期,一個(gè)指令周期 T = 1 / F_CPU。
(測試:可以試著(zhù)計算下當F_CPU取值1M時(shí),_count取1,_delay_loop_1和_delay_loop_2分別延遲時(shí)間
是多 少,如果F_CPU取2M呢,延遲又是多少?)
*********************************************
F_CPU在avr-gcc中有定義,這個(gè)值是在編譯的時(shí)候傳遞給編譯器的,說(shuō)明用戶(hù)程序的晶振頻率,編譯器為了保證編譯過(guò)程中防止因用戶(hù)為定義這個(gè) F_CPU的值,設定一個(gè)初值F_CPU=100 0000UL,即默認用戶(hù)使用的是1M的晶振。當然,在實(shí)際程序設計時(shí)一定要根據實(shí)際用到的晶振設定這個(gè)值,否則,延遲肯定不準??梢栽诙x加載頭文件前這樣:如
#include
#define F_CPU 1000000UL
#include
#include
***********************************************
_delay_us(double __us), _delay_ms(double __ms)中又有這樣的定義:
double __tmp = ((F_CPU) / 4e3) * __ms
__ticks = (uint16_t)__tmp;
_delay_loop_2(__ticks);
--------------------------------------------
double __tmp = ((F_CPU) / 3e6) * __us;
__ticks = (uint8_t)__tmp;
_delay_loop_1(__ticks);
---------------------------------------------
所以根據a,b兩個(gè)函數中_count(實(shí)際參數)的最大值描述就應該是:
((F_CPU) / 3e6) * __us最大值是256
((F_CPU) / 4e3) * __ms的最大值是65536
即我們在自己程序中調用 _delay_us(double __us),_delay_ms(double __ms)這兩個(gè)函數時(shí)參數的選擇與所取的F_CPU(也就是實(shí)際用到的晶振頻率)是有關(guān)系的。
當F_CPU取值為1M時(shí),__us的最大取值是768,__ms的最大取值是65536*4
當F_CPU取值為2M時(shí),__us的最大取值是768/2,__ms的最大取值是65536*4/2
......
當F_CPU取值為8M時(shí),__us的最大取值是768/8,__ms的最大取值是65536*4/8
所以,延遲函數的參數取值是不能一概而論的。
//*************************************************************************************************************************
現在再來(lái)看究竟延遲了多久?
_delay_us(double __us)的延遲時(shí)間因為調用了_delay_loop_1(),而_delay_loop_1()是執行3個(gè)指令周期,所以延遲時(shí)間就是:
((F_CPU) / 3e6) * __us*3*T (T = 1 / F_CPU 單位MHz)
_delay_ms(double __ms)的延遲時(shí)間因為調用了_delay_loop_2(),而_delay_loop_2()是執行4個(gè)指令周期,所以延遲時(shí)間就是:
((F_CPU) / 4e3) * __ms*4*T (T = 1 / F_CPU 單位MHz)
可以試著(zhù)計算下,當F_CPU取值為1M時(shí),_delay_us(X)就是延遲X us,_delay_ms(X)就是延遲X ms
補充:
其實(shí),如果自己查看新的源代碼可以發(fā)現,現在的定時(shí)的時(shí)間并不像有的舊的文章上說(shuō)的那樣,限制在一定的范圍內。因為代碼更新過(guò)了,嘎嘎。

本文引用地址:http://dyxdggzs.com/article/201611/320341.htm


關(guān)鍵詞: Avr單片機編程延遲函

評論


技術(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>