|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机数字频率计仿真设计0~9000hz 数码管显示 带源码
" L+ z8 `" T7 u( b5 P& b9 R! V8 h( L G; a
( T1 q$ B& A( [: A- v6 `今天给论坛的朋友们分享一个51单片机做的数字频率计,用数码管显示,有详细的程序代码.1 t# A I E3 ]2 u2 X) t
仿真原理图如下:
. t# l/ g6 s( U1 T) w- |/ T
* U* T% y5 i& I" p6 W1 R% c
, L9 g) l! G: B- |+ K+ `
3 {: r. P( R$ V$ |" O1 H0 l
部分单片机源码预览:
3 m, }+ o! e( B' c! _* LfreCountMain.c文件:
- Q+ Y, ?9 e' U, L/*************************************************************************+ d! e+ _* [. m8 Z# U6 V) t
*实例名称:频率计1 z6 b* i* d$ P
*实例说明:实现0~9000hz频率计的统计
2 x* Q0 v& z' r: i5 p*作者:yd* e5 e9 @' U: G5 L) o1 j
*时间:09.06.20' f( h3 I) H8 x# i% q" u
*************************************************************************// t" n9 W& B" j7 {9 Y9 Z" b
#include "target.h"; f3 n$ @/ s+ S+ }. N
#include "led.h"
1 J4 U8 O8 n+ S9 y) ^& u+ Kuchar displayBuff[4]={'0','0','0','0'}; //数码管显示缓冲区,千,百,十,个
; d8 V( C' c7 k! E) X3 |const uchar displayMode=0x00; //后四位分别对应缓冲区中每位的数据类型,1为任意字符显示,0为数字显示
, m- |& m( @- K3 _) gvoid main()
% C0 X3 u H: ~{5 q) N3 k& i: E- C) E6 j
uint get_fre;% ~0 S( |9 k' i4 [
target_init();' G% X" q6 V" o
init_led();) r& L" M* n+ L1 q' m
sei();
- P, L+ d/ _4 p9 O; E7 |; B9 N/ } while(1)
: C) R5 @ i/ L2 M {
9 p) Q: X- q9 m' \2 H get_fre=get_fre_number();
' N6 N3 h% f/ ]3 V z4 I2 { if(get_fre/1000<0x0A)' r9 N( y7 t% d( O8 y: |
{3 q( h" b& L, s
displayBuff[0]=get_fre/1000+'0'; //计算频率千位,放在缓冲区第0位
- f% ~% E$ _2 \3 \: o- L- I( L3 Y }, K) @& o' @$ O
displayBuff[1]=(get_fre/100)%10+'0'; //计算频率百位,放在缓冲区第1位. |, H( v. h2 I6 i' Y, {
displayBuff[2]=(get_fre%100)/10+'0'; //计算频率十位,放在缓冲区第2位+ E# p% {9 e8 c- h4 A: S
displayBuff[3]=get_fre%10+'0'; //计算频率个位,放在缓冲区第3位2 P' j; v. Q( L, ?( x9 d \
ledSweepDisplay(displayBuff,displayMode,0x04);//循环显示数码管缓冲区中数据
/ J" C6 @9 N; I. U! O3 X }
3 T: j1 N9 k/ I. p$ U) E1 z0 }4 v a- s, p, }4 o' c
}
+ @. K, y9 {3 e% C0 A8 X& l, B7 Y" y* E( W) o* h4 H) _- k
led.c文件:$ [* S; o4 Y7 {
#define LED_GLOBAL 1
! h8 r$ q- g5 Z: I#include "led.h"
9 s# _+ K, O( i& T( F7 `. G5 t/*******************************************************************************************
4 O0 q$ z# v' }4 Y6 u9 @- @) ~' @* V*函数名称:delay_us(uint us)
' B$ ^, J- m: p G! @4 Q*函数功能:实现微秒级的延时! b- N. Z* e8 M' U3 ?" z2 q+ }9 u
*函数入口:us,延时函数循环后期数
% T+ G( b& R4 L8 f0 ]$ W6 r*函数出口:无
3 ]4 v# |$ Y) }# \, T*******************************************************************************************/9 c" S# d; [' e- y4 v& r
void delay_us(uint us)
' [" ]& l3 A% D{+ m! v8 }/ u: l1 p
uint i; Q0 x1 X& }5 z7 \" B% S( o' k
while(us--): F& n$ a& j$ I- D( n. }
{+ a, t* g. F4 q6 G& I. [0 l6 H
for(i=0;i<100;i++);
" S; A7 U+ y4 _9 Y6 z H' B5 ^! K }
4 s0 ]. |0 c" c}
) K% f" u2 r% w2 r, J& ~4 b/*******************************************************************************************8 }" w! m; N5 O* R' _6 s7 U
*函数名称:led_init(void)7 w1 \* M) F$ A7 E
*函数功能:四位七段数码管显示初始化
# F9 w5 a7 ~! i7 G7 f1 e*函数入口:无
7 M1 W# @5 T' J5 {*函数出口:无
" f/ O! g! | N/ U1 `2 j- Q*******************************************************************************************/: S8 p8 U8 [8 V5 u9 k* p5 j
void init_led(void)
% t- c1 U& _. d4 U{1 i+ C0 q0 a6 V* e; {
LED=segLedCode[0];7 I) g5 h2 L C; c4 E$ t5 ?9 S
LED_CS1=0;' f! q! }. \0 r5 p$ D
LED_CS2=0;
6 C; Z# m& W* Q" c7 N LED_CS3=0;
! b- X1 \( S$ O8 L. \ X LED_CS4=0;
$ ]2 H, D# c3 T6 _6 R}
( A: F2 t1 V3 p* Y* I/*******************************************************************************************
6 s/ @, | P! w& }$ t+ O( V*函数名称:ledWrite(uchar c,uchar n,uchar mod)) q, U5 d a4 A8 R) U! C
*函数功能:对一组数码管的某一位进行短暂显示
; k' t) T! l( s u& j*函数入口:c,要显示的数据;n,显示一组数码管中的第n位;mod,c的数据形式
8 r* c) a9 j- L& `1 E& ~, A- O*函数出口:无
5 B" z" w2 n2 k! C; S*说明:当mod==DIGITAL时,c为数字0~9的ANCII码形式,此时在n位数码管上显示想用数字( H4 N( Q- @. S# e4 b2 W
当mod==CHARACTER,直接将c输出数据口5 t( U2 m3 C8 ]% L' T
*******************************************************************************************/
+ B7 h& N9 G: s. ?void ledWrite(uchar c,uchar n,uchar mod)
( L8 ?8 i3 _% S. W {. B/ P{
1 f4 p5 e! x: ~& Q! C if(CHARACTER==mod)$ L! J E( I$ B: f F( f$ Y
{+ G, M1 V$ l6 Q) Z5 k" u# U
LED=c; & r' t! j0 r0 F& N/ j& J1 j$ `' S
}8 h$ a+ n% p$ [
else if(DIGITAL==mod)0 }) ~5 q: E5 Q- ~; B
{/ G: Z4 h! H- S* j0 X* I9 e
if((c-'0')<0x0a): a9 P/ l1 } Y- F- u% X
{& k3 |* O& o8 l" \) S% p
LED=segLedCode[c-'0'];$ S9 B# o7 a9 A! X8 g. @
}
% p7 I, V4 h7 X2 M" f, i7 f else* W* o- P6 P( [$ a4 l+ X* F; [: A
{
( ]; g; O* ?- Y8 B) b LED=segLedCode[0];
" [5 f1 N1 O( g7 b8 S1 u }
. p! O2 ^( m' k# ] }
8 X* j ^- @" A- {- {2 D switch(n)1 V) \& U* b. f; D# A6 y5 o
{
( X% T- w6 ]4 J! ^0 W" ^2 s* } case 0x01:/ L, v- s, W, Y& W, p J4 E
{0 t* {" `8 [0 A1 P1 i% ^( O9 h; S1 a$ `
LED_CS1=0;
9 U/ B$ q+ m8 B3 T" X delay_us(10);$ f0 }2 Q3 z! ]# z2 ?( H1 a# T9 Q
LED_CS1=1;
+ E/ _2 h' [! w! Z3 Y7 R# p1 i break;
# D J7 f8 G( [- w# t( _ }
, [5 @; Y$ G1 Z( |! n case 0x02:
9 ?3 V9 }# l7 Y+ l. h) L) t# ^ {
\( e0 C, }, x! w5 b3 n& S$ q LED_CS2=0;% W8 ^0 J3 L/ N- g/ {3 |
delay_us(10);
o# k8 _) a0 U% V. D+ [ LED_CS2=1;
) v" o+ U: @% B break;3 U2 p0 J- j7 ]
}
2 i7 Y( a7 \ _# i3 J/ B# ? case 0x03:7 R- Q% k J% U7 t
{
- i$ _% n/ T. J LED_CS3=0;, T/ N! I2 h/ L9 X2 X, E* A; H. a
delay_us(10);2 \) V& T" u- n: A8 ?
LED_CS3=1;
' x0 n: r) R: t break;7 |1 v" l/ I0 S0 R
}
5 d8 _% M$ |5 h8 s+ L case 0x04:
7 G% C# ]5 o6 v$ P$ o+ n3 F {
1 N, y V$ x5 u5 O LED_CS4=0;+ [7 r. L# u# Y3 R
delay_us(10);' b: i4 a/ G# E; M- v5 n0 U
LED_CS4=1;
3 ]# ^; r: G( {" {7 C8 b break;' Z9 H' V' U; f n
}0 c( y3 b# b! U# d& Z. m0 Z
default:0 z% Q) D$ ~- ?8 v
break;0 U2 Q+ Y; m* o+ k+ E' a
2 T, T) D/ q4 N' j
}
. K" |! G$ V. Y0 F
$ k$ Y8 p, u7 N! j4 ]}5 j. y% A8 [! C" X* \
/*******************************************************************************************
! T1 w$ j, `% Q2 R*函数名称:ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)
7 `0 z. A/ h" b7 |* i*函数功能:循环在数码管上显示缓冲区中的数据
/ d& `# c( O* p ^*函数入口:segCode,指向显示缓冲区中的指针;segCodeMod,0~7位为1或0标示1~8位数码管显示的数据的类型(DIGITAL或者CHARACTER);segNumber,代表要显示数码管的位数# w( M# I% u0 |4 ~$ s
*函数出口:无: M. l* Q8 a0 t' X' J7 B* [4 o, C
*说明:本函数主要实现将显示缓冲区中的数据在数码管上显示出来5 l6 d4 z. }7 H. e4 a$ P
*******************************************************************************************/ 4 ~6 F' B2 X- I, M5 L8 L
void ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)
B8 j5 Z0 k: s{
* f) U/ I2 b1 v& i& f uchar segCount;+ x2 k4 ?$ P2 a! W
for(segCount=0;segCount<segNumber;segCount++)0 W& a/ c5 V+ K8 Y. J" b) G) ^9 L
{
$ ?4 H. R* F* h% j if(segCodeMod&0x01) /*1代表此处显示任意字符 */6 A; D+ S( |2 C% `
{/ Z3 @. I9 p, e& k
ledWrite(segCode[segCount],segCount+1,CHARACTER); 8 @; l% k2 ^1 [" g$ W1 m5 n
}. s! v4 j6 ?/ x! X. X8 d
else
# o( q* y0 T8 O# b$ @' W5 b {! `( N8 B' Z5 H" D$ D, T
ledWrite(segCode[segCount],segCount+1,DIGITAL);: o y5 f1 z0 A2 Y, Y H
}' V k2 w; X8 g, c4 J: A' v* Y
segCodeMod=segCodeMod>>1;
. J: z" z2 T& N P; ], @ }
! m+ t, Q, [$ d# b# R) [}
# V+ @ H* T# T* S+ N: ~5 D& u$ }0 u) ~6 T3 X* t
$ I, @, ], Z. E6 ]
全部资料下载(含仿真工程文件和完整代码):
) C* b+ Z2 \( I! n7 n& Z: Y
! o4 E% p/ B/ v5 {, D/ G" L+ H
* z) v# _* q& y0 u: j" A8 Z- q
7 I I1 B( b+ D) h$ ^+ _5 F4 V, Z |
|