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

📄 adc_sampling.c

📁 基于8051F实现数字电压表功能.用液晶作为显示界面,精度很高.
💻 C
字号:
/*===============================================================*/
/*函数名称: main.c                                              */
/*函数功能: 主函数,调用各模块                                   */
/*基本思想:  单端输入,定时启动,由T2定时,选择AIN0.3为ADC0转化通道                                          */
/*修改记录: 有修改记录                                          */
/*编写作者: t483-4-19chenyong                                   */
/*编写日期: 2007-4-06                                           */
/*把realvol变为ad_value                                          */
/**修改日期:2008.3.28/
/*===============================================================*/
#include  "common.h"
#include  "adc.h"
//extern float realvol;                //真实测量电压值
extern long ad_value = 0;
int kk;
int number=0;
extern bit isnewdata;
/*===============================================================*/
/*函数说明:定时器2初始化  
/*修改日期: 2008.3.27                                            */
/*===============================================================*/
void t2_initial()
{
//	CKCON= 0x20;             // T2时钟为系统时钟
//	T2CON= 0x04;             // T2为16bit定时器模式,并启动定时器运行
	SFRPAGE = 0x00;
	TMR2CF = 0x00;			   /*采用系统时钟12分频*/
	TMR2CN = 0x00;			   /*定时器模式,自动重载*/
	CKCON = 0x00;                /*采用系统时钟12分频*/
//	RCAP2H = 0x00;               /*Init reload values*/
//  RCAP2L= 0x00;              /*Init reload values*/
//	SFRPAGE = 0x00;
//	TMR2L = 0x00;
//	TMR2H = 0x00;			  /*定时初始化*/
//	IE|=0x20;                 /* T2中断使能 ET2=1 */

}

/*===============================================================*/
/*函数说明:因为是用定时器2益处,中断来启动adc转换               */
/*入口参数:
            t2reload---------------------------------定时脉冲数目*/
/*修改日期: 2008.3.27                                            */
/*===============================================================*/
void t2_baud(uint t2reload)
{                            //每隔t2reload个T2时钟,产生一次定时溢出

//	RCAP2H=(~t2reload+1)/256;//相当于65536-t2reload
//	RCAP2L=(~t2reload+1)%256;
//	TH2=RCAP2H;
//	TH2=RCAP2L;
	SFRPAGE = 0x00;
	RCAP2H = (~t2reload+1)/256;     /*Init reload values*/
    RCAP2L = (~t2reload+1)%256;     /*Init reload values*/
	SFRPAGE = 0x00;
	TMR2H = RCAP2H;
	TMR2L = RCAP2L;			  /*装载初值*/
//	TF2=0;					  /*T2没有溢出*/
//	TR2=1;		              //启动定时器2 
	TMR2CN |=0x04;			  /*启动定时器2 */
}
/*===============================================================*/
/*函数说明:选择ADC输入的模拟通道    			                 */
/*入口参数:
            source----------------------为ADC0通道选择(共有9个通道)
            type-------------------配置测量方式为差动还是单端输入*/
/*===============================================================*/

void adc0_mux(uchar type,uchar source){

	SFRPAGE = 0x00;
	AMX0CF=type;     //AIN67IC,AIN45IC,AIN23IC,AIN01IC,0为单端输入。  
	AMX0SL=source;	 //选择AD输入通道的,有9个,其中第9通道是内部温度输入 /*0000B-0111B通道*/
					 /*source = 3选择AIN0.3*/

}								

/*===============================================================*/
/*函数说明:ADC0的初始化函数         			                 */
/*修改记录:	有修改记录											 */
/*修改时间:2008.3.28                       						 */
            
            
/*===============================================================*/

void adc0_initial()
{
	char SFRPAGE_SAVE = SFRPAGE;     // Preserve current SFR page
	
	SFRPAGE = ADC0_PAGE;
	
	ADC0CF=0x0f;     //ADC0时钟为系统时钟2(/*1*1+1=2*/)分频,PGA增益为0.5/*ADC 0 CONFIGURATION */
	ADC0CN=0x8c;     //AD0TM=0,ADC0为连续跟踪模式,由T2溢出率启动ADC0/*ADC0开启,必须使BIASE置1*//*ADC 0 CONTROL */
    
	SFRPAGE = ADC0_PAGE; //AD0LJST=0,数据存储格式右对齐,即ADC0H存放12bit高四位
	REF0CN&=0x0f;    //AD0VRS=0,ADC0参考电压为VREFA
	REF0CN|=0x07;    //TEMPE=1,内部温度传感器工作/*ADC/DAC工作,须将此位置1	,内部参考电压输出开启*/
	/* 
	   REFBE=1,内部参考电平工作,电路部分须将VREF参考输出(C8051F40的第12管脚)与	VREF0(C8051F040的16管脚相连,
	   并最好并联一个4.7uF和0.1uF的旁路电容以电平滤波
	*/
	SFRPAGE = SFRPAGE_SAVE;          // Restore SFR page.	

	adc0_mux(0x08,3);//PORT3IC=1,ADC0 6、7通道为差动模式 /*P3奇数位和偶数位成差动输入模式*/
	                 //AIN0.0-AIN0.3均为单端模式   /*HVDA为单端输入模式,送入ADC0转换的信号为HVDA输出与AGND之间的电平*/
	                 //选择AIN0.1为ADC0转化通道	/* 最高电平不要超过3.6V,否则可能会烧坏AD转换器 */
	EIE2|=0x02;    //开ADC0中断	
	t2_initial();
	t2_baud(2000);   //每隔4000个T2时钟产生一次ADC0采样
//	TR2=1;			  /*T2的优先级高于ADC0的优先级*/ /*T2溢出,启动ADC0转换*/
	
}

void ADC0_ISR() interrupt 15
{
    number++;
	if(number==1)
	{ 
	  AD0INT=0;	      /*ADC0转换尚未完毕*/
	  SFRPAGE=0x00;
	  kk=ADC0VAL;	  /*ADC0 Data Word 16位*/
//	  realvol=(long)kk*ADJRATESE;
	  ad_value = (long)kk*ADJRATESE;
	/*
	  ADC0转化值乘以单端电平系数,其结果为电平真实值乘以100000
	*/	
	 number = 0;
	 isnewdata=1;
	}	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -