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

📄 adc0.c

📁 单片机数据通讯典型应用(光盘内容)
💻 C
字号:

#define T2reload 2000
#define ADJRATESE 732L	 	//单端电平系数
#define N 40;				//模拟采样计数
sfr16 ADC0VAL=0xbe;			//将ADC0H-ADC0L通过sfr16实现
bit isnewdata;				//新数据产生位标志
long realvol=0;			   	//转换后的电压值,为实际值的1000000倍
long value_buf[N]={0};		//模拟数据存储单元
 
//**********************模拟控制初始化程序**************************
void adc0_init(void)
{
	//相关控制寄存器
	SFRPAGE=0x00;
	ADC0CF=0x0f;//ADC0时钟为系统时钟2分频,PGA增益为0.5
	ADC0CN=0x8c;//AD0TM=0,ADC0为连续跟踪模式,由T2溢出率启动ADC0
				//AD0LJST=0,数据存储格式右对齐,即ADC0H存放12bit高4位
	REF0CN&=0x0A;//AD0VRS=0,ADC0电压基准取自VREF0引脚
	REF0CN|=0x02;//BIASE=1,偏移产生器工作

   	//输入方式及通道选择
	SFRPAGE=0x00;
	AMX0CF=0x00;  			//AIN0.0-AIN0.3均为单端模式
	AMX0SL=0x00;			//AIN0.0为ADC0转化通道
	EIE2|=0x02;        		//开ADC0中断
	//设置T2触发源
	SFRPAGE=0x00;
	TMR2CF=0x10;  // T2为外部时钟的8分频,计数方向为增值计数
	TMR2CN=0x04;  // T2为16bit定时器模式,并启动定时器运行,自动重装
	SFRPAGE = 0x00;
	RCAP2=65536-T2reload;//自动重装预置数值
	TMR2=RCAP2;
	SFRPAGE=0x00;
	TR2=1;			//启动定时器T2
}
//中位值平均滤波
long filter(void)
{
	uchar i,j;
	long sum=0;
	static int count;				   //模拟数据计数
	while(count<N)					   //存储N个模拟数据
	{
		if(isnewdata)				   //存储新的模拟数据
		{
			value_buf[count++]=realvol;
			isnewdata=0;			  //新数据产生位标志清零
		}
	}
	for(j=0;j<N-1;j++)
	{
		for(i=0;i<N-j;i++)
		{
			if(value_buf[i]>value_buf[i+1])
			{
				temp=value_buf[i];
				value_buf[i]=value_buf[i+1];
				value_buf[i+1]=temp;
			}
		}

	}
	for(count=1;count<N-1;count++)
		sum+=value_buf[count];
	count=0; 						//模拟计数清零
	return (long)(sum/(N-2));
}

void ADC0_ISR() interrupt 15
{
	int value;
	SFRPAGE=0x00;
	AD0INT=0;
	value=ADC0VAL;								//取出模拟值
	realvol=(long)value*ADJRATESE; 	//电压转换ADC0转化值乘以单端电平系数,
									//其结果为电平真实值乘以1000000
									//例如ADC0VAL=4096时,realvol=4096*732=2998272,
									//即表示真实电压为2.998272v
	isnewdata=1;	
}


//延迟1ms
void delay1ms(uint time)
{
	uint i;
	uint j;
	for (i=0;i<time;i++)
	{
		for(j=0;j<300;j++);
	}
}

//系统初始化
void sys_init(void)
{
	 uchar i=0;
	//看门狗禁止
	EA=0;		  				//禁止所有中断
	WDTCN = 0x07;	 			//禁止看门狗定时器	
    WDTCN = 0xDE;   
   	WDTCN = 0xAD;
	EA=1;	 				 	//打开总中断
	//端口引脚配置
	SFRPAGE=0x0F;
	XBR2=0x40;					//交叉开关使能
	XBR3=0x80;					//CAN TX引脚为推挽输出
	P7MDOUT=0x03;			    //P7.0和P7.1推挽方式输出
	P3MDIN=0xFF;				//P3引脚配置为数字量输入
	//系统时钟初始化
	SFRPAGE=0x0F;
	CLKSEL=0x01;		//外部振荡器
	OSCXCN=0x67;		//外部晶振16MHz,
	for(;i<255;i++);	//等待至少1ms
	while(!(OSCXCN&0x80));//查询XTLVLD是否为1,等待外部晶振稳定振荡
}

⌨️ 快捷键说明

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