版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.z.-#include<reg52.h>#include<intrins.h>//包含头文件#defineuintunsignedint#defineucharunsignedchar#defineulongunsignedlong//宏定义#defineLCD_DATAP0//定义P0口为LCD_DATAsbitLCD_RS=P2^5;sbitLCD_RW=P2^6;sbitLCD_E=P2^7;//定义LCD控制引脚sbit*intiao=P3^2;//脉搏检测输入端定义sbitspeaker=P2^4;//蜂鸣器引脚定义voiddelay5ms(void);//误差0usvoidLCD_WriteData(ucharLCD_1602_DATA);/********LCD1602数据写入***********/voidLCD_Write(ucharLCD_1602_);/********LCD1602命令写入***********/voidlcd_1602_word(ucharAdress_,ucharNum_Adat,uchar*Adress_Data);/*1602字符显示函数,变量依次为字符显示首地址,显示字符长度,所显示的字符*/voidInitLcd();//液晶初始化函数voidTim_Init();uchar*intiao_Change=0;//uint*intiao_Jishu;charstopucharView_Data[3];ucharView_L[3];ucharView_H[3];uchar*intiao_H=100;//脉搏上限-uchar*intiao_L=40;//脉搏下限ucharKey_Change;ucharKey_Value;//按键键值ucharView_Change;voidmain()//主函数{Tim_Init();lcd_1602_word(0*80,16,"HeartRate:");//初始化显示TR0=1;TR1=1;//打开定时器while(1)//进入循环{if(Key_Change)//有按键按下并已经得出键值{Key_Change=0;//将按键使能变量清零,等待下次按键按下View_Change=1;switch(Key_Value)//判断键值{case1://设置键按下{View_Con++;//设置的位加if(View_Con==3)//都设置好后将此变量清零View_Con=0;.z.-break;//跳出,下同}case2://加键按下{if(View_Con==2)//判断是设置上限{if(*intiao_H<150)//上限数值小于150*intiao_H++;//上限+}if(View_Con==1)//如果是设置下限{if(*intiao_L<*intiao_H-1)//下限值小于上限-1(下限值不能超过上限)*intiao_L++;//下限值加}}case3://减键按下{if(View_Con==2)//设置上限{if(*intiao_H>*intiao_L+1)//上限数据大于下限+1(同样上限值不能小于下限)*intiao_H--;//上限数据减}if(View_Con==1)//设置下限{.z.-if(*intiao_L>30)//下限数据大于30时*intiao_L--;//下限数据减}}}}if(View_Change)//显示变量{View_Change=0;//变量清零if(stop==0)//心率正常时{if(View_Data[0]==0*30)//最高位为0时不显示View_Data[0]='';}else//心率不正常(计数超过5000,也就是两次信号时间超过5s)不显示数据{View_Data[0]='';View_Data[1]='';View_Data[2]='';}switch(View_Con){case0://正常显示{.z.-lcd_1602_word(0*80,16,"HeartRate:lcd_1602_word(0*c0,16,"");//显示一行数据");//显示第二行数据lcd_1602_word(0*cd,3,View_Data);//第二行显示心率}case1://设置下限时显示{lcd_1602_word(0*80,16,"HeartRate:");//第一行显示心率lcd_1602_word(0*8d,3,View_Data);View_L[0]=*intiao_L/100+0*30;//将下限数据拆字View_L[1]=*intiao_L%100/10+0*30;View_L[2]=*intiao_L%10+0*30;if(View_L[0]==0*30)//最高位为0时,不显示View_L[0]='';lcd_1602_word(0*C0,16,"WarningL:");//第二行显示下限数据lcd_1602_word(0*Cd,3,View_L);}case2://设置上限时显示(同上){lcd_1602_word(0*80,16,"HeartRate:");lcd_1602_word(0*8d,3,View_Data);View_H[0]=*intiao_H/100+0*30;View_H[1]=*intiao_H%100/10+0*30;View_H[2]=*intiao_H%10+0*30;.z..z.-if(View_H[0]==0*30)View_H[0]='';lcd_1602_word(0*C0,16,"WarningH:");lcd_1602_word(0*Cd,3,View_H);}}}}}voidTime1()interrupt3//定时器1服务函数{staticucharKey_Con,*intiao_Con;TH1=0*d8;//10msTL1=0*f0;//重新赋初值switch(Key_Con)//无按键按下时此值为0{case0://每10ms扫描此处{if((P1&0*07)!=0*07)//扫描按键是否有按下{Key_Con++;//有按下此值加1,值为1}}-case1://10ms后二次进入中断后扫描此处(Key_Con为1){if((P1&0*07)!=0*07)//第二次进入中断时,按键仍然是按下(起到按键延时去抖的作用){Key_Con++;//变量加1,值为2switch(P1&0*07)//判断是哪个按键按下{case0*06:Key_Value=1;break;//判断好按键后将键值赋值给变量Key_Valuecase0*05:Key_Value=2;break;case0*03:Key_Value=3;break;}}else//如果10ms时没有检测到按键按下(按下时间过短){Key_Con=0;//变量清零,重新检测按键}}case2://20ms后检测按键{if((P1&0*07)==0*07)//检测按键是否还是按下状态{Key_Con=0;//变量清零,等待下次有按键按下}-}}switch(*intiao_Con)//此处与上面按键的检测类似{case0://默认*intiao_Con是为0的{if(!*intiao)//每10ms(上面的定时器)检测一次脉搏是否有信号{*intiao_Con++;//如果有信号,变量加一,程序就会往下走了}}case1:{if(!*intiao)//每过10ms检测一下信号是否还存在{*intiao_Con++;//存在就加一}{*intiao_Con=0;//如果不存在了,检测时间很短,说明检测到的不是脉搏信号,可能是其他干扰,将变量清零,跳出此次检测}-}case2:{tiao{*intiao_Con++;//存在就加一}{*intiao_Con=0;//如果不存在了,检测时间很短,说明检测到的不是脉搏信号,可能是其他干扰,将变量清零,跳出此次检测}}case3:{tiao{*intiao_Con++;//存在就加一}{*intiao_Con=0;//如果不存在了,检测时间很短,说明检测到的不是脉搏信号,可能是其他干扰,将变量清零,跳出此次检测}.z..z.-}case:{if(*intiao)//超过30ms一直有信号,判定此次是脉搏信号,执行以下程序{第一次脉冲时为0的,所有走下面的else,第二次走这里{if(60000/*intiao_Jishu>200){View_Data[0]='-';View_Data[1]='-';View_Data[2]='-';speaker=1;//不响}{View_Data[0]=(60000/*intiao_Jishu)/100+0*30;//计算心跳并拆字显示:心跳计时是以10ms为单位,两次心跳中间计数如果是100次,也就是100*10ms=1000ms=1sView_Data[1]=(60000/*intiao_Jishu)%100/10+0*30;//则计算出的一分钟(60s)心跳数就是:60*1000/(100*10ms)=60次其中60是一分钟60s,1000是一秒有1000ms,100是计数0*30+1,以此类推if(((60000/*intiao_Jishu)>=*intiao_H)||((60000/*intiao_Jishu)<=*intiao_L))//心率不在*围内报-警speaker=0;//蜂鸣器响speaker=1;//不响}View_Change=1;//计算出心率后启动显示*intiao_Jishu=0;//心跳计数清零*intiao_Change=0;//计算出心率后该变量清零,准备下次检测心率stop=0;//计算出心率后stop邈}else//第一次脉冲时*intiao_Change为0{*intiao_Jishu=0;//脉冲计时变量清零,开始计时*intiao_Change=1;//*intiao_Change置1,准备第二次检测到脉冲时计算心率}*intiao_Con=0;//清零,准备检测下一次脉冲}}}}/**定时器T0工作函数**/voidTime0()interrupt1{TH0=0*fc;//1ms.z.-TL0=0*18;//重新赋初值*intiao_Jishu++;//心跳计数加if(*intiao_Jishu==5000)//心跳计数大于5000{*intiao_Jishu=0;//数据清零View_Change=1;//显示位置1*intiao_Change=0;//置零,准备再次检测stop=1;//心跳计数超过5000后说明心率不正常或者没有测出,stop置1speaker=1;//关闭蜂鸣器}}/**定时器初始化函数**/voidTim_Init(){EA=1;//打开中断总开关ET0=1;//打开T0中断允许开关ET1=1;//打开T1中断允许开关TMOD=0*11;//设定定时器状态TH0=0*fc;TL0=0*18;TH1=0*d8;TL1=0*f0;}//1ms//赋初值//10ms//赋初值/**在指定地址显示指定数量的指定字符**/.z.-voidlcd_1602_word(ucharAdress_,ucharNum_Adat,uchar*Adress_Data){uchara0;ucharData_Word;LCD_Write(Adress_);//选中地址for(a=0;a<Num_Adat;a++)//for循环决定显示字符个数{Data_Word=*Adress_Data;//读取字符串数据LCD_WriteData(Data_Word);//显示字符串Adress_Data++;//显示地址加一}}/***************1602函数*******************/voidLCD_WriteData(ucharLCD_1602_DATA)/********LCD1602数据写入**
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024城市基础设施建设项目特许经营权协议
- 2024年幼儿园教师岗位聘任协议书模板
- 2024专业建设工程项目设计合同范本专业版
- 2024家庭保姆雇佣合同样本
- 2024年先进制造业生产线自动化改造合同
- 2024年度家电行业C型钢部件加工合同
- 2024年废纸回收海运出口协议
- 2024年商场清洁服务合同
- 2024年建筑工程设计与施工一体化合同
- 2024年度智能硬件设备采购与安装合同
- 医院感染管理培训课件消毒剂的选择与使用
- 平台分销返佣合作协议
- 中国城市行政代码
- 低纤维蛋白原血症的护理查房
- 数学4教材介绍
- 全国大学生职业生涯规划大赛
- 肩关节镜术的健康宣教
- 关于学校安全保卫工作存在的问题及对策
- 2024年广西铝业集团有限公司招聘笔试参考题库附带答案详解
- 2024年西藏开发投资集团有限公司招聘笔试参考题库含答案解析
- 爱校主题班会课件
评论
0/150
提交评论