⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc012.c

📁 C8051AD转换程序!
💻 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 + -