基于单片机心率计程序

上传人:岁月****20 文档编号:53997900 上传时间:2022-02-12 格式:DOCX 页数:21 大小:81.01KB
收藏 版权申诉 举报 下载
基于单片机心率计程序_第1页
第1页 / 共21页
基于单片机心率计程序_第2页
第2页 / 共21页
基于单片机心率计程序_第3页
第3页 / 共21页
资源描述:

《基于单片机心率计程序》由会员分享,可在线阅读,更多相关《基于单片机心率计程序(21页珍藏版)》请在装配图网上搜索。

1、#include包含头文件#include/#defineuintunsignedint#defineucharunsignedchar#defineulongunsignedlong/宏定义#defineLCD_DATAP0/定义P0口为LCD_DATAsbitLCD_RS=P2A5;sbitLCD_RW=P2A6;sbitLCD_E=P2A7;/定义LCD控制引脚sbitXintiao=P3A2;/脉搏检测输入端定义sbitspeaker=P2A4;/蜂鸣器引脚定义voiddelay5ms(void);/误差0usvoidLCD_WriteData(ucharLCD_1602_DATA);

2、/*LCD1602数据写入*/void LCD_WriteCom(uchar LCD_1602_COM);/*LCD1602命令写入*/voidlcd_1602_word(ucharAdress_Com,ucharNum_Adat,uchar*Adress_Data);/*1602字符显示函数,变量依次为字符显示首地址,显示字符长度,所显示的字符*/voidInitLcd();/液晶初始化函数voidTim_Init();ucharXintiao_Change=0;/uintXintiao_Jishu;ucharstop;ucharView_Data3;ucharView_L3;ucharVi

3、ew_H3;ucharXintiao_H=100;/脉搏上限ucharXintiao_L=40;/脉搏下限ucharKey_Change;ucharKey_Value;/按键键值uchar View_Con;/设置的位(0正常工作,1设置上限,2设置下限)ucharView_Change;voidmain()/主函数InitLcd();Tim_Init();lcd_1602_word(0x80,16,HeartRate:);/初始化显示TR0=1;TR1=1;/打开定时器while(1)/进入循环if(Key_Change)/有按键按下并已经得出键值/ 判断键值/ 设置键按下/ 设置的位加/

4、都设置好后将此变量清零/ 跳出,下同/ 加键按下/ 判断是设置上限/ 上限数值小于 150/ 上限 +/ 如果是设置下限Key_Change=0;/将按键使能变量清零,等待下次按键按下View_Change=1;switch(Key_Value)case 1:View_Con+;if(View_Con=3)View_Con=0;break;case 2:if(View_Con=2)if(Xintiao_H150)Xintiao_H+;if(View_Con=1)if(Xintiao_LXintiao_L+1)/上限数据大于下限+1(同样上限值不能小于下限)Xintiao_H-;/上限数据减if

5、(View_Con=1)/设置下限if(Xintiao_L30)/下限数据大于30时Xintiao_L-;/下限数据减break;if(View_Change)/显示变量View_Change=0;/变量清零if(stop=0)/心率正常时if(View_Data0=0x30)/最高位为0时不显示else号时间超过5s )不显示数据View_Data0= ;/ 心率不正常(计数超过5000,也就是两次信View_Data0= ;View_Data1= ;View_Data2= ;switch(View_Con)case 0: / 正常显示lcd_1602_word(0x80,16,Heart

6、Rate:);/显示一行数据lcd_1602_word(0xc0,16,);/显示第二行数据lcd_1602_word(0xcd,3,View_Data);/ 第二行显示心break;case 1: / 设置下限时显示lcd_1602_word(0x80,16,Heart Rate:);/第一行显示心率lcd_1602_word(0x8d,3,View_Data);/ 将下限数据拆字View_L0=Xintiao_L/100+0x30;View_L1=Xintiao_L%100/10+0x30;View_L2=Xintiao_L%10+0x30;if(View_L0=0x30)/最高位为0时,

7、不显示View_L0=;lcd_1602_word(0xC0,16,WarningL:);/第二行显示下限数据lcd_1602_word(0xCd,3,View_L);break;case2:/设置上限时显示(同上)lcd_1602_word(0x80,16,HeartRate:);lcd_1602_word(0x8d,3,View_Data);View_H0=Xintiao_H/100+0x30;View_H1=Xintiao_H%100/10+0x30;View_H2=Xintiao_H%10+0x30;if(View_H0=0x30)View_H0=;lcd_1602_word(0xC0

8、,16,WarningH:);lcd_1602_word(0xCd,3,View_H);break;voidTime1()interrupt3/定时器1服务函数staticucharKey_Con,Xintiao_Con;TH1=0xd8;/10msTL1=0xf0;/重新赋初值switch(Key_Con)/无按键按下时此值为0case0:/每10ms扫描此处if(P1&0x07)!=0x07)/Key_Con+;break;case1:扫描按键是否有按下/有按下此值加1,值为1/10ms后二次进入中断后扫描此处(Key_Con为1)if(P1&0x07)!=0x07)/第二次进入中断时,按

9、键仍然是按下(起到按键延时去抖的作用)Key_Con+;/变量加1,值为2switch(P1&0x07)/判断是哪个按键按下/ 判断好按键后将键值赋值给case0x06:Key_Value=1;break;变量Key_Valuecase0x05:Key_Value=2;break;case0x03:Key_Value=3;break;下(按下时间过短)else/如果10ms时没有检测到按键按Key_Con=0;/变量清零,重新检测按键break;case 2:/20ms后检测按键if(P1&0x07)=0x07)/检测按键是否还是按下状态Key_Change=1;1时才会处理键值数据)/有按键

10、按下使能变量,(此变量为Key_Con=0;/变量清零,等待下次有按键按下break;switch(Xintiao_Con)/此处与上面按键的检测类似case0:/默认Xintiao_Con是为0的if(!Xintiao)/每10ms(上面的定时器)检测一次脉搏是否有信号Xintiao_Con+;/如果有信号,变量加一,程序就会往下走了break;case 1: if(!Xintiao)/每过10ms检测一下信号是否还存在Xintiao_Con+;/存在就加一elseXintiao_Con=0;/如果不存在了,检测时间很短,说明检测到的不是脉搏信号,可能是其他干扰,将变量清零,跳出此次检测br

11、eak;case 2:if(!Xintiao)Xintiao_Con+;/存在就加一elseXintiao_Con=0;/如果不存在了,检测时间很短,说明检测到的不是脉搏信号,可能是其他干扰,将变量清零,跳出此次检测break;case3:if(!Xintiao)Xintiao_Con+;/存在就加一elseXintiao_Con=0;/如果不存在了,检测时间很短,说明检测到的不是脉搏信号,可能是其他干扰,将变量清零,跳出此次检测break;case4:if(Xintiao)超过30ms一直有信号,判定此次是脉搏信号,执行以下程序if(Xintiao_Change=1)/心率计原理为检测两次脉

12、冲间隔时间计算心率,变量Xintiao_Change第一次脉冲时为0的,所有走下面的else,第二次走这里if(60000/Xintiao_Jishu200)View_Data0=-;View_Data1=-;View_Data2=-;speaker=1;/不响elseView_Data0=(60000/Xintiao_Jishu)/100+0x30;计算心跳并拆字显示:心跳计时是以10ms为单位,两次心跳中间计数如果是100次,也就是100*10ms=1000ms=1sView_Data1=(60000/Xintiao_Jishu)%100/10+0x30;/那么计算出的一分钟(60s)心跳

13、数就是:60*1000/(100*10ms)=60次其中60是一分钟60s,1000是一秒有1000ms,100是计数值,10是一次计数对应的时间是10msView_Data2=(60000/Xintiao_Jishu)%10+0x30;/计算出的心跳数/100得到心跳的百位,%100是取余的,就是除以100的余数,再除以10就得到十位了,以此类推/0x30的目的是得到对应数字的液晶显示码,数字0对应的液晶显示码是0x30,1是0x30+1,以此类推if(60000/Xintiao_Jishu)=Xintiao_H)|(60000/Xintiao_Jishu)=Xintiao_L)/心率不在范

14、围内报警speaker=0;/蜂鸣器响elsespeaker=1;/不响View_Change=1;/计算出心率后启动显示Xintiao_Jishu=0;/心跳计数清零Xintiao_Change=0;/计算出心率后该变量清零,准备下次检测心stop=0;/ 计算出心率后stop 邈else/第一次脉冲时Xintiao_Change为0Xintiao_Jishu=0;/脉冲计时变量清零,开始计时Xintiao_Change=1;/Xintiao_Change置1,准备第二次检测到脉冲时计算心率Xintiao_Con=0;/清零,准备检测下一次脉冲break;/*定时器T0工作函数*/voidT

15、ime0()interrupt1TH0=0xfc;/1msTL0=0x18;/重新赋初值Xintiao_Jishu+;/心跳计数加if(Xintiao_Jishu=5000)/心跳计数大于5000Xintiao_Jishu=0;/数据清零View_Change=1;/显示位置1Xintiao_Change=0;/置零,准备再次检测stop=1;/心跳计数超过5000后说明心率不正常或者没有测出,stop置1speaker=1;/关闭蜂鸣器/*定时器初始化函数*/voidTim_Init()EA=1;/打开中断总开关ET0=1;/打开T0中断允许开关ET1=1;/打开T1中断允许开关TMOD=0x11;/设定定时器状态TH0=0xfc;/1msTL0=0x18;/赋初值TH1=0xd8;/10msTL1=0xf0;/赋初值/*在指定地址显示指定数量的指定字符*/*Adress_Com显示地址,Num_Adat显示字符数量,Adress_Data显示字符串内容*/voidlcd_1602_word(ucharAdress_Com,ucharNum_Adat,uchar*Adress_Data)uchara=0;ucharData_Word;LCD_WriteCom(Adress_Com);/选中地址for(a=0;a0;b-)for(a=12;a0;a-);

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!