|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机点滴测速的信号处理设计,含源码,PCB原理图* V' [) x4 G9 ]( T
' ~& W* h0 r5 C' O5 T# o. {
- ~# k$ p$ r% P# N F- x: O点滴检测(数码管)使用说明+ B+ p: ^& V( j6 I" H
4 E+ k' D1 Z% }* w1 J2 e
一、通过“设置”按键设置‘检测点滴间隔时间’的设置,设置范围“1-9”秒(通过数码管进行实时显示)。在启动检测的状态下设置,‘检测点滴间隔时间’按新设定的数值进行计时;
) ?) D! X0 Y# q/ g t二、通过“启动”按键,切换检测的‘启动’与‘停止’状态(在报警的状态下,按下‘启动’按键,取消报警)。
' `9 u4 |" x" {: h7 @$ G1 t
) p' l; C$ z0 ~- S; T& k单片机点滴测速的proteus仿真原理图:
9 u0 Y J, Z' | e9 F
$ e8 f- h. N* x3 v1 |- A6 ?
7 j# i2 @! S7 p% U
) a% ~, E( p: }3 G: E点滴检测装置的原理图 用ad画的:3 t& `* O3 \; W3 G0 m( [5 m9 v* r
: K' I7 z) E$ g
" s0 `% J+ Q, O6 e! S& D7 w; F2 U) Z1 p! }+ y, j
点滴测速设计的pcb图,用ad画的
9 x$ H1 i. H; k' m
8 m4 _2 r0 u- e( y/ r0 X/ t! J z' w5 t0 e- A
6 w ~; K X/ R" |; f1 B5 L" }
点滴测速设计的单片机源码:1 J4 d7 o6 a' U. y( v) K
//功能:通过S1按键设置点滴间隔时间(LED数码管显示) S2启动/关闭点滴检测(关闭警报)
h% z4 h) j! D( [1 a8 E//晶振:12Mkz 时间:2015-1-6' g$ _+ M5 P# ^7 O0 ?
#include2 M, H: G5 D; D K& l( V. t
#include3 t' h; Y% s2 F# f
#define uchar unsigned char # B9 J4 \% F5 ~" L# ]/ F! @2 T6 v
#define uint unsigned int " F! e0 ~ }" `* v! J
5 W8 q" Q& t/ B, [9 |8 O
/ {% O5 n, Y3 d! w) N# B#define RdCommand 0x01 //定义ISP的操作命令, m& K2 w1 O* z5 V6 p" A& I+ M
#define PrgCommand 0x02
; v8 |0 O B# Y' Z# ]1 ^% P#define EraseCommand 0x03 # B0 g+ g% e# J& j9 U$ }
#define Error 1. J. l6 j6 j' e, }: W
#define Ok 07 X- a: u+ B% t# U" R
#define WaitTime 0x01 //定义CPU的等待时间% M# U: u2 W: m0 }3 q5 I6 E0 f, s3 i7 c
sfr ISP_DATA=0xe2; //寄存器申明$ h3 N- g# m* e: z1 H% L
sfr ISP_ADDRH=0xe3;
D4 z b( x4 ]$ P4 V! H+ W1 esfr ISP_ADDRL=0xe4;% e" d. W$ s0 U% N% \5 b& j# U6 m
sfr ISP_CMD=0xe5;
& t0 Z, C/ S2 x" B1 fsfr ISP_TRIG=0xe6;$ k( F/ S6 } `. {
sfr ISP_CONTR=0xe7;
z5 q9 b2 S5 W8 E. y
6 ^# b5 P4 H" msbit led_1=P0^0; //绿色指示灯
( X9 ~. j. V: \) G4 i* b/ o; lsbit led_2=P0^1; //红色指示灯
8 p3 E, Q% n' [" H! j. bsbit key_1=P3^6; //设置按键
; o5 _1 y, i7 c$ t, O; f" q1 hsbit key_2=P3^7; //启动检测按键
% S5 H9 M# `3 y6 ]& Msbit beep=P1^2; //蜂鸣器
% S* j" |# a- Q& L( f' m3 v5 |4 o2 n# P! B- t" q
uchar TIME,ms,tes_t,k;
& _7 X8 k* Z# y7 lbit state,deteOK,beep1; //标志位3 r _* f' _1 O5 [
' ^- v9 k: P; n& ^+ h
uchar code seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};6 n- E: ?) D- T. Q) D& Z
q+ Z9 ?2 j2 z: H$ D4 Q
/ u7 e6 E/ u1 N5 ?, a/* ================ 打开 ISP,IAP 功能 ================= */ f' H, E" V% p2 d1 h* P7 }3 J
void ISP_IAP_enable(void)% ^* i0 ]9 V6 k" L' ^9 h9 ^
{+ Q, Y P3 }& w/ c+ N4 \
EA = 0; /* 关中断 */5 {& `; {* z/ Q. u3 [4 U9 x. L
ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */# x- ^! m: Z9 j
ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */* Z" S$ B8 m- r
ISP_CONTR = ISP_CONTR | 0x80; /* ISPEN=1 */
" M- y# |% r4 E+ A+ [}
! N2 Q o2 {! ~. W1 d/ @" `2 R% w/* =============== 关闭 ISP,IAP 功能 ================== */1 r* a. _' {% E! ~" u, i
void ISP_IAP_disable(void); y. i; z. R% B1 _6 r" A
{ [* V9 s- c9 i( ]8 m
ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */' W( H; w4 K, b+ P0 S# m2 N; T. H3 t
ISP_TRIG = 0x00;
7 ?( E* @( y: H0 {& n+ r EA = 1; /* 开中断 */
, q' N8 ?8 v. w}) \9 r1 d7 C9 N% ], }! h; q) @
/* ================ 公用的触发代码 ==================== */
3 X: w- M6 a) K2 u- bvoid ISPgoon(void)8 w+ o9 ?9 A* ?! m
{( X: `& X, w3 u
ISP_IAP_enable(); /* 打开 ISP,IAP 功能 */
P- l& b \" V9 b% N. w ISP_TRIG = 0x46; /* 触发ISP_IAP命令字节1 */7 v2 D% }! S. L! d" i* I5 I4 a
ISP_TRIG = 0xb9; /* 触发ISP_IAP命令字节2 */2 @6 I9 [ o. v( e
_nop_();7 G2 E& f7 C/ J% T* G
}
8 o* ~$ T7 r8 K) k/* ==================== 字节读 ======================== */
6 B$ k" h1 \( _unsigned char byte_read(unsigned int byte_addr)- m, ~4 j- @$ c4 _7 A
{
" v1 E9 a/ R' C/ ] ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址赋值 */( G, w/ l7 _- C# ^7 z" b
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);7 T) @; j5 ?3 f* B, Z- m% U' G
ISP_CMD = ISP_CMD & 0xf8; /* 清除低3位 */
/ K$ I! ?8 z& _( ^6 c# Z ISP_CMD = ISP_CMD | RdCommand; /* 写入读命令 */% g: d8 t0 F: }
ISPgoon(); /* 触发执行 */
8 @4 E- R$ D+ Q4 e& p. Z ISP_IAP_disable(); /* 关闭ISP,IAP功能 */
# c% E) w8 |5 z+ r3 r) C return (ISP_DATA); /* 返回读到的数据 */
4 t$ ~9 w* ~) G& G2 T S( @6 H}
/ y2 x q" ^6 C# v5 a( _8 A! F) A5 p4 K# A/* ================== 扇区擦除 ======================== */$ k! @8 L% m* G6 m
void SectorErase(unsigned int sector_addr)0 x# F8 |: |2 }# @
{
+ M! d5 O; r* O! D unsigned int iSectorAddr;
* O T3 p3 d9 @! g# z, W iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */
6 d) n# ^& j, m ^ ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
% E" V1 n; @. I2 q ISP_ADDRL = 0x00;, }5 d' F& k0 Q2 o7 U1 r
ISP_CMD = ISP_CMD & 0xf8; /* 清空低3位 */% T6 e- @- k8 B( ^; F3 q
ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3 */7 s3 {0 a& }5 x
ISPgoon(); /* 触发执行 */
( b" \6 J: u( ~* \) Y& B9 k' J ISP_IAP_disable(); /* 关闭ISP,IAP功能 */8 {' D4 N; C5 e* ]1 ]
}
, o6 z, o: i; b4 ?- x$ r& K/* ==================== 字节写 ======================== */
+ V Z X6 c3 Y R; h9 v: Qvoid byte_write(unsigned int byte_addr, unsigned char original_data)
$ H9 w6 b! f" @9 G z$ V{7 G! J5 j+ |# x) K0 M- N. P, S* \+ n4 n
ISP_ADDRH = (unsigned char)(byte_addr >> 8); /* 取地址 */% [! f. s* _' U
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
4 [4 Z9 j1 e( M8 ~2 \) y" A, T7 j ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */ n) d+ l- }! X
ISP_CMD = ISP_CMD | PrgCommand; /* 写命令2 */6 ?7 V% b& E# C9 X" g" w
ISP_DATA = original_data; /* 写入数据准备 */
. t& q" h! F ]; K: E% a ISPgoon(); /* 触发执行 */1 g3 `" \& k3 B1 G% R. O
ISP_IAP_disable(); /* 关闭IAP功能 */
0 u, D! h1 Z# o; B' b3 y3 D0 N}* F& u6 H) x6 K0 `) x
$ u6 Z9 f* X9 |# E4 F [7 n( `7 \* O+ _" X" e$ R4 T1 v
void delay(uint T) //延时子程序
/ @" S3 K8 X1 e& x' V{
- R: M( p3 b6 D; [, t while(T--);
6 Z4 R$ I- f1 i' V; H! `7 C! n0 x}8 Q, X: g( H! T6 P
; {/ g* R8 k% {& g2 Z O F
void key() //按键处理程序( y! i ?4 v+ h4 Q
{
6 g& `: ?7 t7 Y) I1 y! R6 u if (key_1==0)
7 Y' L% V2 W5 N* a, C6 _ {: k5 j- q2 Y% z3 J
delay(1000);! g! ?) v9 ]# k9 |7 x7 a( p* x [
if (key_1==0); w0 w7 a* B# `5 C, ^) p
{
0 M) ~/ F5 _4 d; J2 ?' ?- s while(key_1==0);
$ t+ T3 u' G7 ?% ^" C# A2 [0 x TIME++;
4 j }# _! R7 D% q- D6 J8 c if(TIME>9)9 ~4 a# B! z+ S( a# |' X; P
{
$ {+ x/ @. Q+ V6 j TIME=1;( X1 }; Y) k4 Z
}, i5 T3 V/ n H( `( z3 x* P
tes_t=TIME;7 k, \& ?: I+ _9 N, a
ms=0;
4 X h9 g; g9 M) v$ K! L2 c SectorErase(0x2000);: c0 `, y% S. ~: J) M7 a& G
byte_write(0x2000,TIME);
! S0 |6 O" H# U6 W' d3 ^# D, C }
% V: W% Y" M+ |$ [$ ~; G% I( G }
! t9 Q6 A% @* W$ o/ J$ R- Q if (key_2==0)+ A+ |1 R: @7 q4 F8 ~4 B' H
{
+ U- C9 R9 {* M' n* [! E0 d' U delay(1000);
8 e; }. @& T* L! w( u% M$ O; \ if (key_2==0)9 z5 }0 p9 _* K- X0 Q- X" X
{3 i5 [4 J- M$ s1 ~7 M: N
while(key_2==0);
3 A+ f$ E4 N O- `! C- Y y7 X" D state=!state;
/ m _( O9 p' d* A7 b- R m; q if (state)
& v1 r% ?3 o6 w% ] {' j( g3 M5 A7 N" U- W$ ]
ms=0;$ G0 J7 I: V% |% A# P
tes_t=TIME;# e; d) k0 z8 ~# ?9 y
}else& O4 X, l% q- g5 |, i' P( ~( V
{& p1 E9 j) }$ b) k7 S2 P
beep=1;' z5 T$ I: Q: q* B) x3 ^* i3 P! B
led_1=led_2=1;( V- D' n4 E1 x; h3 u9 z
deteOK=0;
5 J7 D [ U6 `) r& N }
# { g6 C" X& w' h$ q! k }
! E5 _2 u' D) K* H }# `/ _3 C, ?9 r2 I: C
}
' L% W, m6 x. {- g1 u4 P/ }- V/ \0 M
void main()
$ Q; w$ y! A# z{5 K7 g) ?( p/ g0 f' _$ G; \
TMOD=0x01; //打开定时器0、外部中断0% S7 G5 ~, H" z) t4 a0 D- S
TH0=0x3c;
# S- C9 i5 t8 x* m0 \6 y TL0=0xb0;+ x; f) K4 V( D( w7 v, a
ET0=1;
- J/ n1 R" I7 Y A EA=1;
5 ~) B9 i5 t+ N2 f: i% T+ _ TR0=1;
0 S o9 `! j, V" ^ I) | IT0=1; //设置下降沿触发方式0 M0 U2 L2 H! ~% @, l. `* b
EX0=1;
) [2 Y7 K r' k3 A: T) G TIME=byte_read(0x2000);
3 J- u6 n' D: F$ T if (TIME==0||TIME>100)TIME=3;6 X# J' {8 d% i9 _
while(1)
, d! |1 m3 {7 J* M- c! k- Q( x5 {' o {. j. h" z$ E* }; d
P2=seg[TIME]; // 数码管显示# o! Z. H4 x* Y: ]* f. {7 X
key();
: T3 Y# ^2 z. @ if (state)
4 ?! C, h6 b; f( `+ z9 a {
j) ~ {& s& ?: z0 e1 S& r if (deteOK)1 D2 s8 ~: J2 A
{
- r& `, R: r2 z& R' k* I8 H beep1=1;- B3 V; @7 F* {' _, W+ V% ~2 [
led_2=0;
: C3 ^* T7 }& K led_1=1;; y1 a2 q0 y$ i$ I& V
}else
9 z' R2 j, Y# u: Y: s {
/ Q! p1 x7 b/ G+ f. Q. [4 D beep1=0;" N7 M% I& {! I8 e. |: V
led_1=0;
0 x. b7 g D L" n/ f led_2=1;
6 k) v1 m; Q; d4 ]: L+ `7 A8 v+ ` beep=1; 2 L1 j; Z! ^ [4 z' v
}" a& e8 V- t- I
}else0 G- E6 ?- U, `
{
4 t, c) h0 ~+ p beep1=0;
, V8 N; e3 H+ K+ v beep=1;
$ i9 V4 n) U- [ led_1=led_2=1;3 u* A" I5 _4 \: |5 Q
deteOK=0;
$ v8 U H! z" a. [( e8 D } , f8 U( j8 v4 Y. p; N: }+ Z* I
}8 c3 ^. D: n' s+ J, R
}
0 W" |% V: h/ R* G
: m7 X' A! `5 K0 A/ Kvoid TIME_ms() interrupt 1 //定时器0 ' y5 T$ A# G/ }0 F$ O1 o. f- [
{8 I& ]% L& ]! S- O# @- _. G+ R
TH0=0x3c;
" U: E4 b2 M- i7 k' G TL0=0xb0;& b4 J4 w! X* Q
ms++;. b/ p) _2 {5 m4 V
k++;
5 { c: q8 e% M- I* F" P: |. \% d2 ` if(beep1==1&&k%3==0) //蜂鸣器报警处理
! o* W/ K6 d( Q) S# k {9 n; U& p( t0 _8 H, D+ M
beep=!beep;) S7 l: @4 B3 Y* o
if(k>19)k=0;
( d, d R: t! _, J& W }
& s8 h$ |# b( a% F/ p0 T" w7 e7 S if(ms==20) //1S定时
9 F! p5 U; A: i C9 @" T3 A7 w, N5 R5 { {
& U# G3 K8 R8 w R% l% F% Z5 W ms=0;
3 I$ f; v7 d# O8 R" y if (state) //启动点滴计时0 Z3 o L9 V+ X' B0 h' p- a
{
" ~) ]; e' D) K' C$ L2 I/ j7 u tes_t--;
# N7 W3 E9 w2 n' Z# C2 r if (tes_t==0): {6 V. {3 r" h% n/ d5 V
{
# T! S0 U5 {; B: l deteOK=1; //超出计时时间: x w) @4 e1 r2 \4 |* Y$ i. Y
}
7 D( `3 L# b( \& c% e }
5 G* J: T$ N y* ?( q }
# Z, z& [) @" Q/ u& _; x}( }* q2 b* T$ Y$ W
5 ^3 f$ @5 L3 V* @( F6 C" _
void dete() interrupt 03 z, a, ^: a* D: N1 @+ _) s
{
* H2 z2 U- O0 D, b/ e if (state==1) //点滴检测
- g& O) j& a8 q: m9 f1 r5 j$ _/ z {! h5 h* z* i; x1 |
tes_t=TIME;
* M. ?2 f9 \0 _# m, u+ ~ ms=0;+ Q3 @$ E6 |: ^1 F
}# K( ?2 o. f. F0 m
}$ k0 L/ E c* h5 |+ S! P
6 o/ _$ d) N* e# Y: F' \
点滴测速设计的所有资料下载:
2 r" T. d0 S* d. R3 O4 M
( I! Q% Y2 ^" A2 [# g4 k
$ @: y+ w$ M/ @6 ~' m |
|