[卒業プロジェクト] 14-シングルチップベースの健康検出器_心拍_温度_血圧設計 (回路図 + ソースコード + シミュレーション工学 + 論文)

[卒業プロジェクト] 14-Single-chip MCU ベースの健康検出器/心拍/温度/血圧の設計 (回路図 + ソースコード + シミュレーション工学 + 論文)

ミッションステートメント

人々の健康への関心は、健康状態検出器の開発を促進しました.このプロジェクトでは、心拍、体温、血圧を検出する多機能の健康状態検出器を設計します。
1. システム全体の構造の設計を完了し、システムのブロック図を描く;
2. 主制御チップと適切なセンサーを選択して、心拍検出、温度検出、血圧検出および関連する回路設計を完了する;
3. の設計を完了するメインとサブルーチンのフローチャート;
4. Protues ソフトウェアを使用して、健康状態検出器のシステム シミュレーション テストを実行します。
データ リンク
回路図プロジェクト ファイル
ソース コード プロジェクト ファイル
シミュレーション プロジェクト ファイル
反復率の低い紙、26851 ワード

設計書

まとめ

このシステムは、主にハードウェアとソフトウェアで構成されています。ハードウェア部分はSTC89C51シングルチップマイコンの最小システムユニット、温度検出回路ユニット、圧力検出ユニット、体温検出ユニット、アラームユニット、ヒューマンコンピュータインタラクションユニット、電源ユニット、液晶表示ユニットで構成されています。設計の観点から、ハードウェアはシステムの安定性と信頼性を考慮に入れる必要があります。ソフトウェア部分は、システムソフトウェアの全体的なフローチャートを描画し、各サブコントロールドライバーを描画し、ドライバープログラムを記述してシステムプログラムの設計を完了します。ハードウェアとソフトウェアの設計では、設計を整理して確実に実行できるように、機能分割に従って設計することを選択します。システム設計では、物理的なオブジェクトを作成するのではなく、シミュレーション モードでデバッグします。シミュレーション ソフトウェア Proteus を使用して、システム ハードウェア回路を構築し、デバッグおよびテストします。最後に、血圧検出、脈拍検出、および体温検出が完了し、しきい値を調整して、システムのカスタマイズされたアラーム設定を実現し、誤警報を防ぐことができます。

フレームワーク アーキテクチャの設計

ここに画像の説明を挿入

設計指示および設計文書

ここに画像の説明を挿入

ここに画像の説明を挿入

繰り返し率の低い論文、26851語
ここに画像の説明を挿入

ソースコード表示

ここに画像の説明を挿入

#include <reg52.h>
#include <intrins.h>
#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;
			}
			}
		}
	}
}

おすすめ

転載: blog.csdn.net/qq_22592979/article/details/128108703