|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的心率脉搏计仿真及源程序
) K; ^. w/ i3 l4 J" V C- T" N! [, `
% E! A" e: W7 p8 @3 g
心率脉搏计的仿真原理图:
' n% T; J+ C, m+ `
1 h U% s* U! M! E; q#include <reg52.h>
+ W) q) p8 X. c v3 X#include "lcd1602.h"
! r; h9 G; G, [. t. a& h; w+ g3 {. m5 n, m% S" T
#define uchar unsigned char % r! b" Q& t6 A8 n$ d2 [) [
#define uint unsigned int8 t0 Z+ |) q* S6 d: }/ c- F& O
0 R/ V' x4 { ^3 Q! V- u* @unsigned char num=0,timecount=0,displayOK=0,rate=0;
# X+ b4 W/ S$ a, xunsigned int time[6]={0};
% D* I4 Y# Z; @" c6 R! Z
& y( d1 F" |5 g- _8 Q3 _' {" H0 B/***********************1ms延时函数*****************************/! z- @$ S4 E7 b6 d$ I
void delay_1ms(uint q)0 ]; L; e' S: T7 F4 ~* x. \+ I% ~8 |
{
! }# }9 v& ]9 j; X' i# z uint i,j;
: s) s! J0 p( }& {$ @1 _/ Z for(i=0;i<q;i++)! j/ Q/ n; O4 q$ V, `: g8 f. i3 X
for(j=0;j<110;j++);$ c4 t5 R4 c) ]! n4 ]- Y# Y9 r
}& E9 \. b0 I8 w* N
S5 u! K4 E1 m( m6 ~$ v0 \7 k5 C6 k2 {7 V J
void main()
4 A3 N- h7 Z/ \+ e5 O3 I3 K( d2 E{ 8 n8 `- }" E- E ^! \8 k8 p$ Y
init_1602();
) L. g3 C" s9 u) i: y TCON=0x01;//设置外部中断0% @) M6 m* W' H+ |+ j8 H
EX0=1;3 C+ T& p0 J7 ]/ F2 \: b
TMOD=0x01;//定时器0初始化
: Z8 ^; l6 B; e2 t- w& F8 ^& }1 Y( b6 | TH0=(65536-50650)/256;//实测每50ms中断的定时值6 ^& ]# s9 A3 A1 P3 [5 s
TL0=(65536-50650)%256;) u# X+ l5 @+ \5 s- N
ET0=1;//开定时器中断
' @7 K! O; l4 c) ]. i7 k* E' N //显示基本文字- f; m" F2 G; e+ t0 P- ^/ r/ e$ O
write_string(1,0," Heart Rate ");
: v; L$ {" ]4 n. L write_string(2,0," /min ");. i3 A5 b; ~1 S; U# L
TR0=0;//定时器停止
/ b* `6 b$ p: _- X9 C; y$ D: d EA=1;//开总中断 * p r& G% a& D
while(1)+ Q Q4 y4 v+ Y7 T
{
# v: F7 I0 F! N7 A, M& |- U- I% P4 g z0 v% K# z9 y c0 n
if(displayOK==1)
* x! I4 Q7 {) z& q {: G: T1 t9 f9 Q5 Y
rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);
: {8 y" ?( h1 Z/ u# m6 S. e1 | write_sfm3_18B20(2,5,rate);+ k; [8 w# @" B
o/ h' T9 N1 ]6 ?; F6 i8 k
} 8 i) N) J3 v4 r! u( Q
else
, M! Z% a1 |1 V, \ {
' N: ]$ i5 z3 }4 f- a write_string(2,5," ");
% M) Q7 Q) {. x. j2 [/ b }% e: [; v4 y# S. q. C$ j. d5 `
delay_1ms(300);
% D8 C5 c$ W) B/ Y* ]5 L" j% o0 u& C' q* Z4 a
% N5 W, E1 \- e" `+ @* c }7 q7 }' a) C' r3 t3 A& _% O) A* A
}0 g0 X0 I6 Y6 u. h* q% V
$ @* Q1 L0 w3 M$ M" `; Y; m7 `4 g
void ex0() interrupt 00 T9 ^1 F+ u" X g2 t% X
{- f8 \7 |# l4 K4 E, p- z
EX0=0;//暂时关外部中断
& V' n: f( J" W1 J" h1 d if(timecount<8) //当连续两次检测时间间隔小于8*50ms=400ms不处理( M O+ d% C8 I1 m
{
6 O. P1 G7 }' u( Q TR0=1;//开定时器
- ^; v8 z3 a C, h$ p5 g: c8 t) v }
: q3 j X4 e+ u/ n) @ else+ ^+ V4 q6 y7 @) ?- M
{/ S7 f1 ~% I8 A4 G0 T' _! `
time[num]=timecount*50+TH0*0.256+TL0/1000;//算出间隔时间' v! Y5 y( n$ M
TL0=(65536-50650)%256;//重新设置定时器' J# }% W4 j* s x7 U/ y' V
TH0=(65536-50650)/256;
: V" y, z4 K; p3 f% E1 e timecount=0;//50ms计数清零
0 Y( {/ f- v! Z4 ~# Z6 V8 M- q3 p num++;
6 U# _6 `/ F [( a; P if(num==6)//记录到超过等于6次时间 t3 c/ Q: d3 I3 W4 N Y6 t8 w; x
{
, F% Z3 _3 o8 i" T) Y num=1;//计数从1开始
7 R# n) P- h/ s displayOK=1; //测得5次开始显示4 `$ N4 U R% B- b5 b
}
5 q" X' D- ]: \3 ^( e0 p
8 |6 p- F. H1 t3 \. [ }
1 \* N' @2 U; C4 V2 t: _ EX0=1;
4 |3 v# E% V6 g4 [}0 M* E& O& Q) J7 O2 z: S
void et0() interrupt 1
8 `2 c- Y0 N9 ? _& |{
0 O3 W4 q3 {, b5 D TL0=(65536-50650)%256;
% p3 R2 d( u+ E0 o0 C+ x- f TH0=(65536-50650)/256;
) _1 O8 k+ L( y8 ?2 k
9 E5 |" \. q9 V# m( D( e timecount++;//每50ms一次计数
" \5 w7 l, Z" L$ N& t; d6 d if(timecount>25) //当超过25*50ms=1.5s没有检测到信号停止显示
9 e; J4 g7 a! h3 o) } {( D4 e8 _. {. P$ C5 w+ u
num=0;//数据个数清零) @5 ]2 X% G) W2 b, L: @8 h; b* r% Z5 L
5 W; j8 L7 Q6 Q9 v a; C J9 Q# a- b2 F @2 d f2 f" U
…………限于本文篇幅 余下代码请从论坛下载附件…………
1 m9 D* I7 [/ q3 B' ^" Y$ q; V0 W. g, K" i
4 s1 e5 I) c8 { |
|