基於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