一:功能介绍
1、采用stm32单片机+LCD1602显示屏+蜂鸣器+DS18B20温度传感器+按键+电位器,制作一个基于stm32单片机电子血压心率脉搏体温计模拟测量仪Proteus仿真;
2、通过ds18b20传感器测量当前的体温,显示到LCD1602屏幕上面;
3、通过按键模拟调节当前的心率脉搏,显示到LCD1602屏幕上面;
4、通过电位器调节当前的血压值,经过stm32单片机ADC采集得到当前的血压值,显示到LCD1602显示屏上面;
5、当温度、心率或者血压超过程序设置阈值,蜂鸣器进行报警提醒,(阈值可以在程序中进行更改)
基于STM32单片机的电子血压心率脉搏体温计模拟测量仪毕业论文
摘要
本文设计并实现了一个基于STM32单片机的电子血压心率脉搏体温计模拟测量仪。该系统集成了DS18B20温度传感器、LCD1602显示屏、蜂鸣器、按键以及电位器等组件,通过Proteus仿真平台进行验证。系统能够实时测量并显示体温、模拟心率脉搏以及通过电位器调节的血压值,并在参数超过预设阈值时通过蜂鸣器发出报警。本文详细阐述了系统的硬件设计、软件实现以及功能验证过程。
一、功能介绍
1. 系统架构与硬件组成
本系统采用STM32单片机作为核心控制器,结合LCD1602显示屏、DS18B20温度传感器、蜂鸣器、按键以及电位器等组件,构建了一个完整的电子血压心率脉搏体温计模拟测量仪。系统硬件架构清晰,各组件之间通过合理的接口设计实现数据通信与控制。
2. 体温测量与显示
系统通过DS18B20温度传感器实时测量当前的体温数据,并将测量结果通过STM32单片机处理后显示在LCD1602显示屏上。DS18B20传感器具有高精度、低功耗等特点,能够确保体温测量的准确性。
3. 心率脉搏模拟与显示
系统通过按键模拟调节当前的心率脉搏值。用户可以通过按键输入不同的心率脉搏值,系统将这些值显示在LCD1602显示屏上,供用户查看。这一功能主要用于模拟心率脉搏的测量过程,便于系统测试和验证。
4. 血压值调节与显示
系统通过电位器调节当前的血压值。电位器的旋转角度被STM32单片机的ADC模块采集,转换为相应的电压值,再经过程序处理得到血压值。血压值同样被显示在LCD1602显示屏上,供用户实时查看。
5. 报警功能
系统设置了温度、心率和血压的阈值。当这些参数中的任何一个超过预设阈值时,蜂鸣器将发出报警声,提醒用户注意。阈值可以在程序中进行更改,以满足不同用户的需求。
6. Proteus仿真验证
在系统设计阶段,利用Proteus仿真平台对系统进行了全面的仿真测试。通过模拟各组件的工作状态和数据传输过程,验证了系统硬件电路的正确性以及软件逻辑的有效性。仿真结果表明,系统能够准确地测量和显示体温、心率脉搏以及血压值,并在参数异常时发出报警。
二、系统设计与实现
1. 硬件设计
- STM32单片机选型与配置:选择合适的STM32型号,配置时钟系统、I/O口、ADC模块等资源。
- DS18B20传感器接口设计:设计单总线通信接口电路,实现与DS18B20传感器的数据通信。
- LCD1602显示屏接口设计:设计并行或串行接口电路,实现与LCD1602显示屏的数据传输。
- 蜂鸣器驱动电路设计:设计蜂鸣器控制电路,实现报警声的发出。
- 按键模块设计:设计按键扫描电路,实现按键输入的检测与去抖处理。
- 电位器与ADC接口设计:选择合适的电位器,设计ADC采样电路,实现血压值的调节与采集。
2. 软件设计
- 主程序设计:编写主程序框架,实现系统的初始化、数据采集、数据处理、显示更新以及报警控制等功能。
- DS18B20传感器数据采集与处理:编写DS18B20传感器数据读取与处理函数,实现体温数据的准确获取与转换。
- LCD1602显示屏驱动函数:编写LCD1602显示屏驱动函数,实现体温、心率脉搏以及血压值的显示更新。
- 按键处理程序设计:编写按键扫描与处理函数,实现心率脉搏值的模拟调节。
- ADC数据采集与处理:编写ADC数据采集与处理函数,实现血压值的采集与转换。
- 报警控制程序设计:编写报警控制逻辑函数,根据当前参数与预设阈值的比较结果,控制蜂鸣器的开关状态。
三、系统性能评估与优化
- 测量准确性测试:对系统进行多次测量实验,验证体温、心率脉搏以及血压值的测量准确性。
- 响应速度测试:测试系统从参数变化到显示更新以及报警响应的时间间隔,评估系统的实时性能。
- 功耗评估与优化:分析系统在运行过程中的功耗情况,提出节能降耗的优化方案。
- 用户友好性评估:评估系统的操作界面、按键布局以及报警提示方式等是否便于用户使用和理解。
结论
本文设计并实现了一个基于STM32单片机的电子血压心率脉搏体温计模拟测量仪。该系统能够实时测量并显示体温、模拟心率脉搏以及通过电位器调节的血压值,并在参数异常时发出报警提醒。通过Proteus仿真平台的验证,系统具有较高的稳定性和测量准确性。未来工作将进一步优化系统性能,提高测量精度和实时性,并探索更多智能化功能的应用。
#include "OLED_IIC.h"
/********************************************
// fill_Picture
********************************************/
void fill_picture(uint8_t fill_Data)
{
uint8_t m,n;
for(m=0;m<8;m++)
{
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0xb0+m); //rowe0-rowe1
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0x00); //low column start address
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0x10); //high column start address
for(n=0;n<128;n++)
{
IIC_Write_Byte(OLED_Device_address,OLED_Device_Data,fill_Data);
}
}
}
void OLED_Printf_EN(uint8_t row,uint8_t column,const char *Str,...)//页、列、汉字
{
uint8_t r,n,ChaNum=0;
char string[100];
va_list ap;
va_start(ap,Str);
vsprintf(string,Str,ap);
va_end(ap);
char *ptr=string;
while(*ptr!='\0')
{
for(r=row;r<row+2;r++)//控制页一页有8行
{
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0xb0+r);//行
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,column&0x0f);//列的低四位
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0x10+(column>>4));//列的高四位
if(r==row)
{
for(n=0;n<8;n++)
IIC_Write_Byte(OLED_Device_address,OLED_Device_Data,ASCII8x16_Table[*ptr-' '][n]);
}
if(r==row+1)
{
for(n=8;n<16;n++)
IIC_Write_Byte(OLED_Device_address,OLED_Device_Data,ASCII8x16_Table[*ptr-' '][n]);
}
}
ChaNum++;
column+=8;
if(ChaNum%16==0)
row+=2;
if(ChaNum==64)
break;
ptr++;
}
}
/******************************************
// picture用来显示一个图片
******************************************/
void OLED_Picture(uint8_t *image)
{
uint8_t x,y;
for(y=0;y<8;y++)
{
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0xb0+y);
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0x0);
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0x10);
for(x=0;x<128;x++)
{
IIC_Write_Byte(OLED_Device_address,OLED_Device_Data,*image++);
}
}
}
void OLED_Init(void)
{
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0xAE); //display off
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0x20); //Set Memory Addressing Mode
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0x00); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,rowe Addressing Mode (RESET);11,Invalid
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0xb0); //Set rowe Start Address for rowe Addressing Mode,0-7
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0xc8); //Set COM Output Scan Direction
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0x00);//---set low column address
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0x10);//---set high column address
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0x40);//--set start line address
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0x81);//--set contrast control register
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0xdf);
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0xa1);//--set segment re-map 0 to 127
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0xa6);//--set normal display
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0xa8);//--set multiplex ratio(1 to 64)
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0x3F);//
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0xa4);//0xa4,Output follows RAM content;0xa5,Output ignores RAM content
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0xd3);//-set display offset
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0x00);//-not offset
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0xd5);//--set display clock divide ratio/oscillator frequency
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0xf0);//--set divide ratio
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0xd9);//--set pre-charge period
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0x22); //
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0xda);//--set com pins hardware configuration
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0x12);
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0xdb);//--set vcomh
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0x20);//0x20,0.77xVcc
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0x8d);//--set DC-DC enable
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0x14);//
IIC_Write_Byte(OLED_Device_address,OLED_Device_Command,0xaf);//--turn on oled panel
}