設(shè)計采用STC89C51作為主控芯片,采用ST188光電對管對脈搏信號進(jìn)行采集,再由LM358將信號進(jìn)行放大后由74HC14將方波信號整形后通過單片機(jī)的計數(shù)器進(jìn)行采集,單片機(jī)通過定時器和計數(shù)器的配合使用,準(zhǔn)確的計算出脈搏數(shù)后通過LCD1602進(jìn)行實時顯示脈搏測量信息。當(dāng)沒有在測量時候系統(tǒng)檢測到會自動的停止測量,在下次檢測到脈搏信號后又自動打開。
00018-2.jpg (561.91 KB, 下載次數(shù): 46)
下載附件
2019-12-19 21:33 上傳
原理圖如下:
脈搏計原理圖.png (43.8 KB, 下載次數(shù): 39)
下載附件
2019-12-19 21:35 上傳
單片機(jī)源程序如下:
- /*************************************************************
- 脈搏計
- 補(bǔ)充說明:
- ***************************************************************/
- #include<reg52.h> //頭文件
- #include<INTERRUPT.h>
- #include<LCD1602.h>
- /************************引腳定義************************/
- sbit IN=P3^4; //脈搏信號輸入
- /********************************************************
- 函數(shù)名稱:void display()
- 函數(shù)作用:脈搏顯示程序
- 參數(shù)說明:
- ********************************************************/
- void display()
- {
- lcd1602_write_character(0,1,"Sphygmus:"); //顯示脈搏數(shù)、【0:表示第1列,1:表示第1行,所有關(guān)于顯示都一樣】
- LCD_disp_char(9,1,ASCII[maibo/100]);
- LCD_disp_char(10,1,ASCII[maibo%100/10]);
- LCD_disp_char(11,1,ASCII[maibo%10]);
- lcd1602_write_character(12,1,"bpm");
- lcd1602_write_character(0,2,"Time:"); //顯示脈搏檢測時間、【0:表示第1列,2:表示第2行,所有關(guān)于顯示都一樣】
- LCD_disp_char(5,2,ASCII[T1_num/1000]);
- LCD_disp_char(6,2,ASCII[T1_num%1000/100]);
- LCD_disp_char(7,2,'s');
- LCD_disp_char(10,2,ASCII[TL0/100]); //顯示當(dāng)前檢測到的脈搏數(shù)、【10:表示第11列,2:表示第2行,所有關(guān)于顯示都一樣】
- LCD_disp_char(11,2,ASCII[TL0%100/10]);
- LCD_disp_char(12,2,ASCII[TL0%10]);
- lcd1602_write_character(13,2,"bpm");
- }
- /********************************************************
- 函數(shù)名稱:void main()
- 函數(shù)作用:主函數(shù)
- 參數(shù)說明:
- ********************************************************/
- void main()
- {
- T0_init(); //計數(shù)器0、定時器1初始化
- LCD_init(); //LCD1602初始化
- while(1) //死循環(huán)
- {
- if(IN==0) //檢測到脈搏信號
- TR1=1;//自動開啟檢測計算脈搏。定時器1開啟
- display();//顯示脈搏相關(guān)信息
- //計算脈搏
- if(TL0>=5)//如果采集到5個脈搏信號
- {
- TL0=0;//重置脈搏數(shù)量,重新計數(shù)
- if(T1_num<1000&&T1_num>150)//計算脈搏,條件就是滿足5個脈搏信號用時大于1.5S且小于10S,否者都忽略
- {
- if(T1_num<375) //脈搏大于80bmp時采用兩次求和取平均方式提高精度
- maibo=(maibo+30000/T1_num)/2;
- else //否者,直接計算脈搏
- maibo=30000/T1_num;//脈搏=(5/(T1_num/100))*60=30000/T1_num;其中T1_num單位是10毫秒30000/375=80
- }
- T1_num=0;//重置計時
- }
- }
- }
- #ifndef _INTERRUPT_H_
- #define _INTERRUPT_H_
- #include<reg52.h>
- #include<math.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define MAX 6 //檢測結(jié)束脈搏數(shù)量
- /************************引腳定義************************/
- sbit IN=P3^2; //脈搏信號輸入
- /************************變量定義************************/
- uchar T0_num=0; //定時計數(shù)變量
- uint T0_nums=0; //計時脈搏時間間隔變量
- uchar miao=0; //測量時間秒鐘
- uchar maibos=0; //最終測量脈搏數(shù)
- uchar maibo=0; //記錄脈搏
- uchar T[MAX]={0};//記錄已采集到的脈搏時間間隔
- uchar low=0; //上一次脈搏時間間隔
- /*********************************************************
- 函數(shù)名稱:void T0_init()
- 函數(shù)作用:計數(shù)器0、定時器1初始化函數(shù)
- 參數(shù)說明:
- *********************************************************/
- void T0_init()
- {
- EA=1; //開總中斷
- TMOD=0x01; //計數(shù)器0工作工作方式1
- ET0=1; //定時器T0中斷允許
- TH0=(65536-10000)/256; //定時器T0的高8位賦初值
- TL0=(65536-10000)%256; //定時器T0的低8位賦初值
- TR0=0; //關(guān)閉定時器
- }
- /*********************************************************
- 函數(shù)名稱:void Int0_init()
- 函數(shù)作用:外部中斷0初始化函數(shù)
- 參數(shù)說明:
- *********************************************************/
- void Int0_init()
- {
- EA=1; //開放總中斷
- IT0=1; //選擇負(fù)跳變來觸發(fā)外中斷
- EX0=0; //允許使用外中斷
- }
- /*********************************************************
- 函數(shù)名稱:void T0_interrupt(void) interrupt 1
- 函數(shù)作用:定時器1中斷處理函數(shù)
- 參數(shù)說明:10毫秒定時中斷一次
- *********************************************************/
- void T0_interrupt(void) interrupt 1
- {
- TH0=(65536-10000)/256;//定時器T0的高8位重新賦初值
- TL0=(65536-10000)%256;//定時器T0的低8位重新賦初值
- if(EX0==1) //開啟脈搏檢測
- {
- T0_num++; //計數(shù)變量+1
- if(T0_num>=100) //100*10ms=1S
- {
- T0_num=0; //重置計數(shù)變量
- miao++; //秒+1
- if(miao>99)
- miao=0;
- }
- T0_nums++; //脈搏時間間隔變量+1
- if(T0_nums>=500) //500*10ms=5S
- {
- miao=0; //采集超時,清除所有變量
- maibo=0;
- EX0=0; //關(guān)閉脈搏檢測
- TR0=0;
- }
- }
- }
- /*********************************************************
- 函數(shù)名稱:void init0(void) interrupt 0
- 函數(shù)作用:外部中斷0中斷處理函數(shù)
- 參數(shù)說明:
- *********************************************************/
- void init0(void) interrupt 0
- {
- uchar i=0;
- uint TS=0;
- if(IN==0&&T0_nums>39) //再次確認(rèn)感應(yīng),并且距上一次感應(yīng)的時間足夠長,如果過短認(rèn)為是波動放棄處理
復(fù)制代碼
全部資料51hei下載地址:
脈搏計源程序代碼(Keil).zip
(125.67 KB, 下載次數(shù): 29)
2019-12-19 21:37 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|