dzahz666 发表于 2013-9-18 17:58:01

stc15f104 定时器计数问题

本帖最后由 dzahz666 于 2013-9-18 18:07 编辑

下面的代码中Time变量好像不能计数,电池充满一小时后不能自动关闭电源。把if(Time >= 3600)语句删除后就可以关闭电源了,但是失去了延时功能

请教大师,问题出在哪里?谢谢先。


/*************        用户系统配置        **************/

#define MAIN_Fosc                12000000L        //定义主时钟

#define D_TIMER0        1000                //选择定时器时间, us


/*************        以下宏定义用户请勿修改        **************/
//#include        "reg51.H"
#include    <stc15f104e.H>
#define        uchar        unsigned char
#define uint        unsigned int

#define freq_base                        (MAIN_Fosc / 1200)
#define Timer0_Reload                (65536 - (D_TIMER0 * freq_base / 10000))

sfr WDT_CONR = 0xc1;
       

sbit IN = P3^4;   //充电状态输入脚,1为电池未充满 0为电池充满
sbit OUT=P3^3;   //继电器控制脚

static int Time=0;



/**************** Timer初始化函数 ******************************/
void InitTimer(void)
{
        TMOD = 0x40;                //for STC15Fxxx系列        Timer0 as 16bit reload timer.
        TH0 = Timer0_Reload / 256;
        TL0 = Timer0_Reload % 256;
        ET0 = 1;
        TR0 = 1;

        EA= 1;
}




//========================================================================
// 函数: voiddelay_ms(unsigned char ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数.
// 返回: none.
// 版本: VER1.0
// 日期: 2010-12-15
// 备注:
//========================================================================
voiddelay_ms(unsigned char z)
{
    uchar i,j,k;
for(i=z;i!=0;i--)
for(j=18;j!=0;j--)
for(k=165;k!=0;k--);
}



void main(void)
{
    delay_ms(100);
        OUT=0; //关闭继电器
    WDT_CONR=0x3f;   // 清0,启动看门狗,预分频数=256,约8S(@12MHz)
   
    P3M1=0X10;//p3.4为输入脚
        P3M0=0X08;//p3.3为强推输出脚
    InitTimer();
        while(1)
        {
       WDT_CONR=0x3f;    //喂狗
      
        }
   

}


/********************** Timer0中断函数************************/
void timer0 (void) interrupt 1
{
static int add;
add++;

if( add >= 1000 )
   {
    Time++;//1秒计一次数
    add=0;
    if( IN==1 )//电池未充满
      {
           if(OUT==0)
             {
         OUT=1;//继电器启动
               }
       if(Time>36000) //充电时间大于10小时时自动关闭充电器
         {
          OUT=0;
                  EA=0;
          while(1);   //进入死循环,但此时电源已切断
              }
      }
    if(IN==0)//电池已充满
      {
          
       if(OUT==1)//继电器打开
             {//1
             if(Time >= 3600)//充满后延时1小时,进行涓流充电,然后关闭
                           {
                Time=0;
                OUT=0;//关闭继电器
                          EA=0;
                                while(1);//进入死循环,但此时电源已切断            
                           }
   
              }//1
      }

   }
}




eva015401 发表于 2013-9-18 21:48:46

芯片是stc15f104e吗?你去下载最新的手册看看吧,这个芯片因为出现很多bug已经停产,现在用stc15w104替代

dzahz666 发表于 2013-9-18 22:47:38

本帖最后由 dzahz666 于 2013-9-18 23:55 编辑

谢谢楼上的,官网上找不到手册,可以直接替代吗?

BXAK 发表于 2013-9-19 16:50:39

{:sweat:}中断服务程序里居然用死循环

dzahz666 发表于 2013-9-19 17:13:11

BXAK 发表于 2013-9-19 16:50 static/image/common/back.gif
中断服务程序里居然用死循环

因为一进入死循环,控制电路就断电了,进入死循环的目的就是断电瞬间防止误动作
页: [1]
查看完整版本: stc15f104 定时器计数问题