微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STC89C5X单片机“看门狗”原理、详解和演示程序

STC89C5X单片机“看门狗”原理、详解和演示程序

时间:01-27 来源:互联网 点击:
  •   如果没有我们的实验板,请按照下面的硬件原理图自己在最小系统上搭建一个实验环境也很容易。

    图1. STC89C52最小单片机系统+两个指示灯

    图2. 串行口接口(用于下载程序和测试本次试验)

    view source

    print?

    001/***************************************************************************

    002程序功能:本程序演示STC51单片机看门狗程序

    003程序设计:燕山大学 鲁信琼

    004晶振选择:11.0592MHz, 如果晶振不匹配,请修改延时函数参数

    005承接51单片机、PIC单片机程序、VB/VC++上位机程序、电子产品软硬件设计开发工作

    006EMail: xqlu(at)ysu.net.cn QQ: 9790335

    007

    008由于现在AT89S52很流行,所以我先说说ATMEL的看门狗;再说说本次试验用的STC89C52RC的看门狗;注意两个不一样!!!

    009

    010★下面是关于ATMEL-51单片机看门狗的描述

    011(watchdog timer)是一个14位的计数器,它以机器周期(晶振频率/12)增加,当计数值计满(16383/0x3FFF)了就使单片机软复位;

    012当启动了之后,我们需要在它计数没有满之前复位计数器强制它不能够溢出,这个过程称作喂狗。

    013

    014"看门狗"原理:

    0151. 系统上电并不启动看门狗计数器,通过设置启动,一般设置是给WDTRST写入0x1E和0xE1启动;

    0162. 一旦启动不可停止,除非是硬件RST或者看门狗的软复位才能使其停止;

    0173. 设计程序在适当的时间喂狗一次,使其不能计满,程序就能不间断执行;

    0184. 如果程序中出现死循环或者执行某一步超时,看门狗计数器就会计满溢出,(这个时候我们认为程序没有按照预定计划执行--程序跑飞),则复位系统。

    019

    020★下面是关于STC89C5XX-51单片机看门狗的描述

    021WDT_CONTR位置0xE1; [-] [-] [EN_WDT] [CLR_WDT] [IDLE_WDT] [PS2] [PS1] [PS0]

    022EN_WDT: 看门狗允许位,置1启动看门狗,看门狗不能自动启动,需要设置该位后启动,一旦启动不能关闭(只能系统重新上电和看门狗复位可以关闭)

    023CLR_WDT: 看门狗计数器清零位,置1清零看门狗计数器,当计数器开始重新计数,硬件清零该位。

    024IDLE_WDT: 单片机IDLE模式看门狗允许位,当IDLE_WDT=1时,单片机在IDLE模式(空闲模式)依然启用看门狗

    025PS2~PS0: 看门狗定时器预分频器,下表中Prescale表示预分频数

    026PS2 PS1 PS0 Prescale

    0270 0 0 2

    0280 0 1 4

    0290 1 0 8

    0300 1 1 16

    0311 0 0 32

    0321 0 1 64

    0331 1 0 128

    0341 1 1 256

    035

    036看门狗溢出时间:(N*Prescale*32768)/晶振频率,其中N表示指令周期数N=12表示12时钟周期模式;N=6表示6时钟周期模式

    037

    038关于实验的注意事项:

    0391. 本次试验使用的是11.0592MHz晶振,设置WDT_CONTR=(0011 0100)B,32预分频,单片机使用12指令周期模式。

    040计算看门狗溢出时间:[12*32*32768/(11059200)]≈1s。

    0412. 本次试验的硬件电路很简单,就是最小系统上增加两个LED灯,原理图见正文,用户可以很容易实现。

    042***************************************************************************/

    043#include REG52.H>

    044sfr WDT_CONTR=0xE1; //定义特殊功能寄存器:STC单片机看门狗控制寄存器

    045#define uchar unsigned char

    046#define true 1

    047#define false 0

    048#define WEIGOU WDT_CONTR=0x34 //看门狗启动设置和“喂狗”操作

    049sbit LED=P1^6; //信号灯,系统正常工作就一闪一闪的

    050sbit LED_busy=P1^7; //工作灯,上电灭一会儿(约800ms),然后正常工作的时候一直亮着;用于指示系统是否重启

    051uchar timer0_ctr,i;

    052const uchar str[]="I love MCU!"; //定义一句话,让他从串口输出,只有系统重启的时候才输出一次,所以也是用于验证看门狗有没有重启系统

    053

    054/*************************************************************************/

    055//延时函数,11.0592MHz晶振下延时约xms毫秒

    056void delay_ms(unsigned xms)

    057{

    058unsigned x,y;

    059for(x=xms; x>0; x--)

    060for(y=110; y>0; y--);

    061}

    062/*************************************************************************/

    063

    064/*************************************************************************/

    065//主程序初始化函数

    066void InitMain()

    067{

    068//初始化时两盏灯都熄灭

    069LED=1;

    070LED_busy=1;

    071

    072TMOD=0x21; //定时器0工作在方式1,作为16位定时器;定时器1工作在方式2,作为串行口波特率发生器

    073TH0=0x4C; //定时器0装初值:每隔50ms溢出一次

    074TL0=0x00;

    075IE=0x82; //IE=(1000 0010)B, 使能定时器0中断

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top