每一次动手操作总会遇到很多困难,经历很多挫折,不过每次收获都很多,未来加油!
制作出来的实物图如下:
一、主要器材
芯片5532、LM393、电容、电阻、51单片机
三、实验原理
通过红外对管检测血管舒张收缩情况,反应为电压的变化,经过放大滤波,输出电平到单片机,通过程序计算周期,再计算心率并在液晶上显示。
测量计算
设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)。
单片机源程序如下:
- #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)
|