|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机数字频率计仿真设计0~9000hz 数码管显示 带源码& t3 L/ U7 `, |8 E
1 H2 S; v6 o4 |4 Z Z! D* O" J, ^! D$ O- A" _+ e! U; E% l2 `" s
今天给论坛的朋友们分享一个51单片机做的数字频率计,用数码管显示,有详细的程序代码.2 D9 l- M, f B+ b
仿真原理图如下:
4 X/ m @! r, C
1 _' t) m3 E; Y2 w7 u3 s! a$ z; u& g' s; K2 v6 B
" i0 k# v3 H5 P5 X7 ]( y
部分单片机源码预览:( L- G* B$ p3 f4 s0 y; l& U' E
freCountMain.c文件:
# X, W3 S( {# q: |* J/*************************************************************************3 R7 w! r9 S3 \& c+ `' ?
*实例名称:频率计
/ d. _: n3 k9 c1 t' p% M*实例说明:实现0~9000hz频率计的统计
# N7 D# J: I! @( D7 ]*作者:yd
$ J" V0 W' g0 U*时间:09.06.20 T, j7 U, _: W" {/ K
*************************************************************************/5 z. _ U, H% d0 x
#include "target.h"
' Z9 d# k9 O9 [6 H) I. J& o#include "led.h"& c, p9 F _9 P1 \
uchar displayBuff[4]={'0','0','0','0'}; //数码管显示缓冲区,千,百,十,个
; c3 C6 R1 `, ~( econst uchar displayMode=0x00; //后四位分别对应缓冲区中每位的数据类型,1为任意字符显示,0为数字显示
- {+ O2 Y/ M9 K P& U$ vvoid main()
/ [" x1 C$ T. {1 L{% ~1 o7 R% X% C, W
uint get_fre;: l1 f) g" J( o2 F
target_init();
6 i1 H0 V& W- S. ]% c$ L) r init_led();
( B& m/ o# G/ Y+ Z; o j( X sei();
# t1 k* i: b/ E% V3 Y while(1)
$ b7 s# K' [/ t. C" B {3 v( i/ g1 C. H% I
get_fre=get_fre_number();; N* Y; H( s: i, C6 V0 a
if(get_fre/1000<0x0A)/ C- Z) l! x: A: V4 v& }* Z$ j
{
" a7 g2 G0 a% Z2 _ displayBuff[0]=get_fre/1000+'0'; //计算频率千位,放在缓冲区第0位, @3 k! T) a0 r; ~# h% b. _$ r; K9 c
}
u& q$ p$ I# Y displayBuff[1]=(get_fre/100)%10+'0'; //计算频率百位,放在缓冲区第1位- G% @2 F3 p' y7 c9 B) v8 K8 L2 t$ P
displayBuff[2]=(get_fre%100)/10+'0'; //计算频率十位,放在缓冲区第2位
! c" U: T. t# f/ h! { displayBuff[3]=get_fre%10+'0'; //计算频率个位,放在缓冲区第3位0 w6 @3 i' e" }8 c6 d
ledSweepDisplay(displayBuff,displayMode,0x04);//循环显示数码管缓冲区中数据( ^: G9 k8 [, q5 w
}
& z/ A8 z; S+ l/ l/ {: B9 U: [$ ^0 B1 O5 `+ j
}( F! {3 Z" ~" K6 w# d/ y
4 F3 J+ P. U$ Z3 m
led.c文件:* Y, L5 v2 Y, W- P# O( K
#define LED_GLOBAL 1) ^4 u1 S4 y Q
#include "led.h"' Q6 h, d/ F, q% n1 q* P7 p
/*******************************************************************************************' G4 a' A& [0 k
*函数名称:delay_us(uint us)0 J; v/ L$ D) D! ?. m1 `* t
*函数功能:实现微秒级的延时 I' D( G L% a/ t, a& Y
*函数入口:us,延时函数循环后期数3 M' g0 U% p# ^* p
*函数出口:无
! J, y! N$ C: |& C8 }( Z: m& l. w*******************************************************************************************/
8 n* u& p$ U/ H2 q. U- fvoid delay_us(uint us); l7 T7 G* ~/ e& b
{
; A' O: x' F% \0 W T C% b d! a uint i;! {# E9 S2 c# q0 k9 f+ u" s' R! O
while(us--)8 l( j- }$ _' V. m/ r/ z, k
{1 N. D6 ~7 V( I$ n8 k$ M; O1 p: V
for(i=0;i<100;i++);
" R/ L, F" Z0 t }' V- A' R ]0 ]& v& C7 z' z n
}* N; |4 P3 W. G/ m" H# g; M
/*******************************************************************************************
5 a. S* F' A6 t4 d. {$ V4 x*函数名称:led_init(void)
4 u" F# e& m9 p/ _# D0 z5 X*函数功能:四位七段数码管显示初始化- C/ Z5 M" ~# _& U
*函数入口:无% W8 u5 I1 t( F* R/ D
*函数出口:无! o3 C5 ?1 b& P( {) X0 [- F H
*******************************************************************************************/
2 X: B& \+ I( ^! m1 B2 Dvoid init_led(void)
3 I: M/ O) ?9 \ F+ t% m' G: A{
) r5 I3 L, g; Q8 c$ s/ U% f LED=segLedCode[0];7 R* z6 |8 z5 c
LED_CS1=0;
& S% A% u" D9 Y; n LED_CS2=0;
' v4 r1 p; k+ \& z' h/ e2 q LED_CS3=0;
! E( o6 l; t, ]6 i LED_CS4=0;0 Z4 W& I% ^2 d, D2 Y, c8 f
}; m( w9 t; V- m- H( I- ?, T
/*******************************************************************************************% _* q1 o0 l; Y% g2 f& }
*函数名称:ledWrite(uchar c,uchar n,uchar mod)
9 E4 ?( a* w# b% A' m2 |0 X, ^*函数功能:对一组数码管的某一位进行短暂显示
- z7 ~7 d3 x5 J! C# o: u3 N*函数入口:c,要显示的数据;n,显示一组数码管中的第n位;mod,c的数据形式
% ^/ U2 t6 F% [9 a j$ B*函数出口:无
2 o4 O. I0 Z8 D# z0 E) a7 N' i1 g*说明:当mod==DIGITAL时,c为数字0~9的ANCII码形式,此时在n位数码管上显示想用数字+ _, I4 V! y K, J- }5 k: q
当mod==CHARACTER,直接将c输出数据口" R/ v N+ Y; c6 x! \: i9 p& l' Q
*******************************************************************************************/
; M6 F" Y% T1 z8 g* Mvoid ledWrite(uchar c,uchar n,uchar mod)
k- C4 m% _7 R{' e# Y/ ]6 r! @. t
if(CHARACTER==mod)% x5 a( h( q/ c7 v b% \
{
: j; X5 T. ?8 C, F LED=c;
) ?! G0 t( T6 V c }
+ {) Q7 z) T `4 n; n) d: |% _' z else if(DIGITAL==mod)( E; r& F0 E& F" `0 X; R
{
! p0 c3 H9 U- g3 L if((c-'0')<0x0a)* n0 i5 ~! H+ O/ |. c/ g* W7 D
{# a; e- m% k& @ w
LED=segLedCode[c-'0'];- @3 X6 t( C9 ^
}
% l6 B6 G: F {7 p8 }7 g else
, G3 c$ h3 ~- y/ } { ; b) ?. \! \8 f' R7 n. ~4 @
LED=segLedCode[0];
- J7 b" v) J* B9 u9 Y% m/ P) H }
5 ] G# _3 D h7 z U9 m }
0 V: \" E4 K" L switch(n)
* P- Z) Z/ u0 y y, x {2 o) ]8 R9 n* N. W$ m! W) {
case 0x01:/ E$ z+ l* p2 A9 J& s
{: C. u. e& ]. E( {
LED_CS1=0;- U3 w* t' X Z" ]! n
delay_us(10);
. X; ?) d! z, m3 y9 M LED_CS1=1;
" @! `% i5 R9 [. }" _* B break;8 z$ F. v ^9 t& C; G% m
}' ]+ S7 S1 \) a+ G! A6 }
case 0x02:6 ]# N! k3 Y9 g: M% ?
{4 S8 _5 \( s0 m4 v+ C; Y1 u
LED_CS2=0;, u& L- d: R0 L" U5 u
delay_us(10);
7 W5 P7 U, o$ B4 Z! u6 }6 @ LED_CS2=1;
7 C- A C1 j0 {, f& W' R, | break;
7 u) Y$ C& C0 O' x }
9 I. B, g5 k9 J L/ J case 0x03:
( Y6 i$ Z i4 w$ R2 }2 n3 C {
5 `# Q/ r: e; e* ` LED_CS3=0;
' V, \. A& ~* b delay_us(10);9 B5 k* j: g i+ W7 O7 c3 o
LED_CS3=1;2 R) \0 I6 K) i& B o+ \
break;
+ O( g9 K+ K" r% k; H1 X- Z }9 O3 q& u, \1 @* L! `
case 0x04:* `; J$ ` O/ X- p
{: W5 Y# @# P4 ]! f3 n
LED_CS4=0;
# B0 Q1 X( C9 a" G/ S delay_us(10); L7 f/ j7 o4 N/ I
LED_CS4=1; " x& n( J% I# R e. j
break;
% b+ j9 G- {4 d. l+ B$ ? }+ q. b5 \0 A$ J1 R# s
default:, x: e" m1 c q
break;
; s/ b: ^& A1 c5 }9 H1 Z7 {4 `5 O8 R" [: N3 j7 ^7 X- ]
}9 \ t$ V' n2 O
. [! h2 z# C$ B4 D
}& C" M z4 ]% ^1 f \; [
/*******************************************************************************************
- m9 A% r2 a$ u. e$ u- W6 T*函数名称:ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)
9 W% ^4 [' B7 s& M3 [*函数功能:循环在数码管上显示缓冲区中的数据
1 l& a* M, |) i' g# p*函数入口:segCode,指向显示缓冲区中的指针;segCodeMod,0~7位为1或0标示1~8位数码管显示的数据的类型(DIGITAL或者CHARACTER);segNumber,代表要显示数码管的位数
" w# n; n8 j& Q*函数出口:无2 P6 O3 h! g; i* a/ y& `' X
*说明:本函数主要实现将显示缓冲区中的数据在数码管上显示出来
" p; E/ ^* V ]. |! K7 c9 S*******************************************************************************************/
% X& g9 \5 r g6 s$ pvoid ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)/ ^* S( E) S4 D5 w- x3 F+ N
{1 t; z9 K0 [# z& U
uchar segCount;
. s( e7 J; P/ B for(segCount=0;segCount<segNumber;segCount++)0 H- J' l5 J J
{
, O/ B- S: X | W3 M1 Y if(segCodeMod&0x01) /*1代表此处显示任意字符 */
! e ~5 h( ?% k6 E2 @# J. O4 v1 E {
; Z1 b: V9 `! N ledWrite(segCode[segCount],segCount+1,CHARACTER); l+ e: m7 P) P9 N/ B- f7 q1 |/ b
}: F3 N- ^. y2 J5 m. y. C
else, g: ]0 W- O( J9 v
{$ E1 I: }' J8 x; a8 U. D
ledWrite(segCode[segCount],segCount+1,DIGITAL);+ u; k- x+ X, G5 g, J; F
}; u7 c) h6 j/ O d
segCodeMod=segCodeMod>>1;
8 E9 b0 s' _9 q& h8 d& `0 V: F }
! x1 C( G& k# W& `" R$ _6 y: R}' Z) U, M$ G" _) q
( q0 k# W2 l2 g3 Z+ a/ K
1 v1 C1 _* Y1 J) ]全部资料下载(含仿真工程文件和完整代码):8 g( r4 n0 J: h$ o7 f% t) N
" X: u7 o; y% C& h5 ^
% Y7 t$ A3 z/ o4 Y
3 k4 N: Q3 F4 D3 R2 d: Z+ f |
|