STC單片機(jī)應(yīng)用在看門(mén)狗程序中的解析是什么
STC單片機(jī)是一款增強(qiáng)型51單片機(jī),完全兼容MCS-51,還增加了新的功能,比如新增兩級(jí)中斷優(yōu)先級(jí),多一個(gè)外中斷,內(nèi)置EEPROM,硬件看門(mén)狗,具有掉電模式,512B內(nèi)存等。還支持ISP下載,不用編程器,只要一個(gè)MAX232和一些廉價(jià)的元件就能寫(xiě)程序,可擦寫(xiě)10萬(wàn)次。因此是一款很好用的單片機(jī)。
在這里,簡(jiǎn)單說(shuō)明一下其看門(mén)狗的使用。STC單片機(jī)的看門(mén)狗一旦啟動(dòng),就不能停止,其看門(mén)狗溢出時(shí)間可以利用STC單片機(jī)用戶手冊(cè)計(jì)算,其簡(jiǎn)單舉例如下:
#i nclude //STC單片機(jī)頭文件
#define uint unsigned int
#define uchar unsigned char
sbit led=P1^0;
//=================================================================
// 函數(shù)名稱 :void delay (uint us)
// 函數(shù)功能 :延時(shí)
// 入口參數(shù) :us 延時(shí)時(shí)間的長(zhǎng)短
// 出口參數(shù) :無(wú)
//=================================================================
void delay (uint us)
{
while(us--);
}
main()
{
WDT_CONTR=0x3c; //啟動(dòng)看門(mén)狗
led=1; //點(diǎn)亮LED
delay(100);
led=0;
delay(100); //熄滅LED
while(1)
{
WDT_CONTR=0x3c; //喂狗,若屏蔽掉該位,則看門(mén)狗溢出后復(fù)位,LED燈不停閃爍
}
}
在工業(yè)控制/汽車(chē)電子/航空航天等需要高可靠行的系統(tǒng)中,為了防止“系統(tǒng)在異常情況下,受到干擾,MCU/CPU程序跑飛,導(dǎo)致系統(tǒng)長(zhǎng)時(shí)間異常工作”,通常是引進(jìn)看門(mén)狗,如果MCU/CPU不在規(guī)定的時(shí)間內(nèi)按要求訪問(wèn)看門(mén)狗,就認(rèn)為MCU/CPU處于異常狀態(tài),看門(mén)狗就會(huì)強(qiáng)迫MCU/CPU復(fù)位,使系統(tǒng)重新從頭開(kāi)始按規(guī)律執(zhí)行用戶程序。看門(mén)狗復(fù)位狀態(tài)結(jié)束后,不影響特殊功能寄存器IAP_ONTR中SWBS/IAP_ONTR.6位的值,單片機(jī)根據(jù)復(fù)位前SWBS/IAP_ONTR.6的值選擇是從用戶應(yīng)用程序區(qū)啟動(dòng),還是從系統(tǒng)ISP監(jiān)控程序區(qū)啟動(dòng)。如果看門(mén)狗復(fù)位前SWBS/IAP_ONTR.6的值為0,則看門(mén)口復(fù)位狀態(tài)結(jié)束后單片機(jī)從系統(tǒng)ISP監(jiān)控程序區(qū)啟動(dòng)??撮T(mén)狗復(fù)位是熱啟動(dòng)復(fù)位中的軟復(fù)位之一。
工作原理:看門(mén)狗實(shí)際上是一個(gè)定時(shí)器或計(jì)數(shù)器,簡(jiǎn)稱WDT。單片機(jī)運(yùn)行工作中,看門(mén)狗會(huì)對(duì)單片機(jī)機(jī)器周期脈沖不停計(jì)數(shù),當(dāng)單片機(jī)程序陷入死循環(huán)時(shí),單片機(jī)程序如果不能及時(shí)對(duì)看門(mén)狗的定時(shí)器復(fù)位,看門(mén)狗就會(huì)在其定時(shí)器計(jì)滿溢出時(shí)產(chǎn)生一個(gè)復(fù)位信號(hào),從而使系統(tǒng)重啟。
看門(mén)狗應(yīng)用時(shí),首先確定看門(mén)狗計(jì)數(shù)器的位數(shù),然后參考計(jì)數(shù)脈沖周期計(jì)算出看門(mén)狗計(jì)數(shù)溢出所需的時(shí)間T,喂狗程序 喂狗時(shí)間要小于T,這樣隔一段時(shí)間喂一次狗,只要程序正常運(yùn)行,看門(mén)狗定時(shí)器就不會(huì)溢出。一旦出現(xiàn)程序死循環(huán)故障,喂狗程序失敗,不能對(duì)看門(mén)狗定時(shí)器及時(shí)清零,就會(huì)導(dǎo)致計(jì)時(shí)器溢出,重啟系統(tǒng)。
對(duì)于T1我們用來(lái)監(jiān)控主程序的運(yùn)行,我們給T1設(shè)定一定的定時(shí)時(shí)間,在主程序中對(duì)其進(jìn)行復(fù)位,如果不能在一定的時(shí)間里對(duì)其進(jìn)行復(fù)位,T1 的定時(shí)中斷就會(huì)使單片機(jī)復(fù)位。在這里T1的定時(shí)時(shí)間要設(shè)的大于主程序的運(yùn)行時(shí)間,給主程序留有一定的的余量。而T1的中斷正常與否我們?cè)儆蒚0定時(shí)中斷子程序來(lái)監(jiān)視。這樣就夠成了一個(gè)循環(huán),T0監(jiān)視T1,T1監(jiān)視主程序,主程序又來(lái)監(jiān)視T0,從而保證系統(tǒng)的穩(wěn)定運(yùn)行。
(1)程序開(kāi)始后,點(diǎn)亮發(fā)光二極管后延時(shí)一段時(shí)間熄滅,延時(shí)不能過(guò)長(zhǎng),若兩次喂狗時(shí)間間程序運(yùn)行時(shí)間大于看門(mén)狗溢出時(shí)間,看門(mén)狗將復(fù)位單片機(jī),可調(diào)節(jié)這個(gè)時(shí)間,讓看門(mén)狗是否復(fù)位。
(2)喂狗時(shí)使用和設(shè)定看門(mén)狗寄存器同樣的語(yǔ)句,只要看門(mén)狗寄存器中CLR—WDT位置“1”,看門(mén)狗定時(shí)器重新計(jì)數(shù),由硬件自動(dòng)將其清零。
(3)演示為發(fā)光二極管亮后熄滅不會(huì)再亮,這說(shuō)明程序沒(méi)被復(fù)位,while循環(huán)中看門(mén)狗被正常喂狗,若將WDT_CONTR= 0x35;去掉程序?qū)?huì)不停復(fù)位,因?yàn)榭撮T(mén)狗定時(shí)器溢出復(fù)位。
軟件看門(mén)狗技術(shù)的原理和這差不多,只不過(guò)是用軟件的方法實(shí)現(xiàn),我們還是以51系列來(lái)講,我們知道在51單片機(jī)中有兩個(gè)定時(shí)器,我們就可以用這兩個(gè)定時(shí)器來(lái)對(duì)主程序的運(yùn)行進(jìn)行監(jiān)控。我們可以對(duì)T0設(shè)定一定的定時(shí)時(shí)間,當(dāng)產(chǎn)生定時(shí)中斷的時(shí)候?qū)σ粋€(gè)變量進(jìn)行賦值,而這個(gè)變量在主程序運(yùn)行的開(kāi)始已經(jīng)有了一個(gè)初值,在這里我們要設(shè)定的定時(shí)值要小于主程序的運(yùn)行時(shí)間,這樣在主程序的尾部對(duì)變量的值進(jìn)行判斷,如果值發(fā)生了預(yù)期的變化,就說(shuō)明T0中斷正常,如果沒(méi)有發(fā)生變化則使程序復(fù)位。