版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中医护理减轻肿瘤患者放化疗副作用的研究
- 2026年石家庄经济职业学院单招综合素质考试备考题库含详细答案解析
- 2026年浙江经贸职业技术学院单招综合素质笔试备考试题含详细答案解析
- 2026东风本田汽车有限公司招聘考试重点题库及答案解析
- 2026年湖南工业职业技术学院单招职业技能考试参考题库含详细答案解析
- 2026上海新嘉商业投资(集团)有限公司急需招聘1人参考考试试题及答案解析
- 2026年襄阳职业技术学院单招综合素质考试备考题库含详细答案解析
- 2026年常州工业职业技术学院单招综合素质笔试模拟试题含详细答案解析
- 2026年阿拉善职业技术学院单招职业技能考试模拟试题含详细答案解析
- 2026年九州职业技术学院单招职业技能考试模拟试题含详细答案解析
- 尼帕病毒病的预防控制专题学习课件
- 2026年锂电池项目投资计划书
- 春节出行交通安全培训课件
- 2025ACCP实践指南:危重患者血浆与血小板输注指南解读
- 【语文】辽宁省沈阳市沈河区文化路小学小学一年级下册期末试卷(含答案)
- 新生儿红臀PDCA课件
- 企业风险预警指标体系设计与应用
- 2025-2026学年江苏省连云港市部分学校高三上学期10月月考历史试题(解析版)
- 道路交通安全警示教育培训
- 兽药使用法律法规学习材料
- 2019-2020学年贵州省贵阳市八年级下学期期末考试物理试卷及答案解析
评论
0/150
提交评论