关于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--);
}
} 谁告诉你WDT_CONTR=0xef?
看手册。 STC的几款芯片的喂狗指令都不太一样吧,好像,没有用过。 xpxp 发表于 2013-11-14 01:38 static/image/common/back.gif
谁告诉你WDT_CONTR=0xef?
看手册。
这里是看门狗控制寄存器设置,我想让它工作在256分频,设置为0xef不知道到底对不对?到底是哪里设置的错误,还请兄弟指教,小弟新手。 sfr WDT_CONTR=0xef;地址错了
sfr WDT_CONTR=0xe1; 本帖最后由 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; virginlulu 发表于 2013-11-14 10:48 static/image/common/back.gif
sfr WDT_CONTR=0xef;地址错了
sfr WDT_CONTR=0xe1;
谢谢兄弟的指点,现在已经调好了。 xpxp 发表于 2013-11-14 13:52 static/image/common/back.gif
你这么一说的话,还得纠正你另一个认知上的错误。
STC的单片机,使用了一些特殊的寄存器来实现特 ...
谢谢兄弟的指点,现在已经调好了。 mark系。。。。。。。。。。。
页:
[1]