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

📄 adc1_func.c

📁 c8051F020 中八位500ksps ADC1的应用程序 包括ADC1和端口初始化及转换完成中断程序
💻 C
字号:
#include <C8051F020.h>
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;


void init_adc1(void);
void init_vref(void);
uint start_adc1(uchar channel);
void delay1ms(uint time);

uint adc1_result,cnt;
bit isnewdata;
float temp;
xdata float t[20];//存放电压检测数据,为20个数据

void init_adc1(void)         //系统时钟=12M
{
  ADC1CF=0x81;           //ADC1配置寄存器,设置转换时钟(SAR<=6M)和内部放大器增益,SAR转换时钟
                         //=系统时钟/(b7-b3)=2M,内部放大器增益=1(b1-b0);此时为系统时钟17分频,增益为1
  AMX1SL=0x00;           //模拟输入通道选择寄存器(b3-0)                                      
  ADC1CN=0x80;           //ADC1控制寄存器,允许ADC(b7),向AD1BUSY写1启动ADC(b3-b1)                                                             
  EIE2=0x08;             //允许ADC0中断,EADC1=1,EIE2.3=1
}
void init_vref(void)
{
  REF0CN=0x03;           //允许参考电压发生器(b1)及其缓冲器x2(b0),参考电压从VREF引脚输出
                         //ADC1参考电压取自AV+(b3=1);取自VREF(b3=0)
						 //内部温度传感器使能(TEMPE=0,b2)
}                    

uint start_adc1(uchar channel)
{

  AMX1SL=channel;
  ADC1CN|=0x10;      //ADC1BUSY=0;

}

void config(void)
{

	WDTCN = 0x07;	//看门狗禁止
    WDTCN = 0xDE;   
   	WDTCN = 0xAD;

	XBR0 = 0x00;	//交叉开关使能,但没有进行外围设备配置
	XBR1 = 0x00;	
	XBR2 = 0x40;

	OSCXCN = 0x00;	
	OSCICN = 0x84;	//b7=1,使能时钟丢失检测器(时钟丢失时间大于100ms将触发复位),
	                //CLKSL(b3)=0,选择内部晶振,IOSCEN(B2)=1,内部振荡器使能
					//IFCN1-0(B1-0)=00,内部振荡器典型频率为2MHz
    
    P1=0xFF;        //逻辑高电平输出
 	P1MDOUT = 0x00; //P1口为开漏输出,引脚被配置为模拟输入
 	P1MDIN = 0x00; 
}
void delay1ms(uint time){//延迟1ms
	uint i;
	uint j;
	for (i=0;i<time;i++){
		for(j=0;j<300;j++);
	}
}	


void main()
{
	char i;
	config();
     init_vref();
	init_adc1();//ADC0初始化
    start_adc1(0);//ADC0启动
	EA=1;
	i=0;

	while(1)
	{
		if(isnewdata)//由该位查询ADC1转化值是否更新
		{
			temp=(float)adc1_result/256.0;
			temp*=3.3;
    	    isnewdata=0;
			t[i]=temp;//将电压检测值存入长度为20的数组中
			i++;
			if(i>19)
				i=0;//在此设断点,观察程序运行结果
			delay1ms(10);
	    start_adc1(0);
		}
	}
}

void ADC1_ISR() interrupt 17
{//ADC1中断

     cnt++;
    ADC1CN&=0xEF;  //ADC1BUSY=0;
    adc1_result=ADC1;
    isnewdata=1;

}

⌨️ 快捷键说明

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