文章目录一、前言二、项目功能简介三、PCB设计四、原理图设计五、程序设计六、包含内容七、资料分享一、前言实物项目成品仿真项目成品哔哩哔哩开源视频链接复制浏览器打开https://www.bilibili.com/video/BV1uthG6hEQU/资料分享见文末二、项目功能简介功能介绍1档位可调系统分为两个档位模式03V档位和030V档位2通过按键进行档位切换以满足不同电压范围的测量需求3电压采集能够采集030V的外部电压信号4最小分辨率达到0.1V测量误差约为±0.1V5采集到的电压值会实时显示在OLED屏幕上6指令控制按键2按下开始采集电压数据按键3按下停止采集电压数据7蓝牙APP显示电压数据、控制电压采集或者停止采集三、PCB设计四、原理图设计五、程序设计部分代码如#includestm32f10x.h// Device header#includeDelay.h#includeoled.h#includekey.h#includeADc.h#includeled.h#includestdio.h#includeusart.h#includeoleddispaly.hvoidEXTIx_Init(void);//外部中断voidTimer2_Init(void);floatVoltage;//电压值uint16_tADValue;//模拟量值uint8_tDW_flag0,LED_flag;//挡位标志位uint8_tstart;//开始/停止标志intmain(void){LED_Init();//led灯OLED_Init();//OLED屏幕初始化OLED_Clear();//清屏EXTIx_Init();//中断按键初始化ADC_Init_V();//adc初始化Timer2_Init();//定时器初始化OLED_ShowCHineseString(byte(1),line1,DYB_display,7);//显示汉字数字电压表系统OLED_ShowCHineseString(byte(0),line5,Voltage_display,3);//显示汉字电压OLED_ShowCHineseString(byte(0),line3,DW_display,3);//显示汉字挡位OLED_ShowString(48,4,00.00V,8,0);while(1){OLED_ShowString(48,2,0~30V ,8,0);ADValueGet_ADCvalue(1);Voltage(float)ADValue/4095*3.3;//获取电压if(start0)//开始采集标志{OLED_ShowCHineseString(byte(4),line7,Start_display,4);OLED_ShowNum(48,4,Voltage,2,8,0);OLED_ShowNum(72,4,(uint16_t)(Voltage*100)%100,2,8,0);if(LED_flag)LED_Turn();}else{OLED_ShowCHineseString(byte(4),line7,Stop_display,4);}DelayMs(200);}}voidTimer2_Init(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);NVIC_InitTypeDef NVIC_InitStructure;//NVIC寄存器结构体变量TIM_InternalClockConfig(TIM2);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivisionTIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterModeTIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period720-1;TIM_TimeBaseInitStructure.TIM_Prescaler100-1;TIM_TimeBaseInitStructure.TIM_RepetitionCounter0;TIM_TimeBaseInit(TIM2,TIM_TimeBaseInitStructure);TIM_ClearFlag(TIM2,TIM_FLAG_Update);TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);TIM_Cmd(TIM2,ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannelTIM2_IRQn;//TIM2中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority1;//抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority0;//子优先级1NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;//使能TIM4中断通道NVIC_Init(NVIC_InitStructure);//中断优先级初始化函数}voidEXTIx_Init(void)//外部中断{NVIC_InitTypeDef NVIC_InitStructure;//NVIC寄存器结构体变量RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_ModeGPIO_Mode_IPU;GPIO_InitStructure.GPIO_PinGPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOB,GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource12);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource13);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_LineEXTI_Line12|EXTI_Line13|EXTI_Line14;EXTI_InitStructure.EXTI_LineCmdENABLE;EXTI_InitStructure.EXTI_ModeEXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_TriggerEXTI_Trigger_Falling;EXTI_Init(EXTI_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断通道使能NVIC_InitStructure.NVIC_IRQChannelEXTI15_10_IRQn;//使能外部中断通道0NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority0;//设置抢占优先级2NVIC_InitStructure.NVIC_IRQChannelSubPriority2;//设置响应优先级2NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;NVIC_Init(NVIC_InitStructure);}voidTIM2_IRQHandler(void){staticuint16_tms5000;if(TIM_GetITStatus(TIM2,TIM_IT_Update)SET){ms500;if(ms500500){ms5000;LED_flag1;}TIM_ClearITPendingBit(TIM2,TIM_IT_Update);}}voidEXTI15_10_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line12)SET){DW_flag~DW_flag;EXTI_ClearITPendingBit(EXTI_Line12);//清除中断挂起标志位}if(EXTI_GetITStatus(EXTI_Line13)SET){start0;EXTI_ClearITPendingBit(EXTI_Line13);//清除中断挂起标志位}if(EXTI_GetITStatus(EXTI_Line14)SET){start1;EXTI_ClearITPendingBit(EXTI_Line14);}}六、包含内容七、资料分享资料获取请查看主页介绍搜索或观看开源视频获取