【畢業(yè)設(shè)計(jì)】14-基于單片機(jī)的健康檢測(cè)儀/心跳/溫度/血壓設(shè)計(jì)(原理圖+源碼+仿真工程+論文)
任務(wù)書(shū)
人們對(duì)自身健康的關(guān)注促進(jìn)了健康狀態(tài)檢測(cè)儀的發(fā)展,本課題設(shè)計(jì)一款具備心跳、體溫、血壓檢測(cè)的多功能健康狀態(tài)檢測(cè)儀。
1.完成整個(gè)系統(tǒng)結(jié)構(gòu)的設(shè)計(jì),繪制系統(tǒng)框圖;
2.選擇主控芯片,及合適的傳感器來(lái)分別完成心跳檢測(cè)、溫度檢測(cè)、血壓檢測(cè)及相關(guān)電路設(shè)計(jì);
3.完成主、子程序流程圖設(shè)計(jì);
4.運(yùn)用Protues軟件對(duì)健康狀態(tài)檢測(cè)儀進(jìn)行系統(tǒng)仿真測(cè)試。
資料鏈接
原理圖工程文件
源碼工程文件
仿真工程文件
論文
設(shè)計(jì)說(shuō)明書(shū)
摘要
本次系統(tǒng)主要有硬件和軟件兩個(gè)部分組成。硬件部分由STC89C51單片機(jī)最小系統(tǒng)單元,溫度檢測(cè)電路單元,壓力檢測(cè)單元,體溫檢測(cè)單元,報(bào)警單元,人機(jī)交互單元,電源單元,液晶顯示器單元組成,在設(shè)計(jì)上硬件需要考慮到系統(tǒng)的穩(wěn)定性以及可靠性。軟件部分通過(guò)對(duì)系統(tǒng)軟件總流程圖繪制,并繪制各個(gè)子控制驅(qū)動(dòng)再對(duì)驅(qū)動(dòng)程序編寫(xiě)完成系統(tǒng)程序的設(shè)計(jì)。在硬件與軟件的設(shè)計(jì)上選擇按照功能性分區(qū)設(shè)計(jì),使設(shè)計(jì)有條理運(yùn)行可靠。系統(tǒng)設(shè)計(jì)沒(méi)有制作實(shí)物而是通過(guò)仿真方式調(diào)試完成。使用仿真軟件Proteus來(lái)搭建系統(tǒng)硬件電路,調(diào)試測(cè)試。最后完成了血壓檢測(cè),脈搏檢測(cè),體溫檢測(cè)并,并可以調(diào)節(jié)閾值實(shí)現(xiàn)對(duì)系統(tǒng)的報(bào)警自定義設(shè)置防止誤報(bào)。
設(shè)計(jì)框架架構(gòu)
設(shè)計(jì)說(shuō)明書(shū)及設(shè)計(jì)文件
論文低重復(fù)率,26851字文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-781659.html
源碼展示
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-781659.html
#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口為L(zhǎng)CD_DATA */
sbit LCD_RS = P2 ^ 5;
sbit LCD_RW = P2 ^ 6;
sbit LCD_E = P2 ^ 7; /* 定義LCD控制引腳 */
sbit Xintiao = P1 ^ 0; /* 心率檢測(cè)輸入端定義 */
sbit speaker = P2 ^ 4; /* 蜂鳴器引腳定義 */
sbit DQ = P3 ^ 7;
uchar blood = 0;
voiddelay5ms(void); /* 誤差 0us */
voidLCD_WriteData(ucharLCD_1602_DATA); /********LCD1602數(shù)據(jù)寫(xiě)入***********/
voidLCD_WriteCom(ucharLCD_1602_COM); /********LCD1602命令寫(xiě)入***********/
void lcd_1602_word( uchar Adress_Com, uchar Num_Adat, uchar *Adress_Data ); /*1602字符顯示函數(shù),變量依次為字符顯示首地址,顯示字符長(zhǎng)度,所顯示的字符*/
voidInitLcd(); /* 液晶初始化函數(shù) */
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; /* 設(shè)置的位(0正常工作,1設(shè)置上限,2設(shè)置下限) */
uchar View_Change;
uchar bloodL = 139;
uchar bloodH = 160;
uint tempL = 360;
uint tempH = 373;
/*****延時(shí)子程序*****/
void Delay_DS18B20( int num )
{
while ( num-- ) ;
}
/*****初始化DS18B20*****/
void Init_DS18B20( void )
{
unsigned char x = 0;
DQ = 1; /* DQ復(fù)位 */
Delay_DS18B20( 8 ); /*稍做延時(shí) */
DQ = 0; /* 單片機(jī)將DQ拉低 */
Delay_DS18B20( 80 ); /* 精確延時(shí),大于480us */
DQ = 1; /* 拉高總線 */
Delay_DS18B20( 34 );
}
/*****讀一個(gè)字節(jié)*****/
unsigned char ReadOneChar( void )
{
unsigned char i = 0;
unsigned char dat = 0;
for ( i = 8; i > 0; i-- )
{
DQ = 0; /* 給脈沖信號(hào) */
dat >>= 1;
DQ = 1; /* 給脈沖信號(hào) */
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 ); /* 跳過(guò)讀序號(hào)列號(hào)的操作 */
WriteOneChar( 0x44 ); /* 啟動(dòng)溫度轉(zhuǎn)換 */
Init_DS18B20();
WriteOneChar( 0xCC ); /* 跳過(guò)讀序號(hào)列號(hào)的操作 */
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() /* 主函數(shù) */
{
InitLcd();
Tim_Init();
lcd_1602_word( 0x80, 16, "Heart Rate: " ); /* 初始化顯示 */
lcd_1602_word( 0xC0, 16, "Te: BP: " ); /* 顯示第二行數(shù)據(jù) */
TR0 = 1;
TR1 = 1; /* 打開(kāi)定時(shí)器 */
while ( 1 ) /* 進(jìn)入循環(huán) */
{
if ( View_Con == 0 )
{
wendu = ReadTemperature();
lcd_1602_word( 0xC0, 3, "Te:" ); /* 顯示第二行數(shù)據(jù) */
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 ) /* 不在范圍內(nèi)報(bào)警 */
speaker=0; /* 蜂鳴器響 */
else
speaker = 1;
}
}
lcd_1602_word( 0xC0 + 8, 4, " BP:" ); /* 顯示第二行數(shù)據(jù) */
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, " " ); /* 顯示第二行數(shù)據(jù) */
if (blood >= bloodH || blood < bloodL ) /* 不在范圍內(nèi)報(bào)警 */
speaker=0; /* 蜂鳴器響 */
else
speaker = 1;
}
if ( Key_Change ) /*有按鍵按下并已經(jīng)得出鍵值 */
{
Key_Change = 0; /* 將按鍵使能變量清零,等待下次按鍵按下 */
View_Change = 1;
switch ( Key_Value ) /* 判斷鍵值 */
{
case 1: /* 設(shè)置鍵按下 */
{
View_Con++; /* 設(shè)置的位加 */
if ( View_Con == 3 ) /* 都設(shè)置好后將此變量清零 */
View_Con = 0;
break; /* 跳出,下同 */
}
case 2: /* 加鍵按下 */
{
if ( View_Con == 2 ) /* 判斷是設(shè)置上限 */
{
if ( Xintiao_H < 150 ) /*上限數(shù)值小于150 */
Xintiao_H++; /*上限+ */
}
if ( View_Con == 1 ) /* 如果是設(shè)置下限 */
{
if ( Xintiao_L < Xintiao_H - 1 ) /*下限值小于上限-1(下限值不能超過(guò)上限) */
Xintiao_L++; /*下限值加 */
}
break;
}
case 3: /* 減鍵按下 */
{
if ( View_Con == 2 ) /* 設(shè)置上限 */
{
if ( Xintiao_H > Xintiao_L + 1 ) /*上限數(shù)據(jù)大于下限+1(同樣上限值不能小于下限) */
Xintiao_H--; /*上限數(shù)據(jù)減 */
}
if ( View_Con == 1 ) /* 設(shè)置下限 */
{
if ( Xintiao_L > 30 ) /*下限數(shù)據(jù)大于30時(shí) */
Xintiao_L--; /*下限數(shù)據(jù)減 */
}
break;
}
}
}
if ( View_Change ) /* 開(kāi)始顯示變量 */
{
View_Change = 0; /* 變量清零 */
if ( stop == 0 ) /* 心率正常時(shí) */
{
if ( View_Data[0] == 0x30 ) /* 最高位為0時(shí)不顯示 */
View_Data[0] = ' ';
}else { /* 心率不正常(計(jì)數(shù)超過(guò)5000,也就是兩次信號(hào)時(shí)間超過(guò)5s)不顯示數(shù)據(jù) */
View_Data[0] = ' ';
View_Data[1] = ' ';
View_Data[2] = ' ';
}
switch ( View_Con )
{
case 0: /* 正常顯示 */
{
lcd_1602_word( 0x80, 16, "Heart Rate: " ); /* 顯示一行數(shù)據(jù) */
lcd_1602_word( 0x8d, 3, View_Data ); /* 第1行顯示心率 */
break;
}
case 1: /* 設(shè)置下限時(shí)顯示 */
{
lcd_1602_word( 0x80, 16, "Heart Rate: " ); /* 第一行顯示心率 */
lcd_1602_word( 0x8d, 3, View_Data );
View_L[0] = Xintiao_L / 100 + 0x30; /* 將下限數(shù)據(jù)拆字 */
View_L[1] = Xintiao_L % 100 / 10 + 0x30;
View_L[2] = Xintiao_L % 10 + 0x30;
if ( View_L[0] == 0x30 ) /* 最高位為0時(shí),不顯示 */
View_L[0] = ' ';
lcd_1602_word( 0xC0, 16, "Warning L : " );/* 第二行顯示下限數(shù)據(jù) */
lcd_1602_word( 0xCd, 3, View_L );
break;
}
case 2: /* 設(shè)置上限時(shí)顯示(同上) */
{
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;
}
}
}
}
}
到了這里,關(guān)于【畢業(yè)設(shè)計(jì)】14-基于單片機(jī)的健康檢測(cè)儀_心跳_溫度_血壓設(shè)計(jì)(原理圖+源碼+仿真工程+論文)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!