|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的心率脉搏计仿真及源程序- E# K+ v: ~( _: _
, V* `/ }+ {/ C9 H A8 D, H
: E; g" f @9 N, h: n心率脉搏计的仿真原理图:- c6 Q$ y; W3 s& |
3 W) ] X, c$ n Q+ x* M3 I#include <reg52.h>% {6 s4 x4 O' q
#include "lcd1602.h"
' l/ l& [: v% |& \# Q: V
) Z# L) i, v2 f; m2 I3 y6 e# Q#define uchar unsigned char ( M C* v$ s8 U, z: D4 c
#define uint unsigned int% k( a/ P# r* u. q0 U2 O/ d5 {- D8 z
, o* R# J& R' a+ M
unsigned char num=0,timecount=0,displayOK=0,rate=0;
+ C% q% s* s% e! F, eunsigned int time[6]={0};
X/ i( S M& Q; u5 j
" f* `! D% t! @2 W3 n/***********************1ms延时函数*****************************/% I _2 P5 O: v6 z. E/ L/ L N
void delay_1ms(uint q)2 p% [( ~, O4 l: M) S% c/ J0 A: D
{
/ I! m$ V) W$ b- p; M! ^5 W5 F$ y uint i,j;4 G( U" h1 H/ i- F# t$ L
for(i=0;i<q;i++)
5 b/ O( w) Y4 G" l% C for(j=0;j<110;j++);, S3 H- g) t/ j6 R; K
}
6 _! M0 V+ J! q6 O1 y5 P& R& }9 ^
- G: q+ Z6 |9 k3 |
- {, s3 ^2 o9 w4 x6 qvoid main()
0 R2 n( F* {% P/ Y9 X4 U' P3 F{ ( O9 A) k0 w& p5 {/ E& h1 M
init_1602();; P& e& Z- m# Y1 v9 C/ A" G4 ^
TCON=0x01;//设置外部中断0- o( Q3 P" c) A0 r" l9 r
EX0=1;
8 n4 A5 ^% g9 w9 \. H% | TMOD=0x01;//定时器0初始化
# P0 b5 B$ @) H TH0=(65536-50650)/256;//实测每50ms中断的定时值
5 \# Y5 w5 V$ B) U: ]- }; n TL0=(65536-50650)%256;
* S5 {1 x: T& b, \( B ET0=1;//开定时器中断7 S9 x6 V# q5 `" b# `" l, j7 u9 d
//显示基本文字7 a; e: v: M7 B/ ?8 J1 i2 O& R
write_string(1,0," Heart Rate ");
8 L7 P/ F; h4 Y/ e! U write_string(2,0," /min ");
4 I; I! j3 t1 Q9 ^0 k4 q TR0=0;//定时器停止
- \7 c) ]& R/ l# k' L/ _. G! r/ U" `$ K EA=1;//开总中断 , p- n# M+ Q$ G& S
while(1)
* q: i1 V! r# T$ r2 L j {
: m% M5 X2 y5 l; v
" |1 a9 j8 C: ]; p; I if(displayOK==1). w9 k. x6 e9 Y; d; L c
{% o& Q- p- u; J' C& H, j, I" g
rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);
. ]: g, {) t4 o write_sfm3_18B20(2,5,rate);
* |, {% l7 L1 |# c6 |' X2 r
' b/ C& u! \0 Z, x4 w0 ? } 7 _5 n: c5 U& i2 L; G
else5 I# p6 T T! l7 r/ ^: a; H
{. R' U9 b) Y# K* k, V4 j0 y
write_string(2,5," ");
6 }( x. g4 P0 x& | }
) V& [. W- A; D, ] delay_1ms(300);
# j* ~- r) {' Z1 z! }5 `1 s
- w$ t+ f' E5 c$ n8 l7 V! P- k8 l ~) v0 F- W. L: R" i3 J5 k
}) s4 \" u4 }$ `4 F, [# }
}# U* f: i# |* D6 d. a ?
' u9 N! H8 ?9 y% a* Evoid ex0() interrupt 0
& [( j6 W: P# w: b$ T{9 e4 U Z9 P. I2 ~: v4 t# {
EX0=0;//暂时关外部中断
. D( D3 L& \- v' E if(timecount<8) //当连续两次检测时间间隔小于8*50ms=400ms不处理
1 s+ j+ f; g1 X! }$ ?! b {8 \4 x' N7 c" b( V9 m) [. c' o* P) L7 N
TR0=1;//开定时器
- M8 F5 u$ P L/ T: d' @4 Y% z }
5 D8 u# j7 Z' V else( M& x" u2 a) v
{
" E8 [! ^8 d7 O, a b+ } time[num]=timecount*50+TH0*0.256+TL0/1000;//算出间隔时间
8 J9 U$ {: L; t& _+ X: F1 r TL0=(65536-50650)%256;//重新设置定时器8 X: e) G9 R8 p3 D1 p4 ^9 Q% ~
TH0=(65536-50650)/256;
3 F" Z- c' D& B; |" x* N* D% r$ T timecount=0;//50ms计数清零
9 g) v3 i3 s6 g1 A num++;
% z- C4 K; J# H0 j8 X, q! U) t$ C if(num==6)//记录到超过等于6次时间
2 D) g% e' M3 Y" u3 k {+ f/ M3 |5 d' b B# a I& M
num=1;//计数从1开始
& G& P: \ i4 S/ V displayOK=1; //测得5次开始显示4 B5 B& U) ]% V
} p6 z K% F/ P( i" u) g' S) a! U. m9 w
8 u, D. ?7 {* Y& T }" G+ [/ I0 R' S, K
EX0=1;1 z! Y' U0 Q8 F7 U0 J
}
' |; E# `- q8 O- Avoid et0() interrupt 1' ]6 q9 n$ P2 C8 i. l' t+ C
{% z$ N6 C5 W& B5 ^, ?9 f( X
TL0=(65536-50650)%256;3 A& v: U7 h- c4 P9 {+ d9 _4 g
TH0=(65536-50650)/256;/ E# d/ ?% A# a4 ^7 L
# J$ M% X: H8 X8 c4 G! {9 I timecount++;//每50ms一次计数
( M" G7 W: o9 Z if(timecount>25) //当超过25*50ms=1.5s没有检测到信号停止显示
/ F0 a* h! W U7 w2 d {: }0 ^. I$ G: S p, ~* Q* w& i
num=0;//数据个数清零
$ c% P) U# t. K1 ]% w0 r- j% }5 X+ ~0 {3 C P6 n
. T; s- J0 D( W5 p% P
…………限于本文篇幅 余下代码请从论坛下载附件…………
: J, }5 Y6 i: l; w+ X6 _
) F- A1 J# k" N3 {- N4 L3 F+ `1 D4 U8 c% Y
|
|