新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 看門狗的概念與應用以及如何用軟件實現系統的復位

        看門狗的概念與應用以及如何用軟件實現系統的復位

        作者: 時間:2017-01-10 來源:網絡 收藏

          在構成的系統中,由于的工作有可能受到來自外來電磁場的干擾而出現程序跑飛的現象,從而陷入死循環,出于對運行狀態進行實時性的監控的考慮,便產生了一種專門用于監測單片機程序運行狀態的芯片,俗稱(watch dog)

        本文引用地址:http://www.104case.com/article/201701/342704.htm

          的工作過程如下:

          芯片和單片機的一個I/O引腳相連,該I/O引腳通過單片機的程序控制,使他定時的往看門狗芯片的這個引腳送入高電平(或者是低電平)這一個程序語句是分散在單片機的其他控制語句中的,一旦單片機由于干擾造成程序跑飛而陷入死循環時,給看門狗引腳送電平的程序便不能被執行到,這時,看門狗電路就會由于得不到單片機送來的信號,便對他送入一個復位信號,使單片機從程序存儲器的起始位置重新開始執行程序,這樣便實現了單片機的自動復位

          示例代碼:

          用軟件觀察看門狗的喂狗現象:如果在while循環中屏蔽這一局,那么在看門狗的作用下,程序將會不斷

          //不斷的復位,這是看到的現象是在看門狗的作用下,led燈不斷的閃爍

          #include

          #define uchar unsigned char

          #define uint unsigned int

          sfr WDT_CONTR = 0xe1;//51系列的單片機的看門狗的位置

          sbit led1 = P1^0;

          void delayms(uint x)

          {

          uint i,j;

          for(i = x;i>0;i--)

          for(j = 110;j>0;j--);

          }

          main()

          {

          WDT_CONTR = 0x35;//0011 0101表示喂狗,時間是2.095m要喂一次

          led1 = 0;

          delayms(500);

          led1 = 1;

          while(1)

          {

          delayms(1000);

          // WDT_CONTR = 0x35;如果在while循環中屏蔽這一局,那么在看門狗的作用下,程序將會不斷

          //不斷的復位,這是看到的現象是在看門狗的作用下,led燈不斷的閃爍

          }

          }

          看門狗的寄存器為WDT_CONTR,字節地址是e1,不能位尋址,實現喂狗功能一般是在程序中插入

          sfr WDT_CONTR = 0xe1 ;

          WDT_CONTR= 0x35;//0011 0000這里可以查看專門的書籍看寄存器的相關位的設置

          用軟件實現單片機的系統復位:

          STC單片機增加了響應的硬件功能,內部的ISP/IAP控制寄存器ISP_CONTR便可以實現此功能,用戶只需要簡單的控制ISP_CONTR特殊功能寄存器中的SWBS和SWRST兩位便可以實現系統的復位

          示例代碼:

          #include

          #define uint unsigned int

          #define uchar unsigned char

          sfr ISP_CONTR = 0xe7;

          sbit dula = P2^6;

          sbit wela = P2^7;

          uchar num ,gw,sw,aa;

          uchar code table[]={0x3f,0x06,0x5b,0x4f,

          0x66,0x6d,0x7d,0x07,

          0x7f,0x6f,0x77,0x7c,

          0x39,0x5e,0x79,0x71};

          void init()//初始化函數

          {

          TMOD = 0x01;

          TH0 = (65535-50000)/256;

          TL0 = (65535-50000)%256;

          EA = 1;

          ET0 = 1;

          TR0 =1;

          }

          void delayms(uint x)//延時函數

          {

          uint i,j;

          for(i = x;i>0;i--)

          for(j=110;j>0;j--);

          }

          void display(uchar gw,uchar sw)//顯示函數

          {

          dula = 1;

          P0 = table[sw];

          dula = 0;

          P0 = 0xff;

          wela = 1;

          P0 = 0xfe;

          wela = 0;

          delayms(5);

          P0 = 0x0;//消影

          dula = 1;

          P0 = table[gw];

          dula = 0;

          P0 = 0xff;

          wela = 1;

          P0 = 0xfd;

          wela = 0;

          delayms(5);

          }

          void main()

          {

          init();

          while(1)

          {

          if(aa ==20)

          {

          aa =0;

          num++;

          if(num == 99)

          num =0;

          if(num ==10)

          {

          ISP_CONTR = 0x20;//0010 0000,操控寄存器實現軟件復位

          }

          gw = num%10;

          sw = num/10;

          }

          display(gw,sw);

          }

          }

          void timer0()interrupt 1

          {

          TH0 = (65536-50000)/256;

          TL0 = (65536-50000)%256;

          aa ++;

          }

          實驗現象,數碼管以秒速遞增,遞增到10后,系統復位,之后重新開始從0計時

          說一下STC單片機的寄存器ISP/IAP寄存器,這個寄存器的地址是E7H,不能位尋址,在這里只需要將寄存器的第五個bit設置為1,便可以實現軟件的復位

          因此代碼通常是

          sfr ISP_CONTR = 0xe7;

          ISP_CONTR = 0x20;//0010 0000



        關鍵詞: 看門狗 單片機

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 新余市| 达拉特旗| 土默特右旗| 梁山县| 开原市| 美姑县| 昌平区| 滁州市| 石屏县| 金昌市| 塘沽区| 阜宁县| 浠水县| 沅陵县| 鹤壁市| 富阳市| 东乌珠穆沁旗| 美姑县| 合川市| 高州市| 炉霍县| 永安市| 江城| 神农架林区| 宜兰市| 驻马店市| 巴彦县| 犍为县| 巴林右旗| 横山县| 庄河市| 咸丰县| 历史| 犍为县| 武威市| 鹿邑县| 唐河县| 博罗县| 来宾市| 盐边县| 翁源县|