0 前言
🔥
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 毕业设计 STM32单片机的蓝牙智能计步器手环(源码+硬件+论文)
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:4分
🧿 项目分享:见文末!
1 主要功能
由 STM32F103C8T6单片机最小系统+ADXL345三轴加速传感器模块+RTC时钟模块+DS18B20温度传感器模块+pulsesenneor心率采集模块+ BT06蓝牙模块+OLED显示模块+键盘模块
1、采用STM32F103C8T6单片机为主控制器
2、利用三轴加速度模块ADXL345实现计步,RTC内部时钟提供时钟信号,通过心率传感器pulsesennor采集心率信号STM32内部A/D转换测量心率,DS18B20温度传感器实现体温测量。
3、OLED0显示体温、步数、日期时间、心率等信息,
4、可通过BT06蓝牙模块传输至第三方手机软件APP(蓝牙助手)显示。
5、按键功能:三个按键用于调整日期、时间;具有一个清楚步数按键;具有一个切换信息显示按键。
6、步数清零功能:每天00:00会自动清除前一天的步数,也可通过按键清除。
2 硬件设计(原理图)
3 核心软件设计
本系统设计主要采用Keil软件编写与调试程序,程序语言采取易读性和移植性更高的C语言编写。系统运行流程图如下图所示。
要实现以上功能要求,我们画出软件程序框图如下图4-2所示。首先进行系统初始化,系统初始化包括液晶初始化配置、ADXL345加速度传感器初始化、RTC时钟初始化、串口初始化配置、FLASH模拟EEPROM数据读取、A/D转换配置、定时器2、定时器3、串口初始化配置。接下来进入主程序循环。主程序循环系统中主要是温度传感器数据的实时采集,实时时钟的读取,心率信号的测量。利用A/D转换和定时器3实现心率脉冲信号的捕获,最终计算得到实际的心率值。加速度传感器数据读取并实现算法计步,并保存步数到FLASH中。同时键盘子程序实时扫描,检测到切换键按下时,会切换显示;按键同时按下时会清除步数。通过内部定时器定时,当定时5秒到后,通过蓝牙模块发送一次数据到APP查看。在RTC实时时钟的作用下,当时间达到凌晨0:00时,会自动清零步数。并重新开始计步。程序执行到这里完了一次,以下列出整体软件设计的流程图,如图
关键代码
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "adc.h"
#include "adxl345.h"
#include "Pedometer.h"
#include "stmflash.h"
#include "OLED_I2C.h"
#include "ds18b20.h"
#include "rtc.h"
#include "key.h"
#include "string.h"
/************************************************
************************************************/
extern _Bool Timer_Flag ; //ʱ�䵽 ��λ
extern _Bool update_flag; //���±�־����
//Ҫд�뵽STM32 FLASH���ַ�������
u8 TEXT_Buffer[]={"0000000"};
#define SIZE sizeof(TEXT_Buffer) //���鳤��
//#define FLASH_SAVE_ADDR 0X08020000 //����FLASH �����ַ(����Ϊż��������ֵҪ���ڱ�������ռ��FLASH�Ĵ�С+0X08000000)
#define FLASH_SAVE_ADDR 0X0800f400 //����FLASH �����ַ(����Ϊż��������ֵҪ���ڱ�������ռ��FLASH�Ĵ�С+0X08000000)
void Dis_Init(void)
{
OLED_ShowCN(0,0,10); //����
OLED_ShowCN(16,00,11);
OLED_ShowStr(32,0,":---r/min",2);
OLED_ShowCN(0,2,12); //����
OLED_ShowCN(16,2,13);
OLED_ShowCN(0,4,14); //����
OLED_ShowCN(16,4,15);
}
unsigned char Dis_mode = 0; //��ʾ״̬��־ 0����ʾ���������� 1����ʾ����ʱ��
short x, y, z;
int main(void)
{
unsigned char p[16]=" ";
u8 datatemp[SIZE];
unsigned int STEP=0; //������ʱ�滻ֵ
_Bool Heart_OK = 0; //��ȡ����ȷ���ʱ�־λ
unsigned char Heart = 0; //����ֵ
short temperature = 0; //�¶�ֵ
STEPS_DIS = 1;
delay_init(); //��ʱ������ʼ��
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);//�����ж����ȼ�����Ϊ��3��2λ��ռ���ȼ���2λ��Ӧ���ȼ�
LED_Init(); //��ʼ��������豸���ӵ�Ӳ���ӿ�
OLED_Init(); //OLED��ʼ��
OLED_CLS(); //����
OLED_ShowCN(32,2,0); //��ӭʹ��
OLED_ShowCN(32+16,2,1);
OLED_ShowCN(32+32,2,2);
OLED_ShowCN(32+32+16,2,3);
while(ADXL345_Init()) //3D���ٶȴ�������ʼ��
{
OLED_ShowStr(0,0,"ADXL345 Error",2);
delay_ms(200);
OLED_ShowStr(0,0," ",2);
delay_ms(200);
}
while(DS18B20_Init()) //DS18B20��ʼ��
{
OLED_ShowStr(0,0,"DS18B20 Error",2);
delay_ms(200);
OLED_ShowStr(0,0," ",2);
delay_ms(200);
}
delay_ms(100);
while(DS18B20_Get_Temp()==850); //DS18B20���ϵ�ʱ�� ��ȡ��ֵ��850 ����ȴ� ֱ������850�ſ�ʼ��һ��
delay_ms(5000);
OLED_CLS(); //����
Adc_Init();
TIM3_Int_Init(1999,71); //��ʱ2ms�ж�
uart_init(9600); //����һ��ʼ��Ϊ9600
TIM2_Int_Init(199,7199); //10Khz�ļ���Ƶ�ʣ�������500Ϊ20ms
KEY_Init(); //IO��ʼ��
EXTIX_Init(); //�ⲿ�жϳ�ʼ��
OLED_CLS(); //����
Dis_Init();
STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,SIZE); //flash�������
STEPS = (datatemp[0]-0x30)*10000+(datatemp[1]-0x30)*1000+(datatemp[2]-0x30)*100+(datatemp[3]-0x30)*10+(datatemp[4]-0x30);//����ֵת��Ϊ����
// RTC_Init();
//
// RTC_Set(2019,8,5,20,43,55); //����ʱ��
while(1)
{
if(Timer_Flag==1) //500ms�� ��ȡ����
{
Timer_Flag = 0; //�����־
TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE ); //ʹ��ָ����TIM3�ж�,���������ж�
TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE ); //ʹ��ָ����TIM3�ж�,���������ж�
temperature=DS18B20_Get_Temp(); //��ȡ�¶�
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //ʹ��ָ����TIM3�ж�,���������ж�
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //ʹ��ָ����TIM3�ж�,���������ж�
TIM_Cmd(TIM2, ENABLE); //ʹ��TIMx
if (QS == true) //��ȡ���������ź�
{
QS = false; //�����־ �ȴ���һ�ζ�ȡ
if(BPM>HEART_MIN_ERROR&&BPM<HEART_MAX_ERROR) //��ȡ����ֵ�������������� 40-160��
{
Heart_OK = 1; //��־λ��һ
Heart = BPM; //���ʴ��ݸ�Heart
}
else
{
Heart_OK = 0; //��־λ����
Heart = 0; //����Ϊ0
}
}
}
if(ADXL345_FLAG==1) //20ms����
{
ADXL345_FLAG = 0; //�����־λ
step_counter();
}
delay_ms(20);
if(STEP!=STEPS) //���������ı� �洢һ��
{
STEP = STEPS;
TEXT_Buffer[0]=(u16)STEPS/10000+0x30;
TEXT_Buffer[1]=(u16)STEPS%10000/1000+0x30;
TEXT_Buffer[2]=(u16)STEPS%10000%1000/100+0x30;
TEXT_Buffer[3]=(u16)STEPS%10000%1000%100/10+0x30;
TEXT_Buffer[4]=(u16)STEPS%10000%1000%100%10+0x30;
STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
}
if(calendar.hour==0&&calendar.min==0&&(calendar.sec==0||calendar.sec==1||calendar.sec==2)) //�賿00:00:00 �������
{
STEPS = 0;
TEXT_Buffer[0]=(u16)STEPS/10000+0x30;
TEXT_Buffer[1]=(u16)STEPS%10000/1000+0x30;
TEXT_Buffer[2]=(u16)STEPS%10000%1000/100+0x30;
TEXT_Buffer[3]=(u16)STEPS%10000%1000%100/10+0x30;
TEXT_Buffer[4]=(u16)STEPS%10000%1000%100%10+0x30;
STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
delay_ms(500);
}
Key_set(); //ʱ������
if(KEY0==0) //KEY0�л���ʾ����
{
while(KEY0==0); //�ȴ��ɿ�
OLED_CLS(); //����
if(Dis_mode==0) //�����һ������ʾ���ʡ����������� �� ����ʾʱ��
Dis_mode = 1;
else //�����һ�β�����ʾ���ʡ����������� �� �����ʡ�����������
{
Dis_mode = 0;
Dis_Init(); //��ʾ������Ϣ
}
}
if(KEY2==0) //�������
{
while(KEY2==0);
STEPS = 0;
TEXT_Buffer[0]=(u16)'0';
TEXT_Buffer[1]=(u16)'0';
TEXT_Buffer[2]=(u16)'0';
TEXT_Buffer[3]=(u16)'0';
TEXT_Buffer[4]=(u16)'0';
STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE); //�����洢һ������
}
if(update_flag==1) //2S��־�� ����һ�����ݵ��ֻ�APP
{
update_flag = 0;
printf("Step:%5d H:%3d T:%4.1f \r\n",STEPS,Heart,(float)temperature/10); //���ڷ��ͳ�ȥ
}
switch(Dis_mode)
{
case 0: //��ʾ����������
if(STEPS_DIS==1) //ˢ�¼Ʋ���
{
sprintf((char*)p,":%-5d ",STEPS); //��ʾ����
OLED_ShowStr(32,2,p,2);
}
sprintf((char*)p,":%4.1f ",(float)temperature/10);
OLED_ShowStr(32,4,p,2); //��ʾ�¶�
if(Heart_OK==1) //��ȡ����ȷ���ʣ�
{
sprintf((char*)p,":%3dr/min",Heart); //��ʾ����
OLED_ShowStr(32,0,p,2);
}
else
{
sprintf((char*)p,":---r/min");
OLED_ShowStr(32,0,p,2);
}
break;
case 1: //��ʾʱ�� ���ڵ���Ϣ
RTC_Display(); //��ʾʱ��
break;
}
}
}
4 实现效果
5 最后
包含内容
🧿 项目分享:见文末!