应广单片机比较器检测电池欠压

        如果说51单片机是通用型的单片机,那么应广单片是实用型的,适用于玩具,消费电子等产品开发.单片机内部集成了1.2V的band-gap参考电压,同时集成了比较器,这对于一些电池供电的产品,更具实用意义.

       下面我就贴上比较器应用的简单案例,如果电池未低压,那么指示灯亮.如果电池低压,那么指示灯闪烁.设置1.2V为比较器负输入.PA.4为比较器正输入.PA4需要分压电阻分压.如果使用锂电池,假如3.4V为低压,那么分压电阻接电源端选择22K,接地端设置为12K.不多说,上图,上代码

 

 

    这个代码适用于外部电阻测电压.内部电阻测电压的,请听下回分解.


#define DISABLE 0
#define ENABLE 1

#define EMPTY 0
#define FULL 1

#define ON 1
#define OFF 0

BIT     LED 	    :       PB.5;

BIT     POW_DET     :       PA.4;

#define RED_LED_ON  LED=0
#define RED_LED_OFF  LED=1
#define RED_LED_FLASH  {if(LED){LED=0;}else{ LED=1;}}


/*定时时间是否到了cinit*/
bit     FLAG_NMS;
/*计数值cinit*/
byte	count;
/*定时器初始化cinit*/
word	T16COUNTER;

word usSystick;


/*取得状态aint*/
word usPowEmpLoCnt;
word usPowEmpHiCnt;

/*ainit*/
byte ubPowEmp;
byte ubPowFul;
byte ubPowFulBak;

/*计数值Cinit*/
byte ucFlashTmrCnt;


/*比较器初始化*/
void InitCompare(void)
{
 /*b7@1=开启比较器
     b6@0=负输入大于正输入
     b5@0=比较器不用tm2_ck采样
     b4@0=比较结果没有极性相反
     b3:1@ 010=内部Band-gap电压
     b0@1=PA4输入*/
   gpcc=0b1_0_0_0_010_1;
 /*关闭数字输入*/
 $ padier	0b111_0_100_1;
}



/*冷启动初始*/
void ColdResetMem ( void )
{
	count=0;
	/*定时时间未到*/
    FLAG_NMS=0;

	ucFlashTmrCnt=0;

}



/***************************************/
void    TIME16_Init(void)
{
	/*计数值清零*/
	T16COUNTER	=488;
	/*ms标记reset*/
	FLAG_NMS	=0;
	
	/*使能定时器*/
	$	INTEN	T16;
	/*关中断*/
	INTRQ		=	0;
	
    /*停止定时器*/
   	T16M.5		=0;               

	STT16 T16COUNTER;
	
	/*计算方法16M/*/
	$	T16M	IHRC,/1,BIT11;     
}




/*工作时电源状态*/
void ResetPowStCnt(void)
{
     /*正输入PA4大于band-gap1.2V*/
	if(gpcc.6)
	{
		/*如果为0就低压*/
	    usPowEmpLoCnt=200;
	}
	/*band-gap电压大于pa4*/
	else
	{
		/*如果为0就非低压*/
		usPowEmpHiCnt=200;
	}
}

void GetPowSt(void)
{
    if(ubPowFulBak!=ubPowFul)
    {
		ubPowFulBak=ubPowFul;
		if(ubPowFul==EMPTY)
		{
			ubPowEmp=ON;
		}
		else
		{
			ubPowEmp=OFF;
			RED_LED_ON;
		}
    }
	
}


void AppInit(void)
{
   /*正输入PA4大于band-gap1.2V*/
   if(gpcc.6)
   {
	        ubPowFul=FULL;
		/*如果为0就低压*/
        usPowEmpLoCnt=200;
   }
   /*band-gap电压大于pa4*/
   else
   {
	      
	    ubPowFul=EMPTY;
	    usPowEmpHiCnt=200;
   }
	  
}
/*更新时间*/
void UpdateLedTmr(void)
{
   /*取得工作电源状态*/
   ResetPowStCnt();
		   
   /*更新led时钟*/
   if(FLAG_NMS)
   {

		if(ucFlashTmrCnt)
		{
			ucFlashTmrCnt--;
			if(!ucFlashTmrCnt)
			{
                /*在电池电量低状态下*/
                if(ubPowEmp)
                {
            		/*闪灯*/
            		RED_LED_FLASH;
            	}
			}
		}
		else
		{
			ucFlashTmrCnt=250;
		}
	    FLAG_NMS=0;
   }
}





void	FPPA0 (void)
{
   .ADJUST_IC	SYSCLK=IHRC/8,IHRC=16MHz, VDD=3.6V;
   $ CLKMD IHRC/8,En_IHRC,En_ILRC,En_WatchDog;
    byte ucTmp;
    
	/*检测输入*/
    $ POW_DET        in; 

	$ LED  out high;

    ColdResetMem();
	
    /*比较器初始*/
	InitCompare();
	
    /*定时器初始化*/
	TIME16_Init();

	ucTmp=200;
	while(ucTmp--)
	{
	   .delay 2000;
	    wdreset;
	}
    /*应用初始化*/
	AppInit();
	
	engint;
	
	while (1)
	{
	   /*更新led时间*/
       UpdateLedTmr();
	 
       GetPowSt();

	   wdreset;
	}
}


void	Interrupt ( void )
{
	pushaf;

	if ( Intrq.T16 )  
	{

		Intrq.T16	=	0;
		
		STT16 T16COUNTER;
		
		if ( count>0 )
		{
			count--;
		}
		else
		{
			count   =   9;
			/*1ms*/
			FLAG_NMS=   1;  

          
	   	    /*电平为高计数*/
	   	    if(usPowEmpHiCnt)
	   	    {
				usPowEmpHiCnt--;
				if(!usPowEmpHiCnt)
				{
					ubPowFul=FULL;
				}
	   	    }
			
			if(usPowEmpLoCnt)
	   	    {
				usPowEmpLoCnt--;
				if(!usPowEmpLoCnt)
				{
					ubPowFul=EMPTY;
				}
	   	    }
		   
    			
    	}
		usSystick++;

	}

	popaf;
}

有问题可以联系QQ:85547259,欢迎探讨应广单片机开发技巧!谢谢!

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值