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