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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

4#
发表于 2019-9-22 17:28 | 只看该作者
多谢分享                            # K9 @& X& Z1 U/ h

该用户从未签到

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

该用户从未签到

6#
发表于 2020-7-13 02:23 | 只看该作者
谢谢楼主,感谢分享
2 C7 y- w) ~$ R6 P% ^

该用户从未签到

7#
发表于 2021-2-20 19:47 | 只看该作者
非常不错nice1 ?, y, r8 n; D8 ~, f5 V0 x* f
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-30 04:18 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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