<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è) > 嵌入式系統 > 設計應用 > 單片機通過(guò)定時(shí)器來(lái)實(shí)現多任務(wù)

單片機通過(guò)定時(shí)器來(lái)實(shí)現多任務(wù)

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò ) 收藏
單片機系統中,有許多情況下需要等待某個(gè)事件的發(fā)生,來(lái)繼續下一步操作,如果有一個(gè)任務(wù)還好說(shuō),單片機可以無(wú)限等待事件的發(fā)生,但是如果單片機要處理多個(gè)事件時(shí),這種系統一般不能實(shí)現,除非用中斷,對!用中斷,但是中斷源的數量是有限的,并且有很多中斷源是針對特殊用處,這樣能給我自由分配的中斷源就只有定時(shí)器中斷和外部中斷,如果僅使用這幾個(gè)中斷源來(lái)實(shí)現異步,這樣可實(shí)現的異步事件時(shí)非常有限的,每個(gè)中斷源完成一個(gè)異步事件,效率是相當低,大大降低了系統的性能,降低了定時(shí)器的利用率.

因此在這里我考慮使用定時(shí)器中斷來(lái)實(shí)現多個(gè)事件的異步,一個(gè)定時(shí)器如何實(shí)現多個(gè)任務(wù)的并發(fā)?

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

在這里使用一個(gè)任務(wù)一個(gè)計數器,根據任務(wù)實(shí)時(shí)性的強弱,來(lái)設計任務(wù)計數器的計數溢出值,每個(gè)任務(wù)的變量通過(guò)一個(gè)全局結構體來(lái)定義,當然這個(gè)結構體必須包括這個(gè)計數溢出值。每到一個(gè)定時(shí)器中斷,各個(gè)任務(wù)計數器都加一,然后檢查計數器是否溢出,如果計數溢出就執行相應的任務(wù),同時(shí)將此任務(wù)的計數器值清零,,如果溢出執行相應的任務(wù),如果沒(méi)有,則此任務(wù)就不執行!但一定要注意在中斷程序,千萬(wàn)不能有死循環(huán),如果有等待一定要進(jìn)行超時(shí)檢測,來(lái)避免死機!

這里舉個(gè)例子,剛剛成思路,因此寫(xiě)的不是很好!這個(gè)程序使用一個(gè)4連體數碼管顯示從DS18B20中采集的溫度值,4位連體數碼管當然只能使用動(dòng)態(tài)掃描方法來(lái)顯示數據,并且這個(gè)動(dòng)態(tài)掃描不能在主程序中執行,因為在主程序動(dòng)態(tài)掃描效果很容易收到中斷程序的影響,而使顯示效果下降,因此必須使用定時(shí)器來(lái)控制延時(shí)實(shí)現動(dòng)態(tài)掃描,但是ds18b20的讀寫(xiě)時(shí)序對延時(shí)的精度要求也是相當高的,如果在主程序中,中斷程序造成的延時(shí)必然會(huì )對ds18b20采集數據的延時(shí)精確度造成干擾,而不能采集正確的數據!因此DS18b20采集數據的程序也不能夠放在主程序中,當然我們可以使用兩個(gè)定時(shí)器來(lái)實(shí)現!這里我們使用一個(gè)定時(shí)器來(lái)實(shí)現,由于DS18B20溫度轉換時(shí)間比較長(cháng)12位精度的溫度轉換需要接近1秒的時(shí)間,這對動(dòng)態(tài)掃描是無(wú)法容忍的,可行的辦法是將啟動(dòng)轉換,讀取溫度值放在同一個(gè)中斷的不同狀態(tài),也就是在任務(wù)中實(shí)現狀態(tài)機,從而避免了在中斷中出現長(cháng)時(shí)間的等待,而影響系統的性能!以下中斷函數的具體實(shí)現:

void interrupt main_int()
{
//t0_int(&data) ;
uchar tl ,th ;
uint temp ;
if(T0IF)
{
T0IF=0 ;
(ds.count)++ ;
if(ds.count==80)
{
ds.count=0 ;
switch(ds.state)
{
case 0 :
ds.state=1 ;
init_ds18b20() ;
write_ds18b20(ROM_SKIP) ;
write_ds18b20(MEM_CONVERT) ;
break ;
case 1 :
init_ds18b20() ;
write_ds18b20(ROM_SKIP) ;
write_ds18b20(MEM_READ) ;
tl=read_ds18b20() ;
th=read_ds18b20() ;
if(!(th&0xf0))
{
th=th&0x07 ;
temp=th*256+tl ;
ds.data=temp/16 ;
}
else
{th=th&0x07 ;
temp=th*256+tl ;
ds.data=temp/16 ;
}
ds.state=0 ;
break ;
default :
ds.state=0 ;
break ;
}
}
int_display1(ds.data) ;
TMR0=210 ;
}
}



關(guān)鍵詞: 單片機定時(shí)器多任

評論


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