本帖最后由 Kxuan163 于 2020-12-18 23:06 编辑
一、制作因由:
笔者开发了一个以AT89s52为MCU的家电控制系统。
在未有看门狗之前,控制系统受到来自所控对象电路通/断或电网波动之类的干扰,时有程序指针跑飞的死机异常。
为保障控制系统工作可靠稳定,决定使用看门狗(Watchdog)。
起初,试用AT89s52片内的看门狗WDT, 实践中发现WDT不可靠----当晶振受干扰而停振时,WDT失效。
决定改用抗干扰能力较强的片外看门狗。有行家提及,可选用片外狗芯片MAX708、MAX813、X25045.....
笔者手头上无该类芯片实物及资料。于是自行设计制作了本文所述的片外看门狗。
半年多以来的使用实践表明,笔者自制的这个片外看门狗有效、实用。
二、基本工作原理:
(1)在单片机程序正常运行状态:
每隔t0时间,T0中断服务程序"喂狗"一次,使它暂不"犬吠"
t0≈65毫秒,由T0初始化程序设置定(请参阅下述的程序块代码 )。
所谓"喂狗",就是由单片机PO.3引脚输出低电平信号,送至片外狗电路的U3_2脚,使狗不"犬吠"。
("喂狗"的实际细节请参阅下述的流程图)
(2)因外界干扰导致程序指针跑飞或晶振停振,不能定时喂狗:
若停止喂狗时间长达td(≈6秒),则狗"犬吠",使单片机复位,复位后恢复平定时喂狗功能。
所谓"犬吠",就是由J5_3脚输出高电平信号送至单片机RST引脚(细节请参阅下述的流程图)。
td时间长短取决于R3阻值与C2电容值的乘积,即RC充放电时间常数。
三、片外看门狗电路图:
四、片外看门狗工作流程图:
五、89s52单片机与喂狗相关的程序块:
;;--------------------------------------------
ORG 000BH ;定时器T0中断处理入口地址
AJMP T0_INT
;;--------------------------------------------
;;
;;
;;--------------------------------------------
SET_T0: ;; T0初始化,
;; 定时65ms的计数值 =65000μs/1μs =65000
;; 方式1,16位计数器,计数值 =65536-65000 =536 =218H
MOV TMOD, #01H ;; T0定时模式.方式1(16位计数器)
MOV TH0, #02H ;; 装入计数初值高字节
MOV TL0, #18H ;; 装入计数初值低字节
SETB TR0 ;; 启动T0
SETB ET0 ;; 允许T0中断
SETB EA ;; MPU开中断
RET
;;-------------------------------------------
;;
;;
;;-------------------------------------------
T0_INT: ;; T0定时中断处理程序,每隔65ms喂狗一次
CLR P0.3 ;; 89s52的P0.3引脚输出低电平
MOV TH0, #02H ;; 重装计数初值高字节
MOV TL0, #18H ;; 重装计数初值低字节
RETI
;;--------------------------------------------
|