在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STC89C5X單片機(jī)“看門狗”原理詳解

            STC89C5X單片機(jī)“看門狗”原理詳解

            作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏

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

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

            本文引用地址:http://www.biyoush.com/article/201611/321362.htm

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

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

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

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

            值得提一下:

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

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

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

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

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

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

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

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

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

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

            view source
            print?
            001/***************************************************************************
            002程序功能:本程序演示STC51單片機(jī)看門狗程序
            003程序設(shè)計(jì):燕山大學(xué) 魯信瓊
            004晶振選擇:11.0592MHz, 如果晶振不匹配,請(qǐng)修改延時(shí)函數(shù)參數(shù)
            005承接51單片機(jī)、PIC單片機(jī)程序、VB/VC++上位機(jī)程序、電子產(chǎn)品軟硬件設(shè)計(jì)開(kāi)發(fā)工作
            006EMail: xqlu(at)ysu.net.cn QQ: 9790335
            007
            008由于現(xiàn)在AT89S52很流行,所以我先說(shuō)說(shuō)ATMEL的看門狗;再說(shuō)說(shuō)本次試驗(yàn)用的STC89C52RC的看門狗;注意兩個(gè)不一樣?。?!
            009
            010★下面是關(guān)于ATMEL-51單片機(jī)看門狗的描述
            011【看門狗計(jì)數(shù)器】(watchdog timer)是一個(gè)14位的計(jì)數(shù)器,它以機(jī)器周期(晶振頻率/12)增加,當(dāng)計(jì)數(shù)值計(jì)滿(16383/0x3FFF)了就使單片機(jī)軟復(fù)位;
            012當(dāng)啟動(dòng)了【看門狗計(jì)數(shù)器】之后,我們需要在它計(jì)數(shù)沒(méi)有滿之前復(fù)位計(jì)數(shù)器強(qiáng)制它不能夠溢出,這個(gè)過(guò)程稱作喂狗。
            013
            014"看門狗"原理:
            0151. 系統(tǒng)上電并不啟動(dòng)看門狗計(jì)數(shù)器,通過(guò)設(shè)置【看門狗重置寄存器(WDTRST SFR)】啟動(dòng)【看門狗計(jì)數(shù)器】,一般設(shè)置是給WDTRST寫入0x1E和0xE1啟動(dòng);
            0162. 【看門狗計(jì)數(shù)器】一旦啟動(dòng)不可停止,除非是硬件RST或者看門狗的軟復(fù)位才能使其停止;
            0173. 設(shè)計(jì)程序在適當(dāng)?shù)臅r(shí)間喂狗一次,使其不能計(jì)滿,程序就能不間斷執(zhí)行;
            0184. 如果程序中出現(xiàn)死循環(huán)或者執(zhí)行某一步超時(shí),看門狗計(jì)數(shù)器就會(huì)計(jì)滿溢出,(這個(gè)時(shí)候我們認(rèn)為程序沒(méi)有按照預(yù)定計(jì)劃執(zhí)行--程序跑飛),則復(fù)位系統(tǒng)。
            019
            020★下面是關(guān)于STC89C5XX-51單片機(jī)看門狗的描述
            021WDT_CONTR位置0xE1; [-] [-] [EN_WDT] [CLR_WDT] [IDLE_WDT] [PS2] [PS1] [PS0]
            022EN_WDT: 看門狗允許位,置1啟動(dòng)看門狗,看門狗不能自動(dòng)啟動(dòng),需要設(shè)置該位后啟動(dòng),一旦啟動(dòng)不能關(guān)閉(只能系統(tǒng)重新上電和看門狗復(fù)位可以關(guān)閉)
            023CLR_WDT: 看門狗計(jì)數(shù)器清零位,置1清零看門狗計(jì)數(shù)器,當(dāng)計(jì)數(shù)器開(kāi)始重新計(jì)數(shù),硬件清零該位。
            024IDLE_WDT: 單片機(jī)IDLE模式看門狗允許位,當(dāng)IDLE_WDT=1時(shí),單片機(jī)在IDLE模式(空閑模式)依然啟用看門狗
            025PS2~PS0: 看門狗定時(shí)器預(yù)分頻器,下表中Prescale表示預(yù)分頻數(shù)
            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看門狗溢出時(shí)間:(N*Prescale*32768)/晶振頻率,其中N表示指令周期數(shù)N=12表示12時(shí)鐘周期模式;N=6表示6時(shí)鐘周期模式
            037
            038關(guān)于實(shí)驗(yàn)的注意事項(xiàng):
            0391. 本次試驗(yàn)使用的是11.0592MHz晶振,設(shè)置WDT_CONTR=(0011 0100)B,32預(yù)分頻,單片機(jī)使用12指令周期模式。
            040計(jì)算看門狗溢出時(shí)間:[12*32*32768/(11059200)]≈1s。
            0412. 本次試驗(yàn)的硬件電路很簡(jiǎn)單,就是最小系統(tǒng)上增加兩個(gè)LED燈,原理圖見(jiàn)正文,用戶可以很容易實(shí)現(xiàn)。
            042***************************************************************************/
            043#include
            044sfr WDT_CONTR=0xE1;//定義特殊功能寄存器:STC單片機(jī)看門狗控制寄存器
            045#define uchar unsigned char
            046#define true 1
            047#define false 0
            048#define WEIGOU WDT_CONTR=0x34 //看門狗啟動(dòng)設(shè)置和“喂狗”操作
            049sbit LED=P1^6;//信號(hào)燈,系統(tǒng)正常工作就一閃一閃的
            050sbit LED_busy=P1^7;//工作燈,上電滅一會(huì)兒(約800ms),然后正常工作的時(shí)候一直亮著;用于指示系統(tǒng)是否重啟
            051uchar timer0_ctr,i;
            052constuchar str[]="I love MCU!";//定義一句話,讓他從串口輸出,只有系統(tǒng)重啟的時(shí)候才輸出一次,所以也是用于驗(yàn)證看門狗有沒(méi)有重啟系統(tǒng)
            053
            054/*************************************************************************/
            055//延時(shí)函數(shù),11.0592MHz晶振下延時(shí)約xms毫秒
            056voiddelay_ms(unsigned xms)
            057{
            058unsigned x,y;
            059for(x=xms; x>0; x--)
            060for(y=110; y>0; y--);
            061}
            062/*************************************************************************/
            063
            064/*************************************************************************/
            065//主程序初始化函數(shù)
            066voidInitMain()
            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//串行口初始化程序
            082voidInitCOM()
            083{
            084SCON=0x50;//SCON=(0101 0000)B,波特率不加倍,允許接收
            085TH1=0xFD;//設(shè)置波特率=9600bps
            086TL1=TH1;
            087TR1=1;//啟動(dòng)定時(shí)器1
            088}
            089/*************************************************************************/
            090
            091/*************************************************************************/
            092//定時(shí)器0中斷服務(wù)程序程序,控制信號(hào)燈閃爍。如果系統(tǒng)正常運(yùn)行,信號(hào)燈1.5秒閃一次
            093voidTimer0_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
            111voidmain()
            112{
            113WEIGOU;//上來(lái)第一步設(shè)置看門狗定時(shí)器,并且啟動(dòng)
            114InitMain();
            115InitCOM();
            116
            117//開(kāi)機(jī)通過(guò)串口發(fā)送一次“I love MCU!”,使用串口調(diào)試助手可以查看
            118//由于在while大循環(huán)外邊,所以只要系統(tǒng)不重新啟動(dòng),則上電后只會(huì)發(fā)送一次,用于判斷系統(tǒng)是否重啟
            119i=0;

            <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
                • <center id="6qfwx"><dl id="6qfwx"></dl></center>