结合板载的电位器和STM32的AD转换功能,测量电位器两端的电压变化,并通过LED的数量提示AD转化的电压值的大小,电压越大点亮的LED越多。 推荐用adcx,04095,分成8个区间,每个区间512 0511,LED0 5121023,LED0、LED1 10241535,LED0、LED1、LED2 依次类推 不推荐用temp,小数,最大值3.3 帮我写一个实现这个功能的工程代码。(开发板为ministm32f103rc)其包main.c文件和.h文件和.c文件

时间: 2023-09-22 17:07:34 浏览: 36
以下是基于STM32的AD转换功能实现测量电位器两端的电压变化,并通过LED的数量提示AD转化的电压值的大小的代码。 main.c 文件: ```c #include "stm32f10x.h" #include "led.h" #include "adc.h" int main(void) { uint16_t adValue; LED_Init(); ADC_Init(); while(1) { adValue = ADC_GetConversionValue(ADC1); LED_Display(adValue); } } ``` adc.h 文件: ```c #ifndef __ADC_H #define __ADC_H #include "stm32f10x.h" void ADC_Init(void); uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx); #endif ``` adc.c 文件: ```c #include "adc.h" void ADC_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // 使能 ADC1 和 GPIOC 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE); // 配置 ADC1 的输入引脚 PC5 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOC, &GPIO_InitStructure); // ADC1 初始化 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); // 配置 ADC1 的通道 15,采样时间为 55.5 周期 ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 1, ADC_SampleTime_55Cycles5); // 使能 ADC1 ADC_Cmd(ADC1, ENABLE); // 开启 ADC1 的 DMA 传输 ADC_DMACmd(ADC1, ENABLE); // 开启 ADC1 的软件触发转换 ADC_SoftwareStartConvCmd(ADC1, ENABLE); } uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx) { // 等待转换完成 while(ADC_GetFlagStatus(ADCx, ADC_FLAG_EOC) == RESET); // 返回 ADC1 最近一次转换的结果 return ADC_GetConversionValue(ADCx); } ``` led.h 文件: ```c #ifndef __LED_H #define __LED_H #include "stm32f10x.h" void LED_Init(void); void LED_Display(uint16_t adValue); #endif ``` led.c 文件: ```c #include "led.h" #define LED0_PIN GPIO_Pin_0 #define LED1_PIN GPIO_Pin_1 #define LED2_PIN GPIO_Pin_2 #define LED3_PIN GPIO_Pin_3 #define LED4_PIN GPIO_Pin_4 #define LED5_PIN GPIO_Pin_5 #define LED6_PIN GPIO_Pin_6 #define LED7_PIN GPIO_Pin_7 #define LED_PORT GPIOB void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能 GPIOB 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 配置 LED 引脚为推挽输出 GPIO_InitStructure.GPIO_Pin = LED0_PIN | LED1_PIN | LED2_PIN | LED3_PIN | LED4_PIN | LED5_PIN | LED6_PIN | LED7_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LED_PORT, &GPIO_InitStructure); // 初始化 LED 灯,全部关闭 GPIO_SetBits(LED_PORT, LED0_PIN | LED1_PIN | LED2_PIN | LED3_PIN | LED4_PIN | LED5_PIN | LED6_PIN | LED7_PIN); } void LED_Display(uint16_t adValue) { uint8_t ledCount = 0; // 根据 AD 值计算需要点亮的 LED 数量 if(adValue >= 0 && adValue < 512) { ledCount = 0; } else if(adValue >= 512 && adValue < 1024) { ledCount = 1; } else if(adValue >= 1024 && adValue < 1536) { ledCount = 2; } else if(adValue >= 1536 && adValue < 2048) { ledCount = 3; } else if(adValue >= 2048 && adValue < 2560) { ledCount = 4; } else if(adValue >= 2560 && adValue < 3072) { ledCount = 5; } else if(adValue >= 3072 && adValue < 3584) { ledCount = 6; } else if(adValue >= 3584 && adValue < 4096) { ledCount = 7; } // 根据需要点亮的 LED 数量点亮相应的 LED switch(ledCount) { case 0: GPIO_SetBits(LED_PORT, LED0_PIN | LED1_PIN | LED2_PIN | LED3_PIN | LED4_PIN | LED5_PIN | LED6_PIN | LED7_PIN); break; case 1: GPIO_ResetBits(LED_PORT, LED0_PIN); GPIO_SetBits(LED_PORT, LED1_PIN | LED2_PIN | LED3_PIN | LED4_PIN | LED5_PIN | LED6_PIN | LED7_PIN); break; case 2: GPIO_ResetBits(LED_PORT, LED0_PIN | LED1_PIN); GPIO_SetBits(LED_PORT, LED2_PIN | LED3_PIN | LED4_PIN | LED5_PIN | LED6_PIN | LED7_PIN); break; case 3: GPIO_ResetBits(LED_PORT, LED0_PIN | LED1_PIN | LED2_PIN); GPIO_SetBits(LED_PORT, LED3_PIN | LED4_PIN | LED5_PIN | LED6_PIN | LED7_PIN); break; case 4: GPIO_ResetBits(LED_PORT, LED0_PIN | LED1_PIN | LED2_PIN | LED3_PIN); GPIO_SetBits(LED_PORT, LED4_PIN | LED5_PIN | LED6_PIN | LED7_PIN); break; case 5: GPIO_ResetBits(LED_PORT, LED0_PIN | LED1_PIN | LED2_PIN | LED3_PIN | LED4_PIN); GPIO_SetBits(LED_PORT, LED5_PIN | LED6_PIN | LED7_PIN); break; case 6: GPIO_ResetBits(LED_PORT, LED0_PIN | LED1_PIN | LED2_PIN | LED3_PIN | LED4_PIN | LED5_PIN); GPIO_SetBits(LED_PORT, LED6_PIN | LED7_PIN); break; case 7: GPIO_ResetBits(LED_PORT, LED0_PIN | LED1_PIN | LED2_PIN | LED3_PIN | LED4_PIN | LED5_PIN | LED6_PIN); GPIO_SetBits(LED_PORT, LED7_PIN); break; default: break; } } ```

相关推荐

最新推荐

recommend-type

利用数字电位器简化LCD面板的VCOM调节

任何薄膜晶体管液晶显示器面板都至少需要一个适当调节的VCOM信号,...VCOM的精确值随不同面板而变化,因此必须在出厂时设置VCOM值,以便与每一个屏幕的各自特性相匹配。适当地调节VCOM值,可以减少闪烁和其它不良影响。
recommend-type

DAC与数字电位器之选择

本文对数模转换器(DAC)和数字电位进行了对比,传统的数字电位器用于替代机械电位器。随着分辨率的提高和功能的增多,数字电位器也可用来取代一些传统的DAC应用。另外,传统的DAC与数字电位器相比尺寸较大,价格较高...
recommend-type

实验二 AD574编程电压测量与显示实验.docx

AD574编程电压测量与显示实验一:教学目的: ①学习AD574 12位A/D的工作原理及工作时序; ②熟悉以AD574接口的电压测量与显示电路...①用电位器调节输入电压,通过AD574模数转换,由单片机控制四位数码管显示电压值。
recommend-type

三电平逆变器中点电位平衡电路仿真

中点钳位型三电平电压型逆变器被广泛的运用于交流调速系统中,是交流...根据中点电压偏移形成的基理结合buck-boost电路原理,设计出一款可以平衡三电平电压型逆变器中点电压的硬件电路,同时用MATLAB仿真软件进行仿真。
recommend-type

DAC8831在恒电位仪电压扫描中的应用

为实现恒电位仪给定...该系统以STC89C51为主控器件,通过单片机IO口模拟SPI通信接口来控制16位数模转换芯片DAC8831,DAC8831根据预先输入的D/A控制字将数字信号转换成模拟电压,借助于外部运放实现双极性电压输出。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。