<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è) > 嵌入式系統 > 設計應用 > STC89C5X單片機“看門(mén)狗”原理、詳解和演示程序

STC89C5X單片機“看門(mén)狗”原理、詳解和演示程序

作者: 時(shí)間:2011-01-27 來(lái)源:網(wǎng)絡(luò ) 收藏
“看門(mén)狗定時(shí)器”是這樣一種東西,從功能上說(shuō)它可以讓微控制器在意外狀況下(比如軟件陷入死循環(huán))重新回復到系統上電狀態(tài),以保證系統出問(wèn)題的時(shí)候重啟一次。就跟我們現在用電腦一樣,死機了你就按一下reset鍵重啟一次電腦,看門(mén)狗就是負責干這個(gè)事兒的。它是52增加的一個(gè)功能,以前Intel 8031、……、AT 89C51時(shí)代片內都沒(méi)有“看門(mén)狗”功能,需要我們外擴看門(mén)狗芯片,比如X5045。

  很多人初次接觸不太理解怎么用,書(shū)上也講的含含糊糊,故意說(shuō)的很復雜很玄妙(可能是現在寫(xiě)書(shū)人的通病,生怕寫(xiě)的簡(jiǎn)單的別人覺(jué)得他沒(méi)水平)。其實(shí)要是說(shuō)明白點(diǎn):“看門(mén)狗”就是一個(gè)計數器,由于位數有限計數器能夠裝的數值是有限的(比如8位的最多裝256個(gè)數、16位的最多裝65536個(gè)數),從開(kāi)啟“看門(mén)狗”那刻起,它就開(kāi)始不停的數機器周期,數一個(gè)機器周期就計數器加1,加到計數器盛不下了(術(shù)語(yǔ)叫溢出)就就產(chǎn)生一個(gè)復位信號,重啟系統。

  注解:這里順便說(shuō)一下,一般教材上叫“看門(mén)狗定時(shí)器”,其實(shí)定時(shí)器原理還是計數器,只是計的是時(shí)鐘周期,所以我為了初學(xué)者好理解叫統一叫“計數器”,這里闡明一下。

  明白了上面的原理,我們在設計程序時(shí),先根據看門(mén)狗計數器的位數系統的時(shí)鐘周期算一下計滿(mǎn)數需要的時(shí)間,就是說(shuō)在這個(gè)時(shí)間內“看門(mén)狗”計數器是不會(huì )裝滿(mǎn)的,然后在這個(gè)時(shí)間內告訴它重新開(kāi)始計數,就是把計數器清零,這個(gè)過(guò)程叫“喂狗”,這樣隔一段時(shí)間喂一次狗,只要程序正常運行他就永遠計不滿(mǎn),一旦出現死循環(huán)之類(lèi)的故障,沒(méi)有及時(shí)來(lái)清零計數器,就會(huì )導致裝滿(mǎn)了溢出,他就重啟系統,這就是看門(mén)狗的看門(mén)原理,其實(shí)想想傻傻的、笨笨的。

  舉個(gè)例子說(shuō):8051 選用12MHz晶振,一個(gè)時(shí)鐘周期為1us,如果“看門(mén)狗計數器”是16位的,最大計數65536個(gè),那么從0開(kāi)始計到65535需要約65ms,所以我們可以在程序的50ms左右清零一次計數器(“喂狗”),讓他重新從0開(kāi)始計,再過(guò)50ms,再清,……,這樣下去只要程序正常運行,計數器永遠不會(huì )計滿(mǎn),也就永遠不會(huì )被“看門(mén)狗”復位。當然這個(gè)喂狗的時(shí)間是大家自己選的,只要不超過(guò)65ms,你選多少都可以,一般不要喂得太勤,這樣單片機運行時(shí)間浪費了,比如你1ms喂一次就太勤了,也不要說(shuō)那我65ms喂一次,這樣太邊緣,這樣抗干擾能力就下降了,最好是留一定的余量,這個(gè)就是設計者自己掌握了,我一般是讓計到90%左右就清一次。

  每種單片機的“看門(mén)狗”實(shí)現方法不盡相同,但是原理都一樣,而且“看門(mén)狗”都是啟動(dòng)了之后就不能被關(guān)閉,只能系統復位(重新斷電在上電)才能關(guān)閉。設置“看門(mén)狗”的一般步驟如下:
  1. 設置“看門(mén)狗”相關(guān)寄存器,啟動(dòng)“看門(mén)狗”;
  2. 隔一段時(shí)間清零一次,“喂狗”;
  3. 如果程序正常,一直運行;如果程序出錯,沒(méi)有按時(shí)“喂狗”,“看門(mén)狗”就在溢出的時(shí)候復位系統。

值得提一下:

  由于現在A(yíng)T89S52應用比較廣泛,所以我先說(shuō)說(shuō)ATMEL的看門(mén)狗;再說(shuō)說(shuō)本次試驗用的STC89C52RC的看門(mén)狗;注意兩個(gè)不一樣?。?!

  AT89S52單片機看門(mén)狗定時(shí)器是14位的,最大計數214=16384個(gè)數,每計16384個(gè)時(shí)鐘周期就溢出一次。也就是說(shuō)如果使用12M晶振的話(huà),至少應該在16.384ms內喂一次狗。

  STC89C5X系列單片機由于采用了“預分頻技術(shù)”,它的溢出時(shí)間是=(N*Prescale*32768)/晶振頻率(不要問(wèn)我為什么,他們就是這么設計的,我們就這么用就行)。

  • 其中N是單片機的時(shí)鐘周期,STC89C5X系列單片機提供6時(shí)鐘周期和12時(shí)鐘周期兩種時(shí)鐘周期,可以在燒寫(xiě)程序時(shí)修改;
  • Prescale是預分頻數,通過(guò)設置【看門(mén)狗控制寄存器】可以設置為2、4、8、16、32、64、128、256;怎么設置演示程序中有介紹;
  • 晶振頻率就是系統選用的晶振。

  所以如果同樣選擇12MHz晶振,使用傳統的12時(shí)鐘周期,它最小的溢出時(shí)間是(12*2*32768)/(12*106)=65.536ms,最大溢出時(shí)間是(12*256*32768)/(12*106)≈8.38s。如果選擇256分頻,也就是說(shuō)只要在8.38秒之內喂一次狗就可以了。戲謔的說(shuō):這只狗比較抗餓,J~~

  對于我們用戶(hù)來(lái)說(shuō),看門(mén)狗的時(shí)間是越長(cháng)越好,這樣可以節省更多的單片機資源,尤其是對時(shí)間要求精準的系統,如果執行過(guò)程中我們不停地“喂狗”,那么是比較浪費時(shí)間的。所以STC89C5X系列單片機的看門(mén)狗更有優(yōu)勢一些。當然這個(gè)也是個(gè)人的選擇,如果對時(shí)間要求的不苛刻的話(huà),勤喂幾次狗也沒(méi)關(guān)系。

  下面我就以STC89C52RC單片機為例說(shuō)說(shuō)典型的的看門(mén)狗程序如何寫(xiě),關(guān)于STC89C52RC單片機的“看門(mén)狗”定義請看STC89C51RC-RD單片機使用說(shuō)明。以下程序在Keil 2和Keil 3下調時(shí)通過(guò),下載在本校的實(shí)驗板上達到預期效果。STC89C52RC/54RD+/58RD+/516RD+單片機上測試正常運行。

  如果沒(méi)有我們的實(shí)驗板,請按照下面的硬件原理圖自己在最小系統上搭建一個(gè)實(shí)驗環(huán)境也很容易。

STC89C5X單片機“看門(mén)狗”原理、詳解和演示程序

圖1. STC89C52最小單片機系統+兩個(gè)指示燈

STC89C5X單片機“看門(mén)狗”原理、詳解和演示程序

圖2. 串行口接口(用于下載程序和測試本次試驗)

view source
print?
001/***************************************************************************
002程序功能:本程序演示STC看門(mén)狗程序
003程序設計:燕山大學(xué) 魯信瓊
004晶振選擇:11.0592MHz, 如果晶振不匹配,請修改延時(shí)函數參數
005承接、程序、VB/VC++上位機程序、電子產(chǎn)品軟硬件設計開(kāi)發(fā)工作
006EMail: xqlu(at)ysu.net.cn QQ: 9790335
007
008由于現在A(yíng)T89S52很流行,所以我先說(shuō)說(shuō)ATMEL的看門(mén)狗;再說(shuō)說(shuō)本次試驗用的STC89C52RC的看門(mén)狗;注意兩個(gè)不一樣?。?!
009
010★下面是關(guān)于A(yíng)TMEL-51單片機看門(mén)狗的描述
011【看門(mén)狗計數器】(watchdog timer)是一個(gè)14位的計數器,它以機器周期(晶振頻率/12)增加,當計數值計滿(mǎn)(16383/0x3FFF)了就使單片機軟復位;
012當啟動(dòng)了【看門(mén)狗計數器】之后,我們需要在它計數沒(méi)有滿(mǎn)之前復位計數器強制它不能夠溢出,這個(gè)過(guò)程稱(chēng)作喂狗。
013
014"看門(mén)狗"原理:
0151. 系統上電并不啟動(dòng)看門(mén)狗計數器,通過(guò)設置【看門(mén)狗重置寄存器(WDTRST SFR)】啟動(dòng)【看門(mén)狗計數器】,一般設置是給WDTRST寫(xiě)入0x1E和0xE1啟動(dòng);
0162. 【看門(mén)狗計數器】一旦啟動(dòng)不可停止,除非是硬件RST或者看門(mén)狗的軟復位才能使其停止;
0173. 設計程序在適當的時(shí)間喂狗一次,使其不能計滿(mǎn),程序就能不間斷執行;
0184. 如果程序中出現死循環(huán)或者執行某一步超時(shí),看門(mén)狗計數器就會(huì )計滿(mǎn)溢出,(這個(gè)時(shí)候我們認為程序沒(méi)有按照預定計劃執行--程序跑飛),則復位系統。
019
020★下面是關(guān)于STC89C5XX-51單片機看門(mén)狗的描述
021WDT_CONTR位置0xE1; [-] [-] [EN_WDT] [CLR_WDT] [IDLE_WDT] [PS2] [PS1] [PS0]
022EN_WDT: 看門(mén)狗允許位,置1啟動(dòng)看門(mén)狗,看門(mén)狗不能自動(dòng)啟動(dòng),需要設置該位后啟動(dòng),一旦啟動(dòng)不能關(guān)閉(只能系統重新上電和看門(mén)狗復位可以關(guān)閉)
023CLR_WDT: 看門(mén)狗計數器清零位,置1清零看門(mén)狗計數器,當計數器開(kāi)始重新計數,硬件清零該位。
024IDLE_WDT: 單片機IDLE模式看門(mén)狗允許位,當IDLE_WDT=1時(shí),單片機在IDLE模式(空閑模式)依然啟用看門(mén)狗
025PS2~PS0: 看門(mén)狗定時(shí)器預分頻器,下表中Prescale表示預分頻數
026PS2 PS1 PS0 Prescale
0270 0 0 2
0280 0 1 4
0290 1 0 8
0300 1 1 16
0311 0 0 32
0321 0 1 64
0331 1 0 128
0341 1 1 256
035
036看門(mén)狗溢出時(shí)間:(N*Prescale*32768)/晶振頻率,其中N表示指令周期數N=12表示12時(shí)鐘周期模式;N=6表示6時(shí)鐘周期模式
037
038關(guān)于實(shí)驗的注意事項:
0391. 本次試驗使用的是11.0592MHz晶振,設置WDT_CONTR=(0011 0100)B,32預分頻,單片機使用12指令周期模式。
040計算看門(mén)狗溢出時(shí)間:[12*32*32768/(11059200)]≈1s。
0412. 本次試驗的硬件電路很簡(jiǎn)單,就是最小系統上增加兩個(gè)LED燈,原理圖見(jiàn)正文,用戶(hù)可以很容易實(shí)現。
042***************************************************************************/
043#include REG52.H>
044sfr WDT_CONTR=0xE1; //定義特殊功能寄存器:STC單片機看門(mén)狗控制寄存器
045#define uchar unsigned char
046#define true 1
047#define false 0
048#define WEIGOU WDT_CONTR=0x34 //看門(mén)狗啟動(dòng)設置和“喂狗”操作
049sbit LED=P1^6; //信號燈,系統正常工作就一閃一閃的
050sbit LED_busy=P1^7; //工作燈,上電滅一會(huì )兒(約800ms),然后正常工作的時(shí)候一直亮著(zhù);用于指示系統是否重啟
051uchar timer0_ctr,i;
052const uchar str[]="I love !"; //定義一句話(huà),讓他從串口輸出,只有系統重啟的時(shí)候才輸出一次,所以也是用于驗證看門(mén)狗有沒(méi)有重啟系統
053
054/*************************************************************************/
055//延時(shí)函數,11.0592MHz晶振下延時(shí)約xms毫秒
056void delay_ms(unsigned xms)
057{
058unsigned x,y;
059for(x=xms; x>0; x--)
060for(y=110; y>0; y--);
061}
062/*************************************************************************/
063
064/*************************************************************************/
065//主程序初始化函數
066void InitMain()
067{
068//初始化時(shí)兩盞燈都熄滅
069LED=1;
070LED_busy=1;
071
072TMOD=0x21; //定時(shí)器0工作在方式1,作為16位定時(shí)器;定時(shí)器1工作在方式2,作為串行口波特率發(fā)生器
073TH0=0x4C; //定時(shí)器0裝初值:每隔50ms溢出一次
074TL0=0x00;
075IE=0x82; //IE=(1000 0010)B, 使能定時(shí)器0中斷
076TR0=1; //啟動(dòng)定時(shí)器0
077}
078/*************************************************************************/
079
080/*************************************************************************/
081//串行口初始化程序
082void InitCOM()
083{
084SCON=0x50; //SCON=(0101 0000)B,波特率不加倍,允許接收
085TH1=0xFD; //設置波特率=9600bps
086TL1=TH1;
087TR1=1; //啟動(dòng)定時(shí)器1
088}
089/*************************************************************************/
090
091/*************************************************************************/
092//定時(shí)器0中斷服務(wù)程序程序,控制信號燈閃爍。如果系統正常運行,信號燈1.5秒閃一次
093void Timer0_isr() interrupt 1
094{
095TH0=0x4C;
096TL0=0x00;
097timer0_ctr++;
098
099if(timer0_ctr>=30)
100{
101TR0=0; //定時(shí)器0暫停,否則再次來(lái)中斷會(huì )沖斷程序
102timer0_ctr=0;
103LED=0;
104delay_ms(100);
105LED=1;
106TR0=1; //定時(shí)器0重新啟動(dòng)
107}
108}
109/*************************************************************************/
110
111void main()
112{
113WEIGOU; //上來(lái)第一步設置看門(mén)狗定時(shí)器,并且啟動(dòng)
114InitMain();
115InitCOM();
116
117//開(kāi)機通過(guò)串口發(fā)送一次“I love !”,使用串口調試助手可以查看
118//由于在while大循環(huán)外邊,所以只要系統不重新啟動(dòng),則上電后只會(huì )發(fā)送一次,用于判斷系統是否重啟
119i=0;
120while(str[i]!='国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品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>