;本程序用于验证 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