技术文档

单片机秒计时器 单片机实例分享,低成本快速心率测试仪

小编 2024-10-10 技术文档 23 0

单片机实例分享,低成本快速心率测试仪

心率是人体的一个重要指标,人在安静或睡眠时心率减慢,运动时或情绪激动时心率加快。制作一个心率计,实时知道自己的心率,不仅是一件好玩儿的事,还可以对自己和家人的身体状况作一个了解。想不想跟我一起做一个超低成本却可以快速测试心率的装置?通过这个制作,收获的不只是心率计,还有动手能力的提升以及周围人好奇和羡慕的目光。

检测心率的方法主要有两大类。第一类是心动电流测量法。人体每次心跳都会产生心动电流,通过在身体固定部位放置电极可以捕获这个信号,其原理和心电图测量原理一致,所以这种方法的精确度最高,但是要想捕获并处理这种生物电流是稍微困难的,而且每次测量都需要粘贴电极,不太适合低成本自制。那有没有一种既简单又可靠的测量方式呢?

当然有啦,第二类测量方式就是光电透射测量法。顾名思义,这种方法是通过光线来测量的。它利用血管内血液血红蛋白吸光度的变化来测量脉搏,换言之,当心脏搏动后,你的手指会充血,这会导致手指的透光性变差。将红外线发射管和接收管分别放置在手指两侧,使其感知这微弱的光线变化,即可测量心率。这种方法的优点是测量简单,无需粘贴电极,而且不需要高昂的制作费用,原理易懂。但是在接受测量的时候,必须要在安静的环境下进行。如果手指有轻微的摆动会直接对光线造成影响,引起错误计数。不过我在这个制作项目的程序里做了相应的改进,可以在一定范围内控制这种误判。

这款心率计所有的元器件都容易购得,且价格低廉(见图27.1),整体成本完全可以控制在30元以内,可实现实时读取心率的作用。采用现在最普遍的51单片机,程序通俗易懂。对于以前从来没有接触过运算放大器的朋友,这个制作可以让你初步领略到运算放大器的用武之地,将课本上生硬的知识应用到实际中来。

图27.1 实物图

硬件原理

我们来看看图27.2所示的电路原理图。你会发现元器件并不多。的确如此,随着半导体技术的发展,电路装置越来越小型化,功耗也更低。运算放大器(简称“运放”)是具有代表性的元器件之一。它是具有很高放大倍数的电路单元,集成在芯片上,由于早期应用于模拟计算机中,用以实现数学运算,故得名“运算放大器”。正是由于这种元器件的诞生,电路简洁化成为了可能。

图27.2 电路原理图

这款制作我们使用的运放型号为LM324(见图27.3),由结构图可知,一个芯片集成了4个相互独立且相同的运放,你可以根据布线需要合理安排。红外接收管接收到杂乱的信号,经过C3进行预处理,抑制掉一部分杂波(高频交流信号可以很容易通过电容而导入GND)。经过C4耦合,抛去了信号中的直流分量,仅保留交流分量。现在我们来逐一分析电路图中4个运放的作用。

图27.3 LM324 运算放大器

IC2A是一个电压跟随电路,它将运放的输出端与反相端相连,使输出端的信号直接反馈回反相端,导致最终该运放的输出端的电压只受同相端的控制,且输出电压与同相端相同。由R10和R11相同可知,输出电压为4.5V。也许有人会问,既然电压相同何必要这么麻烦地连接一个运放。那是因为运放的输出电阻较低,有一定的电流驱动能力,使电压不易随电流的改变而变化。这个电压的作用是把C1输出的信号平衡在4.5V上下,同时再提供到反相端,反相端与同相端进行差模放大,使信号更加可靠。IC2B是整个电路最重要的部分,它肩负的任务是滤除高频杂波,放大低频信号。

将示波器的表笔接到该运放的同相端,波形如图27.4所示。实际应用中杂波很多,脉搏容易被掩盖在其中。再将表笔接到运放输出端,波形如图27.5所示,高频杂波被完全抑制,经过R4和R5的反馈作用,脉搏信号被放大了500倍,达到2V左右,是不是很神奇?IC2C的重要性仅次于IC2B,该运放肩负着电压比较的作用。因为该运放没有反馈电路,所以当同相端电压大于反相端时,输出端将输出电源电压(9V);当同相端电压小于反相端,输出端会输出0V。整个电路调试的重点就是这里,通过调节R6,改变反相端的电压,将图27.5的波形调整成方波,输出如图27.6(黄色线为输入,蓝色线为输出)所示的波形。IC2D的作用就简单了,它只是将上一级的方波进行反相处理,因为单片机中断的方式为下降沿,需要在心脏起搏瞬间接受一个下降沿来计数(IC2D也可以省略,将IC2C的两个输入端反接即可)。

图27.4

图27.5

图27.6

单片机的作用是用来测量脉搏的间隔,以计算出每分钟的心跳次数,这个制作用1602液晶屏作为显示器,你也可以改改程序,用三位数码管来显示。

程序流程及算法

上电后,显示LOGO(在程序里你可以随便改),然后显示操作提示。单片机定时器中断用来标定时间,心跳脉冲引发外部中断。在外部中断子程序里,会计算每两次外部中断的时间间隔,用1min除以这个时间间隔得到心率。另外,为了抑制手指颤动带来的错误计算结果,程序判断计算结果如果大于190,会抛弃这个数据,并用上一次结果代替。为使读数更加平稳,每次显示的数据为前4次心率的平均值。如果系统10s后没有接收到脉冲,会显示操作提示,直至接收到脉冲为止。我已将程序进行详细标注,欢迎读者下载后进行改进和学习参考。

电路调试与制作

建议不要直接往电路板上焊接,有条件的话,最好在面包板上先搭建一下,因为模拟电路十分敏感,图纸上的元器件参数不一定适合你的制作,比如红外对管之间的距离或性能不同,所选用的电阻R4就要相应调整。提前搭建一下电路有利于确定更合理的元件参数。同时,最好准备一台示波器,模拟电路的调试毕竟不同于数字电路,信号的每一次变化代表的意义都很重要。没有示波器,调试电路就好比蒙上眼睛摸墙,当然,如果你制作得足够顺利,可能一次就成功而不需要示波器了。

首先,检测IC2A的输出电压,若电压不是约为电源电压一半的话,请仔细检查这个部分有没有接错,R10和R11是否连接正确。接下来检测IC2B,将示波器探头连接到IC2B输出端,然后将任意一根手指放在对管之间,波形应接近图27.5所示,输出端维持在9V,说明反馈电路有问题,导致放大倍数过高,仔细检查R3、R4、R5。若波形杂波严重,检查C5。因为不同人制作时对管的距离不同,对管参数也有差异,所以信号电压会不同。用示波器检测信号,如果波峰电压值太低的话(建议波峰接近2V),需要适当降低R4的阻值来提高信号放大倍数。这一环节成功后,将示波器的另一路表笔接到IC2C的输出端,同时检测两路波形,适当调整两个波形的纵轴位置,使其相交(见图27.6),两波形交点代表阈值点,通过调节R6改变阈值点的高低,使这个阈值点定位在R波波峰以下和T波波峰以上的区间内(如图27.7所示)。

图27.7

再测试一下IC2D输出端,如果在心脏波动瞬间产生下降沿,则模拟部分调试完毕,否则请仔细检查,切记R4的阻值不能太小,否则会因为放大系数太大,导致振荡,影响单片机计数与电路的整体稳定性。

至此,整个制作环节中最敏感的部分已经搭建完成。接下来的工作就是将确定下来的电路移接到洞洞板或者自己腐刻的电路板上。单片机部分一般不需要提前搭建,直接往电路板上焊接就好,出错概率很低。一定要看清电路图,单片机和液晶屏的输入电压和运算放大器是不同的,切勿马虎大意接在一起。液晶屏的对比度通过R13来调节。我制作的电路实物见图27.8、图27.9,可供参考。

图27.8 制作完成的电路

图27.9 侧视图

使用方法

将9V(12V也可以)电源连接好以后,按下电源开关,这时候会显示Logo,大约5s以后进入工作状态,此时你只需很放松地将手指头放在固定的红外线发射管和接收管之间就可以了,切记一定要放松,手指不要紧张。只需经过大约四五秒,该装置即可进入正常工作状态,你会看到指示灯跟着心跳闪烁,液晶显示屏上显示出此刻你的心率。只要手指不颤动,误差会很小,读数是很可靠的。图27.10、图27.11所示为实际测试效果。

图27.10 显示情况

图27.11 实际测试效果

外壳制作

电路都弄好了,何不做一个外壳来美化一下呢?兴许你有更好的开槽工具,那太好了!否则就和我一样,用电钻和电烙铁来开槽吧。为了精确,可以上网找液晶屏的技术手册,里面有详细的尺寸标注。根据它,你可以在电脑里精确绘制钻孔和开凿模板,打印出来贴在外壳上,剩下的工作就不用我多说了,仔细切割就好。最终效果图27.12所示。

最后祝广大读者身体健康!

图27.12 最终外观

单片机的功能确实多,做一个秒表应该怎么写程序呢?

单片机也有中断功能,它也会中断单片机主程序正常运行。今天设计的秒表是利用单片机内部资源——定时/计数器中断,前面讲过延时1秒(s),是让单片机空耗一段时间,并且延时时间不是精确的,但是定时器中断获得时间单位就比较精确,精确程度与单片机外接晶振质量有关。

常见的单片机单片机一共有5个中断,即外部中断0、外部中断1、定时/计数中断0、定时/计数中断1、串口中断。

一、制作一个秒表

1.电路

2.程序设计

#include<reg52.h>//头文件

#define uchar unsigned char//宏定义

#define uint unsigned int

uchar table []={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴数码管数组

uchar num,num1,shi,ge;//定义变量

void delay(uchar a)//延时函数

{

uint i,j;

for(j=a;j>0;j--)

for(i=110;i>0;i--);

}

void display(uchar shi,uchar ge)//显示函数

{

P0=table[shi];

P1=0XFE;//1111 1110选中数码管第一位

delay(5);

P0=table[ge];

P1=0XFd;//1111 1101选中数码管第二位

delay(5);

}

void t0init()//初始化

{

TMOD=0X01;//0000 0001//定时器0工作方式1

TH0=0X3C;//装入初值,50毫秒

TL0=0XB0;//装入初值

EA=1;//打开总中断开关

ET0=1;//打开定时器0中断开关

TR0=1;//启动定时器0

}

void main()//主函数

{

t0init();

while(1)//无限循环

{

display(shi,ge);

}

}

void timer0()interrupt 1 //中断函数

{

TH0=0X3C;//装入初值

TL0=0XB0;//装入初值

num++;//变量累加

if(num==20)//1秒

{

num=0;

num1++;

shi=num1/10;//取十位

ge=num1%10;//取个位

if(num1==60)

{

num1=0;

}

}

}

3.程序解释

(1)采用定时器中断必要的语句。

TMOD=0X01;

TMOD是选择定时器工作方式。0X01是定时/计数中断0工作方式1,如果是0X10是定时/计数1工作方式1。

TH0=0X3C;//装入初值

TL0=0XB0;//装入初值

如果单片机外接晶振是12M,它的时钟周期是1/12μs(微妙),12个时钟周期是一个机器周期即1μs,定时/计数0工作方式1,最大值能定时65536μs(2的16次方),约等于65ms。如果需要定时50ms,也就是计数不是从0开始,而是从15536(65536-50000)开始,15536(十进制)换算为16进制为3CB0,即“TH0=0X3C;TL0=0XB0;”,需要计时1s,只需程序中断20次。

EA=1;//打开总中断开关

EA是总开关,好比总电闸。

ET0=1;//打开定时器0中断开关。它是定时器0的开关,好比客厅总电源开关。

TR0=1;//启动定时器0。启动定时器0好比客厅的吊灯开关。

以上语句需要写在主函数中,或者作为函数,在主函数中调用。

(2)void display(uchar shi,uchar ge)//显示函数显示部分用函数形式体现,在主函数循环调用。

(3)中断函数

既然中断产生了,那么中断以后做什么?

void timer0()interrupt 1 //中断函数

{

做什么工作;

}

“timer0”自己起的名字,代表定时/计数0中断,“interrupt”不能写错,关键是它后面的数字千万也不能搞错。需要注意,采用工作方式1,需要在中断函数中重新装入初值。

中断源与序号

相关问答

51 单片机 MCS-51,如果采用的晶振的频率为3MHz,定时器/计数器...

[最佳回答]方式0:2^13/3M*12=0.032768s;方式1:2^16/3M*12=0.262144s;方式2:2^8/3M*12=0.001024s;方式0:2^13...

单片机秒 和分钟的进位是如何实现的?

在单片机中,秒和分钟的进位通常通过计时器中断来实现。计时器会以固定的时间间隔触发中断,比如每秒触发一次。当计时器中断触发时,单片机会执行中断服务程序,...

51 单片机 定时器一毫秒怎么写?

假设晶振为12MHz,不用中断时程序语句如下:TMOD=0x01;//定时器0工作方式1TH0=(65536-1000)/256;//装入初值TL0=(65536-1000)%256;TF...

单片机 定时器在12M晶振下,方式二最长可定时多久?怎么算?

12M晶振,每个指令周期是1us,采用方式1定时,那么定时公式为:定时时间=(2^16-定时初值)×1us,当初值=0时,最大可以是2^16us=65536us即一次循环最多可以定时...1...

定时器在 单片机 中程序的运行过程 - 懂得

我觉得是这样的,单片机的定时器,它的计数过程是相当于电脑里面一个后台运行的东东一样。在计数时单片机同时在执行其他程序,计数周期就是单片机的一...

单片机 关于定时器和波特率的计算?

方式1,3的波特率=1/32或1/16*计时器2的溢出率此处有一个公式:波特率=1/16或1/32*(晶振的频率/12*(256-TH1))代入:9600=11059200/32*12*(256-TH...

定时器在 单片机 中程序的运行过程 - yn4Wk5LPWx 的回答 - 懂得

我觉得是这样的,单片机的定时器,它的计数过程是相当于电脑里面一个后台运行的东东一样。在计数时单片机同时在执行其他程序,计数周期就是单片机的一...

51 单片机 如何定义t0为 计时器 t1为计数器?

常规方法测量脉冲的频率,利用51单片机的两个定时器来测量,一个定时器0来定时,一个定时器1作为计数方式voidTimer0Init()//2毫秒@12.000MHz{...常规方法测...

单片机 工作主频12MHz,定时器计数器T0工作方式1,计算定时10ms的初值是多少?

(2^16—计数初值)╳晶振周期╳12=定时时间(2^16—计数初值)╳1/(12╳10^6)╳12=10Ms=10*10^(-3)S计数初值=2^16—10^4=55536=D8F0HTH0=...

单片机 定时器延时计算方法?

51系列单片机的话:先算出来你的定时器+1的单位时间Tu,你需要定时的时间是Tc(注意Tc不能超过定时器的最大定时时间),你的定时器的位数是n,那么你的定时器初...

猜你喜欢