您当前的位置:五五电子网电子知识单片机-工控设备51单片机STC12C4052AD STC单片机ADC采样C程序 正文
STC12C4052AD STC单片机ADC采样C程序

STC12C4052AD STC单片机ADC采样C程序

点击数:7120 次   录入时间:03-04 11:55:02   整理:http://www.55dianzi.com   51单片机
#include "STC12C4052AD.h" 
typedef struct 

BOOL Run; //BOOL量作为定时采样标志,比如每隔3秒,置位一
次该标志 
BYTE Curch; //当前通道 
BYTE tempCvData[6]; //转换结果临时缓冲 
BYTE CvTimes; //采样次数 采样4次,去最大最小,保留4个取平均值 
BYTE ADData[MAX_ADCH]; //MAX_ADCH保存各通道最终采样数据 
}STADC; 
STADC ADC; 
void InitADC() 

Uint16 i; 
ADC_CONTR = 0xC0; //ADC模块加电,420周期转换一次 
for(i=0;i<20000;i++); //ADC电源开启后,延时 
//设置P口外AD模式 
P1M0 = 0x03; //ADC0/1 高阻输入 
P1M1 = 0x00; 
EADC_SPI = 1; //开放ADCSPI总中断 
ADC_DATA = 0; 
AUXR = EADCI; //开放ADC中断 
MEMSet(&ADC,0,sizeof(STADC)); 
//启动0号通道 
ADC.Curch = 0; 
ADC_CONTR |= ADC.Curch; //设置下一通道 
ADC.Run = TRUE; //标志ADC正在转换 
ADC_CONTR |= ADC_START; //启动AD转换器 

void ADCISR() interrupt ADC_VECTOR 

ADC_CONTR &= ADC_STOP; //stop AD 
ADC.Run = FALSE; 
ADC.tempCvData[ADC.CvTimes] = ADC_DATA;//取转换值 
ADC_DATA = 0; 
ADC.CvTimes++; 
ADC.CvTimes %= 6; 
if(ADC.CvTimes!=0) 

ADC_CONTR |= ADC_START; //启动AD转换器 
ADC.Run = TRUE; 


ADC_CONTR &= ADC_FLAG; //清除ADC_FLAG 中断标志 

void Proc_ADC() 

Uint16 CvSum = 0,i; 
BYTE MaxCv=0,MinCv=0; 
if(ADC.Run||ADC.CvTimes!=0) //AD还在进行,等待 
return; 
for(i=0;i<6;i++) 

if(ADC.tempCvData[i]>MaxCv) 
MaxCv = ADC.tempCvData[i]; 
if(ADC.tempCvData[i]<MinCv) 
MinCv = ADC.tempCvData[i]; 

for(i=0;i<4;i++) 
CvSum += ADC.tempCvData[i]; 
CvSum = CvSum-MaxCv-MinCv; 
ADC.ADData[ADC.Curch] = (CvSum>>2); 
ADC.Curch++; 
ADC.Curch %= MAX_ADCH 
ADC_CONTR &= 0xF8; //先清除当前通道值 
ADC_CONTR |= ADC.Curch; //设置下一通道 
ADC.Run = TRUE; //标志ADC正在转换 
for(i=0;i<500;i++); //通道切换延时 100us左右 
ADC_CONTR |= ADC_START; //启动AD转换器 



本文关键字:单片机  程序  51单片机单片机-工控设备 - 51单片机