STC89C5X单片机“看门狗”原理、详解和演示程序
时间:01-27
来源:互联网
点击:
如果没有我们的实验板,请按照下面的硬件原理图自己在最小系统上搭建一个实验环境也很容易。

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

图2. 串行口接口(用于下载程序和测试本次试验)
print?001/***************************************************************************002程序功能:本程序演示STC51单片机看门狗程序003程序设计:燕山大学 鲁信琼004晶振选择:11.0592MHz, 如果晶振不匹配,请修改延时函数参数005承接51单片机、PIC单片机程序、VB/VC++上位机程序、电子产品软硬件设计开发工作006EMail: xqlu(at)ysu.net.cn QQ: 9790335007008由于现在AT89S52很流行,所以我先说说ATMEL的看门狗;再说说本次试验用的STC89C52RC的看门狗;注意两个不一样!!!009010★下面是关于ATMEL-51单片机看门狗的描述011(watchdog timer)是一个14位的计数器,它以机器周期(晶振频率/12)增加,当计数值计满(16383/0x3FFF)了就使单片机软复位;012当启动了之后,我们需要在它计数没有满之前复位计数器强制它不能够溢出,这个过程称作喂狗。013014"看门狗"原理:0151. 系统上电并不启动看门狗计数器,通过设置启动,一般设置是给WDTRST写入0x1E和0xE1启动;0162. 一旦启动不可停止,除非是硬件RST或者看门狗的软复位才能使其停止;0173. 设计程序在适当的时间喂狗一次,使其不能计满,程序就能不间断执行;0184. 如果程序中出现死循环或者执行某一步超时,看门狗计数器就会计满溢出,(这个时候我们认为程序没有按照预定计划执行--程序跑飞),则复位系统。019020★下面是关于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 Prescale0270 0 0 20280 0 1 40290 1 0 80300 1 1 160311 0 0 320321 0 1 640331 1 0 1280341 1 1 256035036看门狗溢出时间:(N*Prescale*32768)/晶振频率,其中N表示指令周期数N=12表示12时钟周期模式;N=6表示6时钟周期模式037038关于实验的注意事项: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 char046#define true 1047#define false 0048#define WEIGOU WDT_CONTR=0x34 //看门狗启动设置和“喂狗”操作049sbit LED=P1^6;//信号灯,系统正常工作就一闪一闪的050sbit LED_busy=P1^7;//工作灯,上电灭一会儿(约800ms),然后正常工作的时候一直亮着;用于指示系统是否重启051uchar timer0_ctr,i;052constuchar str[]="I love MCU!";//定义一句话,让他从串口输出,只有系统重启的时候才输出一次,所以也是用于验证看门狗有没有重启系统053054/*************************************************************************/055//延时函数,11.0592MHz晶振下延时约xms毫秒056voiddelay_ms(unsigned xms)057{058unsigned x,y;059for(x=xms; x>0; x--)060for(y=110; y>0; y--);061}062/*************************************************************************/063064/*************************************************************************/065//主程序初始化函数066voidInitMain()067{068//初始化时两盏灯都熄灭069LED=1;070LED_busy=1;071072TMOD=0x21;//定时器0工作在方式1,作为16位定时器;定时器1工作在方式2,作为串行口波特率发生器073TH0=0x4C;//定时器0装初值:每隔50ms溢出一次074TL0=0x00;075IE=0x82;//IE=(1000 0010)B, 使能定时器0中断
单片机 51单片机 MCU 单片机视频教程 单片机开发 ARM单片机 AVR单片机 PIC单片机 Atmel stm32 单片机学习 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
