單片機成長之路(51基礎篇) - 026 基於stm89c52之單片機看門狗

基於stc89c52的看門狗,代碼以下:函數

main.cui

 1 #include "stc89c5x_Quick_configuration.h"    // 自定義頭文件
 2 #include "data.h"
 3 #include "bsp_gpio.h"
 4 #include "bsp_wdt.h"
 5 
 6 void init_OS_Time(void){
 7     DATA.Time.Time_Interrupt = 1;            // 設置步長
 8     DATA.Time.Interrupt_count = 0;            // 設置單位步數
 9     DATA.Time.Time_s = 0;                    // 時間 s
10     DATA.Time.Time_h = 0;                    // 時間 h
11     DATA.Time.Time_day = 0;                    // 時間 日
12     DATA.Time.Time_month = 0;                // 時間 月
13     DATA.Time.Time_year = 0;                // 時間 年
14 }
15 
16 void main(void){
17     init_OS_Time();
18     init_WDT();
19     while(1){
20         ;
21     }
22 }

bsp_wdt.hspa

 1 #ifndef __BSP_WDT_H_
 2 #define __BSP_WDT_H_
 3 
 4 /*------------------------------ 函數實現 -------------------------------*/
 5 void Watchdog_timer_prescaler(void);      // 看門狗定時器分頻
 6 void init_WDT(void);            // 初始化看門狗
 7 
 8 // 系統寄存器配置
 9 struct OS_Register{
10     unsigned char WDT_Prescaler:3;              // 看門狗預分配係數
11 };
12 
13 #endif

bsp_wdt.c指針

 1 #include "BSP_WDT.h"
 2 #include "stc89c5x_Quick_configuration.h"
 3 #include "data.h"
 4 
 5 /*-------------------------------- 函數實現 --------------------------------*/
 6 // 看門狗分頻
 7 void Watchdog_timer_prescaler(void){
 8     if(DATA.Register_con.WDT_Prescaler > Watchdog_timer_prescaler_MAX)DATA.Register_con.WDT_Prescaler  = Watchdog_timer_prescaler_MAX;
 9     if(DATA.Register_con.WDT_Prescaler < Watchdog_timer_prescaler_MIN)DATA.Register_con.WDT_Prescaler  = Watchdog_timer_prescaler_MIN;
10     WDT_CONTR &=~0x07;                  // 清除配置
11     WDT_CONTR |=Watchdog_timer_prescaler_MAX;              // 配置
12 }
13 // 初始化看門狗
14 void init_WDT(void){
15     set_WDT_EN;                     // 打開看門狗
16     set_WDT_IDLE;                   // 打開「空閒模式」計時
17     Watchdog_timer_prescaler();     // 設置PS
18 }

data.hcode

 1 #ifndef __DATA_H__
 2 #define __DATA_H__
 3 
 4 #include "BSP_WDT.h"
 5 
 6 // 終端時鐘
 7 struct OS_DATA{
 8     struct OS_Register Register_con;    // 看門狗
 9 };
10 
11 extern struct OS_DATA DATA;
12 
13 #endif

data.cblog

1 #include "data.h"
2 #include <STC89C5xRC.H>
3 
4 struct OS_DATA DATA;

stc89c5x_Quick_configuration.h(自定義頭文件)ci

  1 /*
  2     stc89c5x_Quick_configuration.h
  3 */
  4 #ifndef __STC89C5X_QUICK_CONFIGURATION_H__
  5 #define __STC89C5X_QUICK_CONFIGURATION_H__
  6 // stc 頭文件
  7 /*--------------------------------------------------------- 寄存器 ---------------------------------------------------------*/
  8 sfr P0   = 0x80;        // 引腳寄存器 P0
  9 sfr SP   = 0x81;        // 堆棧指針
 10 sfr DPL  = 0x82;        // 數據(DPTR)指針(低)
 11 sfr DPH  = 0x83;        // 數據(DPTR)指針(高)
 12 sfr PCON = 0x87;        // 電源控制寄存器
 13 sfr TCON = 0x88;        // 定時器控制寄存器
 14 sfr TMOD = 0x89;        // 定時器工做方式寄存器
 15 sfr TL0  = 0x8A;        // 定時器0低8位寄存器
 16 sfr TL1  = 0x8B;        // 定時器1低8位寄存器
 17 sfr TH0  = 0x8C;        // 定時器0高8位寄存器
 18 sfr TH1  = 0x8D;        // 定時器1高8位寄存器
 19 sfr AUXR = 0x8E;        // 輔助寄存器(STC附加)
 20 sfr P1   = 0x90;        // 引腳寄存器 P1
 21 sfr SCON = 0x98;        // 串口控制寄存器
 22 sfr SBUF = 0x99;        // 串口數據緩衝器
 23 sfr P2   = 0xA0;        // 引腳寄存器 P2
 24 sfr AUXR1  = 0xA2;      // 輔助寄存器1(STC附加)
 25 sfr IE   = 0xA8;        // 中斷容許寄存
 26 sfr SADDR  = 0xA9;      // 從機地址控制寄存器
 27 sfr P3   = 0xB0;        // 引腳寄存器 P3
 28 sfr IPH  = 0xb7;        // 中斷優先級寄存器(STC附加)
 29 sfr IP   = 0xB8;        // 中斷優先級寄存器
 30 sfr SADEN  = 0xB9;      // 從機地址掩模寄存器
 31 sfr XICON = 0xc0;       // 輔助中斷控制器
 32 sfr T2CON  = 0xC8;      // 定時器/計數器2 控制
 33 sfr T2MOD  = 0xC9;      // 定時器/計數器2 模式
 34 sfr RCAP2L = 0xCA;      // 定時器/計數器2 從新加載/捕獲低字節
 35 sfr RCAP2H = 0xCB;      // 定時器/計數器2 從新加載/捕獲高字節
 36 sfr TL2    = 0xCC;      // 定時器/計數器2 低字節
 37 sfr TH2    = 0xCD;      // 定時器/計數器2 高字節
 38 sfr PSW  = 0xD0;        // 程序狀態字寄存器
 39 sfr ACC  = 0xE0;        // 累加器
 40 sfr WDT_CONTR = 0xe1;   // 看門狗控制寄存器
 41 sfr ISP_DATA  = 0xe2;   // ISP/IAP 數據寄存器
 42 sfr ISP_ADDRH = 0xe3;   // ISP/IAP 高8位地址寄存
 43 sfr ISP_ADDRL = 0xe4;   // ISP/IAP 低8位地址寄存
 44 sfr ISP_CMD   = 0xe5;   // ISP/IAP 命令寄存器
 45 sfr ISP_TRIG  = 0xe6;   // ISP/IAP 命令觸發寄存
 46 sfr ISP_CONTR = 0xe7;   // ISP/IAP控制寄存
 47 sfr P4   = 0xe8;        // 引腳寄存器 P4
 48 sfr B    = 0xF0;        // B寄存器
 49 
 50 /*--------------------------------------------------------- 位尋址 ---------------------------------------------------------*/
 51 // P0   0x80
 52 sbit P07 = P0^7;
 53 sbit P06 = P0^6;
 54 sbit P05 = P0^5;
 55 sbit P04 = P0^4;
 56 sbit P03 = P0^3;
 57 sbit P02 = P0^2;
 58 sbit P01 = P0^1;
 59 sbit P00 = P0^0;
 60 //TCON  0x88
 61 sbit TF1  = TCON^7;             // 定時器1溢出中斷標誌: T1溢出中斷標誌。T1被容許計數之後,從初值開始加1計數。當產生溢出時由硬件置「1」TF1,向CPU請求中斷,一直保持到CPU響應中斷時,才由 硬件清「0」(也可由查詢軟件清「0」)。
 62 sbit TR1  = TCON^6;             // 定時器1運行控制位
 63 sbit TF0  = TCON^5;             // 定時器0溢出中斷標誌
 64 sbit TR0  = TCON^4;             // 定時器0運行控制位
 65 sbit IE1  = TCON^3;             // 外部中斷1標誌 (當檢測到外部中斷1邊沿/低電平時由硬件置位該標誌。中斷處理時由硬件清零,或經過軟件清零。)
 66 sbit IT1  = TCON^2;             // 外部中斷1中斷源類型選擇位(IT1=0,INT1/P3.3引腳上的低電平信號可觸發外部中斷1。IT1=1,外部中斷1爲降低沿觸發方式。)
 67 sbit IE0  = TCON^1;             // 外部中斷0標誌
 68 sbit IT0  = TCON^0;             // 外部中斷0中斷源類型選擇位
 69 // set
 70 #define set_TCON_TF1    TF1 = 1 // 設置中斷標誌位(硬件設置)
 71 //#define 
 72 
 73 
 74 // P1   0x90
 75 sbit P17 = P1^7;
 76 sbit P16 = P1^6;
 77 sbit P15 = P1^5;
 78 sbit P14 = P1^4;
 79 sbit P13 = P1^3;
 80 sbit P12 = P1^2;
 81 sbit P11 = P1^1;
 82 sbit T2EX = P1^1;
 83 sbit P10 = P1^0;
 84 sbit T2   = P1^0;
 85 // SCON 0x98
 86 sbit SM0  = SCON^7; // alternatively "FE"
 87 sbit FE   = SCON^7;
 88 sbit SM1  = SCON^6;
 89 sbit SM2  = SCON^5;
 90 sbit REN  = SCON^4;
 91 sbit TB8  = SCON^3;
 92 sbit RB8  = SCON^2;
 93 sbit TI   = SCON^1;
 94 sbit RI   = SCON^0;
 95 // P2   0xA0
 96 sbit P27 = P2^7;
 97 sbit P26 = P2^6;
 98 sbit P25 = P2^5;
 99 sbit P24 = P2^4;
100 sbit P23 = P2^3;
101 sbit P22 = P2^2;
102 sbit P21 = P2^1;
103 sbit P20 = P2^0;
104 //IE    0xA8
105 sbit EA   = IE^7;
106 sbit EC   = IE^6;
107 sbit ET2  = IE^5;
108 sbit ES   = IE^4;
109 sbit ET1  = IE^3;
110 sbit EX1  = IE^2;
111 sbit ET0  = IE^1;
112 sbit EX0  = IE^0;
113 // P3   0xB0
114 sbit P37 = P3^7;
115 sbit P36 = P3^6;
116 sbit P35 = P3^5;
117 sbit P34 = P3^4;
118 sbit P33 = P3^3;
119 sbit P32 = P3^2;
120 sbit P31 = P3^1;
121 sbit P30 = P3^0;
122 // P3   0xB0
123 sbit RD   = P3^7;
124 sbit WR   = P3^6;
125 sbit T1   = P3^5;
126 sbit T0   = P3^4;
127 sbit INT1 = P3^3;
128 sbit INT0 = P3^2;
129 sbit TXD  = P3^1;
130 sbit RXD  = P3^0;
131 // IP   0xB8
132 // sbit PPC  = IP^6;    // 功能不明
133 sbit PT2  = IP^5;
134 sbit PS   = IP^4;
135 sbit PT1  = IP^3;
136 sbit PX1  = IP^2;
137 sbit PT0  = IP^1;
138 sbit PX0  = IP^0;
139 //XICON 0xC0
140 sbit PX3  = XICON^7;    // 置位代表外部中斷3的優先級爲高,優先級最終由[PX3H,PX3]=[0,0];[0,1];[1,0];[1,1]來決定。
141 sbit EX3  = XICON^6;    // 如被設置成1,容許外部中斷3中斷;如被清成0,禁止外部中斷3中斷。
142 sbit IE3  = XICON^5;    // 外部中斷3中斷請求標誌位,中斷條件成立後,IE3=1,可由硬件自動清零。
143 sbit IT3  = XICON^4;    // 外部中斷3中斷源類型選擇位。IT3=0,INT3/P4.2引腳上的低電平可觸發外部中斷3。IT3=1,外部中斷3爲降低沿觸發方式。
144 sbit PX2  = XICON^3;    // 置位代表外部中斷2的優先級爲高,優先級最終由[PX2H,PX2]=[0,0];[0,1];[1,0];[1,1]來決定。
145 sbit EX2  = XICON^2;    // 如被設置成1,容許外部中斷2中斷;如被清成0,禁止外部中斷2中斷。
146 sbit IE2  = XICON^1;    // 外部中斷2中斷請求標誌位,中斷條件成立後,IE2=1,可由硬件自動清零。
147 sbit IT2  = XICON^0;    // 外部中斷2中斷源類型選擇位。IT2=0,INT2/P4.3引腳上的低電平可觸發外部中斷2。IT2=1,外部中斷2爲降低沿觸發方式。
148 /*
149 STC89C52系列單片機復位之後,IE和XICON被清0,由用戶程序置「1」或 清「0」IE和XICON
150 相應的位,實現容許或禁止各中斷源的中斷申請,若使某一箇中斷源容許中斷必須同時
151 使CPU開放中斷。更新IE和XICON的內容可由位操做指令來實現(SETB BIT;CLR BIT),
152 也可用字節操做指令實現(即MOV IE,#DATA,ANL IE,#DATA;ORL IE,#DATA;MOV
153 IE,A等)。
154 */
155 //T2CON 0xC8
156 sbit TF2   = T2CON^7;
157 sbit EXF2  = T2CON^6;
158 sbit RCLK  = T2CON^5;
159 sbit TCLK  = T2CON^4;
160 sbit EXEN2 = T2CON^3;
161 sbit TR2   = T2CON^2;
162 sbit C_T2  = T2CON^1;
163 sbit CP_RL2= T2CON^0;
164 //PSW   0xD0
165 sbit CY   = PSW^7;
166 sbit AC   = PSW^6;
167 sbit F0   = PSW^5;
168 sbit RS1  = PSW^4;
169 sbit RS0  = PSW^3;
170 sbit OV   = PSW^2;
171 sbit P    = PSW^0;
172 //P4    0xE8
173 sbit P43 = P4^3;
174 sbit P42 = P4^2;
175 sbit P41 = P4^1;
176 sbit P40 = P4^0;
177 
178 /*---------------------------------------------------------------- 位定義 ----------------------------------------------------------------*/
179 /*-----------------------宏定義數據-----------------------*/
180 // bit
181 #define BIT0    (0x01<<0)
182 #define BIT1    (0x01<<1)
183 #define BIT2    (0x01<<2)
184 #define BIT3    (0x01<<3)
185 #define BIT4    (0x01<<4)
186 #define BIT5    (0x01<<5)
187 #define BIT6    (0x01<<6)
188 #define BIT7    (0x01<<7)
189 /*-------------------------------- 看門狗(0xe1) --------------------------------*/
190 /***********************************************************
191 sbit EN_WDT        = WDT_CONTR^5;        // 看門狗使能
192 sbit CLR_WDT    = WDT_CONTR^4;        // 看門狗清「0」位,當設爲「1」時,看門狗將從新計數。硬件將自動清「0」此位。
193 sbit IDLE_WDT    = WDT_CONTR^3;      // 看門狗「IDLE」模式位,當設置爲「1」時,看門狗定時器在「空閒模式」計數。當清「0」該位時, 看門狗定時器在「空閒模式」時不計數
194 sbit PS2        = WDT_CONTR^2;        // 看門狗定時器預分頻控制器 2
195 sbit PS1        = WDT_CONTR^1;      // 看門狗定時器預分頻控制器 1
196 sbit PS0        = WDT_CONTR^0;        // 看門狗定時器預分頻控制器 0
197 
198 PS2    PS1    PS0        Pre_scale預分頻        WDT Period @ 20MHz and 12 clocks mode
199 0    0    0        2                    39.3mS
200 0    0    1        4                    78.6mS
201 0    1    0        8                    157.3mS
202 0    1    1        16                    314.6mS
203 1    0    0        32                    629.1mS
204 1    0    1        64                    1.25S
205 1    1    0        128                    2.5S
206 1    1    1        256                    5S
207 看門狗溢出時間=( N x Pre_scale x 32768) / Oscillator frequency
208 ***********************************************************/
209 /******************* WDT_CONTR ***********************/
210 // set
211 #define set_WDT_EN      WDT_CONTR |=BIT5        // 打開看門狗
212 #define set_WDT_CLR     WDT_CONTR |=BIT4        // 喂狗
213 #define set_WDT_IDLE    WDT_CONTR |=BIT3        // 打開「空閒模式」計時
214 #define set_WDT_PS2     WDT_CONTR |=BIT2        // 看門狗定時器預分頻控制器 2
215 #define set_WDT_PS1     WDT_CONTR |=BIT1        // 看門狗定時器預分頻控制器 1
216 #define set_WDT_PS0     WDT_CONTR |=BIT0        // 看門狗定時器預分頻控制器 0
217 // clear
218 #define clear_WDT_EN      WDT_CONTR &=(~BIT5)   // 關閉看門狗
219 #define clear_WDT_CLR     WDT_CONTR &=(~BIT4)   // 喂狗結束,硬件自動清理爲0
220 #define clear_WDT_IDLE    WDT_CONTR &=(~BIT3)   // 看門狗定時器在「空閒模式」時不計數
221 #define clear_WDT_PS2     WDT_CONTR &=(~BIT2)   // 看門狗定時器預分頻控制器 2
222 #define clear_WDT_PS1     WDT_CONTR &=(~BIT1)   // 看門狗定時器預分頻控制器 1
223 #define clear_WDT_PS0     WDT_CONTR &=(~BIT0)   // 看門狗定時器預分頻控制器 0
224 // range 
225 #define Watchdog_timer_prescaler_MIN 0          // 看門狗最小分頻係數
226 #define Watchdog_timer_prescaler_MAX 7          // 看門狗最大分頻係數
227 
228 
229 /* PCON(0x87)  電源控制寄存器 
230 SMOD:波特率選擇位。當用軟件置位SMOD,即SMOD=1,則使串行通訊方式一、二、3的波特率加倍;SMOD=0,則各工做方式的波特率加倍。復位時SMOD=0。
231 SMOD0:幀錯誤檢測有效控制位。當SMOD0=1,SCON寄存器中的SM0/FE位用於FE(幀錯誤檢測)功能;當SMOD0=0,SCON寄存器中的SM0/FE位用於SM0功能,和SM1一塊兒指定串行口的工做方式。復位時SMOD0=0
232 POF:上電覆位標誌位,單片機停電後,上電覆位標誌位爲1,可由軟件清0。實際應用:要判斷是冷啓動復位(斷電),仍是熱復位(外部復位腳輸入復位信號產生的復位,仍是內部看門狗復位,軟件復位或者其餘復位)在初始化程序中,判斷POF/PCON.4是否爲1,若是爲1,是冷啓動,將其清零。若是爲零,說明爲熱啓動。
233 GF1,GF0 :兩個通用工做標誌位,用戶能夠任意使用。
234 PD :將其置1時,進入Power Down模式,可由外部中斷低電平觸發或降低沿觸發喚醒,進入掉電模式時,內部時鐘停振,因爲無時鐘CPU、定時器、串行口等功能部件中止工做,只有外部中斷繼續工做。掉電模式可由外部中斷喚醒,中斷返回後,繼續執行原程序。掉電模式也叫停機模式,此時功耗<0.1uA。
235 IDL :將其置1,進入IDLE模式(空閒),除系統不給CPU供時鐘,CPU不執行指令外,其他功能部件􀓽仍可繼續工做,可由任何一箇中斷喚醒。
236 */
237 // set
238 #define set_PCON_SMOD   PCON |=BIT7;        // 使串口通訊方式1,2,3的波特率加倍
239 #define set_PCON_SMOD0  PCON |=BIT6;        // SCON寄存器中的SM0/FE位用於FE(幀錯誤檢測)功能
240 #define set_PCON_POF    PCON |=BIT4;        // 上電覆位標誌
241 #define set_PCON_GF1    PCON |=BIT3;        // user 自定義使用標誌位 1(公共)
242 #define set_PCON_GF0    PCON |=BIT2;        // user 自定義使用標誌位 0(公共)
243 #define set_PCON_PD     PCON |=BIT1;        // 將其置1時,進入Power Down模式
244 #define set_PCON_IDL    PCON |=BIT0;        // 進入空閒模式
245 // clear
246 #define clear_PCON_SMOD   PCON &=(~BIT7);   // 各工做方式的波特率加倍。復位時SMOD=0。
247 #define clear_PCON_SMOD0  PCON &=(~BIT6);   // SCON寄存器中的SM0/FE位用於SM0功能,和SM1一塊兒指定串行口的工做方式
248 #define clear_PCON_POF    PCON &=(~BIT4);   // 上電覆位標誌
249 #define clear_PCON_GF1    PCON &=(~BIT3);   // user 自定義使用標誌位 1(公共)
250 #define clear_PCON_GF0    PCON &=(~BIT2);   // user 自定義使用標誌位 0(公共)
251 #define clear_PCON_PD     PCON &=(~BIT1);   // 將其置1時,進入Power Down模式(掉電模式)
252 #define clear_PCON_IDL    PCON &=(~BIT0);   // 不進入空閒模式
253 // get
254 #define get_PCON_SMOD   (bit)((PCON^BIT7)>>0x07)    // 獲取波特率加倍
255 #define get_PCON_SMOD0  (bit)((PCON^BIT6)>>0x06)    // 幀錯誤檢測
256 #define get_PCON_POF    (bit)((PCON^BIT4)>>0x04)    // 獲取上電覆位標誌,(1爲上電覆位,1爲非上電覆位)
257 #define get_PCON_GF1    (bit)((PCON^BIT3)>>0x03)    // 獲取 user 自定義使用標誌位 1(公共)
258 #define get_PCON_GF0    (bit)((PCON^BIT2)>>0x02)    // 獲取 user 自定義使用標誌位 1(公共)
259 #define get_PCON_PD     (bit)((PCON^BIT1)>>0x01)    // 獲取(掉電模式)狀態標誌位
260 #define get_PCON_IDL    (bit)((PCON^BIT0)>>0x00)    // 獲取空閒模式標誌位
261 
262 
263 
264 
265 
266 
267 #endif
相關文章
相關標籤/搜索