【毕业设计】14-基于单片机的健康检测仪/心跳/温度/血压设计(原理图+源码+仿真工程+论文)

文章目录

【毕业设计】14-基于单片机的健康检测仪/心跳/温度/血压设计(原理图+源码+仿真工程+论文)任务书设计说明书摘要设计框架架构设计说明书及设计文件源码展示

任务书

人们对自身健康的关注促进了健康状态检测仪的发展,本课题设计一款具备心跳、体温、血压检测的多功能健康状态检测仪。 1.完成整个系统结构的设计,绘制系统框图; 2.选择主控芯片,及合适的传感器来分别完成心跳检测、温度检测、血压检测及相关电路设计; 3.完成主、子程序流程图设计; 4.运用Protues软件对健康状态检测仪进行系统仿真测试。 资料链接 原理图工程文件 源码工程文件 仿真工程文件 论文

设计说明书

摘要

本次系统主要有硬件和软件两个部分组成。硬件部分由STC89C51单片机最小系统单元,温度检测电路单元,压力检测单元,体温检测单元,报警单元,人机交互单元,电源单元,液晶显示器单元组成,在设计上硬件需要考虑到系统的稳定性以及可靠性。软件部分通过对系统软件总流程图绘制,并绘制各个子控制驱动再对驱动程序编写完成系统程序的设计。在硬件与软件的设计上选择按照功能性分区设计,使设计有条理运行可靠。系统设计没有制作实物而是通过仿真方式调试完成。使用仿真软件Proteus来搭建系统硬件电路,调试测试。最后完成了血压检测,脉搏检测,体温检测并,并可以调节阈值实现对系统的报警自定义设置防止误报。

设计框架架构

设计说明书及设计文件

论文低重复率,26851字

源码展示

#include

#include

#include "adc0832.h"

#define uint unsigned int

#define uchar unsigned char

#define ulong unsigned long /* 宏定义 */

#define LCD_DATA P0/* 定义P0口为LCD_DATA */

sbit LCD_RS = P2 ^ 5;

sbit LCD_RW = P2 ^ 6;

sbit LCD_E = P2 ^ 7; /* 定义LCD控制引脚 */

sbit Xintiao = P1 ^ 0; /* 心率检测输入端定义 */

sbit speaker = P2 ^ 4; /* 蜂鸣器引脚定义 */

sbit DQ = P3 ^ 7;

uchar blood = 0;

voiddelay5ms(void); /* 误差 0us */

voidLCD_WriteData(ucharLCD_1602_DATA); /********LCD1602数据写入***********/

voidLCD_WriteCom(ucharLCD_1602_COM); /********LCD1602命令写入***********/

void lcd_1602_word( uchar Adress_Com, uchar Num_Adat, uchar *Adress_Data ); /*1602字符显示函数,变量依次为字符显示首地址,显示字符长度,所显示的字符*/

voidInitLcd(); /* 液晶初始化函数 */

void Tim_Init();

uchar Xintiao_Change=0; /* */

uint Xintiao_Jishu;

uchar stop;

uchar View_Data[3];

uchar View_L[3];

uchar View_H[3];

uchar Xintiao_H = 100; /*上限 */

uchar Xintiao_L = 40; /*下限 */

uint wendu = 0;

uchar Key_Change;

uchar Key_Value; /*按键键值 */

uchar View_Con; /* 设置的位(0正常工作,1设置上限,2设置下限) */

uchar View_Change;

uchar bloodL = 139;

uchar bloodH = 160;

uint tempL = 360;

uint tempH = 373;

/*****延时子程序*****/

void Delay_DS18B20( int num )

{

while ( num-- ) ;

}

/*****初始化DS18B20*****/

void Init_DS18B20( void )

{

unsigned char x = 0;

DQ = 1; /* DQ复位 */

Delay_DS18B20( 8 ); /*稍做延时 */

DQ = 0; /* 单片机将DQ拉低 */

Delay_DS18B20( 80 ); /* 精确延时,大于480us */

DQ = 1; /* 拉高总线 */

Delay_DS18B20( 34 );

}

/*****读一个字节*****/

unsigned char ReadOneChar( void )

{

unsigned char i = 0;

unsigned char dat = 0;

for ( i = 8; i > 0; i-- )

{

DQ = 0; /* 给脉冲信号 */

dat >>= 1;

DQ = 1; /* 给脉冲信号 */

if ( DQ )

dat |= 0x80;

Delay_DS18B20( 4 );

}

return(dat);

}

void WriteOneChar( unsigned char dat )

{

unsigned char i = 0;

for ( i = 8; i > 0; i-- )

{

DQ = 0;

DQ = dat & 0x01;

Delay_DS18B20( 5 );

DQ = 1;

dat >>= 1;

}

}

/*****读取温度*****/

unsigned int ReadTemperature( void )

{

unsigned char a = 0;

unsigned char b = 0;

unsigned int t = 0;

float tt = 0;

Init_DS18B20();

WriteOneChar( 0xCC ); /* 跳过读序号列号的操作 */

WriteOneChar( 0x44 ); /* 启动温度转换 */

Init_DS18B20();

WriteOneChar( 0xCC ); /* 跳过读序号列号的操作 */

WriteOneChar( 0xBE ); /* 读取温度寄存器 */

a = ReadOneChar(); /* 读低8位 */

b = ReadOneChar(); /* 读高8位 */

t = b;

t <<= 8;

t = t | a;

tt = t * 0.0625;

t = tt * 10 + 0.5; /* 放大10倍输出并四舍五入 */

return(t);

}

void main() /* 主函数 */

{

InitLcd();

Tim_Init();

lcd_1602_word( 0x80, 16, "Heart Rate: " ); /* 初始化显示 */

lcd_1602_word( 0xC0, 16, "Te: BP: " ); /* 显示第二行数据 */

TR0 = 1;

TR1 = 1; /* 打开定时器 */

while ( 1 ) /* 进入循环 */

{

if ( View_Con == 0 )

{

wendu = ReadTemperature();

lcd_1602_word( 0xC0, 3, "Te:" ); /* 显示第二行数据 */

if ( wendu != 0 && wendu !=850)

{

LCD_WriteCom( 0x80 + 0x40 + 3 );

LCD_WriteData( wendu / 100 + 0x30 );

LCD_WriteData( wendu % 100 / 10 + 0x30 );

LCD_WriteData( '.' );

LCD_WriteData( wendu % 100 % 10 + 0x30 );

LCD_WriteData( 0xdf );

if(wendu>350 && wendu<450) {

if (wendu >= tempH || wendu < tempL ) /* 不在范围内报警 */

speaker=0; /* 蜂鸣器响 */

else

speaker = 1;

}

}

lcd_1602_word( 0xC0 + 8, 4, " BP:" ); /* 显示第二行数据 */

LCD_WriteCom( 0x80 + 0x40 + 12 );

LCD_WriteData( blood / 100 + 0x30 );

LCD_WriteData( blood % 100 / 10 + 0x30 );

LCD_WriteData( blood % 100 % 10 + 0x30 );

lcd_1602_word( 0xC0 + 15, 1, " " ); /* 显示第二行数据 */

if (blood >= bloodH || blood < bloodL ) /* 不在范围内报警 */

speaker=0; /* 蜂鸣器响 */

else

speaker = 1;

}

if ( Key_Change ) /*有按键按下并已经得出键值 */

{

Key_Change = 0; /* 将按键使能变量清零,等待下次按键按下 */

View_Change = 1;

switch ( Key_Value ) /* 判断键值 */

{

case 1: /* 设置键按下 */

{

View_Con++; /* 设置的位加 */

if ( View_Con == 3 ) /* 都设置好后将此变量清零 */

View_Con = 0;

break; /* 跳出,下同 */

}

case 2: /* 加键按下 */

{

if ( View_Con == 2 ) /* 判断是设置上限 */

{

if ( Xintiao_H < 150 ) /*上限数值小于150 */

Xintiao_H++; /*上限+ */

}

if ( View_Con == 1 ) /* 如果是设置下限 */

{

if ( Xintiao_L < Xintiao_H - 1 ) /*下限值小于上限-1(下限值不能超过上限) */

Xintiao_L++; /*下限值加 */

}

break;

}

case 3: /* 减键按下 */

{

if ( View_Con == 2 ) /* 设置上限 */

{

if ( Xintiao_H > Xintiao_L + 1 ) /*上限数据大于下限+1(同样上限值不能小于下限) */

Xintiao_H--; /*上限数据减 */

}

if ( View_Con == 1 ) /* 设置下限 */

{

if ( Xintiao_L > 30 ) /*下限数据大于30时 */

Xintiao_L--; /*下限数据减 */

}

break;

}

}

}

if ( View_Change ) /* 开始显示变量 */

{

View_Change = 0; /* 变量清零 */

if ( stop == 0 ) /* 心率正常时 */

{

if ( View_Data[0] == 0x30 ) /* 最高位为0时不显示 */

View_Data[0] = ' ';

}else { /* 心率不正常(计数超过5000,也就是两次信号时间超过5s)不显示数据 */

View_Data[0] = ' ';

View_Data[1] = ' ';

View_Data[2] = ' ';

}

switch ( View_Con )

{

case 0: /* 正常显示 */

{

lcd_1602_word( 0x80, 16, "Heart Rate: " ); /* 显示一行数据 */

lcd_1602_word( 0x8d, 3, View_Data ); /* 第1行显示心率 */

break;

}

case 1: /* 设置下限时显示 */

{

lcd_1602_word( 0x80, 16, "Heart Rate: " ); /* 第一行显示心率 */

lcd_1602_word( 0x8d, 3, View_Data );

View_L[0] = Xintiao_L / 100 + 0x30; /* 将下限数据拆字 */

View_L[1] = Xintiao_L % 100 / 10 + 0x30;

View_L[2] = Xintiao_L % 10 + 0x30;

if ( View_L[0] == 0x30 ) /* 最高位为0时,不显示 */

View_L[0] = ' ';

lcd_1602_word( 0xC0, 16, "Warning L : " );/* 第二行显示下限数据 */

lcd_1602_word( 0xCd, 3, View_L );

break;

}

case 2: /* 设置上限时显示(同上) */

{

lcd_1602_word( 0x80, 16, "Heart Rate: " );

lcd_1602_word( 0x8d, 3, View_Data );

View_H[0] = Xintiao_H / 100 + 0x30;

View_H[1] = Xintiao_H % 100 / 10 + 0x30;

View_H[2] = Xintiao_H % 10 + 0x30;

if ( View_H[0] == 0x30 )

View_H[0] = ' ';

lcd_1602_word( 0xC0, 16, "Warning H : " );

lcd_1602_word( 0xCd, 3, View_H );

break;

}

}

}

}

}

相关阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: