|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机脉搏测量仪仪仿真加程序
# j! j" @) B. S8 R" h$ Q& l) I
' C" Z! V: b4 C7 y, Z B3 d" t6 Y) R& O5 m5 p6 d" m- [, A3 R
51单片机座的脉搏测量仪proteus仿真加程序分享,带工程文件1 A# w' K* B, K& n$ f
, o0 `+ w$ X- x. g7 I" m( @1 K/ @
仿真原理图:
0 V6 z9 F! M; b/ n* S
1 C! j* W* y$ \ O ' z3 Y0 e# c/ @1 `9 \
% x+ f2 E: M3 Z* N* Q8 Z源程序:4 d: u6 h9 ~: [6 K- Q1 v* F9 W
4 C+ T) E+ T9 q$ U. [- ?! E0 t
% m" o- n8 ?; Y0 B
' V' y( e% d e+ E3 ^, P) }( U! O$ e) {4 _. K
#include <reg51.h>
# {" U7 E/ }! c' sunsigned char i,j,t,m,DelayTime,DispBuf[3];3 L, D3 W! s" N2 y# q% Q9 |: I
//单片机脉搏测量仪源程序, {, I) n2 _( P& _5 x ~
//作者:吴汉清 ntwhq@tom.com
E/ ]8 D/ `# Q% N" B; Lunsigned int n,mb;" f' R* m9 @0 P. D# s
unsigned char code6 K2 d5 E; \( C/ P
BitTab[3]={0xf7,0xef,0xdf};//位驱动码
2 I/ X/ z' I0 G1 t2 Z+ Ounsigned char code/ s+ ]' N' |: B6 k w
DispTab[10]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84};//字形码
. R4 T4 ?6 Y1 msbit P3_0=P3^0;
. s1 s5 M5 @! K: N {' U* rvoid delay(DelayTime);
2 |" @9 \8 i4 ^' `/ B9 emain() //主程序6 A7 R4 T3 p% j) ]( S( L
{ 6 _+ Y/ n' A! L+ E" C
TMOD=0x01; //定时器T0工作于方式1
. T# M+ g3 `( ]: [, |$ I5 c TH0=0xec;
* X% X3 c! X; q, a7 K TL0=0x78; //T0定时时间为5ms: l4 g Y3 Y1 c+ x: p' b$ l% D
IE=0X83; //开中断) [; I; l$ f, W/ t. M
IT0=1; //外部中断0为边沿触发方式
9 h0 |) ?5 P) w: E: C3 c6 j TR0=1; //开定时器T0& E) q1 ]1 {5 e+ Q V7 h
for(;;) //脉搏指示灯控制
( A; w% T D) o8 [# X+ [ { + G+ i- a+ {6 ~& p+ V, Q
if(P3_0==0)
: |2 s6 I2 E) O {
& g+ _7 K0 o7 y& S' y& Y, F5 S- y delay(200);
/ c. V2 |7 A# R: F3 d P3_0=1;
7 Q# V& ?" Q$ R/ R; [, | }2 t" Y( Y h3 b% W8 W
}4 Q, J6 R" h! b; T3 p5 S' \
}
6 _. L" r/ Z7 O+ A A4 _external0() interrupt 0//外部中断服务程序
3 o/ i0 a4 s3 I* a; B+ g" y{
: a8 a% ]" I! z* k9 S! v* T. j, } P3_0=0; //点亮指示灯% W9 s1 M* \. N
if(n==0)
6 e6 s$ R1 e1 K mb=0;) `$ @, G, ~: k' h
else
* m9 B8 O3 N- V mb=12000/n; //计算每分钟脉搏数
" E3 `4 E, x2 D) E1 w2 s DispBuf[2]=mb%10;//取个位数- m2 ^* V( N! h1 ~
mb=mb/10;! b8 x7 u+ ~' U' g- Q
DispBuf[1]=mb%10;//取十位数0 p8 a' C7 G/ g# X* |0 h: E4 Q! \( _9 W% |, X
DispBuf[0]=mb/10;//取百位数
' I% k" e7 T4 i7 E) v n=0;
/ t/ \# ?7 f0 A- a}6 l0 U" j$ `9 E( u5 n/ U
Timer0() interrupt 1//定时中断服务程序
4 Y. N. ]/ v. x0 J7 m{ 9 y A& M9 }- ~2 N$ o5 z5 N
TH0=0xec;
( t& f' U3 P; P# X5 _ TL0=0x78;; `* N9 r; V+ I* Y
t=BitTab[j];//取位值0 X! o! k5 z; ^5 F5 |: q
P3=P3|0x38;//P3.3-P3.5送1. A4 S8 ]- R9 J; C/ w* B( U8 h
P3=P3&t; //P3.3-P3.5输出取出的位值
, n* a+ M0 J. }5 r. P7 n: q2 D t=DispBuf[j];//取出待显示的数
/ K& {6 S- R; k7 [ t=DispTab[t];//取字形码5 j; C2 ~& @/ O; v9 X( `
P1=t; //字型码由P3输出显示# \# F6 ^ v D3 |( R5 V, M& x
j++; //j作为数码管的计数器,取值0-2,显示程序通过它确认显示哪个数码管
6 h% D) i( s1 y; V if(j==3)( o1 \1 Q# c3 Y/ d. e7 d P
j=0;( p9 y& F. G/ v7 k) V) P# p# Z+ ^
n++;: ]2 R( {, ?& Q& C9 V
if(n==2000)//10秒钟测不到心率,n复位6 b$ I9 H9 R, R6 \& v$ s1 m+ H2 L0 n
n=0;2 _9 E, x: V6 w5 `
}( g8 m& g: b) ?
void delay(DelayTime)//延时子程序+ I c3 D% [1 s/ `; J; G8 G1 g
{
; O$ V" M K; I" | for(;DelayTime>0;DelayTime--)
2 x' p; B! r9 M. t: A9 ` {3 I5 b: k5 Q. y8 j4 s+ |( q8 [
for(i=0;i<250;i++) E" i/ y3 Y2 i; Q
;
- D3 k+ \& ?% l/ X }
5 t/ a/ U! k5 ~. H( E}) _' g# q5 n5 _# I- S) |
3 v6 y! O2 i7 F3 n; V* M9 V* H7 J. s5 {( i2 |8 _3 K
|
|