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

📄 ad04.c

📁 IAR MSP430F149 12位AD程序
💻 C
字号:

#include <C:\Documents and Settings\Administrator.MIRACLE-YKRBYQB\桌面\RTU\rtu.h>
extern unsigned char index;
extern unsigned int  max,min;
extern unsigned long  Liangcheng;
extern unsigned int  OUTCH0,OUTCH1,OUTCH2,OUTCH3;
unsigned int A0results[Num_of_Results];  
unsigned int A1results[Num_of_Results];   
unsigned int A2results[Num_of_Results];
unsigned int A3results[Num_of_Results]; 
extern unsigned char i;

extern void StartADC(void);
/******************************************
***功能:启动一次转换                    ***
***入口:通道CHinx (0,1,2,4)             ***
***出口:无                              *** 
******************************************/
void StartADC(void )
{
	long sum;
	
	unsigned int i = 0;
  	unsigned char j;
  	unsigned long temp;
  	
  	ADC12CTL0 &= ~ ENC;
  	ADC12CTL0 = ADC12ON+MSC+SHT0_2+REFON+REF2_5V;       // Turn on ADC12, extend sampling time
  	ADC12CTL1 = SHP+CONSEQ_1;                    	    // Use sampling timer, repeated sequence
  	ADC12MCTL0 = SREF_1+INCH_0;                         // ref+=AVcc, channel = A0
  	ADC12MCTL1 = SREF_1+INCH_1;                         // ref+=AVcc, channel = A1
  	ADC12MCTL2 = SREF_1+INCH_2;                         // ref+=AVcc, channel = A2    
  	ADC12MCTL3 = SREF_1+INCH_3+EOS;                    // ref+=AVcc, channel = A3
  	for ( i=0; i<0x3600; i++);//for ( i=0; i<0x3600; i++);
  	ADC12IE = 0x08; 
  	ADC12CTL0 |= ENC;                     // Enable conversions
  	i=0;
  	_EINT(); 
  	do{
  		ADC12CTL0 |= ADC12SC;
  		for ( j=0; j<20; j++);
    		i++;
  	}while(i<10);
  	ADC12CTL0 = 0;
  	
	sum = 0;max=0;min=4096;
	for(i=0;i<8;i++) {
  	  if(A0results[i]>max)max=A0results[i];//找出最大值
  	  if(A0results[i]<min)min=A0results[i];//找出最小值
  	}
	for(i=0;i<8;i++) sum += A0results[i];//求和
	sum = sum - max - min;//减去一个最大值和最小值
  	OUTCH0 = OUTCH0_offset+(Liangcheng*(sum/6))/4095;//计算水位=量程X采样平均值/2的12次方
  	
  	sum = 0;max=0;min=4096;
  	for(i=0;i<8;i++) {
  	  if(A1results[i]>max)max=A1results[i];
  	  if(A1results[i]<min)min=A1results[i];
  	}
	for(i=0;i<8;i++) sum += A1results[i];
	sum = sum - max - min;
	temp=sum/6;
	if(temp<=0x333) temp=0x333;
	if(temp>=4095) temp=4095;
	temp=temp-0x333;
	temp=Liangcheng*temp;
  	OUTCH1 = OUTCH1_offset+temp/(4095-0x333);
  	
  	sum = 0;max=0;min=4096;
  	for(i=0;i<8;i++) {
  	  if(A2results[i]>max)max=A2results[i];
  	  if(A2results[i]<min)min=A2results[i];
  	}
	for(i=0;i<8;i++) sum += A2results[i];
	sum = sum - max - min;
  	OUTCH2 = OUTCH2_offset+(Liangcheng*(sum/6))/4095;
  	
  	sum = 0;max=0;min=4096;
  	for(i=0;i<8;i++) {
  	  if(A3results[i]>max)max=A3results[i];
  	  if(A3results[i]<min)min=A3results[i];
  	}
  	for(i=0;i<8;i++) sum += A3results[i];
	sum = sum - max - min;
  	OUTCH3 = OUTCH3_offset+(Liangcheng*(sum/6))/4095;
}
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
  A0results[index] = ADC12MEM0;                   // Move results, IFG is cleared
  A1results[index] = ADC12MEM1;                   // Move results, IFG is cleared
  A2results[index] = ADC12MEM2;                   // Move results, IFG is cleared
  A3results[index] = ADC12MEM3;                   // Move results, IFG is cleared
  index = (index+1)%Num_of_Results; 
}

⌨️ 快捷键说明

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