#include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit rs=P1^0; //数据与命令选择控制引脚 sbit rw=P1^1; //读与写选择控制引脚 sbit en=P1^2; //使能择控制引脚 sbit bf=P0^7; //忙标志位 sbit P32=P3^2; unsigned char i=0,timecount=0,displayOK=0,rate=0,aa=0; unsigned int time[6]={0}; /************ 延时函数 *****************/ void delay(uint z) { while(z--); } /************ 忙检测函数 *****************/ void jiance() { P0=0xff; rs=0;rw=1;en=1; while(bf); //如果BF==1表示液晶在忙 en=0; } /************ 写命令函数 *****************/ void write_com(uchar com) { jiance(); P0=com; rs=0;rw=0;en=1; delay(2); en=0; } /************ 写数据函数 *****************/ void write_dat(uchar dat) { jiance(); P0=dat; rs=1;rw=0;en=1; delay(2); en=0; } /************ 1602液晶初始化函数 *****************/ void init_lcd() { write_com(0x38); // 设置16*2显示,5*7点阵,8位数据接口 write_com(0x0c); // 开显示,不显示光标 write_com(0x06); // 地址加1,当写入数据的时候光标右移 write_com(0x01); //清屏 } /******************************************************************/ /* 在指定位置写字符 */ /******************************************************************/ void LCD_write_char(unsigned char x,unsigned char y,unsigned char Data) { if (y == 0) write_com(0x80 + x); else write_com(0xC0 + x); write_dat(Data); } void DelayMs(unsigned int z) { unsigned int x; for(;z>0;z--) for(x=110;x>0;x--); } void main() { P32=1; init_lcd();//lcd初始化 TCON=0x01;//设置外部中断0 EX0=1; TMOD=0x01;//定时器0初始化 TH0=(65536-50000)/256;//实测每50ms中断的定时值 TL0=(65536-50000)%256; ET0=1;//开定时器中断 //显示基本文字 LCD_write_char(3,0,'H'); LCD_write_char(4,0,'e'); LCD_write_char(5,0,'a'); LCD_write_char(6,0,'r'); LCD_write_char(7,0,'t'); LCD_write_char(8,0,' '); LCD_write_char(9,0,'R'); LCD_write_char(10,0,'a'); LCD_write_char(11,0,'t'); LCD_write_char(12,0,'e'); LCD_write_char(8,1,'/'); LCD_write_char(9,1,'m'); LCD_write_char(10,1,'i'); LCD_write_char(11,1,'n'); TR0=0;//定时器停止 EA=1;//开总中断 while(1) { if(displayOK==1) { rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5); LCD_write_char(5,1,rate/100+48); LCD_write_char(6,1,(rate%100)/10+48); LCD_write_char(7,1,rate%10+48); } DelayMs(300); } } void ex0() interrupt 0 { EX0=0;//暂时关外部中断 if(timecount<8) //当连续两次检测时间间隔小于8*50ms=400ms不处理 { TR0=1;//开定时器 } else { time[i]=timecount*50+TH0*0.256+TL0/1000;//算出间隔时间 TL0=(65536-50000)%256;//重新设置定时器 TH0=(65536-50000)/256; timecount=0;//50ms计数清零 i++; if(i==6)//记录到超过等于6次时间 { i=1;//计数从1开始 displayOK=1; //测得5次开始显示 } } EX0=1; } void et0() interrupt 1 { TL0=(65536-50000)%256; TH0=(65536-50000)/256; timecount++;//每50ms一次计数 if(timecount>25) //当超过25*50ms=1.25s没有检测到信号停止显示 { i=0;//数据个数清零 timecount=0;//50ms计数清零 displayOK=0;//显示关 TR0=0;//定时器关 TH0=(65536-50000)/256; TL0=(65536-50000)%256; } } |
那个心率是怎么采集的? |