找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 3359|回复: 0
收起左侧

基于单片机的脉搏测量仪设计论文下载

[复制链接]
ID:365036 发表于 2018-7-4 17:49 | 显示全部楼层 |阅读模式
实训报告
题    目:基于单片机的脉搏测量仪设计   
Design of Pulse Measuring Instrument Based on Single Chip            
学    院:电气与动力工程学院

目录
摘要
Abstract
引言
第一章 概述
1.1 选题的背景和意义
1.2 脉搏测量仪的发展与应用
第二章 总体方案的论证与设计
2.1主控模块的选型和论证
2.2显示模块的选型和论证
2.3传感器的选型和论证
2.4系统整体设计概述
第三章 系统硬件电路设计
3.1主控模块
3.1.1 STC89C52单片机主要特性
3.1.2 STC89C52单片机的中断系统
3.1.3单片机最小系统设计
3.2 LCD液晶显示器简介
3.2.1液晶原理介绍
3.2.2液晶模块简介
3.2.3液晶显示部分与STC89C52的接口
3.3信号采集电路设计
3.3.1传感器简介
3.3.2滤波电路
3.3.3放大整形电路
第四章 系统软件设计
4.1系统软件总体设计
4.2程序设计原理
第五章 系统调试
5.1软件调试
5.2硬件调试
5.3调试结果
5.4误差分析
结论
致谢
参考文献
附录

基于单片机的脉搏测量仪设计

摘要脉搏测量仪在我们的日常生活中已经得到了非常广泛的应用,通过观测脉搏信号,可以对人体的健康进行检查,通常被用于保健中心和医院。为了提高脉搏测量仪的简便性和精确度,本课题设计了一种基于51单片机的脉搏测量仪。系统以STC89C52单片机为核心,以光电传感器利用单片机系统内部定时器来计算时间,由光电传感器感应产生信号,单片机通过对信号累加得到脉搏跳动次数,时间由定时器定时而得。系统运行中可以通过观察指示灯闪烁,若均匀闪烁说明测量值准确。系统停止运行时,能够显示总的脉搏次数和时间。经测试,系统工作正常,达到设计要求。

本设计利用红外光电传感器产生脉冲信号,经过放大整形后,输入单片机内进行相应的控制,从而测量出一分钟内的脉搏跳动次数,快捷方便。系统可以供用户测量当时的脉搏次数,同时还可以设定上限次数和下限次数,当测量的范围超过设定的范围则驱动蜂鸣器报警提醒,除此外用户还可以设定每天闹钟提醒测量,时间可以自行设定,结果最终可以把采集到的脉搏信号显示在LCD1602上。

引 言

脉搏测量在有脉搏时遮挡光线,无脉搏时透光强,所采用的传感器是红外接收二极管和红外发射二极管。通过观测脉搏信号,可以对人体的健康进行检查,通常被用于保健中心和医院。系统可以供用户测量当时的脉搏次数,同时还可以设定上限次数和下限次数,当测量的范围超过设定的范围则驱动蜂鸣器报警提醒,除此外用户还可以设定每天闹钟提醒测量,时间可以自行设定[1]。

从脉搏波中提取人体的生理病理信息作为临床诊断和治疗的依据,历来都受到中外医学界的重视。系统以STC89C52单片机为核心,以光电传感器利用单片机系统内部定时器来计算时间,由光电传感器感应产生信号,单片机通过对信号累加得到脉搏跳动次数,时间由定时器定时而得。系统运行中可以通过观察指示灯闪烁,若均匀闪烁说明测量值准确。几乎世界上所有的民族都用过“摸脉”作为诊断疾病的手段。脉搏波所呈现出的形态(波形)、强度(波幅)、速率(波速)和节律(周期)等方面的综合信息,在很大程度上反映出人体心血管系统中许多生理病理的血流特征,但人体的生物信号多属于强噪声背景下的低频的弱信号, 脉搏波信号更是低频微弱的非电生理信号, 必需经过放大和后级滤波以满足采集的要求。


第一章 概述

1.1 选题的背景和意义

脉搏携带有丰富的人体健康状况的信息,自公元三世纪我国最早的脉学专著《脉经》问世以来,脉学理论得到不断的发展和提高。在中医四诊(望、闻、问、切)中,脉诊占有非常重要的位置。脉诊是我国传统医学中最具特色的一项诊断方法,其历史悠久,内容丰富,是中医“整体观念”、“辨证论证”的基本精神的体现与应用。脉诊作为“绿色无创”诊断的手段和方法,得到了中外人士的关注。但由于中医是靠手指获取脉搏信息,虽然脉诊具有简便、无创、无痛的特点易为患者接受,然而在长期的医疗实践中也暴露出一些缺陷。首先,切脉单凭医生手指感觉辨别脉象的特征,受到感觉、经验和表述的限制,并且难免存在许多主观臆断因素,影响了对脉象判断的规范化;其次,这种用手指切脉的技巧很难掌握;再则,感知的脉象无法记录和保存影响了对脉象机理的研究。脉诊的这种定性化和主观性,大大影响了其精度与可行性,成为中医脉诊应用、发展和交流中的制约因素。为了将传统的中医药学发扬光大,促进脉诊的应用和发展,必须与现代科技相结合,实现更科学、客观的诊断[1]。

医院的护士每天都要给住院的病人把脉记录病人每分钟脉搏数,方法是用手按在病人腕部的动脉上,根据脉搏的跳动进行计数。为了节省时间,一般不会作1分钟的测量,通常是测量10秒钟时间内心跳的数,再把结果乘以6即得到每分钟的心跳数,即使这样做还是比较费时,而且精度也不高。为了提高脉搏测量的精确与速度,多种脉搏测量仪被运用到医学上来,从而开辟了一条全新的医学诊断方法。

早在1860年Vierordt 创建了第一台杠杆式脉搏描记仪,国内20世纪50年代初朱颜将脉搏仪引用到中医脉诊的客观化研究方面。此后随着机械及电子技术的发展,国内外在研制中医脉象仪方面进展很快,尤其是70年代中期,国内天津、上海、江西等地相继成立了跨学科的脉象研究协作组,多学科共同合作促使中医脉象研究工作进入了一个新的境界。脉象探头式样很多,有单部、三部、单点、多点、刚性接触式、软性接触式、气压式、硅杯式、液态汞、液态水、子母式等组成,脉象探头的主要原件有应变片、压电晶体、单晶硅、光敏元件、PVDF压电薄膜等,其中以单部单点应变片式为最广泛,不过近年来正在向三部多点式方向设计[2]。

目前脉搏测量仪在多个领域被广泛应用,除了应用于医学领域,如无创心血管功能检测、妊高症检测、中医脉象、脉率检测等等,商业应用也不断拓展,如运动、健身器材中的心率测试都用到了技术先进的脉搏测量仪。

1.2 脉搏测量仪的发展与应用

随着科学技术的发展,脉搏测量技术也越来越先进,对脉搏的测量精度也越来越高,国内外先后研制了不同类型的脉搏测量仪,而其中关键是对脉搏传感器的研究。起初用于体育测量的脉搏测试集中在对接触式传感器的研究,利用此类传感器所研制的指脉、耳脉等测量仪各有其优缺点。指脉测量比较方便、简单,但因为手指上的汗腺较多,指夹常年使用,污染可能会使测量灵敏度下降:耳脉测量比较干净,传感器使用环境污染少,容易维护。但因耳脉较弱,尤其是当季节变化时,所测信号受环境温度影响明显,造成测量结果不准确。过去在医院临床监护和日常中老年保健中出现的日常监护仪器,如便携式电子血压计,可以完成脉搏的测量,但是这种便携式电子血压计利用微型气泵加压橡胶气囊,每次测量都需要一个加压和减压的过程,存在体积庞大、加减压过程会有不适、脉搏检测的精确度低等缺点。

近年来国内外致力于开发无创非接触式的传感器,这类传感器的重要特征是测量的探测部分不侵入机体,不造成机体创伤,能够自动消除仪表自身系统的误差,测量精度高,通常在体外,尤其是在体表间接测量人体的生理和生化参数。

其中光电式脉搏传感器是根据光电容积法制成的脉搏传感器,通过对手指末端透光度的监测,间接检测出脉搏信号。具有结构简单、无损伤、精度高、可重复使用等优点。通过光电式脉搏传感器所研制的脉搏测量仪已经应用到临床医学等各个方面并收到了理想效果。

人体心室周期性的收缩和舒张导致主动脉的收缩和舒张,是血流压力以波的形式从主动脉根部开始沿着整个动脉系统传播,这种波成为脉搏波。从脉搏波中提取人体的心理病理信息作为临床诊断和治疗的依据,历来都受到中外医学界的重视。脉搏波所呈现出的形态(波形)、强度(波幅)、速率(波速)和节律(周期)等方面的综合信息,在很大程度上反映出人体心血管系统中许多生理病理的血流特征,因此对脉搏波采集和处理具有很高的医学价值和应用前景。但人体的生物信号多属于强噪声背景下的低频的弱信号, 脉搏波信号更是低频微弱的非电生理信号,因此必需经过放大和后级滤波以满足采集的要求。


第二章 总体方案的论证与设计

2.1主控模块的选型和论证

方案一:

采用MSP430系列单片机,该单片机是TI公司1996年开始推向市场的一种16位超低功耗的混合信号处理器。其内部集成了很多模拟电路、数字电路和微处理器,提供强大的功能。不过该芯片昂贵不适合一般的设计开发[3]。

方案二

采用51系列的单片机,该单片机是一个高可靠性,超低价,无法解密,高性能的8位单片机,32个IO口,且STC系列的单片机可以在线编程、调试,方便地实现程序的下载与整机的调试。

因此选用方案二中的51系列单片机作为主控芯片。

2.2显示模块的选型和论证

方案一:

采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较合适,如采用在显示数字显得太浪费,且价格也相对较高,所以不用此种作为显示。

方案二:

采用LED数码管动态扫描,LED数码管价格虽适中,对于显示数字也最合适,而且采用动态扫描法与单片机连接时,占用单片机口线少。但是由于数码管动态扫描需要借助74LS164移位寄存器进行移位,该芯片在电路调试时往往有很多障碍,所以不采用LED数码管作为显示。

方案三:

采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,对于本设计而言一个LCD1602的液晶屏即可,价格也还能接受,需要的借口线较多,但会给调试带来诸多方便。

所以本设计中方案三中的LCD1602液显示屏作为显示模块。

2.3传感器的选型和论证

方案一:

采用压电传感器用来提取人的脉搏信号,压电传感器是利用某些电介质受力后产生的压电效应制成的传感器。所谓压电效应是指某些电介质在受到某一方向的外力作用而发生形变(包括弯曲和伸缩形变)时,由于内部电荷的极化现象,会在其表面产生电荷的现象。通过此现象可以提取出人的脉搏信号。

方案二:

采用光电传感器提取人体脉搏信号,授予手指组织可以分成皮肤、肌肉、骨骼等非血液组织和血液组织,其中非血液组织的光吸收量是恒定的,而在血液中,静脉血的搏动相对动脉血是十分微弱的,可以忽略,因此可以认为光透过手指后的变化仅由动脉血的充盈而引起,那么在恒定波长的光源的照射下,通过检测透过手指的光强将可以间接测量到人体的脉搏信号[4]。

由于光电传感器较压电传感器容易在一般的地方可以买得到,因此这里选用光电传感器来提取人体脉搏信号。

2.5系统整体设计概述


系统总体设计由STC89C52、按键、LCD1602、光电传感器、时钟模块、运放等构成,如图2.1所示,系统设有四个按键,可以设置上下限脉搏数,当超过范围的时候单片机会驱动蜂鸣器发响,脉搏测量的时候需要人把手轻轻的按在光电传感器上面,由于人脉搏跳动的时候,血液的透光性不一样会导致接收器那边接收的信号强弱不一样,间接的把人脉搏信号传回,通过运放对其进行放大、整形后连接到单片机的IO口,单片机利用外部中断对其进行计数,最终换算成人一分钟脉搏的跳动次数,最终显示在液晶屏上。


第三章 系统硬件电路设计

3.1主控模块

主控模块模块在整个系统中起着统筹的作用,需要检测键盘等各种参数,同时驱动液晶显示相关参数,在这里我们选用了51系列单片机中的STC89C52单片机作为系统的主控芯片。

51系列单片机最初是由Intel 公司开发设计的,但后来Intel 公司把51 核的设计方案卖给了几家大的电子设计生产商,譬如SST、Philip、Atmel 等大公司。因此市面上出现了各式各样的均以51 为内核的单片机[6]。这些各大电子生产商推出的单片机都兼容51 指令、并在51 的基础上扩展一些功能而内部结构是与51一致的。

STC89C52有40个引脚,4个8位并行I/O口,1个全双工异步串行口,同时内含5个中断源,2个优先级,2个16位定时/计数器。STC89C52的存储器系统由4K的程序存储器(掩膜ROM),和128B的数据存储器(RAM)组成。

STC89C52单片机的基本组成框图见图3.1所示。
图3.1 STC89C52单片机结构图

3.1.3单片机最小系统设计

图3.3 单片机最小系统电路图

              图3.3为单片机最小系统电路图,单片机最小系统有单片机、时钟电路、复位电路组成,时钟电路选用了12MHZ的晶振提供时钟,作用为给单片机提供一个时间基准,其中执行一条基本指令需要的时间为一个机器周期,单片机的复位电路,按下复位按键之后可以使单片机进入刚上电的起始状态。图中10K排阻为P0口的上拉电阻,由于P0口跟其他IO结构不一样为漏极开路的结构,因此要加上拉电阻才能正常使用。

3.2 LCD液晶显示器简介

由于本设计中要求显示界面显示一些参数,因此这里选用了LCD1602作为界面显示,可以把一些相关的参数进行显示。

3.2.1 液晶原理介绍

液晶显示器(LCD)英文全称为Liquid Crystal Display,它一种是采用了液晶控制透光度技术来实现色彩的显示器。和CRT显示器相比,LCD的优点是很明显的。由于通过控制是否透光来控制亮和暗,当色彩不变时,液晶也保持不变,这样就无须考虑刷新率的问题。

显示接口用来显示系统的状态,命令或采集的电压数据。本系统显示部分用的是LCD液晶模块,采用一个16×2的字符型液晶显示模块。

点阵图形式液晶由 M 行×N 列个显示单元组成,假设 LCD 显示屏有64行,每行有 128列,每 8列对应 1 个字节的 8 个位,即每行由 16 字节,共 16×8=128个点组成,屏上 64×16 个显示单元和显示 RAM 区 1024 个字节相对应,每一字节的内容和屏上相应位置的亮暗对应。一个字符由 6×8 或 8×8点阵组成,即要找到和屏上某几个位置对应的显示 RAM区的 8 个字节,并且要使每个字节的不同的位为‘1’,其它的为‘0’,为‘1’的点亮,为‘0’的点暗,这样一来就组成某个字符。但对于内带字符发生器的控制器来说,显示字符就比较简单了,可让控制器工作在文本方式,根据在LCD 上开始显示的行列号及每行的列数找出显示 RAM对应的地址,设立光标,在此送上该字符对应的代码即可。

3.2.2液晶模块简介

LCD1602液晶模块采用HD44780控制器,hd44780具有简单而功能较强的指令集,可以实现字符移动,闪烁等功能,LM016L与单片机MCU通讯可采用8位或4位并行传输两种方式,hd44780控制器由两个8位寄存器,指令寄存器(IR)和数据寄存器(DR)忙标志(BF),显示数RAM(DDRAM),字符发生器ROMA(CGOROM)字符发生器RAM(CGRAM),地址计数器RAM(AC)。IR用于寄存指令码,只能写入不能读出,DR用于寄存数据,数据由内部操作自动写入DDRAM和CGRAM,或者暂存从DDRAM和CGRAM读出的数据,BF为1时,液晶模块处于内部模式,不响应外部操作指令和接受数据,DDTAM用来存储显示的字符,能存储80个字符码,CGROM由8位字符码生成5*7点阵字符160中和5*10点阵字符32种.8位字符编码和字符的对应关系, CGRAM是为用户编写特殊字符留用的,它的容量仅64字节,可以自定义8个5*7点阵字符或者4个5*10点阵字符,AC可以存储DDRAM和CGRAM的地址,如果地址码随指令写入IR,则IR自动把地址码装入AC,同时选择DDRAM或CGRAM,LCD1602液晶模块的引脚图如图3.4所示。

图3.4 LCD1602引脚图

液晶寄存器选择控制如表3.1。

表3.1寄存器选择控制
RS
R/W
操作说明
0
0
写入指令寄存器(清除屏等)
0
1
读busy flag(DB7),以及读取位址计数器(DB0~DB6)值
1
0
写入数据寄存器(显示各字型等)
1
1
从数据寄存器读取数据

3.2.3液晶显示部分与STC89C52的接口

如图3.5所示。用STC89C52的P0口作为数据线,用P1.2、P1.1、P1.0分别作为LCD的EN、R/W、RS。其中EN是下降沿触发的片选信号,R/W是读写信号,RS是寄存器选择信号本模块设计要点如下:显示模块初始化:首先清屏,再设置接口数据位为8位,显示行数为1行,字型为5×7点阵,然后设置为整体显示,取消光标和字体闪烁,最后设置为正向增量方式且不移位[10]。向LCD的显示缓冲区中送字符,程序中采用2个字符数组,一个显示字符,另一个显示电压数据,要显示的字符或数据被送到相应的数组中,完成后再统一显示.首先取一个要显示的字符或数据送到LCD的显示缓冲区,程序延时2.5ms,判断是否够显示的个数,不够则地址加一取下一个要显示的字符或数据。

图3.5 LCD1602与STC89C52的引脚连接图
3.3信号采集电路设计

此部分电路的功能是由传感器将脉搏信号转换为电信号,一般为几十毫伏,必须加以放大,以达到整形电路所需的电压,一般为几伏。放大后的信号波形是不规则的脉冲信号,因此必须加以滤波整形,整形电路的输出电压应满足计数器的要求。选择电路:所选放大整形电路框图如图3.8所示。

图3.8 放大整形电路框图

3.4.1传感器简介

传感器采用了红外光电转换器,作用是通过红外光照射人的手指的血脉流动情况,把脉搏跳动转换为电信号,其原理电路如图3.9所示。

图3.9 传感器信号调节原理电路            

如图3.9中,红外管VD采用ST188。用+5V电源供电,R1取150Ω,R2取33kΩ,当人把手指放在发光二极管和光电二极管之间的时候,光电二极管接收到的信号会随人脉搏强度的变化而变化[11]。

3.4.2滤波电路

图3.10 放大滤波电路

图3.10为脉搏计的放大滤波信号,由于脉搏信号输出的信号十分微弱,一般在uV级别,除此外输出的信号一般会伴随很大的噪声干扰,因此在这里用LM358搭建起一个放大和滤波电路。

3.4.3放大整形电路

经过放大滤波后的脉搏信号仍是不规则的脉冲信号,且有低频干扰,仍不满足计数器的要求,必须采用整形电路,这里选用了滞回电压比较器,如图3.11所示,其目的是为了提高抗干扰能力。集成运放采用了LM358,除此外LM358还接上了一个LED用作指示脉搏跳动的状态。

              
图3.11波形整形电路

第四章 系统软件设计

4.1系统软件总体设计
图4.1系统流程图

主程序流程图如图4.1所示,单片机上电后先进行初始化,清楚一些参数的初值,然后等待用户按下对应的按键并进入对应的功能,当用户按下测量按键的时候流程如图4.1(c)所示,单片机通过定时15s测量人体的脉搏次数流程如图4.1(b)所示,然后再换算出对应的真实的脉搏次数再在液晶屏幕上显示流程如图4.1(a)所示,当用户按下设置脉搏范围设定按键后,单片机根据用户按下的按键进行增加或减少范围。

首先先调用液晶自定义的字库,设置好DDRAM地址后在第一行显示,根据程序中的数据设置显示数据的首地址并设置循环量,在循环过程中不断的取字符代码直到终止,第二行的显示过程同一行的显示过程一样,两行显示完毕后便结束子程序,如图4.2所示[15]。

图4.2 LCD1602初始化子函数流程图
4.2程序设计原理            

软件任务分析和硬件电路设计结合进行,哪些功能由硬件完成,哪些任务由软件完成,在硬件电路设计基本定型后,也就基本上决定下来了。

软件任务分析环节是为软件设计做一个总体规划。从软件的功能来看可分为两大类:一类是执行软件,它能完成各种实质性的功能,如测量,计算,显示,打印,输出控制和通信等,另一类是监控软件,它是专门用来协调各执行模块和操作者的关系,在系统软件中充当组织调度角色的软件。这两类软件的设计方法各有特色,执行软件的设计偏重算法效率,与硬件关系密切,千变万化。

软件任务分析时,应将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义(输入输出定义)。在各执行模块进行定义时,将要牵扯到的数据结构和数据类型问题也一并规划好。

各执行模块规划好后,就可以监控程序了。首先根据系统功能和键盘设置选择一种最适合的监控程序结构。相对来讲,执行模块任务明确单纯,比较容易编程,而监控程序较易出问题。这如同当一名操作工人比较容易,而当一个厂长就比较难了。

软件任务分析的另一个内容是如何安排监控软件和各执行模块。整个系统软件可分为后台程序(背景程序)和前台程序。后台程序指主程序及其调用的子程序,这类程序对实时性要求不是太高,延误几十ms甚至几百ms也没关系,故通常将监控程序(键盘解释程序),显示程序和打印程序等与操作者打交道的程序放在后台程序中执行;而前台程序安排一些实时性要求较高的内容,如定时系统和外部中断(如掉电中断)。也可以将全部程序均安排在前台,后台程序为“使系统进入睡眠状态”,以利于系统节电和抗干扰。


第五章 系统调试

5.1软件调试

基于单片机的脉搏计系统是多功能的数字型设计,,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。在软件的调试过程中主要遇到的问题如下:

问题1:烧入程序后,LCD液晶显示闪动,而且亮度不均匀。

解决:首先对调用的延时进行逐渐修改,可以解决显示闪动问题。其次,由于本作品使作动态扫描方式显示的数字,动态扫描很快,人的肉眼是无法看出,但是调用的显示程序时,如果不在反回时屏蔽掉最后的附值,则会出现很亮的现象,所以在显示的后面加了屏蔽子令,最后解决了此问题。

问题2:当用户按下按键的时候,单片机读取的数值跟设定的数值不对。

解决:重新检查矩阵键盘电路的连接,重新建立一个新的对应关系。

5.2硬件调试

基于单片机的脉搏计系统的电路较大,对于焊接方面更是不可轻视,庞大的电路系统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交线较多,对于各种锋利的引脚要注意处理,否则会刺破带有包皮的导线,则会对电路造成短路现象[14]。

在本脉搏计的设计调试中遇到了很多的问题。回想这些问题只要认真多思考都是可以避免的,以下为主要的问题:

问题1:最开始的时候以为单片机IO口直接可以驱动蜂鸣器发声,后来调试的时候久久不能出声音(见附录C)。

解决:经过查找相关资料,知道扬声器需要三极管来驱动,后来把三极管放大器加上系统便可以正常工作。

问题2:开始的时候由于没想到脉搏信号十分微弱大概在uV级别,因此没有放大足够的倍数,单片机最后没有检测到脉搏的信号(见附录C)。

解决:经过查找相关资料,确定脉搏信号的幅值范围后,增加放大器的放大倍数就解决问题。

5.3调试结果

1.放大倍数的增加

   传感器的输出端经示波器观察有幅度很小的正弦波,但经整形输出后检测到的脉冲还是很弱,在确定电路没有问题的情况下,加强信号的放大倍数,调整电阻R23和R27的阻值。

2.时钟的调试

根据晶体振荡频率计算出内部定时器的基本参数,通过运行一段时间可通过秒表来校正后,看时间误差的量,以这个量为依据改变程序中的内部定时器基本参数,就可使时钟调准确。

3.开机后无显示

首先检查交流电源部分,有无交流,若无则可能保险管或变压器烧坏,如有继续查直流有无,如无则电源已烧坏,可更换解决。

4.显示正常但经适当运动后测量,脉搏次数没有增加

可能是前置放大级有问题,可采用更换的办法判断并排除。

5.进人测量状态, 但测量值不稳定

主要是光电传感器受到电磁波等干扰,其次是损坏或有虚焊。

6.开机后显示不正常或按键失灵

可查手指摆放的位置或按键电路,若无故障则是硬件损坏。

经过一系列的问题查找后系统最终能正常工作,并完成所有的功能。

5.4误差分析
表5.1误差分析表
实际的脉搏次数
测量得出脉搏次数1
测量得出脉搏次数2
测量得出脉搏次数3
测量得出脉搏次数4
测量得出脉搏次数5
65
64
64
63
65
63
72
70
71
69
69
70
76
76
75
75
74
73
81
80
80
79
81
80
85
83
83
85
82
84

注:实际的脉搏次数以听诊器测出的脉搏次数为参考值。

表3.1列出了测量值,但存在误差,由于传感器和其他器件本身并非理想线性,实测数据进行了线性补偿。

由均方差公式得:

=0.59

误差分析:经校准,非线性补偿后,误差以基本达到要求。


结  论

通过这次毕业设计,我学到了不少课本上没有的知识,也锻炼了自己的动手能力,将以前学过的零散的知识串到一起。经过我长时间的设计及调试,本系统基本能实现基于单片机的脉搏计的所有功能。不足之处有:1.硬件的稳定性有待进一步提高2.系统人性化还不足。

我的综合设计主要涉及硬件和软件两方面的内容,通过这些我的硬件和软件开发能力都获得了提高。首先硬件方面,基本了解了电子产品的开发流程和所要做的工作。基本掌握了Protel99SE原理图的方法,并设计了一个单片机最小系统。通过开发板的设计和硬件搭建的过程,使我对51系单片机的接口有了更深层次的理解,熟悉了一些单片机常用的外围电路引脚和连接方法,如LCD液晶,键盘等。并且我学会了分析问题解决问题的能力,加深了对所学理论知识的理解和运用。我的动手能力得到了很大的提高,创新意识得到了锻炼。


致  谢

在这次课程设计的过程中,我的指导老师11111老师给予了我很大的帮助,提供了相关的资料,对我的课程设计作品给予了指导和支持。使我顺利圆满的完成了此次课称设计设计。在此,向1111老师表示衷心的感谢!同时,也要感谢学院提供制板等设施,使我的设计得以顺利完成。

古人云:预则立,不预则废。祖先曾经教导我们:一年之计在于春,一日之计在于晨。作为即将走向社会的我们又何尝不是如此?一个没有规划的人生,就像一场没有球门的足球赛,满场乱踢;一个没有规划的人生,就像一叶在茫茫大海上漫无目标的小舟,随波飘荡。在我们即将走向社会的时候,我们必须对自己的职业生涯进行规划。罗素曾说:选择职业就是选择你自己的将来。因此我们要针对社会需要,结合自身的情况及早做好相应准备,为我们走向社会打下坚实的基础。俗话说:磨刀不误砍柴功。为适应社会需要,促进自我发展,我们除了学好本专业外,还应辅修相关专业知识,积极参加社会实践活动,培养工作能力,努力提高综合素质,同时努力培养特长,形成自身竞争优势。

最后,再次感谢学院给了我们机会,以及电子信息与电气工程学院的各位老师和许多的朋友、同学在各个方面给予了我很多的帮助和支持,让我坚持到了最后,谢谢你们!


单片机源程序如下:


  1. #include <reg52.h>                       //调用单片机头文件
  2. #define uchar unsigned char  //无符号字符型 宏定义              变量范围0~255
  3. #define uint  unsigned int              //无符号整型 宏定义              变量范围0~65535
  4. #include <intrins.h>

  5. sbit dq   = P1^5;              //18b20 IO口的定义
  6. sbit beep = P1^4;   //蜂鸣器IO口定义

  7. bit flag_300ms ;



  8. uchar code table_num[]="0123456789abcdefg";

  9. sbit rs=P1^0;              //寄存器选择信号 H:数据寄存器                L:指令寄存器
  10. sbit rw=P1^1;              //寄存器选择信号 H:数据寄存器                L:指令寄存器
  11. sbit e =P1^2;              //片选信号   下降沿触发

  12. unsigned char i=0,timecount=0,displayOK=0,rate=0,aa=0;
  13. unsigned int time[6]={0};


  14. /***********************1ms延时函数*****************************/
  15. void delay_1ms(uint q)
  16. {
  17.               uint i,j;
  18.               for(i=0;i<q;i++)
  19.                             for(j=0;j<110;j++);
  20. }


  21. /********************************************************************
  22. * 名称 : delay_uint()
  23. * 功能 : 小延时。
  24. * 输入 : 无
  25. * 输出 : 无
  26. ***********************************************************************/
  27. void delay_uint(uint q)
  28. {
  29.               while(q--);
  30. }

  31. /********************************************************************
  32. * 名称 : write_com(uchar com)
  33. * 功能 : 1602命令函数
  34. * 输入 : 输入的命令值
  35. * 输出 : 无
  36. ***********************************************************************/
  37. void write_com(uchar com)
  38. {
  39.               e=0;
  40.               rs=0;
  41.               rw=0;
  42.               P0=com;
  43.               delay_uint(25);
  44.               e=1;
  45.               delay_uint(100);
  46.               e=0;
  47. }

  48. /********************************************************************
  49. * 名称 : write_data(uchar dat)
  50. * 功能 : 1602写数据函数
  51. * 输入 : 需要写入1602的数据
  52. * 输出 : 无
  53. ***********************************************************************/
  54. void write_data(uchar dat)
  55. {
  56.               e=0;
  57.               rs=1;
  58.               rw=1;
  59.               P0=dat;
  60.               delay_uint(25);
  61.               e=1;
  62.               delay_uint(100);
  63.               e=0;            
  64. }

  65. /********************************************************************
  66. * 名称 : write_string(uchar hang,uchar add,uchar *p)
  67. * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
  68.                             write_string(1,5,"ab cd ef;")
  69. * 输入 : 行,列,需要输入1602的数据
  70. * 输出 : 无
  71. ***********************************************************************/
  72. void write_string(uchar hang,uchar add,uchar *p)
  73. {
  74.               if(hang==1)  
  75.                             write_com(0x80+add);
  76.               else
  77.                             write_com(0x80+0x40+add);
  78.               while(1)
  79.               {
  80.                             if(*p == '\0')  break;
  81.                             write_data(*p);
  82.                             p++;
  83.               }            
  84. }

  85. /***********************lcd1602上显示特定的字符************************/
  86. void write_zifu(uchar hang,uchar add,uchar date)
  87. {
  88.               if(hang==1)  
  89.                             write_com(0x80+add);
  90.               else
  91.                             write_com(0x80+0x40+add);
  92.               write_data(date);            
  93. }

  94. /***********************lcd1602上显示两位十进制数************************/
  95. void write_sfm3(uchar hang,uchar add,uint date)
  96. {
  97.               if(hang==1)  
  98.                             write_com(0x80+add);
  99.               else
  100.                             write_com(0x80+0x40+add);
  101.               write_data(0x30+date/100%10);
  102.               write_data(0x30+date/10%10);
  103.               write_data(0x30+date%10);            
  104. }

  105. /***********************lcd1602初始化设置************************/
  106. void init_1602()
  107. {
  108.               write_com(0x38);              //
  109.               write_com(0x0c);
  110.               write_com(0x06);
  111.               delay_uint(1000);
  112.               write_string(1,0,"   Heart Rate     ");            
  113.               write_string(2,0,"     000/min       ");
  114. }

  115. /*************定时器0初始化程序***************/
  116. void time_init()               
  117. {
  118.               EA   = 1;                              //开总中断
  119.               TMOD = 0X01;                //定时器0、定时器1工作方式1
  120.               ET0  = 1;                              //开定时器0中断
  121.               TR0  = 1;                              //允许定时器0定时
  122. }


  123. /***********外部中断0初始化程序****************/
  124. void init_int0()                //外部中断0初始化程序
  125. {
  126.               EX0=1;                                            //允许外部中断0中断
  127.               EA=1;                                            //开总中断
  128.               IT0 = 1;                               //外部中断0负跳变中断
  129. }

  130. /****************主函数***************/
  131. void main()
  132. {            
  133.               init_1602();                    //1602初始化
  134.               time_init();                    //初始化定时器
  135.               init_int0();                //外部中断0初始化程序
  136.               while(1)
  137.               {                                         
  138.                             if(displayOK==0)//如果显示关
  139.                             {
  140.                                           rate = 0;
  141.                             }
  142.                             else//如果显示开
  143.                             {
  144.                                           rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);
  145.                             }
  146.                             write_sfm3(2,5,rate);

  147.                             delay_1ms(300);
  148.               }
  149. }

  150. void int0() interrupt 0
  151. {
  152.                             EX0=0;//暂时关外部中断
  153.                             if(timecount<8)   //当连续两次检测时间间隔小于8*50ms=400ms不处理
  154.                             {
  155.                                                         TR0=1;//开定时器
  156.                             }
  157.                             else
  158.                             {
  159.                                           time[i]=timecount*50+TH0*0.256+TL0/1000;//算出间隔时间
  160.                                           TH0 = 0x3c;
  161.                                           TL0 = 0xb0;     // 50ms              12M
  162.                                           timecount=0;//50ms计数清零
  163.                                           i++;
  164. ……………………

  165. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
论文.doc (578.5 KB, 下载次数: 45)


回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表