13.2.6 看门狗定时器的仿真

目前,大多数单片机都内置有看门狗定时器。当程序正常运行的时候,看门狗定时器将定时清零。如果遇到系统故障,导致程序跑飞,则看门狗定时器将得不到及时的清零,此时,看门狗定时器溢出,引起系统复位。使用看门狗定时器可以增加软件的可靠性,KeilµVision3集成开发环境对看门狗定时器提供了仿真支持。

1.看门狗定时器的仿真界面

现在大多数的单片机均集成了看门狗定时器,可以防止程序跑飞。这里以AT89S52单片机的看门狗定时器为例进行介绍,其他类型的单片机中,看门狗定时器的仿真操作类似。在KeilµVision3集成开发环境中,看门狗定时器的仿真界面如图13.41所示,其中包含如下两项。

13.2.6 看门狗定时器的仿真 - 图1

图 13.41 看门狗定时器的仿真界面

❑“WDTRST”文本框显示了看门狗寄存器中的值。对于AT89S52单片机,在程序初始化时,向看门狗寄存器中先写入0x1E,然后再写入0xE1,即可启动AT89S52的看门狗定时器。

❑“Timer”显示了当前看门狗定时器中的计数值,当计数到8191时将溢出,随即强制复位单片机。因此,应该在溢出之前清零看门狗定时器。如果该值显示为“<Off>”,则表示看门狗定时器未启动。

2.看门狗定时器的仿真

下面通过实例介绍KeilµVision3集成开发环境中看门狗定时器的仿真操作。具体仿真操作步骤如下。

(1)按照前面的方法,新建一个工程,选择Atmel公司的AT89S52单片机。

(2)选择“File”→“New”命令,新建一个程序文件,并保存为*.C文件,在其中输入如下的程序源代码。


include<reg52.h>

sfr WDTRST=0xA6;//声明看门狗定时器

void main()//主函数

{

int i;

WDTRST=0x1E;//启动看门狗定时器

WDTRST=0xE1;

while(1)//主循环

{

if(P2==0x01)

{

for(i=0;i<200;i++);//短延时

}

else if(P2==0x02)

{

for(i=0;i<20000;i++);//长延时,模拟软件故障

}

else

{

}

WDTRST=0x1E;//喂看门狗

WDTRST=0xE1;

}

}


在该程序中,首先启动看门狗定时器,然后在while主循环中判断P2端口的值,当P2端口为0x01时,执行一个短延时,然后喂看门狗定时器;当P2端口为0x02时,执行一个长时间的延时程序,模拟单片机的软件故障,此时看门狗定时器无法在指定的时间内清零,将强制单片机复位。

(3)选择“Debug”→“Start/Stop Debug Session”命令,进入程序仿真调试模式。

(4)选择“Peripherals”→“Timer”→“Watchdog”命令,打开看门狗定时器仿真界面。

(5)选择“Peripherals”→“I/O-Ports”→“Port 2”命令,打开并行I/O端口P2的仿真界面。

(6)选择“Debug”→“Run”命令,程序便开始仿真执行。此时,看门狗定时器开始运行,如图13.42所示。

(7)当手工置P1端口为0x02时,由于长时间延时的作用,看门狗定时器无法及时清理,将强制单片机复位,如图13.43所示。此时,可以从CPU寄存器界面中看到CPU的复位操作。

13.2.6 看门狗定时器的仿真 - 图2

图 13.42 看门狗定时器开始运行

13.2.6 看门狗定时器的仿真 - 图3

图 13.43 看门狗定时器未能及时清零

(8)当仿真完成后,选择“Debug”→“Stop Running”命令,便可以结束程序的仿真运行。

(9)选择“Debug”→“Start/Stop Debug Session”命令,可以退出程序仿真调试模式。