欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
一個(gè)關(guān)于單片機(jī)硬件延時(shí)的疑惑
[打印本頁(yè)]
作者:
laopihappy123
時(shí)間:
2021-11-21 21:54
標(biāo)題:
一個(gè)關(guān)于單片機(jī)硬件延時(shí)的疑惑
本帖最后由 laopihappy123 于 2021-11-22 20:21 編輯
關(guān)于單片機(jī)的定時(shí),在我剛剛學(xué)習(xí)的時(shí)候,都是用軟件實(shí)現(xiàn)的.但在軟件進(jìn)行延時(shí)的過(guò)程中,cpu時(shí)間被白白浪費(fèi)了,此時(shí)能利用cpu的只有中斷.
隨著使用的深入,我越發(fā)覺(jué)得軟件定時(shí)這是不是個(gè)好方法,雖然它很簡(jiǎn)單.
隨后我對(duì)硬件定時(shí)進(jìn)行了了解,發(fā)現(xiàn)替代的方法有個(gè)用定時(shí)器來(lái)搞的:
在定時(shí)器中斷里設(shè)置一個(gè)標(biāo)志位,每當(dāng)定時(shí)器運(yùn)行到設(shè)定的時(shí)間,就將該位置置位(定時(shí)短)或+1(定時(shí)時(shí)間較長(zhǎng)),然后用外部程序去查詢這個(gè)標(biāo)志位,做判斷.
但是我又有了個(gè)疑惑,對(duì)于后者,假如我要定時(shí)30毫秒,定時(shí)器溢出時(shí)間為1ms,標(biāo)志位用8位無(wú)符號(hào)
那到了240的時(shí)候,240+30=14 ,溢出了~ 這個(gè)怎么處理?
難道我把最大閾值設(shè)定為225么? 那假如我有多個(gè)不同的延時(shí)需要進(jìn)行處理呢?.... 沒(méi)辦法呀~ 難道要設(shè)置最大延時(shí)限制值么?...
讓人很是摸不著頭腦,求大家?guī)椭幌挛已絶
---------------分割線---------------
一天后更新,感謝大家的回復(fù)與指教,我看了感覺(jué)無(wú)地自容.....愧對(duì)壇齡,愧對(duì)老師....
大家的回復(fù)我都有好好看,我會(huì)好好學(xué)習(xí)的,謝謝大家
作者:
my808
時(shí)間:
2021-11-21 23:53
標(biāo)志位可以隨時(shí)清零。
等到了30ms 執(zhí)行操作后,順便清零標(biāo)志位,
可以設(shè)置多個(gè)變量 例如 flag_300ms = 0; 上面每次到30ms 就加一;
然后大循環(huán)里面判斷flag_300ms ==9,執(zhí)行操作,清零 flag_300ms
作者:
lkc8210
時(shí)間:
2021-11-22 01:30
標(biāo)志位用完要清零
void timer0_int (void) interrupt 1 //1ms
{
if(!TMR_01_DN)
if(++TMR_01_OT>30)
{
TMR_01_DN = 1;
TMR_01_OT = 0; //clear count
}
}
void main()
{
if(TMR_01_DN)
{TMR_01_DN = 0; //clear flag
//your code
}
}
作者:
IdeaMing
時(shí)間:
2021-11-22 01:36
看樣子,您還在單片機(jī)門檻上,沒(méi)有了解有時(shí)間片輪,RTX-Tiny系統(tǒng)
unsigned short TimeMs;//全局變量 short 65536一般夠用了
void TIM0_Init(void) //設(shè)置定時(shí)器1毫秒一個(gè)中斷,代碼省略
{}
void TIM0_Int (void) interrupt 1
{
if(TimeMs>0)//如果有延時(shí)
TimeMs--;
}
void Delay(unsigned short t)//short 65536一般夠用了
{
TimeMs = t;
while(TimeMs);
}
void main(void)
{
while(1)
{
P1^0 = 0X00;
Delay(1000);
P1^0 = 0XFF;
Delay(1000);
}
}
復(fù)制代碼
作者:
IdeaMing
時(shí)間:
2021-11-22 01:44
還有
unsigned short TimeMs;//全局變量 short 65536一般夠用了
unsigned short Systick;//全局變量 short 65536一般夠用了
void TIM0_Init(void) //設(shè)置定時(shí)器1毫秒一個(gè)中斷,代碼省略
{}
void TIM0_Int (void) interrupt 1
{
if(TimeMs>0)//如果有延時(shí)
TimeMs--;
Systick++;
}
void Delay(unsigned short t)//short 65536一般夠用了
{
TimeMs = t;
while(TimeMs);
}
void Delay2(unsigned short t)//short 65536一般夠用了
{
unsigned short start;
start = Systick;
while((Systick-start) < t);
}
void main(void)
{
while(1)
{
P1^0 = 0X00;
Delay(1000);
P1^0 = 0XFF;
Delay(1000);
}
}
復(fù)制代碼
作者:
IdeaMing
時(shí)間:
2021-11-22 01:45
附上代碼
p.zip
2021-11-22 01:45 上傳
點(diǎn)擊文件名下載附件
647 Bytes, 下載次數(shù): 6
作者:
Hephaestus
時(shí)間:
2021-11-22 02:49
沒(méi)有任何規(guī)定讓你必須要用8位標(biāo)志,255不夠用換16位數(shù)據(jù)好了。
作者:
wulin
時(shí)間:
2021-11-22 04:56
用軟件延時(shí)的時(shí)間長(zhǎng)度是無(wú)限值,定時(shí)器溢出時(shí)間為1ms,定時(shí)30毫秒只要計(jì)數(shù)30。使用后清0,怎么會(huì)溢出?240+30的算法又從何談起?樓主提這個(gè)問(wèn)題明顯與壇齡不符。
作者:
Jack315
時(shí)間:
2021-11-22 08:12
定時(shí)器溢出時(shí)間為1ms,另外用一個(gè)變量做(加法或減法)計(jì)數(shù)器。計(jì)數(shù)到 30 ms 時(shí),計(jì)數(shù)大器復(fù)位并執(zhí)行相應(yīng)的操作。
多個(gè)定時(shí)的情形,最容易理解的是實(shí)時(shí)時(shí)鐘。定時(shí)器溢出時(shí)間為1ms,然后設(shè)置多個(gè)計(jì)數(shù)器變量:秒(兩位)、分(兩位)、時(shí)(兩位)……以此類推。
作者:
npn
時(shí)間:
2021-11-22 08:54
無(wú)論是什么程序,至少開(kāi)啟一個(gè)定時(shí)器中斷(通常為1mS),如果沒(méi)有打開(kāi)就是新人寫的,按鍵消抖、流水燈、數(shù)碼管動(dòng)態(tài)掃描、延時(shí)任意毫秒什么,一心多用,全部交給定時(shí)器中斷實(shí)現(xiàn)。
軟件延時(shí)少用或不用,一般只有驅(qū)動(dòng)DS18B20、WS2812B等芯片才使用,其他代碼幾乎沒(méi)有,誤差不好計(jì)算且會(huì)被中斷打亂,如果大量使用就是亂成一鍋粥。
作者:
hhdsdy
時(shí)間:
2021-11-22 09:16
所謂的軟件延時(shí),是利用它的循環(huán)、計(jì)數(shù)等特征完成的,因?yàn)樾枰烤帉懗绦騺?lái)達(dá)到目的,又需要有別于NE555、CD4060之類的方法,所以才有這種說(shuō)法的,而單片機(jī)本身是不具有直接延時(shí)的功能,就是定時(shí)器延時(shí)也是需要編寫程序的,所以單片機(jī)是不具有硬件延時(shí)功能的。
作者:
適得府君書(shū)
時(shí)間:
2021-11-22 09:25
解決閥值問(wèn)題。使用合適的進(jìn)制就行。比如說(shuō)定時(shí)器中斷為1ms,我可以設(shè)置100進(jìn)1,變量i滿100使j+1,這樣就可以,j=10為1秒,再設(shè)置一個(gè)變量y,J設(shè)置為60進(jìn)1。以此類推就可以。也不會(huì)導(dǎo)致變量溢出。
對(duì)于延時(shí)的使用,硬件延時(shí)和軟件延時(shí)沒(méi)有那個(gè)好那個(gè)不好的說(shuō)法,只要合不合適用的問(wèn)題。如果定時(shí)器多當(dāng)然使用硬件延時(shí),如果定時(shí)器少你用來(lái)做延時(shí)那你其他的就不夠用。軟件延時(shí)調(diào)試合適了也可以達(dá)到比較好的精準(zhǔn)度。
作者:
liuzx66
時(shí)間:
2021-11-22 09:59
這個(gè)問(wèn)題不在于溢出,而是你定義的這個(gè)變量類型,如果是8位的就是最大255ms,如果程序在這個(gè)時(shí)間內(nèi)不能處理,那就會(huì)造成定時(shí)不準(zhǔn)。對(duì)于溢出,直接拋棄就好。另外,8位無(wú)符號(hào)數(shù)240+30=14,不是=15
作者:
wodiaonimade111
時(shí)間:
2021-11-22 12:42
對(duì)于延時(shí)的使用,硬件延時(shí)和軟件延時(shí)沒(méi)有那個(gè)好那個(gè)不好的說(shuō)法,只要合不合適用的問(wèn)題。如果定時(shí)器多當(dāng)然使用硬件延時(shí),如果定時(shí)器少你用來(lái)做延時(shí)那你其他的就不夠用。軟件延時(shí)調(diào)試合適了也可以達(dá)到比較好的精準(zhǔn)度。
作者:
188610329
時(shí)間:
2021-11-22 13:27
先強(qiáng)調(diào)一個(gè)定義, 至少目前你在玩的單片機(jī), 是不存在硬件延時(shí)的。
在給你區(qū)分兩個(gè)概念, 延時(shí),和定時(shí)。
延時(shí): 啥也不干(表面上,其實(shí)干的很歡),等消磨一定時(shí)間后再繼續(xù)下一步。
定時(shí): 先干別的,等到時(shí)間了再干指定的事情。
延時(shí)的實(shí)現(xiàn): 通常有兩種方式,
一、通過(guò)延時(shí)函數(shù),進(jìn)行累加或者累減,達(dá)到消耗時(shí)間的目的,達(dá)成延時(shí)目的,常見(jiàn)用法有:delay(50); 等。
二、通過(guò)定時(shí)器延時(shí),利用判斷定時(shí)器標(biāo)志來(lái)達(dá)到消耗時(shí)間的目的,常見(jiàn)用法有: while(!TF0); 這里我們可以看到,在定時(shí)器延時(shí)的情況下,其實(shí)單片機(jī)也是在不停的判斷 TF0 的狀態(tài),繁忙程度和用延時(shí)函數(shù)沒(méi)有什么區(qū)別,無(wú)非是又搭上一個(gè)定時(shí)器而已。
定時(shí)的實(shí)現(xiàn): 通常也有兩種方式
一、通過(guò)定時(shí)器實(shí)現(xiàn), 通過(guò)定時(shí)器實(shí)現(xiàn)對(duì)精度要求比較高的,需要定期執(zhí)行的程序。通過(guò)這也分兩種。
1) 精度要求極高,這一類的,我們會(huì)直接在定時(shí)器中斷里面執(zhí)行,比如每10微秒讀取一次比較器的狀態(tài)位這種,
2) 精度要求不高,只是隔一段時(shí)間需要執(zhí)行一下,比如每0.5秒讀取一次RTC的時(shí)間,那么,我們通常在定時(shí)器中斷里面設(shè)置一個(gè)標(biāo)志為,比如: GetTime_Flag = 1; 然后主程序里面,通過(guò)判斷標(biāo)志位決定是否執(zhí)行, if(GetTime_Flag) {GetTime_Flag = 0; 其他執(zhí)行語(yǔ)句; }
二,通過(guò)計(jì)數(shù)方式定期執(zhí)行對(duì)時(shí)間精度幾乎沒(méi)有要求的程序。
比如,在主程序中,有些項(xiàng)目是每次循環(huán)都要執(zhí)行的有些不是,還是拿時(shí)鐘舉例子吧,在主循環(huán)體內(nèi),平時(shí)通過(guò)RTC芯片,獲取時(shí)間。但是為了精度定期要聯(lián)網(wǎng)校對(duì)時(shí)間,這個(gè)定期,對(duì)時(shí)間要求不高,我們可以每循環(huán)65536次,執(zhí)行一次網(wǎng)絡(luò)對(duì)時(shí),那么一般會(huì)聲明一個(gè)u16的變量,Adjusttime_Count,然后這么在主函數(shù)中寫:
if(--Adjusttime_Count ==0) { 需要執(zhí)行的語(yǔ)句 }
這樣也就達(dá)到了,定期執(zhí)行的目的。
所以,認(rèn)清自己的目的,選擇合適的方式是最重要的。
最后再?gòu)?qiáng)調(diào)一下: 用定時(shí)器來(lái)“延時(shí)”是毫無(wú)意義的。僅僅增加了“功耗”。
作者:
npn
時(shí)間:
2021-11-22 16:11
比如某游樂(lè)設(shè)施,一邊數(shù)碼管精準(zhǔn)計(jì)秒、流水燈的同時(shí)控制蜂鳴器放音樂(lè)和按鍵識(shí)別處理等,都離不開(kāi) 定時(shí)器中斷 。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1