|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机数字频率计仿真设计0~9000hz 数码管显示 带源码2 y- Y; D8 u; J8 ^& [0 u) i
. b0 s. W( p3 X, M# I* I# N- t3 ^0 c! V- v1 f5 N; E
今天给论坛的朋友们分享一个51单片机做的数字频率计,用数码管显示,有详细的程序代码.- ]/ V. }/ Q1 W' ~1 \
仿真原理图如下:
, v& ]8 f' e. r+ ^. }& a' Q
" j7 ~. J3 l! v
: R$ W s) r% R2 a; G8 H* T, C3 d7 y; a8 `& w% P; t
部分单片机源码预览:# l- U$ r( S6 x- Q$ Y4 K! i
freCountMain.c文件:+ s5 d5 g; {# b: ? L+ E' R
/*************************************************************************/ q: s9 S( S5 o
*实例名称:频率计
* n3 P2 o% [. _. _, G V*实例说明:实现0~9000hz频率计的统计
1 A- m! Z$ |5 ^, J& e*作者:yd( K: G' A' @; o( V& p: r
*时间:09.06.206 L" F: }4 @: T2 S; m" g
*************************************************************************/
; ^% \ T- o1 C; N# s1 X#include "target.h"
* I4 N( T; Y p( C; G* M4 d6 h#include "led.h", w0 B; F( d# l$ S$ Y2 q
uchar displayBuff[4]={'0','0','0','0'}; //数码管显示缓冲区,千,百,十,个
) T3 p6 |$ P( K; ]" z. T Y* d, jconst uchar displayMode=0x00; //后四位分别对应缓冲区中每位的数据类型,1为任意字符显示,0为数字显示
9 V" V# d3 @3 S8 o zvoid main()
% H+ h8 @: t$ N1 k{' i9 l$ [, Q( S- @3 K
uint get_fre;6 ?. r8 u$ \4 A- y3 G
target_init();( R; ]- D. Q ?6 M) w& W
init_led();
6 Z4 i1 m: |, b2 n1 K- H4 `7 U! } sei();
7 O# T2 s2 P' {, f* K! p while(1)
8 }2 |( u2 s* m! i9 S {4 y8 z7 U# B+ W/ H! v3 g2 D# O
get_fre=get_fre_number();; F7 f" M3 K& q" Q q$ i: o; h
if(get_fre/1000<0x0A)
1 k8 B+ T, |# \7 x" o {
0 q- C) t6 m. l4 k: q* P* y displayBuff[0]=get_fre/1000+'0'; //计算频率千位,放在缓冲区第0位
2 M* p5 f' u) a4 n9 j$ e# X- [& } }/ c- y0 q0 l( A& X0 j1 m, w
displayBuff[1]=(get_fre/100)%10+'0'; //计算频率百位,放在缓冲区第1位
) N- Y! A: P- c4 [/ C displayBuff[2]=(get_fre%100)/10+'0'; //计算频率十位,放在缓冲区第2位
A: @: Z# n4 b3 A9 X displayBuff[3]=get_fre%10+'0'; //计算频率个位,放在缓冲区第3位
! x6 t. g) I9 V$ ^ ledSweepDisplay(displayBuff,displayMode,0x04);//循环显示数码管缓冲区中数据5 \; _, P( o! l+ U
}
4 A* ^" i4 ~% [+ C: A: s, e, }3 G; n Z1 e! c
}
& p$ m/ t4 F2 ]4 p1 L
1 t( {9 J9 {! t5 ]8 m+ K. Yled.c文件:# s4 S; o# o7 _
#define LED_GLOBAL 1) `' K* D' m/ E+ _: T' E& R
#include "led.h"% H8 Z; O4 } B( _" W: b5 K
/*******************************************************************************************( Q; p/ q4 t) W
*函数名称:delay_us(uint us)
6 s; y9 e% {3 Z2 }( |/ Q! @4 ], {*函数功能:实现微秒级的延时5 Q. {& y+ _! G. i
*函数入口:us,延时函数循环后期数
6 F7 s* p! S/ f# l: r3 A*函数出口:无
. {; F/ g0 m! p \* S*******************************************************************************************/
5 v0 l/ E( C4 k( [& w% H( Jvoid delay_us(uint us)1 C }& k( b' `5 w
{! x3 V+ R& l4 H: ?" V8 Y/ j
uint i;5 q# J' V$ J! m8 y8 s1 Q K
while(us--)
0 v% p7 S6 H. e, M {% M+ k& b/ r/ X+ ~; F7 I
for(i=0;i<100;i++);9 c* E* \2 M& f/ t5 z
}
6 m2 u2 R' V5 n% j6 Y8 C* s; E}
7 `! H& Y( }* D9 k* Z7 I/*******************************************************************************************
8 S5 r) X% b- _9 f5 e: S*函数名称:led_init(void)
8 l% I3 I8 n4 ^7 o6 H*函数功能:四位七段数码管显示初始化- G* w+ E2 H& w7 {
*函数入口:无
$ `* J9 A& N( N2 T- w4 o*函数出口:无 X$ x# k, [3 C) y& W" V4 t
*******************************************************************************************/
; p1 D6 `. j. m& o( x: hvoid init_led(void)
; @- C5 l1 G: s$ |{
& g; X0 R+ A2 S$ f" p$ d! a LED=segLedCode[0];
1 d3 X7 R9 O( G; Y N y5 V" M LED_CS1=0;
& Z5 v3 N* _4 Y! n$ S/ A0 @! q LED_CS2=0;) x" j5 {; H0 \7 _
LED_CS3=0;7 o0 e- s, B i$ L
LED_CS4=0;- P) Z0 u+ h+ C, \& }, R0 l h
}
# }6 |/ e$ Y4 T; ^" Y) W/*******************************************************************************************
+ p' F. j7 W( h/ A c( H3 \*函数名称:ledWrite(uchar c,uchar n,uchar mod)" ]) Q% R; g" c. n, k$ ?' @" r7 }
*函数功能:对一组数码管的某一位进行短暂显示' Q8 H) F6 Y' U5 F
*函数入口:c,要显示的数据;n,显示一组数码管中的第n位;mod,c的数据形式: @' T7 u/ U9 \2 l( A' ]
*函数出口:无' v0 ` i0 {' C9 O
*说明:当mod==DIGITAL时,c为数字0~9的ANCII码形式,此时在n位数码管上显示想用数字
5 P9 k5 `5 i+ m" Y S/ c 当mod==CHARACTER,直接将c输出数据口: Z! t6 A( z0 U# Y. E
*******************************************************************************************/
! {2 S+ O/ k; v7 i# w/ M7 f! qvoid ledWrite(uchar c,uchar n,uchar mod)
4 j" `; j/ Z. l+ V( ]5 R f5 x- p- M{0 P, e8 D9 t0 b$ m/ |4 M
if(CHARACTER==mod)
! P! }/ |# ~" {) z# q# ? {: Z* X- L) [7 Z! e* o7 W' q
LED=c; 2 B3 o3 u7 ]" f$ X W
}
/ T1 U- }3 Q: x4 y else if(DIGITAL==mod)
& F# R. `/ Z3 m' M# X& o: z {6 h2 ?! I! b l6 z8 X, V
if((c-'0')<0x0a)
. A* H) ^: o1 G, a5 i8 j& D& T3 t; J [ {
+ x+ F# z2 J5 \3 X% a7 @ LED=segLedCode[c-'0'];
) B( m! X) V0 U2 d9 Z9 L } 7 }; t. X/ L' J- o3 A! w6 w
else1 k0 S& U7 {' U( U1 k
{ % k" }1 N( P) `* @
LED=segLedCode[0];
. M; \# ]0 f! m% P+ t' [ }. K5 E" M* F+ F$ i5 q6 R, F
}
3 T1 T& y% C' t* |% w switch(n)' t4 {7 ?2 F4 _- X/ _0 i
{ f" h* o4 [# N5 P/ t+ F
case 0x01:
& f' s2 ^4 ?% W/ Q7 O { `% P3 j* z: v* [, `! j3 |
LED_CS1=0;
- o) u J# t6 X( d: x8 p b- H delay_us(10);2 P$ x) V3 e' m1 }
LED_CS1=1;+ I2 O6 A+ f% B( n; ]
break;
8 {6 e$ Y3 j$ A8 Y }( t* V) x5 R3 c; @
case 0x02:
3 L1 o/ Y- Z1 C4 O {- o! R* v. f4 \) C
LED_CS2=0;6 |( z% s2 X% N- `; R$ G/ Q
delay_us(10);
l) B2 F; i' l* o+ r( Y LED_CS2=1;
9 X" x* o& z% S; x: | break;
' [! t( m% k1 I } G/ q+ f6 C; D- ^. X; t7 s% e% B# n" E
case 0x03:5 Q, a1 ?# n3 ]0 s( O' G
{: f7 g+ s0 o/ n" {6 v( [3 F5 F
LED_CS3=0;4 _- x I; l5 L% ] g" B
delay_us(10);6 k7 J4 I2 g; [
LED_CS3=1;% C+ {/ a! q6 D; ^- j* m% ?2 D' a
break;
+ C( I j1 W9 X! ] }
- }5 s9 D5 _4 k7 Q case 0x04:
! v+ ?$ Y" {& A# G$ Y {
0 q. U0 J# m2 c& Q% L9 i; N LED_CS4=0;
- W4 Y# V+ l, ?& m+ f c delay_us(10);) H! F( d; s+ N# v3 D3 G+ M
LED_CS4=1;
& Q) G& }( S/ \# z break;7 y% Y. j% y' \; n! I6 ?
}$ r! _1 I1 o( S" z" ^8 V
default:8 y; u2 G* m o9 s9 q) g' h, T+ f9 X
break;. r. ?* e; b0 S7 F
V' K0 h" [ n; _# ]& _
}
; ]' W0 P: }8 s" U8 \1 ?- {9 y/ v, @& S8 q1 d& e6 `# \' d4 p5 d
}
: s9 M: h# C8 B& d; J# Y7 J/*******************************************************************************************8 i- }# Y/ a! j* _, u+ j. K3 p
*函数名称:ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)
& w7 m3 V; ~; ?& B: t" y*函数功能:循环在数码管上显示缓冲区中的数据
, p1 `; ]* K* B& }8 l! c; Y a*函数入口:segCode,指向显示缓冲区中的指针;segCodeMod,0~7位为1或0标示1~8位数码管显示的数据的类型(DIGITAL或者CHARACTER);segNumber,代表要显示数码管的位数
5 ?$ A8 I) E0 S( w+ H) Y5 O6 e*函数出口:无( b$ o! [% l5 @; U# s& R, a
*说明:本函数主要实现将显示缓冲区中的数据在数码管上显示出来
" J5 t) ]9 ]( k% C*******************************************************************************************/
# U, Z6 o \6 Y( m7 Nvoid ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)& J* n1 q% _" r0 O
{
- W5 f7 t# p& e- k% J uchar segCount;7 B- W8 c+ ?4 d
for(segCount=0;segCount<segNumber;segCount++)
$ T) U% f& ? e* ]7 S: M {
' Y" ~! D" E( D1 ^) }6 i" V) h if(segCodeMod&0x01) /*1代表此处显示任意字符 */
) |& `% z8 n3 k1 ^7 i {: h! k8 R! {3 V4 t( I4 w
ledWrite(segCode[segCount],segCount+1,CHARACTER); # q1 U8 z& } _, s% d+ f) K5 }
}
4 ~+ c4 @! R. N& i" s; ^. J else6 U' W, K5 J" I2 d
{4 U2 L9 F& W+ B& Q% Q
ledWrite(segCode[segCount],segCount+1,DIGITAL);
8 `7 g5 {+ U. C. t1 O4 c# n }
7 U( d& j% v2 q. f6 m5 c4 H. o! ` segCodeMod=segCodeMod>>1;; Z& E9 l7 ]0 g) k" w: g
}
/ q0 j8 W' ?- t. x}
. z. j7 @2 n# J: B3 A. l# j+ t4 V) o7 H( X1 g! r
: F9 ?; N3 Z- a全部资料下载(含仿真工程文件和完整代码):) r, t7 \: X( S' [5 Y+ U
$ h4 ~) o7 d5 G. Y+ g
/ J" K/ C7 g; Y' m) y; x9 }9 R
9 F. A: I6 i4 B8 t* t- U |
|