STM32项目分享:基于单片机的自行车测速系统设计
“我们不做一锤子买卖,只做技术成长的长期伙伴!”
目录
一、视频展示
二、项目简介
三、原理图设计
四、PCB硬件设计
五、程序设计
六、资料分享
一、视频展示
基于单片机的自行车测速系统设计 -视频分享
二、项目简介
题目:基于单片机的自行车测速系统设计
主控:STM32
显示:OLED显示屏
DHT11温湿度传感器
蓝牙模块
按键模块
光电开关
功能:
1、实时监测当前速度数据,温湿度数据。
2、按键查看数据信息。
3、光电开关监测当前速度数据。
4、蓝牙连接手机后,可手机控制单片机,并接收单片机数据。
5、屏幕实时显示当前温湿度,速度数据信息。
三、原理图设计
四、PCB硬件设计
五、程序设计
#include "stm32f10x.h" // 设备头文件
#include "delay.h" // 延迟函数库
#include "lcd.h" // LCD显示库
#include "dht11.h" // DHT11传感器库
#include "IOput.h" // 输入输出控制库
#include "usart.h" // 串口通信库
#include "adc.h" // ADC转换库
#include "MOTOR.h" // 电机控制库
#include "timer.h" // 定时器库u8 on_flag, speed, real_speed, cesu_flag, count, speed_flag; // 定义标志和速度相关变量
u8 show_flag, show1_flag; // 定义显示标志
float yali, count1, count2, max_TY = 3, dec_TY = 0.2; // 定义胎压和计数变量u8 max_wd = 40,max_sd = 60;void wifi(){if(res=='a'){OLED_Clear();res=0;set_flag=1;}else if(res=='b'){res=0;add_flag=1;}else if(res=='c'){res=0;dec_flag=1;}}int main (void)
{delay_init(); // 初始化延时函数NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置中断优先级组Adc_Init(); // 初始化ADCOLED_Init(); // 初始化OLED显示屏delay_ms(1); // 延时1msOLED_Clear(); // 清屏output_init(); // 初始化输出input_init(); // 初始化输入Usart1_Init(9600); // 初始化串口1,波特率9600DHT11_Init();motor_init(); // 初始化电机
// TIM_PWM_Init(100, 8); // 初始化PWM定时器TIM2_Int_Init(71, 9999); // 初始化定时器2while(1){wifi();DHT11_Read_Data(&temp,&humi);count++;delay_ms(10);key_scan(1, 0, 0); // 扫描按键if(set_flag == 1 && show_flag != 1){show1_flag = 0;OLED_Clear();set_flag = 0;show_flag++;if(show_flag >= 2){show_flag = 0;}}if(show_flag == 0){yali = 2.5 - Get_Adc_Average(1, 10) * 2.5 / 4096; // 读取并计算胎压值OLED_ShowCH(0, 0, " 自行车测速系统 ");OLED_ShowCH(0, 2, "温度:");OLED_Showdecimal(40, 2, temp, 2, 1, 16);OLED_ShowCH(0, 4, "湿度:");OLED_ShowNum(40, 4, humi, 2, 16);OLED_ShowCH(0, 6, "转速:");OLED_Showdecimal(40, 6, count2, 3, 1, 16);OLED_ShowCH(80, 6, "转/min");OLED_ShowCH(64, 4, "电机:");if(speed != 0){OLED_ShowCH(104, 4, "开");}else{OLED_ShowCH(104, 4, "关");}if(GD == 1) // 如果检测到速度传感器信号{TIM_Cmd(TIM2, ENABLE); // 使能定时器2if(time_count >= 100){count1++;time_count = 0;}}else if(GD == 0){TIM_Cmd(TIM2, DISABLE); // 关闭定时器2count2 = 60 / (count1 + (float)time_count / 100); // 计算转速time_count = 0;count1 = 0;}}if(show_flag == 1){OLED_ShowCH(0, 0, "最高温度:");OLED_ShowCH(0, 2, "最高湿度:");OLED_ShowNum(72, 0, max_wd, 2,16);OLED_ShowNum(72, 2, max_sd, 2,16);if(set_flag == 1){set_flag = 0;show1_flag++;if(show1_flag >= 2){show_flag = 0; OLED_Clear();}}if(show1_flag == 0){OLED_ShowCH(112, 0, "←");if(add_flag == 1){add_flag = 0;max_wd++;}if(dec_flag == 1){dec_flag = 0;max_wd--;}if(max_wd >= 100 || max_wd <= 0){max_wd = 0;}}if(show1_flag == 1){OLED_ShowCH(112, 2, "←");if(add_flag == 1){add_flag = 0;max_sd++;}if(dec_flag == 1){dec_flag = 0;max_sd--;}if(max_sd >= 100 || max_sd <= 0){max_sd = 0;}}}if(count >= 50){count = 0;UsartPrintf(USART1, "转速:%f\r\n", count2);UsartPrintf(USART1, "温度:%d\r\n", temp);UsartPrintf(USART1, "湿度:%d\r\n", humi);UsartPrintf(USART1, "\r\n\r\n");}}
}
六、资料分享
点击即可查看当前资料分享。