單片機成長之路(51基礎篇) - 004 STC89C52MCU 軟件實現系統復位

  用戶應用程序在運行過程中,有時會有特殊需求,需要實現單片機系統復位(熱啓動之一),傳統的8051單片機由於硬件上未支持此功能,用戶必須用軟件模擬實現,實現起來較麻煩。STC單片機增加了相應的硬件功能,內部的ISP/IAP控制寄存器ISP_CONTR便可以實現此功能。用戶只需簡單的控制ISP_CONTR特殊功能寄存器的其中兩位SWBS和SWRST就可以實現系統復位。 
ISP/IAP控制寄存器(ISP_CONTR)

STC單片機ISP/IAP控制寄存器在特殊功能寄存器中的字節地址爲E7H,不能位尋址,該寄存器用來管理和ISP/IAP相關的功能設定及是否軟件復位等。單片機復位時該寄存器全部被清0。其各位的定義如表4.3.1所示。

 

表1 ISP/IAP控制寄存器(ISP_CONTR)

 

位序號

D7

D6

D5

D4

D3

D2

D1

D0

位符號

ISPEN

SWBS

SWRST

--

--

WT2

WT1

WT0

 

 

       ISPEN:ISP/IAP 功能允許位。0:禁止ISP/IAP編程改變Flash。1:允許編程改變Flash。

       SWBS:軟件選擇從用戶應用程序區啓動(0),還是從ISP程序區啓動(1)。要與SWRST直接配合纔可以實現。

       SWRST:0:不操作;1:產生軟件系統復位,硬件自動清零。 

WT2、WT1、WT0:ISP/IAP編程時設定CPU等待的最長時間。ISP/IAP編程時可對Flash進行讀操作、寫操作、擦除操作,當進行這些操作時,時鐘將被CPU鎖定只進行這些操作,而不同的操作將會耗費CPU不同的時間,這裏我們通過人爲設定可以給CPU一個最長的等待時間,若在此時間段內相應的操作未完成,數據將丟失或錯誤。以下給出芯片廠商推薦的等待時間關係表,如表3.4.2所示:

 

表2 ISP/IAP編程CPU等待時間參考表

 

設置等待時間

CPU等待時間(機器週期)

WT2

WT1

WT0

讀操作

寫操作

擦除操作

要求系統時鐘

0

1

1

6

30

5741

小於5MHz

0

1

0

11

60

10942

小於10MHz

0

0

1

22

120

21885

小於20MHz

0

0

0

43

240

43769

小於40MHz


 

 

   SWBS與SWRST組合情況如下:

   從用戶應用程序區(AP區)軟件復位並切換到用戶應用程序區(AP區)開始執行程序:

   ISP_CONTR=00100000B,SWBS=0(選擇AP區),SWRST=1(軟復位)。

   從系統ISP監控程序區軟件復位並切換到用戶應用程序區(AP區)開始執行程序:

    ISP_CONTR=00100000B,SWBS=0(選擇AP區),SWRST=1(軟復位)。

    從用戶應用程序區(AP區)軟件復位並切換到系統ISP監控程序區開始執行程序:

   ISP_CONTR=01100000B,SWBS=1(選擇ISP區),SWRST=1(軟復位)。

    從系統ISP監控程序區軟件復位並切換到系統ISP監控程序區開始執行程序:

    ISP_CONTR=01100000B,SWBS=1(選擇ISP區),SWRST=1(軟復位)。

    本復位是整個系統復位,所有的特殊功能寄存器都會復位到初始值,I/O口也會被初始化。

    用戶應用程序區(AP區)指僅僅是用戶自己編寫的程序區。

    ISP監控程序區ISP區是指芯片出廠時就已經固化在單片機內部的一段程序,STC單片機可以進行ISP串行下載程序,這就是因爲芯片在出廠時已經在單片機內部固化了ISP引導碼,程序首次上電時先會從ISP區開始執行代碼,體現在實際實驗中時,就是我們在下載程序時,先要點擊下載軟件界面上的下載,然後再開啓單片機電源,當單片機檢測到上位機有下載程序的需要時,便啓用ISP下載功能給單片機下載程序。若經過短暫的時間沒有檢測到上位機有下載程序的需求,單片機便會從用戶應用程序區(AP區)開始執行代碼。

    接下來我們通過一個例程,爲大家演示如何使用STC單片機的軟件復位功能實現運行中的程序突然復位。

    【例】:在實驗板上實現如下描述,在數碼管前兩位顯示以秒遞增數,到增加到10時,利用STC單片機的軟件復位功能讓單片機復位。

 1 #include<reg51.h>
 2 #define uchar unsigned char//宏定義 
 3 #define uint unsigned int 
 4 sbit dula=P2^6; //段控制位 
 5 sbit wela=P2^7; //位控制位 
 6 uchar miao,fen,aa,n1,n2,n3,n4; 
 7 uchar code table[]={ //顯示編碼 
 8 0x3f,0x06,0x5b,0x4f, 
 9 0x66,0x6d,0x7d,0x07, 
10 0x7f,0x6f,0x77,0x7c, 
11 0x39,0x5e,0x79,0x71};
12 
13 void delay(uint z); //延時程序聲明 
14 void init(void);//初始化程序聲明 
15 void display(uchar n1 ,uchar n2,uchar n3,uchar n4); //顯示程序聲明
16 
17 
18 void main(){ //主程序 
19     init(); //調用初始化程序 
20     while(1){  //進入大循環 
21         if(aa==20){ //判斷是否到了1S  
22             miao++; //秒數加1 
23             if(miao==60){ //判斷是否到了60秒  
24                 miao=0; //秒數清0 
25                 fen++; //分數加1 
26                 if(fen==60){ //判斷是否到了60分 
27                     fen=0; //分數到60則清0 
28                 }
29                 n1=fen/10; //第一個數碼管顯示分的十位 
30                 n2=fen%10; //第二個數碼管顯示分的個位 
31                 n3=miao/10; //第三個數碼管顯示秒的十位 
32                 n4=miao%10; //第四個數碼管顯示秒的個位 
33             } 
34             display(n1,n2,n3,n4);
35         }
36     } 
37 }
38 
39 void delay(uint z){ //延時程序  
40     uint x,y; 
41     for(x=z;x>0;x--) 
42     for(y=110;y>0;y--);
43 }
44 
45  
46 
47 void display(uchar n1 ,uchar n2,uchar n3,uchar n4) {
48     dula=1; //開段選 
49     P0=table[n1]; //送分的十位 
50     dula=0; //關段選 
51     P0=0xff; //消隱 
52     wela=1; //開位選 
53     P0=0xfe; //選通分的十位 
54     wela=0; //關位選 
55     P0=0xff; //消隱 
56     delay(1); //延時
57 
58     dula=1; //開段選 
59     P0=table[n2]; //送分的個位 
60     dula=0; //關段選 
61     P0=0xff; //消隱 
62     wela=1; //開位選 
63     P0=0xfd; //選通分的個位 
64     wela=0; //關位選 
65     P0=0xff; //消隱 
66     delay(1); //延時
67 
68     dula=1; //開段選 
69     P0=table[n3]; //送秒的十位 
70     dula=0; //關段選 
71     P0=0xff; //消隱 
72     wela=1; //開位選 
73     P0=0xfb; //選通秒的十位 
74     wela=0; //關位選 
75     P0=0xff; //消隱 
76     delay(1); //延時
77 
78     dula=1; //開段選 
79     P0=table[n4]; //送秒的個位 
80     dula=0; //關段選 
81     P0=0xff; //消隱 
82     wela=1; //開位選 
83     P0=0xf7; //選通秒的個位 
84     wela=0; //關位選 
85     P0=0xff; //消隱 
86     delay(1); //延時 
87 }
88 
89 void init(void){
90 
91 }
92 
93 void timer0(void) interrupt 1 using 1 {
94     TH0=(65536-50000)/256; //求模 
95     TL0=(65536-50000)%256; //求餘 
96     aa++;
97 }

分析:

  (1)“sfr ISP_CONTR=0xe7;”定義ISP/IAP控制寄存器。

  (2)“ISP_CONTR=0x20;”用軟件復位到用戶應用程序區(AP區),重新開始執行程序。

  (3)從演示結果可看出,當數碼管上的數字顯示到“09”,再加一秒時,數字立即變成“00”,則說明程序復位從頭開始執行了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章