蓝桥杯嵌入式——ADC篇

直接贴出代码,并且辅以 详细的解释

#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);	
	}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值