|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机脉搏测量仪仪仿真加程序( x+ y0 |2 K6 ^) m
* \/ \) S' ]( c6 B( e8 n: v
/ ~, ?& J; v! \& p0 }4 R51单片机座的脉搏测量仪proteus仿真加程序分享,带工程文件 K! P1 W! ^7 G8 y: a2 _+ |
6 a1 Q7 c2 m8 J. b仿真原理图:
" @5 @& g. f( D" P2 c 1 [* ^; }- v$ J$ x9 m0 Z
4 D3 p n6 j* J0 N& V8 W
$ X3 u- t- ]0 S3 K+ E0 d源程序:
; C' c' P& S/ a: ]' N( I* F3 \/ W/ Q" {- ?
$ j$ E. U) p0 J& K c: I) |. P; |! b
7 w% k# i' [8 C" n O
! b* p" h/ A5 |#include <reg51.h>
+ O0 c5 | z: c. L" Dunsigned char i,j,t,m,DelayTime,DispBuf[3];6 S- M$ S1 g9 z ?
//单片机脉搏测量仪源程序0 G. I/ M7 X5 p+ I, R
//作者:吴汉清 ntwhq@tom.com9 ]7 \& t; _( u* l
unsigned int n,mb;4 P. Y D1 W/ V: J" Y; A: R- W
unsigned char code6 u) U7 _- ?0 I5 o6 y6 p
BitTab[3]={0xf7,0xef,0xdf};//位驱动码+ E# E) m7 T; j! u0 s! N) ?
unsigned char code! D9 y" c' J, C3 t: F. g3 v) z
DispTab[10]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84};//字形码
8 I6 j0 [& q1 a1 W" s! Bsbit P3_0=P3^0;
- _( O5 s2 R0 ~6 T9 avoid delay(DelayTime);
; W" h1 N6 u. w* _! t( smain() //主程序
& z" I) h* s1 e8 p3 N! r/ z{
% K& l: N5 q( @" e TMOD=0x01; //定时器T0工作于方式1. X7 m/ C+ H; l, ~ A3 L
TH0=0xec;
$ A3 @. h. b$ G TL0=0x78; //T0定时时间为5ms
7 Y; `) t- M* _# o IE=0X83; //开中断; \% v( h" \7 P+ m6 Y
IT0=1; //外部中断0为边沿触发方式 ] j7 v! Q( g7 i# }. i7 F: K
TR0=1; //开定时器T0$ }, q4 f" `/ t+ r& V g
for(;;) //脉搏指示灯控制+ G1 e1 n# e/ l3 w- e
{
: S" u$ z9 X- O0 b& A- } if(P3_0==0)
6 n% ^+ L: ^# Z* t1 j% J1 E {7 C/ y# J% p, k7 T6 U2 A! V
delay(200);
/ _1 }4 i+ _2 E/ p/ P2 k P3_0=1;
- X- d4 k, Z1 m }' X7 N V5 d* X# A: P4 H! S# y
}
! E2 d n6 @/ F' o" n}9 ~# ~; D8 @" r( B9 }
external0() interrupt 0//外部中断服务程序
+ Q* x* A2 [2 h9 B1 k{3 I Z5 |- ?, X2 Y
P3_0=0; //点亮指示灯. s% T$ U! D! O
if(n==0)
" J" a9 H9 F6 f. a- l mb=0;
9 O6 ?7 R9 q) y7 _& I& ? else$ k9 D2 Q1 {' X3 P6 b% h
mb=12000/n; //计算每分钟脉搏数: o" F% a& F- ?4 p2 \
DispBuf[2]=mb%10;//取个位数
$ o9 s p& j1 X- v( ^ mb=mb/10;+ U+ k+ r3 S, i E& e
DispBuf[1]=mb%10;//取十位数0 `: X% ?2 w4 Y) g, H
DispBuf[0]=mb/10;//取百位数- ]* u" n/ I2 V) i8 _1 z
n=0;& @( i' s7 _8 a% d) _- l
}
( @) ~) O1 ?7 e4 f+ Z/ l' ^8 }Timer0() interrupt 1//定时中断服务程序
$ N* z( [7 Q2 M( L: D H* @3 Y) w{ * Q6 |# f, f+ _; |. A: [0 e
TH0=0xec;
/ b4 H# d2 P/ a3 `- w4 M; U, `' L TL0=0x78;
2 S6 f5 c4 K1 S8 E" M t=BitTab[j];//取位值9 f! R/ V% b9 z1 S1 w* {7 A" M
P3=P3|0x38;//P3.3-P3.5送1 ~, U% b3 _2 g. ^- K" e" K+ m
P3=P3&t; //P3.3-P3.5输出取出的位值
4 e3 A. H# x, q E3 ^ t=DispBuf[j];//取出待显示的数5 d# Z u( y. ~6 u2 y" r+ W
t=DispTab[t];//取字形码) Z. _# R& _' e/ j: @: Q3 ?
P1=t; //字型码由P3输出显示. ^4 N0 I3 ?9 N; A4 t! S( h
j++; //j作为数码管的计数器,取值0-2,显示程序通过它确认显示哪个数码管" P4 d+ M+ o% L' A, P
if(j==3), Z0 S/ T: D" {# ?4 O8 L
j=0;
# Z8 O( x$ o5 [1 r5 X" A6 k2 M$ C' v! A; g n++;3 l B, ^* f; d3 G7 U4 `. y9 l
if(n==2000)//10秒钟测不到心率,n复位
1 e% C# ]% {% Z) e n=0;4 w& w1 U2 ~; |" _. \ ?
}
$ ~/ J' M# r, f- i1 B9 @$ \" U( S3 d9 U$ Evoid delay(DelayTime)//延时子程序
* U: X! K, o% e1 ~: z/ A{! R! K+ a: d+ S- r& g% x. H, x- o9 d
for(;DelayTime>0;DelayTime--)
1 z( K$ N2 e5 Z8 e: | {
1 B7 |& |/ Y ]" U for(i=0;i<250;i++)
, w. y5 `7 z. b7 z( u ;
I) i) s" j$ g* H6 a9 ] }+ O% h5 p s8 u/ ]# S
}
, I3 w3 e# }# d# I$ i' i0 B: O
1 i* e9 x' o1 I1 N" T5 |- C3 w |
|