目录
一、主要功能
二、硬件资源
三、程序编程
四、实现现象
一、主要功能
基于STM32单片机,通过滑动变阻器模拟电压传感器检测电压,通过12864显示显示电压和电压阈值,按键可以控制阈值的增加,并通过串口实时显示相关参数和状态
二、硬件资源
基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。
三、程序编程
#include "stm32f10x.h"
#include "usart.h"
#include "delay.h"
#include "sys.h"
#include "led.h"
#include "adc.h"
#include "key.h"
#include "oled.h"
#include "code.h"
#include "bmp.h"u16 t;
u16 times=0;
u16 times1 = 0;
u16 times2 = 0;
u8 LsensVal=0; //将电压传感器的值赋值给LsensVal PF.7
u8 key=0;void Check_serial_KEY(void);
void Check(void);
void serial_port(void);int main(void){ LED_Init(); //初始化与LED连接的硬件接口Adc_Init();delay_init();KEY_Init();Lsens_Init(); //初始化电压传感器端口uart_init(57600);OLED_Init();OLED_ColorTurn(0);//0正常显示,1 反色显示OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示 printf("开机测试完成!\r\n");OLED_Clear();OLED_Display_Sensitizer();//显示传感器种类OLED_Display_Welcome();//printf("开机测试完成!\r\n");printf("\r\n欢迎使用!\r\n"); // 初始化完成并测试串口LED0 = 1;LED1 = 0;while(1){Check_serial_KEY(); //按键控制函数Check();serial_port(); if(LsensVal > dyyz){LED0 = 0;LED1 = 1;if(times1 %20 == 1){printf("电压过高,请注意\r\n");}times1++;}else{LED0 = 1;LED1 = 0;if(times2 %20 == 1){printf("电压正常\r\n");}times2++;}} }//串口传输函数,并检查
void serial_port()
{LsensVal=Lsens_Get_Val(); //将电量传感器的值赋值for(t=0;t<1;t++) //Proteus的STM32F103仿真模型只能正确接收第一个字符{USART1->DR=USART_RX_BUF[t];while((USART1->SR&0X40)==0);//等待发送结束}if(times%20 == 1){printf("DIANYA= %d\r\n",LsensVal);printf("DIANYAYU= %d\r\n",dyyz);delay_ms(10);USART_RX_STA=0;}times++;delay_ms(10);
}void Check_serial_KEY(void)
{OLED_Clear_Down();key=KEY_Scan(1); //0,不支持连续按;1,支持连续按;if(key){ switch(key){ case WKUP_PRES: // 电压阈值增大dyyz++;break; case KEY1_PRES: //电压阈值减少dyyz--;break; default:break;}}else delay_ms(10); }void Check(void)
{times++;if(times%5==0){ OLED_Display_SensitizerNumber();//显示传感器数值}delay_ms(10);
}
四、实现现象
具体动态效果看B站演示视频:
基于STM32的电压检测WIFI模拟
虚拟串口讲解
全部资料(源程序、仿真文件、安装包、演示视频):
百度网盘资料下载https://pan.baidu.com/s/1tPHt82_tvyGZhqJqhLVcXQ?pwd=p63y