资源描述
龙岩学院毕业设计 题目: 基于单片机的多功能自行车防丢系统设计 专业: 电子信息工程 学号: 2014041817 作者: 柯庆烽 指导教师(职称): 曾玮 副教授 2016年5 月20 日基于单片机的多功能自行车防丢系统设计【摘要】在社会不断进步的同时,人们的生活水平也随之提高。越来越多的人开始喜欢上了自行车,它不仅成为一种交通工具或者代步工具。随着社会的进步,自行车上的辅助功能也变得越来越多,于此同时,人们也非常希望自行车上能够有休闲、锻炼等功能,这样能够在骑自行车的同时给人带来更多舒适和健康。虽然自行车骑行是一个老少皆宜的运动,但是在骑行的过程时,人们对自身的安全非常重视。同时在没有骑行时,对自行车停放的位置也是有点顾虑和担忧的。本设计是利用STC12C5A60S2单片机来实现自行车的多功能自行车防丢系统,主要分为主机和副机两个部分来实现自行车的转向灯的功能,运动时心率检测功能,和自行车防丢功能。【关键字】STC12C5A60S2 转向灯 防丢功能 心率检测Multifunctional bicycle lost prevention system based on single chip microcomputerAbstract in the continuous progress of society, peoples living standards will be improved. More and more people began to love on the bike, it not only as a means of transport or transport. With the progress of the society, bicycle auxiliary function has become more and more, at the same time, people also very much hope that bike to leisure, exercise, and other functions, this can in riding a bicycle also brings more comfort and health. Although the cycling is an ages of movement, but in the process of riding, people for their own safety very seriously. At the same time in the absence of riding, the location of the bicycle parking is also a bit of concern and worry. This design is uses STC12C5A60S2 to achieve a bike multifunctional bicycle anti lost system, mainly divided into two parts: the host machine and the auxiliary machine to achieve a bike of steering lamp function, movement heart rate detection function, and the bicycle anti lost functions.keyword STC12C5A60S2 Steering light Anti drop function Heart rate detection目录第1章 绪论11.1研究的背景及意义11.1.1课题研究背景11.1.2课题研究意义1第2章 课题的目标任务22.1 课题的主要内容22.1.1 课题总体介绍体22.1.2 工作内容22.1.3 课题具体任务2第3章 硬件设计33.1 硬件系统选型33.1.1 控制芯片的选择33.1.2 无线通信模块选择33.1.3 心率检测传感器的选择43.2 系统硬件设计43.2.1 单片机控制电路设计43.2.2 无线通信模块电路设计43.2.3 按键模块电路63.2.4 心率检测模块设计63.2.5 报警电路设计7第4章 软件设计84.1 系统功能介绍84.2 程序总体框图84.2.1 主机的程序框图84.2.2 副机的程序框图84.3 程序设计的总体思路94.3.1 NRF24L01无线通信模块的设计思路94.3.2 自行车转向灯模块的设计思路94.3.3 心率检测模块的设计思路94.4 部分程序流程图104.4.1 NRF24L01无线收发模块的程序流程图设计104.4.2 主机流程图设计104.4.2 副机流程图设计11第5章 系统调试125.1 硬件系统调试125.1.1 基本电路检测125.1.2 基本连线检查125.2 软件系统调试135.2.1 基本输入输出调试135.2. 基本功能的调试13第6章 结论146.1 基本成果146.2 改进展望146.3 经验总结14致谢15参考文献16附录17附录一:基于单片机的多功能自行车防丢系统设计的电路原理图17附录二:基于单片机的多功能自行车防丢系统设计的PCB图18附录三:基于单片机的多功能自行车防丢系统设计的部分程序.194第1章 绪论1.1研究的背景及意义1.1.1课题研究背景 在科技不断的发展和社会不断的进步条件下,人们的生活也随着不断的改善,从而人们越来越注重自身的身体健康,越来越多的人会选择不同的运动方式。自行车现在不仅仅是人们的代步工具,从而也成为人们的运动工具。但是人们将自行车骑在马路上的时候,马路上总是有汽车等机动车,由于当自行车在转向的时候,让后方的机动车无法及时的判断出自行车的转向,从而容易导致事故的发生;同时,总是会听说自行车放在露天或者停下自行车去买个东西的时候,发生了自行车丢失的事件,这让那些丢车的车主头痛,也让那些原本想买自行车的人望而祛步。作为一些专业的运动者而言,总是希望有一个良好是数据能够体现出自己当前的运动心率,用来提醒自己的身体能否承受更大的运动。所以,在这样的背景条件下,自行车的辅助功能就显得尤为重要,同时能够让自行车赋予更多的运用功能。1.1.2课题研究意义本课题的设计是将自行车的转向灯、自行车的无线防丢以及心率检测三个功能结合起来,这样能够让使用自行车的人在马路上骑行的时候,不要担心身后的机动车无法判别出自己的转向而会发生车祸;同时也让那些车主在停放自行车的时候,不用担心自己的自行车发生丢失,从而使自己的心情变差。于此同时,也可以让那些以自行车为运动工具的人在运动是检测到自己的心率,从而来体现自己当前的运动量是否超过了自己身体是承受能力。第2章 课题的目标任务2.1 课题的主要内容2.1.1 课题总体介绍体本课题是基于单片机的多功能自行车防丢系统的设计和制作,同时对相应的硬件和软件进行设计与制作。2.1.2 工作内容(1)完成多功能自行车防丢系统的总体系统方案的设计与电路设计。(2)制作与连接好完整的硬件电路,同时能调试出正确的结果。2.1.3 课题具体任务多功能自行车防丢系统是基于单片机控制的,系统电路分为主机和副机两个部分。主机的系统电路设计主要由单片机的最小系统电路、按键输入电路、LCD1602显示电路、无线收发电路、 LED显示电路和报警电路;副机主要由单片机的最小系统电路、无线收发电路、LED显示电路和报警电路。软件的设计由程序输入检测、软件的处理和输出的刷新三个部分组成。基本任务:能够实现无线防丢的功能;实现转向灯的按键控制;实现心率检测,同时通过按键改变心率预设值的加减。第3章 硬件设计3.1 硬件系统选型3.1.1 控制芯片的选择 本次的芯片使用STC12C5A60S22单片机。STC12C5A60S2有256字节的RAM和64 K单周期的Flash可以为一个周期的工作。STC12C5A60S2单片机的引脚和编程与传统的8051单片机是兼容的,同时拥有丰富的应用程序编程基础和经验,当P0口作为输出时,不要像传统的单片机一样外接上拉电阻,使系统的设计会更加的简单、轻松。同时在单个周期模式的条件下运行时,它的运行速度比传统的51单片机快8至12倍左右的速度。STC12C5A60S2单片机即可满足本次设计需求,同时价格低,外围电路简单,系统整体制作性价比较高。具体的管脚图如图3-1所示。图3-1 STC12C5A60S2引脚图3.1.2 无线通信模块选择本次的无线通信采用的是2.4G技术进行的短距离传输的NRF24L01无线接收与发送模块。NRF24L01无线发送和接收模块具有成本低、体积较小、功耗低、稳定性好、运行的速度较快、抗干扰能力强等优点。同时该模块结构简单,功能强大,能够实现双向的报警。3.1.3 心率检测传感器的选择 本次的心率检测采用的是pulse sensor心率传感器,此传感器采用的是观点容积法对人体中的血管波动是造成的透光率的变化来检测脉搏的值。此传感器容易开发,能够快速的完成心率脉搏的检测。同时,该传跟其体积小,便于携带,功耗低等特点。3.2 系统硬件设计3.2.1 单片机控制电路设计本次设计中的单片机选用的是STC12C5A60S2单片机,该单片机运行的最基本的条件分别是振荡电路和电源。在本次的设计中采用的是外部石英晶振作为单片机系统的时钟源,在晶振两侧分别连接这一个22pF的独石电容来帮助晶振起到起振的作用。单片机的外部电路连接图如图3-2所示。图3-2 单片机外部电路接线图单片机有共有4组的I/O口,分别是P0口、P1口、P2口和P3口。其中主机中的按键分别连接单片机的P3.3-P3.6口,同时无线通信模块NRF24L01的6个引脚分别连接单片机的P2.0-P2.5口。3.2.2 无线通信模块电路设计本设计采用NRF24L01无线通信模块实现主机和副机之间的通信,它是利用nRF24L01芯片制作而成的,nRF24L01无线收发器是一个工作在2.4GHz2.5GHz,同时能够对近距离的信号进行发送和接收。同时NRF24L01芯片体积较小,功率损耗低,性能稳定,实用能力强等特点。NRF24L01芯片可实现自动应答、循环冗余校验码检测、自动重发等功能。NRF24L01芯片可以设置的几个主要模式分别为接收模式、发送模式、待机模式、待机模式和断电模式。NRF24L01模块外接有8个管脚,如表3-1所示。表3-1 NRF24L01模块引脚说明引脚功能说明CSN芯片的片选线,CSN为低电平芯片工作SCK芯片控制的时钟线(SPI时钟)MISOSPI输出MISISPI输入IRQ中断输出CE工作模式选择VCC电源GND接地 将NRF24L01模块的8个引脚与单片机的P2.0-P2.5口相连接,VCC接电源,GND接地,接线图有图3-3所示图3-3 NRF24L01模块接线图在NRF24L01模块的无线发送和接收过程中,对数据包的处理方式有两种模式,分别是ShockBurstTM模式和增强型ShockBurstTM模式。这两种模式都是将单片机与NRF24L01无线发送和接收模块通过串行外围接收SPI进行连接起来。增强型ShockBurstTM模式在保持与单片机工作的同时,还能够实现自动应答和自动重发的功能,这样在一定程度上比ShockBurstTM模式更为方便,收发功能更为自动。本次的设计中采用了的是增强型ShockBurstTM模式。增强型ShockBurstTM模式的主要工作流程如下:首先是由发送端发出信号,然后当接收端接收到发出的信号,则会通过自动应答功能对发送端进行反馈,由发送端对反馈的信息进行检测。当信息检测无误时,则发送端就会继续发送下一条信息;如果信息检测有误时,则会执行自动重发功能,一直到信息传输无误为止。3.2.3 按键模块电路在本次的设计中,按键模块主要用于主机上,它的工作原理主要是当按下按键时,就会在单片机的输入、输出接口输入低电平,其主要的功能是用于控制两个LED灯的闪烁和关闭,同时也用于对心率预设值的增减。其中,按下K1的按键,LED3会一直处于闪烁状态,当再次按下K1按键后,LED3灯灭。K3和K4按钮连接着单片机的P3.4口和P3.5口,通过软件设计来对心率预设值进行增减。按键模块的接线图如图3-4所示。图3-4 按键模块的接线图同时,在按键按下的过程中会出现了抖动的现象。为了解决这种现象,一般采用的方式分为硬件去抖动和软件去抖动。硬件抖动就是电平的不稳定,这种抖动持续的时间范围在10200ms之间。硬件消抖就是能够及时的对硬件电路进行处理;软件消抖是跳过抖动的时间,等到按键保持稳定的时候,再对其进行处理。本设计采用的是软件去抖动的方式。3.2.4 心率检测模块设计在本次的设计中,心率检测采用的Pules sensor传感器,它是一款用于脉搏心率测量的光电反射式模拟传感器,此传感器较小,可以佩戴在手指或者耳垂处。它可以通过导线与单片机连接,将模拟信号转换为数字信号,再通过单片机进行简单的计算后得心率的值。此传感器共有三个借口,分别是S口,+极口和极口,其中S口是脉搏信号输出口,需要与单片机的AD口相连接,在本次的设计中,S口连接单片机的P1.7口。传统的脉搏检测有三种方法:第一种是在心电信号中提取;第二种是对血压测量的时候压力传感器测得到的波动来计算脉搏;第三种是采用光电容积法。前面两种测量的方法会限制了测量人员的活动范围,如果长时间的测量会给测量人员造成不适,而第三种方法具有测量方法简单、佩戴方便等特点。Pulse sensor心率传感器的接线图如图3-5所示图3-5 心率传感器接线图光电容积法是利用人体组织在血管搏动时造成透光率的不同而进行脉搏测量的,此传感器有光电变换器和光源两个部分所组成,通过绷带固定在测量人员的手指上来进行测量。光源采用的是动脉血中氧和血红蛋白有选择性的一定波长(500nm700nm)的发光二极管。当光束透过人体血管时,由于动脉搏动从学容积变化导致光束透光率的变化,此时的观点传感器接收到人体组织反射的光线,从而转变为电信号并将其放大和输出。由于脉搏波动是随着周期性变化的,所以动脉血管容积也是随着周期性变化的,因此光电变化器的变化周期就是脉搏率。3.2.5 报警电路设计本次设计中的主机和副机中都采用了报警电路,其中主机的报警电路主要是用于当心率超过预设值时,蜂鸣器发出声响;副机中的报警电路主要是用于当主机与副机断开连接时,副机上的蜂鸣器发出声响。报警电路如图3-6所示。图3-6 报警电路图第4章 软件设计4.1 系统功能介绍本次的设计是基于单片机的多功能无线防丢系统,主要包括自行车无线防丢功能、自行车转向灯以及心率检测这三个功能。主要分为主机和副机,当主机断电时,副机上的蜂鸣器会发出声音,代表主机丢失;或者是当副机断电是,主机上的LCD1602显示屏上会显示LOST字样,表示副机丢失。当主机和副机在接通电源的情况下,两块超过一定的距离,副机上的蜂鸣器会发出声响或主机上的LCD1602显示屏会显示LOST字样表示丢失。同时将手指放在Pulse sensor心率传感器时,会检测到心率,同时心率的值会显示在显示屏上,同时显示屏上还有心率的预设值,当检测到心率的值超过了预设值,主机上的蜂鸣器会发出声响。主机上还设有四个按键,两个按键表示左右转向灯的,第一次按下左转向灯的按钮时,左边的LED灯会闪烁,再次按下,LED灯灭。右转向灯同左转向灯的方法是一样的。剩下的两个按钮分别是心率预设值的增与减,按下按钮就可以设置预设值。4.2 程序总体框图4.2.1 主机的程序框图 由于本次设计中分为了主机和副机,其中主机的程序框图如图4-1所示时钟电路Pulse sensor心率传感器复位电路NRF24L01无线通信模块图4-1 主机的程序框图4.2.2 副机的程序框图副机的程序框图如图4-2所示图4-2 副机的程序框图4.3 程序设计的总体思路4.3.1 NRF24L01无线通信模块的设计思路使用NRF24L01无线通信模块,首先要对此模块进行初始化,在初始化完毕后,要此模块配置发送地址和接收地址,并且将CE为配置为高电平后,读取NRF24L01模块中的STATUS寄存器中的数据。同时配置TX_DS和RX_DS后,两个NRF24L01模块进行连接。这样就可以达到无线通信的功能。4.3.2 自行车转向灯模块的设计思路自行车转向灯模块采用的是两个按键控制两个LED灯,将两个LED灯连接到P1.5口和P1.6口,按键分别连接P3.3口和P3.4口,通过对单片机的程序编程,当按键按下时,LED灯会发生0.5s闪烁,若再次按下后,LED灯灭。4.3.3 心率检测模块的设计思路本次的设计中,采用的是Pules sensor心率传感器,在使用此传感器是,首先要I/O口、串口、中断进行初始化,定义变量,建立时间去读脉冲信号传感器,将检测到的信号进行计算后得到心率值,并显示在LCD1602显示屏上,同时将测得的值与预设值进行比较,如果超过预设值,蜂鸣器会发出声响。在心率检测中,还有两个按键就预设值进行增减。4.4 部分程序流程图4.4.1 NRF24L01无线收发模块的程序流程图设计 NRF24L01模块流程图如图4-3所示图4-3 NRF24L01无线通信模块流程图4.4.2 主机流程图设计主机流程图如图4-4所示图4-4 主机流程图4.4.2 副机流程图设计主机流程图如图4-4所示图4-4 主机流程图第5章 系统调试5.1 硬件系统调试5.1.1 基本电路检测 在前期的硬件设计中完成了电路图的绘制,同时将电路板块制作出来并进行焊接,在焊接成功后,对焊接好的电路板进行检查,主要分为以下几个步骤:(1)查看电路板在制作过程中有没有出现线路的出现短路,或者是焊盘后有没有松动或脱离而造成电路板在后期焊接上的错误。(2)检查线路是否与设计的相符合,并用万用表检查看在断电的情况下有没有焊接上的错误,以免在后期通电时发生的短路。(3)虽然在前期采用万用表检查了电路,但是在后期通电状态下,用手指触摸下芯片看芯片是否发热,若发热,应立即断开电源,对电路再次进行检测,如果线路正常,也可查看芯片的是否插反,若插反应立即插好。 5.1.2 基本连线检查在硬件调试的过程中,要对所设计的每一个部分有清楚的了解,并且知道它的工作特性和优缺点,便于在检查和调试过程中出现的问题进行更好的解决。硬件调试时,必须对每一部分的部件清楚了解,明白他的工作特性,知道它的优点、缺点,以便在检查和后续的调试过程中对出现问题很好的解决。若问题不是很大的话,可以在电路板上直接加焊或者搭线焊接。在本次的设计中,我谨记这几个要求,认真的焊接,在焊接中节省了不少的时间。电路板焊接完成后,如图5-1和图5-2所示。在焊接完成后,先不急着上电,首先打开设计原理图,然后用万用表对应着设计原理图认真的检查焊接好的板是否有焊接错误的,或者出现虚焊的。同时使用万用表检查无线通信模块与单片图5-2 焊接好的正面图图5-2 焊接好后的反面图对应引脚是否接通;然后再检测两块板的电源、地线是否和单片机连通;再检测板上的按键是否焊接正常,按下时按键两侧是否能导通;最后检测板上其他的引出脚是否与单片机正常连接。经过检查,主机的板和副机的板焊接正常,与单片机I/O引脚均正常接通。5.2 软件系统调试5.2.1 基本输入输出调试在硬件系统制作和调试完成后,下一步要进行的就是软件程序的编写。首先是对于一整个软件系统的编程,也需要分部、分块进行编写调试。在本次调试过程中,首先调试的是两个转向灯是否可以按照预初设计的那样正常显示,当编好程序好,将程序导入到副机的单片机中,按下与单片机P3.3相连接的按键,与单片机P1.5口相连的LED灯是否正常闪烁;再次按下这个按键,LED灯灭。经过检测,P3.3口和P3.4口的两个按键按下的现象正常。然后检查P3.5口和P3.6口,分别按下按键,然后观察显示屏上的预设值是否能够进行增、减,经过检测,按键的程序正常。5.2. 基本功能的调试在程序变成好后分别下载到主机模块和副机模块的单片机中,然后检查LCD1602显示屏能够正常显示程序中所设计的字幕,如果显示屏的对比度过低,调节板上的调节电阻,使显示屏上的字幕更加的清晰。然后检查一下无线通信模块和心率检测模块在通电的状态下是否能够正常的连接,数据能够正常的显示在液晶显示屏上,经过检测,能够正常的连接和显示。转向灯的设计在基本输入输出调试中对按键和LED灯进行了调试,所以转向灯的功能也能够正常的显示出来。第6章 结论6.1 基本成果经过多次的实验和调试,最后成功完成了多功能自行车防丢系统的设计与制作,实现了自行车在转向时的闪烁提醒、自行车在骑行后的心率检测以及自行车的无线防丢的设计。这样给以往传统的自行车有了更多的辅助功能。6.2 改进展望在多功能自行车的设计完成后,实现了预期设想的设。但是这样还是不足的,比如这次的无线防丢功能,它的功能是有局限性的,在超过一定的范围距离,无论副机是否丢失,主机上都会发出声响。在今后的学习和生活中,我会继续努力学习和研究,并对此进行改进。在无线防丢功能上进行更近一步的改进。同时,最为本次系统的设计这,我的目的是希望让大家在骑自行车的时候,对自己的人身安全有了保障,并且在停放自行车的时候不要再对自行车的丢失而发愁。同时这次的设计也是对我在学校中的一个学习成功的展示。希望我的多功能自行车无线防丢系统的设计能够应用在现实的生活中,被更多的人所接受。6.3 经验总结毕业设计就是考察学生在大学中所学习到的知识进行一次综合性的考察,以及对学生的动手能力的检验。通过设计能够体现出学生在对学习过的对知识掌握能力和发现问题、分析问题、解决问题和实践能力。在本次的设计、制作和论文的撰写中然我学习到了很多的东西,首先是对单片机有了更深一步的认识,同时绘图的能力有明显提高。在本次的毕业设计的过程中,起初开始是没有头绪的,也不知道从何下手,但是在设计的过程中让我明白了,分步、分模块的设计和调试,能够让设计变得更为的简单。所以我认为分步、分模块的设计这个是尤为重要的。同时在本次的设计中先查阅资料,从芯片选型到电路的设计,再到硬件焊接的检查,最后到程序的编程和调试,分步的进行让我的设计过程更为的顺利。同时在写论文的时候,我发现以我一个人的知识是远远不够的,在此过程中,记住了网络和同学之间的帮忙、同时到图书馆翻阅资料来完成自己的论文,在此过程中,学到了不少的东西。 在做毕业设计的这段时间里,不断的查阅的相关资料,于此同时增强了自己对知识的理解,其中很多以前不是很懂的问题现在都解决了,也丰富了自己,也让我受益匪浅。致谢经过这段时间的忙碌和学习,本次的设计也已经接近了尾声,在这里,非常感谢这段时间以来帮助我的同学和老师。同时在曾玮老师的指导下,我的毕业设计和毕业论文能够如期完成,在此我对增玮老师给予的帮助表示衷心的感谢。除了指导老师,也要感谢在我大学生活中所以的老师和同学,感谢老师们在平时悉心的教导和同学们在平时中对我的帮助。大学的生活即将结束,我们也即将步入社会,我会老师们平时对我们的教导,在今后的工作和生活中要更加的努力和认真,同时也祝老师们今后的工作顺利,身体健康。参考文献1 宏晶科技(深圳).STC12C5A60S2系列单片机器件手册M. 2006, 1-22 王啸东. 尤凤翔. 基于单片机的智能防丢器系统设计J. 河南科技, 2011, (21): 61-61. 3郭天祥. 新概念51单片机C语言教程M北京:电子工业出版社,2009, 240-258 4李蛟, 杨仁锟. 肖峻. 2.4GHz无线技术标准及ZigBee抗干扰性能J. 电信工程技术与标准化, 2006, 19(3): 31-35. 5刘雅琨;冷刘伟;汽车尾灯智能控制电路设计J;科技经济市场;2011年05期6 朱勇.单片机原理与应用技术M.清华大学出版社.2005, 200-2207李朝青.单片机原理及接口技术M.第三版.北京:北京航空航天大学出社.2005, 86-748沈勇, 蒋文雄, 段勇. 基于nRF24L01的通用无线通信模块设计J. 电子设计工程, 2013, 21(18): 84-86. 9 元增民,张文希.单片机原理与应用基础.长沙M:国防科技大学出版社. 2006.6,112-11910 陶国正.单片机与接口应用技术M.苏州:苏州大学出版社,2004:137-146,190202.11Maxim.+5V Single-Supply,IMsps,16-Bit Self-Calibrating ADCDB/CD,2000.附录附录一:基于单片机的多功能自行车防丢系统设计的电路原理图主机原理图:副机原理图:附录二:基于单片机的多功能自行车防丢系统设计的PCB图主机PCB图:副机PCB图:附录三:基于单片机的多功能自行车防丢系统设计的部分程序主机主程序:#include common.h#include uart.h#include nRF24L01P.h#define false 0#define true 1#define FOSC 11059200L#define T0MS (65536-FOSC/12/500)/500HZ in 12T MODE#define ADC_POWER 0 x80/ADC POWER CONTROL BIT#define ADC_FLAG 0 x10/ADC COMPLETE FLAG#define ADC_START 0 x08;/ADC START CONTROL BIT#define ADC_SPEEDLL 0 x00/540 CLOCKS#define ADC_SPEEDL 0 x20/360 CLOCKS#define ADC_SPEEDH 0 x40/180 CLOCKS#define ADC_SPEEDHH 0 x60/90 CLOCKS#define ADC_MASK 0 x01sbit beep_alarm =P27;sbit loft_alarm_led=P15;sbit init_alarm_led=P14;unsigned char PulsePin = 7; / Pulse Sensor purple wire connected to analog pin 0(P1.0?aAD?)/sbit blinkPin = P20; / pin to blink led at each beat/sbit fadePin = P23; / pin to do fancy classy fading blink at each beat/sbit led1 = P21;/sbit led2 = P22;int fadeRate = 0; / used to fade LED on with PWM on fadePin/ these variables are volatile because they are used during the interrupt service routine!volatile unsigned int BPM; / used to hold the pulse ratevolatile unsigned int Signal; / holds the incoming raw datavolatile unsigned int IBI = 600; / holds the time between beats, must be seeded!volatile bit Pulse = false; / true when pulse wave is high, false when its lowvolatile bit QS = false; / becomes true when Arduoino finds a beat.volatile int rate10; / array to hold last ten IBI valuesvolatile unsigned long sampleCounter = 0; / used to determine pulse timingvolatile unsigned long lastBeatTime = 0; / used to find IBIvolatile int Peak =512; / used to find peak in pulse wave, seededvolatile int Trough = 512; / used to find trough in pulse wave, seededvolatile int thresh = 512; / used to find instant moment of heart beat, seededvolatile int amp = 100; / used to hold amplitude of pulse waveform, seededvolatile bit firstBeat = true; / used to seed rate array so we startup with reasonable BPMvolatile bit secondBeat = false; / used to seed rate array so we startup with reasonable BPMstatic unsigned char order=0;unsigned char DisBuff4= 0;unsigned int xdata heart_rate = 0;unsigned int xdata loft_time = 0;void ADC_init(unsigned char channel);void T0_init(void);void main(void) char ret; unsigned char RX_BUFTX_PLOAD_WIDTH; unsigned char TX_BUFTX_PLOAD_WIDTH; ADC_init(PulsePin); uart_init(UART_B9600); printf(OKrn); T0_init(); / sets up to read Pulse Sensor signal every 2mS while (NRF24L01_Check() init_alarm_led = init_alarm_led; delay_ms(500); NRF24L01_RT_Init(); init_alarm_led = 0; while(1) if (QS = true) / Quantified Self flag is true when arduino finds a heartbeat fadeRate = 255; / Set fadeRate Variable to 255 to fade LED with pulse QS = false; / reset the Quantified Self flag for next time heart_rate = BPM; printf(B:%srn,DisBuff); ret = NRF24L01_RxPacket(RX_BUF,250); if (!ret) if (RX_BUF0 = 0 xaa & RX_BUF1 = 0 xbb & RX_BUF2 = 0 xcc & RX_BUF3 = 0 xdd) delay_ms(100); loft_time = 0; TX_BUF0 = heart_rate & 0 xFF; / 数据送到缓存 TX_BUF1 = (heart_rate 8 )& 0 xFF;/ 数据送到缓存 TX_BUF2 = (heart_rate 16 )& 0 xFF; / 数据送到缓存 TX_BUF3 = (heart_rate 24 )& 0 xFF; / 数据送到缓存 ret =NRF24L01_TxPacket(NRF_DEFAULT_CH,TX_BUF,200); NRF24L01_RX_Mode(NRF_DEFAULT_CH);/ 配置为接收模式 if (loft_time + 8) loft_alarm_led = 0; beep_alarm = 0; else loft_alarm_led = 1; beep_alarm = 1; delay_ms(1); ;void T0_init(void) / Initializes Timer0 to throw an interrupt every 2mS. TMOD |= 0 x01;/16bit TIMER TL0=T0MS; TH0=T0MS8; TR0=1;/start Timer 0 ET0=1;/enable Timer Interrupt EA=1; / MAKE SURE GLOBAL INTERRUPTS ARE ENABLEDvoid ADC_init(unsigned char channel) P1ASF=ADC_MASKchannel;/enable PlusePin as ADC INPUT ADC_RES=0;/clear former ADC result ADC_RESL=0;/clear former ADC result AUXR1 |= 0 x04;/adjust the format of ADC result ADC_CONTR=channel|ADC_POWER|ADC_SPEEDLL|ADC_START;/power on ADC and start conversionunsigned int analogRead(unsigned char channel)unsigned int result; ADC_CONTR &=!ADC_FLAG;/clear ADC FLAG result=ADC_RES; result=result8;/reload 16 bit TIMER0 Signal = analogRead(PulsePin); / read the Pulse Sensor sampleCounter += 2; / keep track of the time in mS with this variable N = sampleCounter - lastBeatTime; / find the peak and trough of the pulse waveif(Signal (IBI/5)*3)/ avoid dichrotic noise by waiting 3/5 of last IBI if (Signal thresh & Signal Peak) / thresh condition helps avoid noise Peak = Signal; / P is the peak if (N 250) / avoid high frequency noise if ( (Signal thresh) & (Pulse = false) & (N (IBI/5)*3) ) Pulse = true; / set the Pulse flag when we think there is a pulse /blinkPin=0; / turn on pin 13 LED IBI = sampleCounter - lastBeatTime; / measure time between beats in mS lastBeatTime = sampleCounter; / keep track of time for next pulse if(secondBeat) / if this is the second beat, if secondBeat = TRUE secondBeat = false; / clear secondBeat flag for(i=0; i=9; i+) / seed the running total to get a realisitic BPM at startup ratei = IBI; if(firstBeat) / if its the first time we found a beat, if firstBeat = TRUE firstBeat = false; / clear firstBeat flag secondBeat = true; / set the second beat flag EA=1; / enable interrupts again return; / IBI value is unreliable so discard it for(i=0; i200)BPM=200; if(BPM30)BPM=30; DisBuff2 = BPM%10+48; DisBuff1 = BPM%100/10+48; DisBuff0 = BPM/100+48; if(DisBuff0=48) DisBuff0=32; QS = true; / set Quantified Self flag / QS FLAG IS NOT CLEARED INSIDE THIS ISR if (Signal 2500) / if 2.5 seconds go by without a beat thresh = 512; / set thres
展开阅读全文