×
单片机 > 单片机程序设计 > 详情

STC12C4052AD STC单片机ADC采样C程序

发布时间:2020-05-18 发布时间:
|

#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 = 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转换器  




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何为单片机选择合适的负载电容