📄 adc012.c
字号:
#include <C8051F020.h>
#include <string.h>
#include ".\include\system.h"
#include ".\include\hardio.h"
#include ".\include\cmc.h"
#include ".\include\flash.h"
#include ".\include\file.h"
#include ".\include\isr.h"
#include ".\include\other.h"
#include ".\include\function.h"
#include ".\include\main.h"
#include ".\include\rflink.h"
#include ".\include\lcdMenu.h"
#include ".\include\lcdl.h"
#include ".\include\adc012.h"
//uchar idata SysWorkMode, FuctionStatus ; //System Mode and Function Mode
//uchar xdata DeviceSN[6] ;
//uint xdata MaxFlashBlocks;
unsigned int xdata AD0Result; // AIN0 results
BATFLAGS bBatFlags;
sfr16 TMR3RL = 0x92; // Timer3 reload value
sfr16 TMR3 = 0x94; // Timer3 counter
sfr16 ADC0 = 0xbe; // ADC0 data
sbit MCU_PWRA =P3^7;
sbit MCU_PWRB =P3^6;
/*=============Program Description=============*/
/* Program Name: ADC0_Init.c */
/* Program Function: ADC0_Init */
/* Device: */
/* Written by zdy. 2003.11.28(BOYU) */
/* Modified by */
/*==============================================*/
void Timer3_Init(int counts)//auto reload
{
TMR3CN=0x02;//use the SYSCLK and disable Timer3
// TMR3RLL=-counts;//the lower reload value of Timer3,
TMR3RL=-counts;//Init reload values
// TMR3H=0xFF;//high byte of Timer3
// TMR3L=0xFF;//low byte of Timer3
TMR3=0xFFFF;//set to reload immediately
//EIE2|=0xFE;//disable the interrupt of Timer3
EIE2&=0xFE;//disable the interrupt of Timer3
TMR3CN|=0x04;//start Timer3
}
char xdata CurChannel;//the current ADC channel
uint xdata VoltA,VoltB;//volt of A and B
bit bADCPending;
bit ADCFlag;
/*=============Program Description=============*/
/* Program Name: ADC0_Init.c */
/* Program Function: ADC0_Init */
/* Device: */
/* Written by zdy. 2003.12.14(BOYU) */
/* Modified by */
/*==============================================*/
void ADC0_Init (void)
{
Timer3_Init(65000);//73
bBatFlags.nValue=0x30;//low power ,power in
ADC0CN=0x04;// ADC0 disabled; normal tracking mode;
// ADC0 conversions are initiated on overflow of Timer3;
// ADC0 data is right-justified
REF0CN=0x02;// use VREF0,VREF1
CurChannel=0;
AMX0CF=0x00; //配置AIN0-7全为独立的单端输入
AMX0SL=0x00; //当AMX0CF=0时,AMX0SL=0:选择AIN0 1:选择AIN1。。。 8:选择AIN7 other:温度传感器
//ADC0CF=0x08;
ADC0CF=(SysOscRate/(SysOscRate/2)-1)<<3;//ADC0转换时钟为系统时钟的二分频。
ADC0CF&=0xF8; //内部放大器增益为1
EIE2&=0xFD;//disable ADC0 interrupt
AD0EN=1;//enable ADC0
AD0Result=0;
ADCFlag=0;
EIE2|=0x02;//enable ADCo interrupt
while(!ADCFlag);
if(VoltA<200)//VoltA less than 1.93V
{
MCU_PWRA=0;
MCU_PWRB=1;
//bBatFlags.nValue&=0xFE;
//bBatFlags.nValue|=0x20;
bBatFlags.bits.bBatACtl=0;
bBatFlags.bits.bBatBCtl=1;//use B as power
}
else
{
MCU_PWRA=1;
MCU_PWRB=0;
// bBatFlags.nValue|=0x10;
bBatFlags.bits.bBatACtl=1;
bBatFlags.bits.bBatBCtl=0;
// bBatFlags.nValue&=0xDF;
}
bADCPending=0;
}
/*=============Program Description=============*/
/* Program Name: battery.c */
/* Program Function: battery */
/* Device: */
/* Written by zdy. 2003.12.14(BOYU) */
/* Modified by zdy. 2003.12.16(BOYU) */
/*==============================================*/
uchar battery(uchar ch)
{
uchar t;
int Volt;
if(ch==0)//AIN0
{
Volt=VoltA;
}
else//AIN2
{
Volt=VoltB;
}
/* if(ch==0&&(bBatFlags.bits.bBatACtl||bBatFlags.bits.bBatBCtl))//AIN0 and using battery A now
{//if()
if(Volt<=760)
t=0;
else if(Volt<=820)
t=1;
else if(Volt<=850)
t=2;
else
t=3;
}
if(!bBatFlags.bits.bBatBCtl)//AIN2 and using battery B now
{
if(Volt<=780)
t=0;
else if(Volt<=830)
t=1;
else if(Volt<=870)
t=2;
else
t=3;
}*/
if(((ch==0)&&bBatFlags.bits.bBatACtl)||(ch&&bBatFlags.bits.bBatBCtl))//the channel was using now
{
if(Volt<=760)//
t=0;
else if(Volt<=820)
t=1;
else if(Volt<=850)
t=2;
else
t=3;
}
else
{
if(Volt<=780)
t=0;
else if(Volt<=830)
t=1;
else if(Volt<=870)
t=2;
else
t=3;
}
return t;
}
//sbit PWR_IN =P5^5;
/*=============Program Description=============*/
/* Program Name: PwrManeger.c */
/* Program Function: PwrManeger */
/* Device: */
/* Written by zdy. 2003.12.14(BOYU) */
/* Modified by zdy. 2003.12.16(BOYU) */
/*==============================================*/
void PwrManeger(void)
{
uchar flag=0;//切换标志
bBatFlags.bits.bPwrIn=(P5&0x20);
if(bADCPending)
{
if(!ADCFlag)
{
return;
}
else
bADCPending=0;
}
else
{
AD0Result=0;
ADCFlag=0;
EIE2|=0x02;
bADCPending=1;
}
bBatFlags.bits.BatAVol=(battery(0));
bBatFlags.bits.BatBVol=(battery(2));
if(bBatFlags.nValue&0x0F)//有电
{
bBatFlags.bits.LowPwr=0;
}
else//无电
{
if((VoltA<750)&&bBatFlags.bits.bBatACtl)//A低于7.5V并且正在用A
{
bBatFlags.bits.LowPwr=1;
}
//else if(VoltB<750)
else if((VoltB<750)&&bBatFlags.bits.bBatBCtl)
{
bBatFlags.bits.LowPwr=1;
}
}
if(bBatFlags.bits.bBatACtl)//正在用A
{
if(bBatFlags.bits.BatAVol==0)//A无电
{
if(bBatFlags.bits.BatBVol>=1)//B有电
{
bBatFlags.bits.bBatACtl=0;
bBatFlags.bits.bBatBCtl=1;//转到B
flag=1;
}
}
}
else if(bBatFlags.bits.bBatBCtl)
{
if(bBatFlags.bits.BatBVol==0)
{
if(bBatFlags.bits.BatAVol>=1)
{
bBatFlags.bits.bBatACtl=1;//转到A
bBatFlags.bits.bBatBCtl=0;
flag=1;
}
}
}
// flag=1;
if(flag)//切换操作
{
MCU_PWRA=1;//
MCU_PWRB=1;//保证在切换中不断电
MCU_PWRA=bBatFlags.bits.bBatACtl;
MCU_PWRB=bBatFlags.bits.bBatBCtl;
}
}
/*=============Program Description=============*/
/* Program Name: ADC0_ISR.c */
/* Program Function: ADC0_ISR */
/* Device: */
/* Written by zdy. 2003.12.14(BOYU) */
/* Modified by zdy. 2003.12.19(BOYU) */
/*==============================================*/
void ADC0_ISR (void) interrupt 15
{
static uchar nNum=0;
int iVolt;
AD0INT=0;//clear adc0 interrupt flag
iVolt=ADC0;//read the adc0 result
// AD0Result=(AD0Result*nNum+iVolt)/(nNum+1);//average
AD0Result+=iVolt;
nNum++;
if(nNum>=15)
{
AD0Result/=nNum;
nNum=0;
if(CurChannel==0)//AIN0
{
VoltA=AD0Result;
CurChannel=2;//AIN2
AMX0SL=0x02;
AD0Result=0;
}
else//AIN2
{
VoltB=AD0Result;
CurChannel=0;
AMX0SL=0x00;//AIN0
AD0Result=0;
EIE2&=0xFD;//disable ADC0 interrupt
ADCFlag=1;//AD convert has completed
}
}
}
/*=============Program Description=============*/
/* Program Name: tipbat.c */
/* Program Function: battery in using tip */
/* Device: */
/* Written by zdy. 2003.12.14(BOYU) */
/* Modified by zdy. 2003.12.16(BOYU) */
/*==============================================*/
void tipbat(uchar x, uchar y)
{
DrawBatBk(x,y);//draw battery block
DrawBatVol(x,y,0,bBatFlags.bits.BatAVol);//draw battery volt of A
DrawBatVol(x,y,1,bBatFlags.bits.BatBVol);//draw battery volt of B
if(bBatFlags.bits.bBatACtl)
{
DrawPlug(x,y);//draw the flag which indicate that that this battery in using.
}
else if(bBatFlags.bits.bBatBCtl)
{
DrawPlug(x,y+14);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -