13.2.6 看门狗定时器的仿真
目前,大多数单片机都内置有看门狗定时器。当程序正常运行的时候,看门狗定时器将定时清零。如果遇到系统故障,导致程序跑飞,则看门狗定时器将得不到及时的清零,此时,看门狗定时器溢出,引起系统复位。使用看门狗定时器可以增加软件的可靠性,KeilµVision3集成开发环境对看门狗定时器提供了仿真支持。
1.看门狗定时器的仿真界面
现在大多数的单片机均集成了看门狗定时器,可以防止程序跑飞。这里以AT89S52单片机的看门狗定时器为例进行介绍,其他类型的单片机中,看门狗定时器的仿真操作类似。在KeilµVision3集成开发环境中,看门狗定时器的仿真界面如图13.41所示,其中包含如下两项。
图 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.42 看门狗定时器开始运行
图 13.43 看门狗定时器未能及时清零
(8)当仿真完成后,选择“Debug”→“Stop Running”命令,便可以结束程序的仿真运行。
(9)选择“Debug”→“Start/Stop Debug Session”命令,可以退出程序仿真调试模式。