;本程序用于验证 STC12C2052AD 系列单片机的看门狗及其溢出时刻计算公式
;看门狗及其溢出时刻 = (12 * Pre_scale *32768)/Oscillator frequency
WDTCR EQU 0E1H ;看门狗地址
WDT_TIME_LED EQU P1.5 ;用 P1.5 操控看门狗溢出时刻指示灯,
;看门狗溢出时刻可由该指示灯亮的时刻长度或平息的时刻长度表明
WDT_FLAG_LED EQU P1.7 ;用 P1.7 操控看门狗溢出复位指示灯, 如点亮表明为看门狗溢出复位
Last_WDT_Time_LED_Status EQU 00H ;位变量, 存储看门狗溢出时刻指示灯的上一次状况位
;WDT 复位时刻(Oscillator frequency = 18.432MHz):
;Pre_scale_Word EQU 00111100B ;清0、发动看门狗,预分频数=32 0.68S
Pre_scale_Word EQU 00111101B ;清0、发动看门狗,预分频数=64 1.36S
;Pre_scale_Word EQU 00111110B ;清0、发动看门狗,预分频数=128 2.72S
;Pre_scale_Word EQU 00111111B ;清0、发动看门狗,预分频数=256 5.44S
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN:
MOV A, WDTCR ;检测是否为看门狗复位
ANL A, #10000000B
JNZ WDT_Reset ;WDTCR.7 = 1, 看门狗复位, 跳转到看门狗复位程序
;上电复位, 冷发动, RAM 单元内容为随机值
SETB Last_WDT_Time_LED_Status ;上电复位,
;初始化看门狗溢出时刻指示灯的状况位 = 1
CLR WDT_TIME_LED ;上电复位, 点亮看门狗溢出时刻指示灯
MOV WDTCR, #Pre_scale_Word ;发动看门狗
WAIT1:
SJMP WAIT1 ;循环履行本句子(停机),等候看门狗溢出复位
;看门狗复位, 热发动, RAM 单元内容不变, 为复位前的值
WDT_Reset: ;看门狗复位, 热发动
CLR WDT_FLAG_LED ;点亮看门狗溢出复位指示灯
JB Last_WDT_Time_LED_Status, Power_Off_WDT_TIME_LED
;依据看门狗溢出时刻指示灯的上一次状况位设置 WDT_TIME_LED 灯,
;若前次亮本次就平息, 若前次平息本次就亮
CLR WDT_TIME_LED ;前次平息本次点亮看门狗溢出时刻指示灯
CPL Last_WDT_Time_LED_Status ;将看门狗溢出时刻指示灯的上一次状况位取反
WAIT2:
SJMP WAIT2 ;循环履行本句子(停机),等候看门狗溢出复位
Power_Off_WDT_TIME_LED:
SETB WDT_TIME_LED ;前次亮本次就平息看门狗溢出时刻指示灯
CPL Last_WDT_Time_LED_Status ;将看门狗溢出时刻指示灯的上一次状况位取反
WAIT3:
SJMP WAIT3 ;循环履行本句子(停机),等候看门狗溢出复位
END