imfv 发表于 2013-11-14 00:52:24

关于STC单片机看门狗的疑问

本帖最后由 imfv 于 2013-11-14 00:54 编辑

做一个东西需要用到看门狗,测试了一下狗,不能正常工作,程序里开了狗,在不喂狗的情况下,狗不能让程序重新启动,只能在ISP里选择打开狗的情况下才能启动狗,可是问题又来了,通过ISP打开狗了之后,无论怎么喂狗,狗还是会让程序重新启动。
程序中所用的单片机为STC12C5612AD,晶振为11.0592M,程序如下:
#include<reg51.h>
#define uint unsigned int
sbit led1=P2^3;
sbit led2=P2^0;       
sbit led3=P2^1;       
sbit led4=P2^2;
sfr WDT_CONTR=0xef;
void delay(uint Time);
void main()
{
        led1=0;
        delay(100);
        led2=0;
        delay(100);
        led3=0;
        WDT_CONTR=0x3f;
        delay(100);
        led4=0;
        delay(100);
        led1=1;
        delay(100);
        WDT_CONTR=0x3f;
        led2=1;
        delay(100);
        led3=1;
        delay(100);       
        led4=1;
        while(1)
        {
                WDT_CONTR=0x3f;
                led1=0;
                delay(1000);
                led1=1;
                led2=0;
                delay(1000);
                led2=1;
                led3=0;
                WDT_CONTR=0x3f;
                delay(1000);
                led3=1;
                led4=0;
                delay(1000);
                led4=1;                                                       
        }
}
void delay(uint time)
{
uint j;
for(;time>0;time--)
        {
                j=1000;
                while(j--);
        }
}

xpxp 发表于 2013-11-14 01:38:49

谁告诉你WDT_CONTR=0xef?
看手册。

xiaobendan001 发表于 2013-11-14 09:03:24

STC的几款芯片的喂狗指令都不太一样吧,好像,没有用过。

imfv 发表于 2013-11-14 10:14:38

xpxp 发表于 2013-11-14 01:38 static/image/common/back.gif
谁告诉你WDT_CONTR=0xef?
看手册。


这里是看门狗控制寄存器设置,我想让它工作在256分频,设置为0xef不知道到底对不对?到底是哪里设置的错误,还请兄弟指教,小弟新手。

virginlulu 发表于 2013-11-14 10:48:17

sfr WDT_CONTR=0xef;地址错了
sfr WDT_CONTR=0xe1;

xpxp 发表于 2013-11-14 13:52:54

本帖最后由 xpxp 于 2013-11-14 14:38 编辑

imfv 发表于 2013-11-14 10:14 static/image/common/back.gif
这里是看门狗控制寄存器设置,我想让它工作在256分频,设置为0xef不知道到底对不对?到底是哪里设置的错 ...

    你这么一说的话,还得纠正你一些认知上的错误。
   STC的单片机,使用了一些特殊的寄存器来实现特殊的功能操作,例如看门狗、ADC、IAP等等。这些“寄存器的地址”,在标准的“reg51.h”头文件中是不包含在内的,需要用sfr声明。例如sfr WDT_CONTR = 0xe1,这个0xe1就是看门狗的寄存器地址。
   古老的51单片机就相当于古老的旅馆,仅有前台、寄存处、客房、卫生间这些简陋设施。后来STC把它改装扩建了,增加了健身房、餐厅、炮房等。所以,为了让客人使用:
   sfr 健身房=501;   //健身房在501房间
   sfr 炮房=511;   //炮房在511房间
   ......
   声明之后,你就可以使用这个设施了。例如
   餐厅 = 1;    //到601房间吃一餐
   炮房 = 2;    //到511房间打两炮
   ......

   如果你使用了STC提供的头文件STC12C5630AD.H,则不需要再用sfr WDT_CONTR = 0xe1,因为在STC12C5630AD.H中已经包含了。节选头文件中的一段给你参考参考一下里面的内容:
#ifndef __STC12C5630AD_H_
#define __STC12C5630AD_H_

/////////////////////////////////////////////////

/* The following is STC additional SFR or change */

/* sfrAUXR= 0x8e; */
/* sfrIPH   = 0xb7; */

/* Watchdog Timer Register */
sfrWDT_CONTR = 0xe1;   

/* ISP_IAP_EEPROM Register */
sfr ISP_DATA= 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD   = 0xe5;
sfr ISP_TRIG= 0xe6;
sfr ISP_CONTR = 0xe7;

/* System Clock Divider */
sfr CLK_DIV= 0xc7;

/* I_O Port Mode Set Register */
sfr P0M0= 0x93;
sfr P0M1= 0x94;
sfr P1M0= 0x91;
sfr P1M1= 0x92;
sfr P2M0= 0x95;
sfr P2M1= 0x96;
sfr P3M0= 0xb1;
sfr P3M1= 0xb2;

/* SPI Register */
sfr SPSTAT= 0x84;
sfr SPCTL   = 0x85;
sfr SPDAT   = 0x86;

/* ADC Register */
sfr ADC_CONTR= 0xc5;
sfr ADC_DATA   = 0xc6;
sfr ADC_LOW2   = 0xbe;

/* PCA SFR */
sfr CCON   = 0xD8;
sfr CMOD   = 0xD9;
sfr CCAPM0 = 0xDA;
sfr CCAPM1 = 0xDB;
sfr CCAPM2 = 0xDC;

imfv 发表于 2013-11-14 14:29:22

virginlulu 发表于 2013-11-14 10:48 static/image/common/back.gif
sfr WDT_CONTR=0xef;地址错了
sfr WDT_CONTR=0xe1;

谢谢兄弟的指点,现在已经调好了。

imfv 发表于 2013-11-14 14:29:56

xpxp 发表于 2013-11-14 13:52 static/image/common/back.gif
你这么一说的话,还得纠正你另一个认知上的错误。
   STC的单片机,使用了一些特殊的寄存器来实现特 ...

谢谢兄弟的指点,现在已经调好了。

yklstudent 发表于 2013-11-15 10:28:34

mark系。。。。。。。。。。。
页: [1]
查看完整版本: 关于STC单片机看门狗的疑问