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

📄 adc0.c

📁 c8051F020 ADC0 用PCA完成16位的PWM 29F040 定时器的设置 外部静态存储器
💻 C
字号:
 #include "c8051F020.h" 
//----------------------------------------------------------------------------- 
// ADC0功能模块
//----------------------------------------------------------------------------- 
//
#define SAMPLERATE0 50000                         // ADC0采样频率
#define SYSCLK 22118400                           // 系统时钟频率Hz
#define NUM_SAMPLES 20                            // ADC0采样次数  
#define TRUE 1 
#define FALSE 0 
void ADC0_Init (void) ;
void Timer_Init (int timex,int modex,int count_H,int count_L);
void ADC0_ISR (void);
//----------------------------------------------------------------------------- 
// 全局变量 
//-----------------------------------------------------------------------------
xdata unsigned samples[NUM_SAMPLES][2]; 		 //	ADC0结果数组 进行指针调用
bit ADC0_DONE;                                   // 当NUM_SAMPLES次被采集为真

unsigned * ADC0_function (void)
{
  Timer_Init (3,0,SYSCLK/SAMPLERATE0,0x00);       // 初始化定时器3溢出作为ADC0采样率 
  ADC0_Init ();                                    // 初始化ADC 
  EA = 1;                                          // 允许全部中断
  while (1)
  { 
     ADC0_DONE = FALSE; 
     EIE2 |= 0x02;                                 // 允许ADC0中断 
     while (ADC0_DONE == FALSE);                   // 等待采样结果 
   }
  return(samples);
}

 /*使用定时器3溢出作为转换开始信号*/ 
void ADC0_Init (void) 
{ 
   ADC0CN = 0x05;                                   // ADC0 禁止; 正常跟踪模式 定时器3溢出ADC0转换开始
                                                    // ADC0数据左对齐 
   REF0CN = 0x03;                                   // 片内 VREF和 VREF 输出缓冲器
   AMX0CF = 0X00; 
   AMX0SL = 0x00;                                   // 选择AIN0作为ADC多路转换输入
   ADC0CF = (SYSCLK/2500000) << 3;                  // ADC转换时钟2.5MHz 
   ADC0CF &= ~0x07;                                 // PGA增益 = 1 
   EIE2 &= ~0x02;                                   // 禁止ADC0中断 
   AD0EN = 1;                                       // 使能ADC0 
}
void ADC0_ISR (void) interrupt 15 using 3 
{ 
   unsigned temp_samples[NUM_SAMPLES][2];           // 寄存ADC0结果数组
   int i;
   int tempH;
   int tempL;
   static unsigned num_samples = 0;                  // ADC0采样计数器 
   AD0INT = 0;                                       // 清除ADC0转换结束标志 
   temp_samples[num_samples][0] = ADC0H;             // 读和存储ADC0值
   temp_samples[num_samples][1] = ADC0L; 
   num_samples++;                                    // 更新采样计数器 
   if (num_samples == NUM_SAMPLES) 
    { 
       EIE2 &= ~0x02;                                // 禁止ADC0中断
	   for(num_samples=0;num_samples<21;num_samples++)
	     {
		   for (i=0;i<21;i++)
		     {
			   	tempH += temp_samples[i][0];
				tempL += temp_samples[i][1];		  //采样值做平均 放入samples数据寄存
			 }
			samples[num_samples][0]=tempH/20;
			samples[num_samples][1]=tempL/20;
		  }
	   num_samples = 0;                              // 复位采样计数器 
       ADC0_DONE = 1;                                // 设置DONE标志 
    } 
}

⌨️ 快捷键说明

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