当前位置:   article > 正文

基于STM32单片机的智能手环设计(OLED显示)(Proteus仿真+程序+报告)_基于stm32f报告

基于stm32f报告

编号8

基于STM32单片机的智能手环设计(OLED显示)

功能描述:

        由 STM32单片机+按键模拟计步+RTC时钟模块+DS18B20温度传感器模块+心率采集模块+串口模块+OLED显示模块+键盘模块
1、采用STM32F103单片机为主控制器
2、利用按键模拟实现计步,RTC内部时钟提供时钟信号,通过心率传感器采集心率信号测量心率,DS18B20温度传感器实现体温测量。
3、OLED显示体温、步数、日期时间、心率等信息, 
4、通过串口将心率、步数、体温、IBI等信息发送至串口显示
5、按键功能:三个按键用于调整日期、时间;具有一个清楚步数按键;具有一个切换信息显示按键。
6、步数清零功能:每天00:00会自动清除前一天的步数,也可通过按键清除。
7、仿真中心率传感器用波形发生器和按键两种方式模拟,可用开关切换。

注意:proteus8.11版本才能打开  心率测量误差±1 

视频演示链接:

8、基于STM32单片机的智能手环设计(OLED显示)

仿真图:

主界面:

 时间显示界面:

时间调整界面:

程序源码:

  1. #include "delay.h"
  2. #include "OLED_I2C.h"
  3. #include "pulsesensor.h"
  4. #include "ds18b20.h"
  5. #include "timer.h"
  6. #include "rtc.h"
  7. #include "key.h"
  8. #include "usart.h"
  9. #include "stdio.h"
  10. #include "stdlib.h"
  11. #include <string.h>
  12. extern unsigned int cnt;
  13. unsigned char Dis_mode; //显示状态标志 0:显示传感器数据 1:显示日期时间
  14. void Dis_Init(void)
  15. {
  16. OLED_ShowCN(0,0,10); //心率
  17. OLED_ShowCN(16,00,11);
  18. OLED_ShowStr(32,0,":---/min",2);
  19. OLED_ShowCN(0,2,12); //步数
  20. OLED_ShowCN(16,2,13);
  21. OLED_ShowCN(0,4,14); //体温
  22. OLED_ShowCN(16,4,15);
  23. }
  24. void Dis_Time(void)
  25. {
  26. OLED_ShowCN(16*2,0,16); //时间
  27. OLED_ShowCN(16*3,0,17);
  28. OLED_ShowCN(16*4,0,30); //时间
  29. OLED_ShowCN(16*5,0,31);
  30. OLED_ShowCN(0,2,18); //日期
  31. OLED_ShowCN(16,2,19);
  32. OLED_ShowCN(0,4,16); //时间
  33. OLED_ShowCN(16,4,17);
  34. }
  35. void RTC_Clock_Init(void);
  36. int main(void)
  37. {
  38. unsigned char buf[18];
  39. unsigned short int STEPS=0; //步数
  40. unsigned char Heart = 0; //心率值
  41. short temprature; //定义温度变量
  42. unsigned char key_value = 0; //按键返回值
  43. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  44. OLED_Init(); //OLED初始化操作
  45. OLED_CLS(); //OLED清除屏幕
  46. OLED_ShowCN(32,2,0); //欢迎使用
  47. OLED_ShowCN(32+16,2,1);
  48. OLED_ShowCN(32+32,2,2);
  49. OLED_ShowCN(32+32+16,2,3);
  50. KEY_Init(); //IO初始化
  51. DS18B20_Init();
  52. while(DS18B20_Init()!=0) //ds18b20初始化检测
  53. {
  54. OLED_ShowStr(0,0,(u8 *)" DS18B20 Error! ",2);
  55. delay_ms(100);
  56. OLED_ShowStr(0,0,(u8 *)" ",2);
  57. delay_ms(100);
  58. }
  59. USART1_Init(9600);
  60. TIM3_Int_Init(11,7350); //定时 按照正常计算发现数值偏大 这里作为微调使仿真中更加准确
  61. EXTIX_Init(); //外部中断初始化
  62. TIM2_Int_Init(199,7199); //10Khz的计数频率,计数到200为20ms
  63. RTC_Clock_Init();
  64. OLED_CLS(); //清屏
  65. Dis_Init();
  66. UsartPrintf(USART1,"*************************** 欢迎使用!******************\r\n");
  67. while(1)
  68. {
  69. key_value = KEY_Scan(0); //按键单击
  70. switch(key_value)
  71. {
  72. case 1:
  73. KEY_Set();
  74. break;
  75. case 2: //清除步数
  76. STEPS = 0;
  77. break;
  78. case 4:
  79. OLED_CLS(); //清屏
  80. if(Dis_mode==0) //如果上一次是显示心率、步数、体温 的 则显示时间
  81. {
  82. Dis_Time();
  83. Dis_mode = 1;
  84. }
  85. else //如果上一次不是显示心率、步数、体温 的 则心率、步数、体温
  86. {
  87. Dis_mode = 0;
  88. Dis_Init(); //显示汉字信息
  89. }
  90. break;
  91. case 5: //KEY5按下
  92. STEPS++;
  93. break;
  94. }
  95. if(flag_timer==1) //毫秒赋一次值 flag_timer是标志位
  96. {
  97. flag_timer = 0; //清除标志 等待下一次
  98. TIM_Cmd(TIM2, DISABLE); //使能TIMx
  99. TIM_Cmd(TIM3, DISABLE); //使能TIMx
  100. temprature = DS18B20_Get_Temp(); //读取温度
  101. TIM_Cmd(TIM2, ENABLE); //使能TIMx
  102. TIM_Cmd(TIM3, ENABLE); //使能TIMx
  103. }
  104. if(update_flag==1) //2S标志到 发送一次数据到手机APP
  105. {
  106. update_flag = 0;
  107. UsartPrintf(USART1,"步数:%5d步 心率:%3d/min 体温:%4.1f℃ IBI:%4dms\r\n",STEPS,Heart,(float)temprature/10,cnt); //串口发送出去
  108. }
  109. if(calendar.hour==0&&calendar.min==0&&(calendar.sec==0||calendar.sec==1||calendar.sec==2)) //凌晨00:00:00 清除步数
  110. {
  111. STEPS = 0;
  112. }
  113. switch(Dis_mode)
  114. {
  115. case 0: //显示传感器数据
  116. sprintf((char*)buf,":%5d",STEPS); //显示步数
  117. OLED_ShowStr(16*2,2,buf,2);
  118. OLED_ShowCN(16*5,2,12); //汉字 步
  119. Heart = Pulsesensor_Read(); //获取心率值
  120. sprintf((char *)buf,(const char *)":%3d/min",Heart);
  121. OLED_ShowStr(16*2,0,buf,2);
  122. sprintf((char *)buf,(const char *)":%5.1f",(float)temprature/10);
  123. OLED_ShowStr(16*2,4,buf,2);
  124. sprintf((char *)buf,(const char *)"IBI:%4dms",cnt);
  125. OLED_ShowStr(0,6,buf,2);
  126. break;
  127. case 1: //显示时间 日期等信息
  128. RTC_Display(); //显示时钟
  129. break;
  130. }
  131. }
  132. }

软件免费下载地址:

1、Proteus仿真软件
文件内容:Proteus7.8安装包、Proteus8.6安装包、Proteus.8.10安装包、Proteus Professional 8.11 SP0安装包

链接:https://pan.baidu.com/s/11LNUZ9BJXWvXf1C4dPc3_w 
提取码:2756 


3、KEIL5 MDK软件(STM32开发软件)
链接:https://pan.baidu.com/s/1t3eY-3yRdTa7jZMlijq_jg 

提取码:ab58 

代码下载:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/153419
推荐阅读
相关标签
  

闽ICP备14008679号