目录
一、主要功能
二、硬件资源
三、程序编程
四、实现现象
一、主要功能
基于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