|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机点滴测速的信号处理设计,含源码,PCB原理图& J- {) h5 ^- Q( C( f
1 V! B2 E. O5 g j# E4 w& x; [* X
' P1 P) e& c1 m0 b* G
点滴检测(数码管)使用说明
/ w9 S" e2 F, u0 k9 K) }8 g$ X, h2 {6 Q6 m
一、通过“设置”按键设置‘检测点滴间隔时间’的设置,设置范围“1-9”秒(通过数码管进行实时显示)。在启动检测的状态下设置,‘检测点滴间隔时间’按新设定的数值进行计时;
* I# Q5 A0 _6 y7 @# T3 d6 c3 D二、通过“启动”按键,切换检测的‘启动’与‘停止’状态(在报警的状态下,按下‘启动’按键,取消报警)。: L5 {0 s% u% Z, l! _
0 R" V9 ]! p" H: V! d. n+ X单片机点滴测速的proteus仿真原理图:2 k4 w; |( c# D6 B. u5 i) E6 M
" I [: ]% `. h' w9 @6 l/ _
5 C/ U, \. [ Z' F4 f G1 g/ y
# X$ S- E$ ~+ c' d# h) t: [点滴检测装置的原理图 用ad画的:: }& w, O% r1 P) O+ P8 V$ a
2 e6 P& }4 w: D" ` ?, i* F! n2 ~' N& p5 m' c
3 r( W# u' C" |: ?4 s6 [点滴测速设计的pcb图,用ad画的) `* }+ E: b( X3 K! [" I6 A6 r- `- S
) E9 e! t# v1 w9 }) Z+ O& j2 V
* u6 C' W6 S7 {+ _' G/ L" @2 {
: J( z9 T; k2 Z# a) ^5 V& ^* L点滴测速设计的单片机源码:1 W0 i% E' {8 Q" {
//功能:通过S1按键设置点滴间隔时间(LED数码管显示) S2启动/关闭点滴检测(关闭警报)
9 Y4 _% A9 e7 X" {2 H! D//晶振:12Mkz 时间:2015-1-6
S1 E' _% ~ ~0 M9 W% O( M+ j#include8 {' W4 o3 G# s R; ?( E, o) \
#include
# @4 u' J) I1 \3 H#define uchar unsigned char # A2 g: y& K Q& Z; ? z
#define uint unsigned int
$ [7 c9 Q8 w: V7 v, @2 ]% J1 x: y$ v" D$ \
) b5 e: L2 S, F/ W+ T$ A1 n2 K2 D
#define RdCommand 0x01 //定义ISP的操作命令
, ?7 O9 G. }2 h8 q* ]6 E8 C1 z) u: g#define PrgCommand 0x02
% a- k: V; P/ t( L8 B6 d#define EraseCommand 0x03
^# A8 @- L k- ?, Y; z5 i#define Error 14 c+ m. {% P9 Z$ S- s
#define Ok 02 A N$ @6 C7 K5 {$ ? `
#define WaitTime 0x01 //定义CPU的等待时间
$ e$ U( o3 G! K: B: Y, [sfr ISP_DATA=0xe2; //寄存器申明
6 F b5 N' }% B# Vsfr ISP_ADDRH=0xe3;
; ^/ M9 d, X$ l8 S' Osfr ISP_ADDRL=0xe4;* u2 ^" `) {1 q6 @9 F
sfr ISP_CMD=0xe5;2 g7 t: ^, A6 U2 M; }
sfr ISP_TRIG=0xe6;
' v+ j, g- u" n* `5 ? j0 Msfr ISP_CONTR=0xe7;( n) @0 \& u& F2 L6 y
8 c; y& |1 I6 ^7 L% a# v2 a% hsbit led_1=P0^0; //绿色指示灯
) f8 Q5 D: Y$ f4 c9 W5 x2 msbit led_2=P0^1; //红色指示灯& l/ D: D, b; t) u) U% f
sbit key_1=P3^6; //设置按键
1 L4 R1 w- R' ^sbit key_2=P3^7; //启动检测按键
! M1 h8 k6 P, dsbit beep=P1^2; //蜂鸣器% `, k2 w9 S( I: Q3 z+ Q
( X U$ |8 x( Juchar TIME,ms,tes_t,k;/ i- [+ `) K5 E* Z6 y
bit state,deteOK,beep1; //标志位$ f2 H. e/ n9 q* e/ P
4 V4 z9 t3 ?0 v' O: W* j/ d& O2 ~, @
uchar code seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};; D6 O p/ H3 A8 M( Y! @
/ o5 H+ f1 [+ h
. ?5 g6 _) [8 B" E" S4 u1 T/* ================ 打开 ISP,IAP 功能 ================= */8 {' m3 T% W' c
void ISP_IAP_enable(void)
, |+ L6 l8 i; H3 ~{
4 R9 X4 L) t* A4 v& }8 H EA = 0; /* 关中断 */# ?( s9 K9 s5 l1 T5 W( m6 {; A N
ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */+ ?7 n0 E* X# M. z- K, @
ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */
2 [2 K$ E! T5 L; N% \1 l A1 h) q5 H, Q ISP_CONTR = ISP_CONTR | 0x80; /* ISPEN=1 */! X. r8 V4 s' a5 Q. Z4 l# j
}
7 n( \* [# W3 w/* =============== 关闭 ISP,IAP 功能 ================== */* z4 Y# ~ c% M0 W" ]6 c) @' a
void ISP_IAP_disable(void)
9 i- ]8 N, t1 N2 f. A% P2 `{- K) m+ {7 [9 `( ?6 D9 [
ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */3 H: {4 q0 h; N% G
ISP_TRIG = 0x00;. H0 z5 R4 l8 e3 T0 X: g" @
EA = 1; /* 开中断 */6 }3 ?) z3 w' ]
}
u X& m$ `, w2 m( E3 o/* ================ 公用的触发代码 ==================== */# [0 L5 {1 C; P0 A& D7 E) _
void ISPgoon(void). g* H9 G/ x8 A$ A6 e
{
7 |+ J; h3 ^0 j ISP_IAP_enable(); /* 打开 ISP,IAP 功能 */
3 T% O9 `) a) _4 [# M ISP_TRIG = 0x46; /* 触发ISP_IAP命令字节1 */
: X, f- B0 O$ Q0 u/ o ISP_TRIG = 0xb9; /* 触发ISP_IAP命令字节2 */2 f8 k/ i; [. C, w4 M8 {- ?' p
_nop_();+ L* W3 q ]6 o" M0 ^4 a: y1 M
}% Q! b5 X# K, r9 w7 q, H) q
/* ==================== 字节读 ======================== */# d4 h+ G4 T7 t! O2 c
unsigned char byte_read(unsigned int byte_addr)
$ g0 f0 P$ }3 p ^: u9 S3 |{
4 S% ~) r6 ~) A$ S9 Y; d( q7 H* S- A ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址赋值 */: X) \# ]& o7 H, J
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
& n1 P, U" l9 N% V8 g* ~$ O v0 a* e ISP_CMD = ISP_CMD & 0xf8; /* 清除低3位 */2 e3 B1 ?& {8 _
ISP_CMD = ISP_CMD | RdCommand; /* 写入读命令 *// R- ?$ I4 o+ S% h1 ?
ISPgoon(); /* 触发执行 */
" E! c" d; \: ?" D- ]5 g ISP_IAP_disable(); /* 关闭ISP,IAP功能 */
3 Z1 ~# F" U3 A3 c return (ISP_DATA); /* 返回读到的数据 */2 y2 P3 M4 U' l+ A0 i
}
7 d; p1 f5 [$ n1 P/* ================== 扇区擦除 ======================== */, t0 _2 h& f( p6 w1 L% o: e! y0 D/ a
void SectorErase(unsigned int sector_addr)8 B6 f8 i9 \5 o9 y+ C5 X
{
* i1 g2 o4 p( \8 s) V! q unsigned int iSectorAddr;8 t. M! [0 R* Q
iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */
: t8 o- l; [8 Q$ A; l3 A ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);6 J9 \* C% M- s h
ISP_ADDRL = 0x00;; e6 H! ?6 ?$ I/ R
ISP_CMD = ISP_CMD & 0xf8; /* 清空低3位 */
. V$ `9 p( e, h# v ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3 */1 }# }# {7 l" b0 v2 S
ISPgoon(); /* 触发执行 */
3 z* U9 B2 K U I ISP_IAP_disable(); /* 关闭ISP,IAP功能 */
" L _# s' g( j; i5 V! A8 v) Z+ @}! \# ~# P' o6 o i3 c+ M4 [
/* ==================== 字节写 ======================== */
$ c2 G' ]- D% ~void byte_write(unsigned int byte_addr, unsigned char original_data)2 Z$ D! O1 [& i
{
`4 S% N; k9 R8 b( h5 ]" e" N7 r/ d ISP_ADDRH = (unsigned char)(byte_addr >> 8); /* 取地址 */
: f% \! D$ j6 r9 t& z, T ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); d# O0 T' Z, y2 y( o2 W3 @
ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */
$ n% N& b5 h4 D) ^2 f9 Z' K# n ISP_CMD = ISP_CMD | PrgCommand; /* 写命令2 */* `- S: b* H- p& I
ISP_DATA = original_data; /* 写入数据准备 */2 ?; Z6 o& Q$ K
ISPgoon(); /* 触发执行 */
% _- @6 n6 U# x& G+ u ISP_IAP_disable(); /* 关闭IAP功能 */3 s- @; C. u8 ~/ c
}6 P! U }1 U! H
3 B) g U5 V' H% }8 I9 m Q ^5 I N) O
# s% q$ `6 |, a' Lvoid delay(uint T) //延时子程序 $ N1 C' Z8 ^' G0 ^
{" X: h( l1 @; i
while(T--);* I9 j! G0 o; }' o! @4 ?, e/ V
} {; |3 ]% n) l8 l( P4 [1 k
4 ^! w w/ F2 m( V' H8 bvoid key() //按键处理程序
) S% ]9 [! f7 u9 h% H{8 p! E% d. J9 y2 S+ m; R$ ~( `
if (key_1==0)& ^/ ~- j* y8 w# U6 C# X
{
; N6 Y; H6 }. |+ f. F1 o delay(1000);
$ s$ o* L0 S) ^5 S7 k, g+ z$ x+ c if (key_1==0); b4 D7 Y5 O D3 i8 a+ \' O" c
{
, p7 n1 J/ `# | while(key_1==0);
3 s4 z5 }' o( _1 c+ \: C4 R& o* W TIME++;
6 _3 {% r' k5 I+ q" J) U7 w if(TIME>9)
9 c# I" f, p/ I! s8 X {
' ?& |( m' z0 v- h TIME=1;5 D2 i* w) c7 B
}, ?. }& n# n# \1 _0 K# b- c
tes_t=TIME; L9 ^. B2 g, A
ms=0;
. `3 N* A+ u9 v9 p6 a0 O- m- {5 i SectorErase(0x2000);
. @1 x4 j. d" M9 M+ [* s8 l' t byte_write(0x2000,TIME);- k7 Z# l8 c* O4 |. _
}
. R2 U+ a2 F, f: x4 K# A }2 a- x! x" \7 E" N
if (key_2==0)% g" ]2 W% x& k8 {
{. O) {! Y8 Y- N( h
delay(1000); {4 O% M/ k7 W& g$ H
if (key_2==0)8 L) a! z- K( k; @: a. _
{! i* I7 ]0 n* a5 _* w6 g& b! x9 \
while(key_2==0);
6 i# m1 s. O# a6 W# z+ [ state=!state;
3 y( G+ e( G0 G6 n% d if (state)3 g! z/ [6 S2 D' q3 ^# j
{
; Q1 U2 ^; ]0 W. o3 ^ ms=0;
! ?6 u0 b% A( N$ d- u: A tes_t=TIME;( e# B2 f/ C# m( z
}else' p% t$ j$ k5 p
{; W; \. \" W" V) G+ F @: t
beep=1;
# N2 m& a6 Q6 | led_1=led_2=1;
3 i$ a1 ]" j6 N4 E9 C! r deteOK=0;
- f, D& x' Q, o }
& r+ J3 ~7 t* @2 j: f } i |! e- S# s5 ?. L2 |1 @8 j! o
}
" |0 `% x8 ?# a- g! e}
' V- a+ n1 s6 D1 J
# v, ?/ T3 o( }6 g( a9 O6 j9 ovoid main()- W8 Z9 N% P' ]" J1 V" ~' \
{, h# v- P6 F! ~0 y
TMOD=0x01; //打开定时器0、外部中断0
& s" c+ e$ o' `0 b" e ?9 C% p TH0=0x3c;
* V3 G# T3 R# p# \1 h, }* ~ TL0=0xb0;
3 N2 I: x" I" w: A! W6 ]+ K ET0=1;9 y+ x2 t; b5 y% V$ L% I4 T
EA=1;
3 }9 ^! O3 P' P0 ^' R- o+ O TR0=1;
- m6 D# W3 R; N9 ^$ l# T IT0=1; //设置下降沿触发方式1 d7 b: N4 y+ @! V9 [+ q7 p
EX0=1;
& i" U. T) Z4 Z/ r# t: f; ^* Z TIME=byte_read(0x2000);+ X: n3 d) f. `
if (TIME==0||TIME>100)TIME=3;
9 A: w) N+ ^& `) k# R while(1)
. p4 e2 c7 S0 B+ e! k+ C {! n5 {! f$ E* z" N P# r$ U
P2=seg[TIME]; // 数码管显示
8 E3 c8 p& A4 n4 D1 d, l# {$ {3 w; w key();
3 ~$ H% i) D; A' \ t6 C0 x if (state). T* {" z; N/ \6 b- I4 ]8 ^
{4 J1 O6 X& m8 g# H3 x* q3 X6 y+ C
if (deteOK)
# K5 R2 i& F& k" W {
@3 z0 a$ y% b& i0 f, o beep1=1;
3 Q: p- V# j; n# C* m led_2=0;8 V. Q8 V" | `7 w7 c0 ?
led_1=1;
4 T3 y0 k8 u8 @9 I }else
7 e% a& l, k( H- x {
% V* y- q& h* s; n0 W" T beep1=0;
' k2 ?! n' p5 S/ n led_1=0;
" ]+ K6 G. a) D led_2=1;0 C! |' ]2 |0 l& [* C
beep=1; 9 q' u$ ^1 x5 r9 F3 s) Q
}2 s$ J$ _& D* T# f# V7 E
}else7 ?( y5 R, E8 L, H, N
{
6 E6 V2 Y6 t% F% S P T beep1=0;. P* r2 Y0 {* Z0 R
beep=1;/ t! _1 E0 Y& i( P
led_1=led_2=1;
^& E# l1 D9 B/ P deteOK=0;
! V1 F0 K3 c6 C- l0 N D8 [ }
o+ k) G _ a }
n, a+ \! x, K! s: N}/ f" ^! g! {6 _5 n1 U/ L
6 _, A9 Q! ^# @
void TIME_ms() interrupt 1 //定时器0 # _! r. h; H# z$ V2 A( D
{
( [) D& l9 J; B2 D& R TH0=0x3c;
% x, k f" T! r* O+ h TL0=0xb0;
' S3 G3 d5 G" _1 Y, v ms++;
& w9 Y" W9 _3 T0 @8 L5 J8 g k++;
; j* R0 _) d) a4 E if(beep1==1&&k%3==0) //蜂鸣器报警处理' E; d& F, E( U. a, @
{
+ _5 y6 W! \, D% ^$ r# m8 \& x# r beep=!beep;7 P6 ~5 T/ v* {
if(k>19)k=0;
# n& X( U( i5 _ }
, ~0 q0 ~4 T# ]; p9 K t" _( v if(ms==20) //1S定时
9 n9 J( F4 ]$ l T H2 ]5 \9 y {9 [. O- ~! m/ C5 u* B1 u
ms=0;9 R2 P7 g& v G& q
if (state) //启动点滴计时
% K5 ?7 \ V1 O, |( k {/ A6 ` J4 Y5 z1 s, Z! P0 b
tes_t--;' k; Q. ~) Q* S$ S/ J# \# r
if (tes_t==0)! d. J6 D2 \3 o1 b0 k8 B
{. u( `6 Q7 V n* | D, M4 u4 q
deteOK=1; //超出计时时间
- u b- H; W- |: m5 @! d0 g& X. b }; g9 G# C) w! `% v' i) H: |
}
# a( u# p3 L- ~ }! b6 X4 [' n5 U; ?2 s# {) X
}' N/ N f; a1 Y8 ~ C+ B/ r8 z
) W, g3 { H2 |& U4 j
void dete() interrupt 01 v( h6 _1 x. k& q
{5 P( Y q8 l; Q
if (state==1) //点滴检测
2 `! g! `8 }7 H3 m" x$ R {
' U6 h9 \* G7 X8 n tes_t=TIME;" H$ p R6 h0 f3 g% ~
ms=0;
$ W' z; `0 ?1 ?$ F, D }
( p! u2 A, t$ d& G! s}
+ Q6 P" a, m3 u7 l
/ U+ S3 ?& o4 V( q$ w4 ~( F点滴测速设计的所有资料下载:- I. e/ s% G' t
$ l5 G4 u8 \1 S* }# {9 [
' q0 D9 Z- O. W- L3 B. Z |
|