|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机数字频率计仿真设计0~9000hz 数码管显示 带源码2 o. E' I# B8 s% U9 ~3 [1 M/ P
- B' } Q" Z, \2 \- l9 E
9 X# M5 q9 M- L9 y- ]& |今天给论坛的朋友们分享一个51单片机做的数字频率计,用数码管显示,有详细的程序代码.
' \0 R- M( ?) J- G仿真原理图如下:
1 O% y/ p, u. F: p3 e9 U& H
' X# p/ `" N2 g0 o% F# a3 h2 g
$ [4 `8 F& ~& N' b7 o" @/ S& M
6 l7 w1 V, a% x/ Z8 O2 Z, i部分单片机源码预览:# w" R5 v! A/ @& x- S
freCountMain.c文件:
7 r+ v# c+ B; A! b9 E/*************************************************************************
3 i, A K: o h*实例名称:频率计
- M5 T' b P, W% _+ b*实例说明:实现0~9000hz频率计的统计, b/ u1 p5 Y3 ?
*作者:yd! u, I2 r5 w- h4 D' M3 ~
*时间:09.06.20& N+ \5 L' Y7 X1 }2 b
*************************************************************************/
0 A0 V( T7 C. A8 g; q1 v# C- U8 s#include "target.h"9 Z" n& U6 \- ~
#include "led.h"
0 |: t( M) a! Q- o0 Ruchar displayBuff[4]={'0','0','0','0'}; //数码管显示缓冲区,千,百,十,个
( ]: d0 _ ]. @% iconst uchar displayMode=0x00; //后四位分别对应缓冲区中每位的数据类型,1为任意字符显示,0为数字显示: H b& F" L% @
void main()) K' D% T. Z6 g5 k& x
{
9 @7 i h7 G; B4 L! r: Z uint get_fre;
+ U0 R; {+ I/ W target_init();
+ A- I9 I( [9 X9 L+ Y) u- R init_led();
$ G1 {3 E6 G& W8 A! T5 P sei();
J5 K8 j' l5 |& @2 T) F while(1)8 \2 o3 Z( t" ^! A
{0 N; k* ~1 a9 a) T/ @5 n
get_fre=get_fre_number();) M! E0 s+ C4 F" d9 J, T, K
if(get_fre/1000<0x0A) |& U8 r+ l7 _, m4 K
{
1 P' C2 y* t7 M( e H1 K2 y displayBuff[0]=get_fre/1000+'0'; //计算频率千位,放在缓冲区第0位
8 D. c( S+ e4 @/ K7 ]3 F% P% { }$ e( j+ [! I3 f
displayBuff[1]=(get_fre/100)%10+'0'; //计算频率百位,放在缓冲区第1位
: }5 X4 L" k/ G. C1 {' Z3 k, y) P) W displayBuff[2]=(get_fre%100)/10+'0'; //计算频率十位,放在缓冲区第2位
4 [: L+ i6 L; y2 o displayBuff[3]=get_fre%10+'0'; //计算频率个位,放在缓冲区第3位/ [ }& G' A s8 C
ledSweepDisplay(displayBuff,displayMode,0x04);//循环显示数码管缓冲区中数据1 k; d2 o; m7 P- T4 w& Y4 ~3 @$ P
}
9 }5 P6 [ x. e/ I, Y# T* M/ v! g! ]$ R2 q3 U% O1 f
}! L: c4 r( K" `0 J- M9 u/ X7 }' }
$ ^* j+ j6 t) H: s; F/ X
led.c文件:
5 I' j8 @) ?5 |( l2 f#define LED_GLOBAL 1/ C% j2 P8 x+ E
#include "led.h"1 c8 _, S A$ i |6 N' w. R4 V
/*******************************************************************************************
9 N" ?% n' I# O0 o; y. c* W6 V*函数名称:delay_us(uint us)
2 B2 C# V5 R; {' H*函数功能:实现微秒级的延时# H( }& [0 h4 H. [
*函数入口:us,延时函数循环后期数
7 ?7 u* S# e: `. p! w5 X: \*函数出口:无7 ~6 k1 {2 s% I$ @" A+ \2 W5 n% j
*******************************************************************************************/
! k& ]: }) l! Pvoid delay_us(uint us)
( P; m! K- f& O% Q# n) {+ W{4 A/ V/ I f4 E2 o7 W+ g' F, R
uint i;- o' M3 ]" O" i' O6 L$ e
while(us--)
! q* P9 U; i H' m {4 C, e0 D& T) w+ X2 T* }
for(i=0;i<100;i++);
- U# L; G) v! r3 j6 {1 |- i }
; R: x' j% t% g8 o1 e! t}
T: {( X4 `3 G9 m1 e/*******************************************************************************************) {6 [; n1 T8 A* r( k0 @
*函数名称:led_init(void)
/ F+ B X+ Q3 b' f* N*函数功能:四位七段数码管显示初始化
; y# @, ~! E0 p! N& r+ c2 k! S1 ]*函数入口:无
1 }/ N* Y- C; p, J6 R+ F*函数出口:无7 b7 Z4 Z; @8 G4 d/ W r1 w6 ^
*******************************************************************************************/6 R, h% [3 Q5 _; P: A7 r
void init_led(void)
" \* L$ q2 [$ h3 ?1 l# T' P{
' S# ]" ^& l, r( ^2 `% G) \# Y" | LED=segLedCode[0];( A8 v8 o+ S% m( O" Z
LED_CS1=0;# R. U$ I2 k0 J2 k0 C1 b4 D n$ E
LED_CS2=0;
: n9 ~. X8 @6 A# Z* p LED_CS3=0;
8 [5 c$ m. U! L! @6 _ LED_CS4=0;
4 r. _! E( }$ }- O1 X2 [}+ a! o6 A8 F+ _- W' Q
/*******************************************************************************************+ ^) V6 X7 S9 ^$ u
*函数名称:ledWrite(uchar c,uchar n,uchar mod)
( d& D4 w5 J) z4 ~& |: v*函数功能:对一组数码管的某一位进行短暂显示
+ ?7 e" q1 c5 E3 l1 E) l. U*函数入口:c,要显示的数据;n,显示一组数码管中的第n位;mod,c的数据形式5 i1 T3 s4 H8 t
*函数出口:无
' p2 S. L# l: h: ~' ], v*说明:当mod==DIGITAL时,c为数字0~9的ANCII码形式,此时在n位数码管上显示想用数字3 X6 p1 v' k3 C6 w k$ w
当mod==CHARACTER,直接将c输出数据口
0 `# R1 ^) r$ y' M3 r; _6 i3 z*******************************************************************************************/
+ K* i4 Q1 l7 w+ z8 S' g% uvoid ledWrite(uchar c,uchar n,uchar mod)/ K' ?! H, Q+ `1 a! X- [
{+ P. C! U5 i ~8 e- U4 L
if(CHARACTER==mod)/ X! I: [( V- D" Y; G* i& p
{
~4 G9 V. S6 Z. v( U LED=c;
( |0 i* k; A; W- V }
5 B' g+ @1 y* h5 S; G% A- ] else if(DIGITAL==mod)
5 z/ A7 b: o6 E! b {, V; x+ o5 r7 h* F
if((c-'0')<0x0a)
1 H* a+ a9 A% ~9 |3 \; G3 t {
& P) e3 T8 a2 ]2 i! j' v5 w LED=segLedCode[c-'0'];
o, n" _$ D1 V7 t; u# Y9 z } + ^& e9 H! t6 T5 w% w+ O0 l1 H
else1 i- M! B9 @+ V7 |0 f
{
C* `- o+ I& [* [8 f LED=segLedCode[0];
# k+ }/ x; Q8 Q" R! W }. d2 Q0 P) o- Z+ c# e2 {; m
}
. I: e1 [0 p! }; L: a" w( R switch(n)* i$ A; `+ d+ o2 L& A
{$ _/ p/ Z1 L" P( m6 B! p1 e/ e$ V
case 0x01:: u/ H& \/ m. a' W" J/ C9 j
{
1 B4 F+ }! D% G* ~0 y LED_CS1=0;! g3 m3 t3 {$ V5 d+ A; O, B1 }5 E
delay_us(10);2 S' Q1 Y8 q! \' _: r5 P
LED_CS1=1;
5 v+ }5 T7 S! m break;
8 S/ Y' a f5 t/ P }
. ^% O9 F) O. N# r5 F case 0x02:
4 W4 g+ G' t9 r6 n$ l# F {, L$ i2 d5 O9 t( V+ J w( H2 s# {
LED_CS2=0;
$ c9 w( @, Q, e7 t) H delay_us(10);
& k, W1 X. a4 l$ x/ q+ x LED_CS2=1;9 Q- Q% |0 `+ l0 n
break;
* O" _5 u2 Y4 R8 u6 Q6 b- Q Z4 k" b }
8 j3 x5 w: [6 ^1 M case 0x03:$ G* A3 N: X9 E
{' o/ A' k5 ^% q o' Q
LED_CS3=0;% n6 Y5 |" C: s, t- O2 B
delay_us(10);
* @& |' a( F* j; d+ `' v LED_CS3=1;/ E9 u+ |. O( A M/ O' z
break;
6 h8 C6 C' U& ] }
. F m! F8 b5 L case 0x04:7 T9 B8 s" Z( N" o1 E% ]: @$ f5 T
{% x4 \" M- `: J7 E8 \
LED_CS4=0;& _( d' _, D: S5 t6 [8 e* Z+ a. i% M- ?
delay_us(10);
' N$ L- p) m7 [. V) y, L LED_CS4=1;
! g+ U; \4 Z) ?6 _5 C break;9 j2 [/ F" h) Q1 T' e# W
}
6 ?& s: d" e) a; e7 S! z7 \6 |* ` default:' u9 f; e2 E' K Y4 `$ C$ a5 y
break;
+ N1 \- ?/ h% x0 w
+ P! P0 X1 G8 }. c( V0 r7 O" L. D }
, z9 V/ Z6 P- b; t: B9 R7 Z8 j2 }3 m0 w+ y4 j
}
8 B7 O' @: l% B4 f- Q6 i, s. G/*******************************************************************************************
) C; q) T N( b- x \( i% m*函数名称:ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)
4 b1 y' p6 `0 C*函数功能:循环在数码管上显示缓冲区中的数据0 L2 C! \% D$ Y7 i% A
*函数入口:segCode,指向显示缓冲区中的指针;segCodeMod,0~7位为1或0标示1~8位数码管显示的数据的类型(DIGITAL或者CHARACTER);segNumber,代表要显示数码管的位数* p5 [/ x5 s# L3 V! C! W" a
*函数出口:无
; B# E, t. a/ e$ d5 }*说明:本函数主要实现将显示缓冲区中的数据在数码管上显示出来# S. W N/ Y4 k4 {' s7 h e/ e
*******************************************************************************************/
p8 R( J* f; gvoid ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)
3 F0 s; c1 k- y g4 i, ?8 d' _# T0 |{8 Y! O2 V' F5 z' {( B; }# i8 p
uchar segCount;+ F6 ]; @& V" _/ w! G8 t
for(segCount=0;segCount<segNumber;segCount++)
+ \$ ^. L; L7 f2 k' t& L {
j( ^! ^: y/ Q+ T. ]( a if(segCodeMod&0x01) /*1代表此处显示任意字符 */3 |9 j" ]0 N9 Z, _2 X
{
/ B9 y7 `' }1 a H) t8 S5 p ledWrite(segCode[segCount],segCount+1,CHARACTER);
& `0 [1 U8 I0 I! p- ^5 { }. b! }6 c0 m: Z% v8 @
else
: Z' e! ]! E9 E1 s& u) w {* R+ i: s3 }* }: m
ledWrite(segCode[segCount],segCount+1,DIGITAL);
/ S7 d1 w( S" G: Q" ^* M* f } P ~& t8 O+ f% ]
segCodeMod=segCodeMod>>1;
: K( p; H9 V- f" C" { }
! E8 q0 B. t1 n- Q3 q) G4 i- _6 O& o}5 I) h; I+ u; A7 i
* C6 l" h+ Y% j) S1 P9 {7 E" s0 G3 {% e& T0 ?
全部资料下载(含仿真工程文件和完整代码):
% |/ t% @' s% F' o; a1 j* j
4 u# ~% r" A7 R
/ M) g) r5 o# b- L X( J( \$ {* b3 |* s, [" i: [, l
|
|