每一次動手操作總會遇到很多困難,經歷很多挫折,不過每次收獲都很多,未來加油!
制作出來的實物圖如下:
IMG_20190801_092241.jpg (288.92 KB, 下載次數: 42)
下載附件
2019-8-2 04:15 上傳
一、主要器材
芯片5532、LM393、電容、電阻、51單片機
三、實驗原理
通過紅外對管檢測血管舒張收縮情況,反應為電壓的變化,經過放大濾波,輸出電平到單片機,通過程序計算周期,再計算心率并在液晶上顯示。
0.png (23.22 KB, 下載次數: 52)
下載附件
2019-8-2 04:13 上傳
0.png (46.95 KB, 下載次數: 49)
下載附件
2019-8-2 04:13 上傳
測量計算
設K個連續的動脈搏動所用時間為t(秒),在時間 t 內心率的平均值為n(次/分),則:
n = 60K/t
為了能夠控制用單片機計算機測定t值,我們利用脈動信號控制(在K個連續的脈搏周期內)單片機的定時/計數器T0定時(定時1ms中斷一次),工作寄存器對中斷次數進行計數,然后讀取計數值。設該計數值為N,于是有:
t = 0.001N
把(2)帶入(1)得到:
n = 60k/0.001N =60000K/N
式(3)就是利用單片計算機測定心率值的數學模型(誤差小于0.4%)。在該單片機系統中,K = 1~~9(用戶可通過按鍵自行設置)。可測心率范圍20次/分~~200次/分(N的范圍:300~~30000)。
IMG_20190801_083511.jpg (199.39 KB, 下載次數: 46)
下載附件
2019-8-2 04:15 上傳
IMG_20190801_083502.jpg (163.79 KB, 下載次數: 46)
下載附件
2019-8-2 04:15 上傳
IMG_20190801_083458.jpg (193.94 KB, 下載次數: 49)
下載附件
2019-8-2 04:15 上傳
單片機源程序如下:
- #include<reg52.h>
- #define LCD_DB P0
- unsigned long int fre;
- unsigned char time;
- unsigned char Flag0;
- unsigned char Flag1;
- unsigned char Flag2;
- unsigned char count;
- unsigned char kai;
- sbit LCD_RS=P2^6;
- sbit LCD_RW=P2^5;
- sbit LCD_E=P2^7;
- sbit key_0=P3^1;
- sbit key_1=P3^0;
- sbit key_2=P3^2;
- sbit key_3=P3^3;
- sbit beep=P2^0;
- unsigned char character[10]={0};
- unsigned char character_1[]={"Heart Rate "};
- unsigned char character_2[]={"upper "};
- unsigned char character_3[]={"lower "};
- void displaym();
- void displaym1();
- void LCD_init(void);
- void LCD_write_command(unsigned char command);
- void LCD_write_data(unsigned char dat);
- void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat);
- void delay_n(unsigned int n);
- void clocktimer_init();
-
- //--------------------------------------------------------------延時
- void delay_n(unsigned int n)//延時函數
- {
- unsigned int i;
- unsigned char j;
- for(i=n;i>0;i--)
- for(j=0;j<2;j++);
- }
- //--------------------------------------------------------------液晶顯示
- void LCD_init(void)//液晶初始化函數
- {
- LCD_write_command(0x38);
- LCD_write_command(0x38);
- LCD_write_command(0x38);
- LCD_write_command(0x0c);
- LCD_write_command(0x06);
- LCD_write_command(0x01);
- delay_n(100);
- }
-
- void LCD_write_command(unsigned char dat)//液晶寫命令函數
- {
- LCD_DB=dat;
- LCD_RS=0;
- LCD_RW=0;
- LCD_E=1;
- LCD_E=0;
- delay_n(1);
- }
-
- void LCD_write_data(unsigned char dat)//液晶寫數據函數
- {
- LCD_DB=dat;
- LCD_RS=1;
- LCD_RW=0;
- LCD_E=1;
- LCD_E=0;
- delay_n(1);
- }
- void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat)//液晶顯示一個字符
- {
- unsigned char address;
- if(y==1)
- address=0x80+x;
- else
- address=0xc0+x;
- LCD_write_command(address);
- LCD_write_data(dat);
- }
- void LCD_disp_num(unsigned char x,unsigned char y,unsigned char dat)//顯示一個數字
- {
- unsigned char address;
- if(y==1)
- address=0x80+x;
- else
- address=0xc0+x;
- LCD_write_command(address);
- LCD_write_data(dat+48);
- }
- void dis_num(void)
- {
- unsigned char i=0,j=0,k=0;
- LCD_write_command(0x01);
- character[0] = fre/1000;
- character[1] = fre/100%10;
- character[2] = fre/10%10;
- character[3] = fre%10;
- for(i = 0;i<10;i++)
- {
- LCD_disp_char(i+0,1,character_1[i]);
- }
- for(i = 0;i<4;i++)
- {
- if(character[i]!=0)
- break;
- }
- k=4-i;
- for(j = 0;j<k;j++)
- {
- if(fre>40&&fre<120)
- LCD_disp_num(12+j,1,character[i++]);
- }
- if(Flag0==1)
- {
- for(i = 0;i<5;i++)
- {
- LCD_disp_char(i+0,2,character_2[i]);
- }
- displaym();
- }
- if(Flag0==2)
- {
- for(i = 0;i<5;i++)
- {
- LCD_disp_char(i+0,2,character_3[i]);
- }
- displaym1();
- }
-
- }
- //-------------------------------------------------------------定時/計數器初始化
- void clocktimer_init(void)
- {
- TMOD=0x60;//計數器0和計數器1賦初值初始化
- TL1=0;
- TR1=1;
- ET1=1;
- RCAP2H=(65536-60000)/256;
- RCAP2L=(65536-60000)%256;
- TH2=RCAP2H;
- TL2=RCAP2L;
- ET2=1;
- TR2=1;
- EA=1;
- }
- void clock1(void) interrupt 3 //計數器1中斷
- {
- count++;
- }
- void timer2(void) interrupt 5 //定時器2中斷
- {
- time++;
- TF2=0;
- if (time==200)
- {
- time=0;
- EA=0;
- fre=(count*256+TL1)*4;
- TL1=0;
- TH1=0;
- count=0;
- EA=1;
- }
- }
-
- void key_scan()
- {
- if(key_0==0)
- {
- delay_n(50);
- if(key_0==0)
- {
- while(key_0==0);
- Flag0++;
- while(Flag0>2)
- Flag0=0;
- }
- }
- if(key_1==0)
- {
- delay_n(100);
- if(key_1==0)
- {
- if(Flag0==1)
- {
- Flag1++;
- dis_num();
- }
- if(Flag0==2)
- {
- Flag2++;
- dis_num();
- }
- }
- }
- if(key_2==0)
- {
- delay_n(100);
- if(key_2==0)
- {
- if(Flag0==1)
- {
- Flag1--;
- dis_num();
- }
- if(Flag0==2)
- {
- Flag2--;
- dis_num();
- }
- }
- }
- if(key_3==0)
- {
- delay_n(100);
- if(key_3==0)
- {
- while(key_3==0);
- kai=1-kai;
- }
- }
- }
-
- void displaym()
- {
- LCD_write_command(0xc6);
- if(Flag1/200%10!=0)
- {
- LCD_write_data(Flag1/200%10+0x30);
- }
- else
- {
- LCD_write_data(' ');
- }
-
- if(Flag1/200%10==0&&Flag1/20%10==0)
- {
- LCD_write_data(' ');
- }
- else
- {
- LCD_write_data(Flag1/20%10+0x30);
- }
- LCD_write_data(Flag1/2%10+0x30);
- }
- void displaym1()
- {
- LCD_write_command(0xc6);
- if(Flag2/200%10!=0)
- {
- LCD_write_data(Flag2/200%10+0x30);
- }
- else
- {
- LCD_write_data(' ');
- }
-
- if(Flag2/200%10==0&&Flag2/20%10==0)
- {
- LCD_write_data(' ');
- }
- else
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
代碼文檔.7z
(3.21 MB, 下載次數: 18)
2019-8-2 04:18 上傳
點擊文件名下載附件
加油 下載積分: 黑幣 -5
|