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
}
}
}
芯片是stc15f104e吗?你去下载最新的手册看看吧,这个芯片因为出现很多bug已经停产,现在用stc15w104替代 本帖最后由 dzahz666 于 2013-9-18 23:55 编辑
谢谢楼上的,官网上找不到手册,可以直接替代吗? {:sweat:}中断服务程序里居然用死循环 BXAK 发表于 2013-9-19 16:50 static/image/common/back.gif
中断服务程序里居然用死循环
因为一进入死循环,控制电路就断电了,进入死循环的目的就是断电瞬间防止误动作
页:
[1]