如果说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,欢迎探讨应广单片机开发技巧!谢谢!