2、结合板载的电位器和STM32的AD转换功能,测量电位器两端的电压变化,并通过LED的数量提示AD转化的电压值的大小,电压越大点亮的LED越多。推荐用adcx,0~4095,分成8个区间,每个区间5120~511,LED0512~1023,LED0、LED11024~1535,LED0、LED1、LED2依次类推不推荐用temp,小数,最大值3.3,写出具体代码
时间: 2023-09-29 10:10:55 浏览: 39
以下是基于STM32的AD转换功能和板载电位器测量电压变化的代码,通过LED数量提示电压大小:
```c
#include "stm32f10x.h"
void GPIO_Configuration(void);
void ADC_Configuration(void);
void delay(uint32_t time);
int main(void)
{
GPIO_Configuration();
ADC_Configuration();
while (1)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //开始转换
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //等待转换结束
uint16_t adcValue = ADC_GetConversionValue(ADC1); //获取转换结果
//根据adcValue的值控制LED的数量
if (adcValue >= 0 && adcValue < 512)
{
GPIO_SetBits(GPIOB, GPIO_Pin_0);
}
else if (adcValue >= 512 && adcValue < 1024)
{
GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1);
}
else if (adcValue >= 1024 && adcValue < 1536)
{
GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);
}
else if (adcValue >= 1536 && adcValue < 2048)
{
GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
}
else if (adcValue >= 2048 && adcValue < 2560)
{
GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
}
else if (adcValue >= 2560 && adcValue < 3072)
{
GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5);
}
else if (adcValue >= 3072 && adcValue < 3584)
{
GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6);
}
else if (adcValue >= 3584 && adcValue < 4096)
{
GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
}
delay(1000);
GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7); //关闭LED
}
}
void GPIO_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void ADC_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0连接电位器
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入模式
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_InitTypeDef ADC_InitStructure;
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; //转换通道数目为1
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //配置转换通道
ADC_Cmd(ADC1, ENABLE); //使能ADC1
ADC_ResetCalibration(ADC1); //复位ADC1校准寄存器
while (ADC_GetResetCalibrationStatus(ADC1)); //等待复位完成
ADC_StartCalibration(ADC1); //开始校准
while (ADC_GetCalibrationStatus(ADC1)); //等待校准完成
}
void delay(uint32_t time)
{
while (time--);
}
```