|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的心率脉搏计仿真及源程序7 y% O4 i2 }8 N l- g
% c, a* Y4 ^7 g. p
, d4 d3 v, A' ^0 z, X7 G- i+ A5 ^心率脉搏计的仿真原理图:
$ m7 v* ^4 M% @* k- s / T3 O P9 U+ N" J
#include <reg52.h>
. ?' l; X" r7 O# t- d" p8 }#include "lcd1602.h"
% ?6 @- \9 o3 F( S; x1 u9 s
1 v6 ]6 g7 W [2 V#define uchar unsigned char
: l, j! B* P0 C4 {; ^( J* J, c+ r#define uint unsigned int
. y3 a* V3 A6 W1 K5 K. W& W4 {% X
. N, B% N& B3 e; k, d: C4 iunsigned char num=0,timecount=0,displayOK=0,rate=0;
1 f. H }: J1 A1 Uunsigned int time[6]={0};
" ^7 m& @: b* M+ T, z3 P$ }" |& T# _
/***********************1ms延时函数*****************************/
/ F% n, e ?' t+ G- ~* Xvoid delay_1ms(uint q)
) H8 f. `& R, c{
: u1 H0 q( x! N5 h9 o5 q% I uint i,j;4 l7 [' Z8 l% G/ @
for(i=0;i<q;i++)& X+ L7 ~$ i7 n, M3 h4 |
for(j=0;j<110;j++);
( R- o: ~4 c$ |}9 {/ Z4 ^. O; J2 S% T/ Y
" D( z4 f2 k$ ~; i! c, c$ U1 j( a8 ]! A5 K C
void main()
; W( L+ W% F2 u9 j) E{ . A; }' A$ s3 K, w
init_1602();, K; n( ^* ~6 Z; [ A
TCON=0x01;//设置外部中断0& h$ S! j4 k" Y# l6 T7 b% q
EX0=1;
D, j! m" F& L' ^# p* Y0 [ TMOD=0x01;//定时器0初始化5 T j* Y1 H6 _) [9 N* h
TH0=(65536-50650)/256;//实测每50ms中断的定时值
$ F1 ~! d/ D8 Q% B- R1 b& ^" L" K! h TL0=(65536-50650)%256;/ g# r& Q- o! {8 k I# L
ET0=1;//开定时器中断
. N# w: ?) O* T9 I5 [% ~+ C //显示基本文字: l8 z9 H0 Z/ P8 Q
write_string(1,0," Heart Rate ");0 D, J+ t7 i: \+ D) ^# d( q
write_string(2,0," /min ");- {$ A( }& j& f1 t
TR0=0;//定时器停止
. R# W4 x& @) h d EA=1;//开总中断
! m4 a: ~% c: b) J1 b while(1)& N5 m8 J' \3 u
{) `) e. ^& ]: X
3 z) X2 G5 Y7 A9 A3 U9 q! J! A if(displayOK==1)
& m( x \7 ]( X {3 V- {6 |: }# H
rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);6 U6 g+ m% l( p" w
write_sfm3_18B20(2,5,rate);% _8 t% D; m. K. C
0 q* T3 m8 k) H0 ^, a) J
}
0 v( |" R/ `" K& ^9 ~ x. j0 M else9 Y5 d4 X4 K5 m' V
{2 z; s8 }& k2 V2 M/ [
write_string(2,5," ");/ y, K( N( j( i! \0 S6 W1 |# Q
}
+ J! K6 \* a& z$ J+ B delay_1ms(300);, X1 r1 g$ f& P0 N6 Q$ L o
; `! W- |! o9 |: _" D8 Z
% w, r4 |* c* P; ~' ]3 c) m" S0 ] }
: g" q7 x3 j* H8 R+ p}! Q7 l, A( h* ^/ B1 ^
5 S: o6 D, h) I. Q" r5 p! v8 u
void ex0() interrupt 0
% z x3 S" v( u4 k& L: s5 E& \{
; W' o6 J, Y) n. A EX0=0;//暂时关外部中断+ w W9 n# D, I8 W
if(timecount<8) //当连续两次检测时间间隔小于8*50ms=400ms不处理5 h* _( B* |9 {) F( g
{; C- }3 i# B3 C8 m, \$ ?/ M6 A, H4 s7 y
TR0=1;//开定时器; X7 t$ j3 I# A% s) Q3 O# C
}, |5 Y" O( }) d- M: d
else& p$ @/ M1 B6 _: [2 L6 l1 k
{, R6 ^" m" W2 Y- M$ P" m+ t% U
time[num]=timecount*50+TH0*0.256+TL0/1000;//算出间隔时间; w" [) U" q4 N
TL0=(65536-50650)%256;//重新设置定时器. P: g& J+ L% N$ f
TH0=(65536-50650)/256;
( x0 a! B' l6 _) ~ \- K; z timecount=0;//50ms计数清零
8 }$ c8 Y9 w6 [, q1 v0 q7 m num++;
; z& L6 q F% p9 c/ s if(num==6)//记录到超过等于6次时间
6 a( A1 {; s1 V0 I5 r8 U% c {
8 h) Q6 f$ E1 U num=1;//计数从1开始
% l. g- ~$ U! d* I displayOK=1; //测得5次开始显示! m% j0 s2 q4 o. X1 D( m: f
}
7 l; p( ~7 K( R- f
. K& A2 i, F) K5 F# f3 `8 t7 w0 \ }% x+ ~# `/ |$ w+ x1 p
EX0=1;
4 h H: V t& h5 r2 ^! L% i}
L, {1 ?: C1 n0 a3 J' f; ]# o/ yvoid et0() interrupt 1 `& M0 T! _& \$ t. R
{
+ i& F7 V: Y6 T& d5 p TL0=(65536-50650)%256;
, |$ q+ W- d; a3 |9 ^/ z TH0=(65536-50650)/256;
5 C4 ]9 Z$ J' e9 D1 \" o. o% x- S! G8 X1 }! C9 h
timecount++;//每50ms一次计数) y# E9 i, w% k. s5 p
if(timecount>25) //当超过25*50ms=1.5s没有检测到信号停止显示
1 d' e# `+ {2 y4 s5 P, O {
- d8 q/ B- Y8 m" N/ U num=0;//数据个数清零
. a' B$ Q# Z' j3 d' H7 N U
# n4 U! S5 S8 i8 E; W# T! c
* b4 x# O% p- x4 d& o, G0 I; \…………限于本文篇幅 余下代码请从论坛下载附件…………; k, F7 y3 Q, ^$ E+ }9 c
4 H- M1 I$ t/ V/ D4 e3 x5 S
+ a( O9 r5 i& t |
|