|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的心率脉搏计仿真及源程序
; N/ |3 C( o* \% [$ @7 }) k% O* Y
% j+ O# u @6 T, n9 u
: n7 H7 G2 S- `0 ]6 ]% x, d8 A心率脉搏计的仿真原理图:
/ L: n+ n3 {1 N3 f, V" i# i
" U6 l3 Q% e; Z: y' w3 l) G#include <reg52.h>- |1 R& ?6 N: z1 a0 c
#include "lcd1602.h"
/ m* j o% }" g* y5 z) m2 ]6 C% I6 m8 T8 S% L' r
#define uchar unsigned char 5 r; E/ Y0 u+ M( E( [
#define uint unsigned int
. U' Y5 d; i" r9 r9 h. }- I! v J! ^/ w* Z
unsigned char num=0,timecount=0,displayOK=0,rate=0;4 _& @# V9 n9 [
unsigned int time[6]={0};# a3 K. y" F; H! v7 x
8 b3 e0 ~6 U& {3 `9 N3 ^% S; M/***********************1ms延时函数*****************************/
* F. e$ M+ @6 d* W8 g+ y: _# L, jvoid delay_1ms(uint q)
5 @2 A7 h" v! b* k{
; @: T/ p# _, ?- {& O uint i,j;. v% J5 p/ y0 j( \' |) y4 b
for(i=0;i<q;i++)9 a, |. M3 [/ e/ |: ]% A! T
for(j=0;j<110;j++);( {6 s! b( K: Z& K& c9 R& `
}$ T( w5 m! Z) R+ B4 T) N
; P. z d, A. ?. Y! I
! G7 l9 J, u- d# U+ j; B$ ?void main()
' H$ d. _+ q$ f; _, r{
3 _; m$ P! ^- k8 n init_1602();' G% U# k5 W! F% n, i, A* B
TCON=0x01;//设置外部中断0# M, w m$ J% G% X- j2 _0 j" Y
EX0=1;
( {% O2 x; D @" r: o9 g3 o TMOD=0x01;//定时器0初始化
+ p, _/ {9 R$ I. H2 M4 i3 H TH0=(65536-50650)/256;//实测每50ms中断的定时值8 b& G0 Y. O# u# n
TL0=(65536-50650)%256;
, M! }; N* n! x ET0=1;//开定时器中断) n4 |% H5 r: H u8 B
//显示基本文字. q$ w# T3 ^; D7 g
write_string(1,0," Heart Rate ");3 K/ O) M4 n. e" T+ x/ b; ~9 \
write_string(2,0," /min ");8 l q/ ?! `; h) ?" K! r
TR0=0;//定时器停止
1 b1 o% S0 o2 N9 _# c$ D6 M% f EA=1;//开总中断
6 V5 D* v% w% Q" t" N/ c* K$ _2 p while(1)
5 x( Y% e0 c9 ? {8 Y5 ^2 w: E' @7 G. r7 q6 V5 K/ s
8 i3 `! }% @' q9 g9 M
if(displayOK==1)
9 w) i8 U6 u+ o {
( @0 x- d6 V% ]( c6 e' { rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);
4 ?2 ?" C$ C9 ^9 u6 K3 u) u write_sfm3_18B20(2,5,rate);' H+ R: }7 [. O% H E
/ @$ f/ E1 Q4 O
}
7 _8 G8 S5 e6 G, d/ p else( h& a: r p1 i9 F @$ O& }
{
2 E$ T& Q0 G9 n- { write_string(2,5," ");
3 Y( N; w& ^' R0 H6 e }
6 Y' B7 w# H# g delay_1ms(300);
& g3 m: Y5 B; M" {$ o( [
% F' G9 ] A/ b5 `$ U. c
9 L9 ]4 q1 N6 e/ t3 A5 _7 n d$ s- M } _' ^, j$ L$ U1 ^5 E
}
" e h8 [$ \8 [5 P+ M/ j8 U
+ s: b/ r9 e3 ?$ \ q) Yvoid ex0() interrupt 0
0 d. l4 S9 ~3 Y& q' l- A9 j# R7 u{
t& X v" h: N. p' g1 t0 e EX0=0;//暂时关外部中断( K/ |- r% F; x; V5 P
if(timecount<8) //当连续两次检测时间间隔小于8*50ms=400ms不处理) l2 M5 I8 g+ |. J* G/ I
{6 E9 e3 A. w! n
TR0=1;//开定时器" z( t! S2 v( U5 R
}1 J! e. G( }- ?5 J- b9 m( Q
else
+ m% n; o. J7 M4 W/ D4 g; E; \8 [ {$ Z6 g7 |( D% M/ ]/ U
time[num]=timecount*50+TH0*0.256+TL0/1000;//算出间隔时间
- ~2 _1 w @$ [: i$ a- @7 \0 b( ~ TL0=(65536-50650)%256;//重新设置定时器( \. \; k; Z$ N9 K
TH0=(65536-50650)/256;
: I, T6 I V! ~$ I% X" S timecount=0;//50ms计数清零5 [. [, ^" W. y
num++;
2 R6 w. Y% S I9 q: q if(num==6)//记录到超过等于6次时间& q. P9 W# h8 ]$ y0 G4 O
{
3 }* {, R" K1 X7 s8 y& c4 ^1 U! A num=1;//计数从1开始
+ `6 h/ W6 k8 s, X" h4 u! u displayOK=1; //测得5次开始显示# }! x+ q) S0 ~$ S4 i! @
} ! H8 T4 o( o( E2 C3 z
- Y# D) m# ?, X" F9 }0 v
}. |# v$ d& w3 k+ z0 A+ u& }* ?/ F, T) `
EX0=1;
0 H& X- Z! j" X0 F9 S6 Q0 ^' o' C}
) @0 @( F9 N+ G( x& J* x3 J) Xvoid et0() interrupt 1
" _5 y$ N( s$ I9 L F7 Z- x! J- N{2 S, o" P+ X9 }* P) z; Z
TL0=(65536-50650)%256;+ C. y/ F2 Q3 f1 L) |8 W) U
TH0=(65536-50650)/256;7 l1 J* x @$ _5 r6 e
, `2 t T" ]# t' k9 S timecount++;//每50ms一次计数; A3 ?( b( `' |3 r; m$ q( D
if(timecount>25) //当超过25*50ms=1.5s没有检测到信号停止显示
$ ]7 }: q' e' S) o3 c' l% p {* r8 o, i( J" g; a& t6 O% ^
num=0;//数据个数清零
8 [9 ~+ _6 N* ] r- M
% C7 B" X% o, H! ?$ `
& z u { g" p$ m" a- y…………限于本文篇幅 余下代码请从论坛下载附件…………* Q% u! U5 |/ L& |# S
7 `9 z/ d y2 I" A& @* M% q; {
|
|