找回密码
 注册
关于网站域名变更的通知
查看: 1422|回复: 6
打印 上一主题 下一主题

单片机数字频率计仿真设计0~9000hz 数码管显示 带源码

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-17 13:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

该用户从未签到

4#
发表于 2019-9-22 17:28 | 只看该作者
多谢分享                           
6 h  X0 C$ E+ Z% p2 h

该用户从未签到

5#
发表于 2019-11-29 09:19 | 只看该作者
非常不错nice

该用户从未签到

6#
发表于 2020-7-13 02:23 | 只看该作者
谢谢楼主,感谢分享
% s. f3 T" t# r

该用户从未签到

7#
发表于 2021-2-20 19:47 | 只看该作者
非常不错nice+ _* j" v9 j& t* `4 v7 u+ a
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-16 07:18 , Processed in 0.125000 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表