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