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

📄 adc0_capture.c

📁 主要是关于A/D转换的程序
💻 C
字号:
//////////ADC0监控中断调试程序////////////////
/////////选择AIN0.3为ADC0转化输入,单端模式/////
//调试时可采用变位器作为ADC输入源,调节其电压观察监控中断情况//
//////adc0_capture.c///////////////////////////////////
#include "lcd.h"
#define ADC0START temppage=SFRPAGE;SFRPAGE=0x00;AD0BUSY=1;SFRPAGE=temppage
#define REAL_RATE 488L
#define ADJRATEDIF 237L
#define ADJRATESE 118L

/*
REAL_RATE为物理量转化系数,由具体对象而定
ADJRATEDIF为差动模式下,增益为0.5时ADC0转化值与真实电压的转换系数
ADJRATESE为单端输入模式下,增益为0.5时ADC0转化值与真实电压的转换系数
*/

sfr16 RCAP2=0xca;
sfr16 RCAP3=0xca;
sfr16 RCAP4=0xca;
sfr16 TMR4=0xcc;
sfr16 TMR3=0xcc;
sfr16 TMR2=0xcc;
sfr16 PCA0CP0=0xfb;
sfr16 PCA0CP1=0xfd;
sfr16 PCA0CP2=0xe9;
sfr16 PCA0CP3=0xeb;
sfr16 PCA0CP4=0xed;
sfr16 PCA0CP5=0xe1;
sfr16 ADC0VAL=0xbe;//将ADC0H-ADC0L通过sfr16实现
sfr16 ADC0GT=0xc4;
sfr16 ADC0LT=0xc6;
uchar temppage;
bit isnewdata;
bit adc_is_capture;
int kk;
long target_val;//工程量转化值
long realvol;//真实测量电压值
float temp;
void adc0_mux(uchar type,uchar source);
void adc0_source(uchar source);
void p3anolog_ini(uchar port);
void HVDA_ini(uchar gaind);
void adc0_ini();
void config();
void t2_ini();
void t2_baud(uint t2reload);
void t2_ini(){
	SFRPAGE = 0x00;
	TMR2CF = 0x08;  // T2时钟为系统时钟,计数方向为增值计数
	TMR2CN = 0x04;  // T2为16bit定时器模式,并启动定时器运行
}
void t2_baud(uint t2reload){//每隔t2reload个T2时钟,产生一次定时溢出
	SFRPAGE = 0x00;
	RCAP2=~t2reload+1;//相当于65536-t2reload
	TMR2=RCAP2;
}
void adc0_mux(uchar type,uchar source){//type 配置测量方式为差动还是单端输入
//source 为ADC0通道选择(共有9个通道)
	SFRPAGE=0x00;
	AMX0CF=type;
	AMX0SL=source;
}
void adc0_source(uchar source){//ADC0通道选择,为adc0_mux()的简化函数
	SFRPAGE=0x00;
	AMX0SL=source;
}
void p3anolog_ini(uchar port){//配置p3口模拟输入管脚
	SFRPAGE=0x00;
	AMX0PRT=port;
	SFRPAGE=0x0f;
	P3MDIN&=~port;//将相应管脚配置成模拟输入口
}
void HVDA_ini(uchar gaind){
/*高压差动放大器配置,调的只是第二级的增益,整体增益还需再乘以0.05;*/
//HVDA禁止时,HCAP+上检测到的是HVAIN+的电压
	SFRPAGE=0x00;
	HVA0CN=gaind;
}
void adc_capture(uint greater,uint less){//greater和less设置监控范围
	SFRPAGE=0x00;
	ADC0GT=greater;
	ADC0LT=less;
	AD0WINT=0;
	EIE1|=0x04;
}
void adc0_ini(){
	SFRPAGE=0x00;
	ADC0CF=0x0f;//ADC0时钟为系统时钟2分频,PGA增益为0.5
	ADC0CN=0x8c;//AD0TM=0,ADC0为连续跟踪模式,由T2溢出率启动ADC0
	//AD0LJST=0,数据存储格式右对齐,即ADC0H存放12bit高四位
	REF0CN&=0x0f;//AD0VRS=0,ADC0参考电压为VREFA
	REF0CN|=0x07;//TEMPE=1,内部温度传感器工作
	//BIASE=1,偏移产生器工作
	
	/*REFBE=1,内部参考电平工作,电路部分须将VREF参考输出(C8051F40的第12管脚)与	VREF0(C8051F040的16管脚相连,并最好并联一个4.7uF和0.1uF的旁路电容以电平滤波*/
	
	adc0_mux(0x08,3);//PORT3IC=1,ADC0 6、7通道为差动模式
	//HVDA2C=0,4、5通道为单端模式
	//AIN0.0-AIN0.3均为单端模式
	//选择AIN0.3为ADC0转化通道
	EIE2 |= 0x02;        //开ADC0中断
	t2_ini();
	t2_baud(6000);//每隔6000个T2时钟产生一次ADC0采样
	SFRPAGE=0x00;
	TR2=1;
}
void config (void) {
//看门狗禁止
    WDTCN = 0x07;	
    WDTCN = 0xDE;   
    WDTCN = 0xAD;
    SFRPAGE = 0x0F;
    XBR0 = 0x00;	
    XBR1 = 0x00;	
    XBR2 = 0x40;	//交叉开关使能,使得P0-P3口能输出
    XBR3 = 0x00;    
    SFRPAGE = 0x0F;
    P0MDOUT = 0x00; //端口配置,P0-P3,P6-P7口为开漏输出
    P1MDOUT = 0x00; 
    P2MDOUT = 0x00; 
    P3MDOUT = 0x00; 
    P4MDOUT = 0x00; //P4口为开漏
    P5MDOUT = 0x07; 
    P6MDOUT = 0x00; 
    P7MDOUT = 0x00; 
    P1MDIN = 0xFF;  //所有端口为数字输入,没有模拟输入端口
    P2MDIN = 0xFF;  
    P3MDIN = 0xFF; 
    SFRPAGE = 0x0F;
    CLKSEL = 0x00;  
    OSCXCN = 0x00;	
    OSCICN = 0x84;	
    //采用内部晶振,为24.5MHZ8分频
}   
void main(){
	uchar i;
	config();
	dispini();//LCD初始化,具体见LCD章节部分
	adc0_ini();//ADC0初始化
	EA=1;
	i=0;
	realvol=0;
	adc_capture(0x0200,0x400);//设置监控中断范围值
	showpage("ADC0 TEST","testing……");
	while(1){
		if(isnewdata){
			i++;
			if(i>40){//每采样40次,显示刷新一次
				i=0;
				showline("AIN0.1 VAL",0);
				showf(realvol,5,1);
			}
			isnewdata=0;
		}
		if(adc_is_capture){ 
			adc_is_capture=0;
			showline("ADC CAPTURE",0);
			showf(realvol,5,1);
			delay1ms(3000);
		}
	}
}
void ADC0_ISR() interrupt 15{
	SFRPAGE=0x00;
	AD0INT=0;
	kk=ADC0VAL;
	realvol=(long)kk*ADJRATESE;
	
	/*
	ADC0转化值乘以单端电平系数,其结果为电平真实值乘以100000
	例如ADC0VAL=1024时,realvol=1024*118=120832,即表示真实电压为1.20832v 
	*/
	
	target_val=(long)kk*REAL_RATE;
	isnewdata=1;
	
}
void ADC0_WIN_ISR() interrupt 8{//ADC0监控中断,在此用户可加入需要处理的程序
	adc_is_capture=1;
	SFRPAGE=0x00;
	AD0WINT=0;
}

⌨️ 快捷键说明

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