选择,如果对时间要求的不苛刻的话,勤喂几次狗也没关系。
下面我就以STC89C52RC单片机为例说说典型的51单片机的看门狗程序如何写,关于STC89C52RC单片机的“看门狗”定义请看STC89C51RC-RD单片机使用说明。以下程序在Keil 2和Keil 3下调时通过,下载在本校的实验板上达到预期效果。STC89C52RC/54RD+/58RD+/516RD+单片机上测试正常运行。
如果没有我们的实验板,请按照下面的硬件原理图自己在最小系统上搭建一个实验环境也很容易。
图1. STC89C52最小单片机系统+两个指示灯
图2. 串行口接口(用于下载程序和测试本次试验)
view source
print?001 | /*************************************************************************** |
002 | 程序功能:本程序演示STC51单片机看门狗程序 |
004 | 晶振选择:11.0592MHz, 如果晶振不匹配,请修改延时函数参数 |
005 | 承接51单片机、PIC单片机程序、VB/VC++上位机程序、电子产品软硬件设计开发工作 |
006 | EMail: xqlu(at)ysu.net.cn QQ: 9790335 |
008 | 由于现在AT89S52很流行,所以我先说说ATMEL的看门狗;再说说本次试验用的STC89C52RC的看门狗;注意两个不一样!!! |
010 | ★下面是关于ATMEL-51单片机看门狗的描述 |
011 | (watchdog timer)是一个14位的计数器,它以机器周期(晶振频率/12)增加,当计数值计满(16383/0x3FFF)了就使单片机软复位; |
012 | 当启动了之后,我们需要在它计数没有满之前复位计数器强制它不能够溢出,这个过程称作喂狗。 |
015 | 1. 系统上电并不启动看门狗计数器,通过设置启动,一般设置是给WDTRST写入0x1E和0xE1启动; |
016 | 2. 一旦启动不可停止,除非是硬件RST或者看门狗的软复位才能使其停止; |
017 | 3. 设计程序在适当的时间喂狗一次,使其不能计满,程序就能不间断执行; |
018 | 4. 如果程序中出现死循环或者执行某一步超时,看门狗计数器就会计满溢出,(这个时候我们认为程序没有按照预定计划执行--程序跑飞),则复位系统。 |
020 | ★下面是关于STC89C5XX-51单片机看门狗的描述 |
021 | WDT_CONTR位置0xE1; [-] [-] [EN_WDT] [CLR_WDT] [IDLE_WDT] [PS2] [PS1] [PS0] |
022 | EN_WDT: 看门狗允许位,置1启动看门狗,看门狗不能自动启动,需要设置该位后启动,一旦启动不能关闭(只能系统重新上电和看门狗复位可以关闭) |
023 | CLR_WDT: 看门狗计数器清零位,置1清零看门狗计数器,当计数器开始重新计数,硬件清零该位。 |
024 | IDLE_WDT: 单片机IDLE模式看门狗允许位,当IDLE_WDT=1时,单片机在IDLE模式(空闲模式)依然启用看门狗 |
025 | PS2~PS0: 看门狗定时器预分频器,下表中Prescale表示预分频数 |
036 | 看门狗溢出时间:(N*Prescale*32768)/晶振频率,其中N表示指令周期数N=12表示12时钟周期模式;N=6表示6时钟周期模式 |
039 | 1. 本次试验使用的是11.0592MHz晶振,设置WDT_CONTR=(0011 0100)B,32预分频,单片机使用12指令周期模式。 |
040 | 计算看门狗溢出时间:[12*32*32768/(11059200)]≈1s。 |
041 | 2. 本次试验的硬件电路很简单,就是最小系统上增加两个LED灯,原理图见正文,用户可以很容易实现。 |
042 | ***************************************************************************/ |
044 | sfr WDT_CONTR=0xE1;//定义特殊功能寄存器:STC单片机看门狗控制寄存器 |
045 | #define uchar unsigned char |
048 | #define WEIGOU WDT_CONTR=0x34 //看门狗启动设置和“喂狗”操作 |
049 | sbit LED=P1^6;//信号灯,系统正常工作就一闪一闪的 |
050 | sbit LED_busy=P1^7;//工作灯,上电灭一会儿(约800ms),然后正常工作的时候一直亮着;用于指示系统是否重启 |
052 | constuchar str[]="I love MCU!";//定义一句话,让他从串口输出,只有系统重启的时候才输出一次,所以也是用于验证看门狗有没有重启系统 |
054 | /*************************************************************************/ |
055 | //延时函数,11.0592MHz晶振下延时约xms毫秒 |
056 | voiddelay_ms(unsigned xms) |
062 | /*************************************************************************/ |
064 | /*************************************************************************/ |