直接贴出代码,并且辅以 详细的解释
#include"stm32f10X.h"
#include"adc.h"
/***ADC初始化函数***/
/*
(1)定义两个结构体
(2)ADC时钟六分频
(3)配置两个结构体(ps配置ADC结构体之前需要复位ADC)
(4)使能ADC
(5)校正
*/
void Adc_Init()
{
GPIO_InitTypeDef GOIO_InitStructure;//GPIO结构体
ADC_InitTypeDef ADC_InitStructure;//ADC结构体
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//将ADC时钟六分频
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_ADC1,ENABLE);//开启GPIO,ADC时钟
GOIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//ADC1的第八通道
GOIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GOIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Init(GPIOB,&GOIO_InitStructure);
ADC_DeInit(ADC1);//配置ADC工作方式先复位ADC
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent; //独立模式
ADC_InitStructure.ADC_ScanConvMode=DISABLE;//不开启扫描模式
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE; //不开启连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; //软件触发不是外部触发
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//数据右对齐
ADC_InitStructure.ADC_NbrOfChannel=1;//开启一个通道
ADC_Init(ADC1,&ADC_InitStructure);
ADC_Cmd(ADC1,ENABLE);//使能ADC
ADC_ResetCalibration(ADC1);//复位ADC校正
while(ADC_GetResetCalibrationStatus(ADC1));//等待复位ADC校正
ADC_StartCalibration(ADC1);//开始校正
while(ADC_GetCalibrationStatus(ADC1));//等待校正完成
}
float get_adc(u8 channel)
{ float adc_value=0.0;
ADC_RegularChannelConfig(ADC1,channel,1,ADC_SampleTime_239Cycles5);//规则通道配置,channel表示哪一通道,这里是ADC的第八通道
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件启动AD转换
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));// 等待转换完成
adc_value=ADC_GetConversionValue(ADC1)*(3.3/0Xfff);//获取转换值
return adc_value;
}
float average_adc()//十次转换获取平均值
{ float aver=0;
u8 i=0;
for(i=0;i<10;i++)
{
aver+=get_adc(8);
}
return aver/10;
}
主函数
int main()
{ u8 string[20];//定义字符数组
float temp_adc;
Adc_Init();
STM3210B_LCD_Init();
LCD_Clear(White);
LCD_SetTextColor(White);
LCD_SetBackColor(Blue);
LCD_ClearLine(Line0);
LCD_ClearLine(Line1);
LCD_ClearLine(Line2);
LCD_ClearLine(Line3);
LCD_ClearLine(Line4);
LCD_SetTextColor(Blue);
LCD_SetBackColor(White);
while(1)
{ temp_adc=average_adc();
sprintf((char*)string,"adc_value:%0.3f",temp_adc);//将" "里的内容转化为字符数组
LCD_DisplayStringLine(Line5,string);
}