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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
单片机数字频率计仿真设计0~9000hz 数码管显示 带源码+ t7 {& ]7 H6 U
: F# y- |# j; R% e& e  v% `# R
- v0 r% W  [. m  `" h! K0 q! ^
今天给论坛的朋友们分享一个51单片机做的数字频率计,用数码管显示,有详细的程序代码.
  a6 m% v& v) X8 O3 ~仿真原理图如下:0 X" Y4 u9 B; k2 m6 R$ J2 @
4 x" l" j. v. ~
5 D! z9 q8 d: T6 O) H/ |5 |; @

+ W( ?! ?0 G5 c8 k1 A  X部分单片机源码预览:; K' E( I( P" N) Z, N1 |/ w
freCountMain.c文件:

/ a4 `, K; O% i0 n. I  z/*************************************************************************
9 w& w9 n. h( \+ V/ l! c' ]! f*实例名称:频率计" H* F5 X; g3 t* L& I
*实例说明:实现0~9000hz频率计的统计
! D  s2 w# I, O; P* b/ B6 a*作者:yd
) ?/ R4 c0 l' \( @; l( n. K*时间:09.06.20
5 U7 B4 K$ L4 A* n: V+ X. d6 G*************************************************************************/6 u# D3 \3 M4 x* q
#include "target.h"
$ ^9 e8 A! B! f; z#include "led.h"
0 Z8 _% P) A3 G) D  R: `- T* Yuchar displayBuff[4]={'0','0','0','0'}; //数码管显示缓冲区,千,百,十,个
1 [. F+ f0 D' ~) Nconst uchar displayMode=0x00;           //后四位分别对应缓冲区中每位的数据类型,1为任意字符显示,0为数字显示/ Q$ q- x) W8 Z; r: p" S
void main()( b8 B  |  ]" ], r. l
{
+ ~3 M5 e5 H0 q! \' w0 X: r  z  uint get_fre;
/ ^/ G( ~  n, X) p4 M# L  target_init();0 G9 N& Q: O  Y( i( R% B% Y# m
  init_led();# n' x* Y  d5 F
  sei();
$ Q# f4 V  m; C, D6 W+ L4 R  while(1)9 f, K% G. `: C4 [- z) r
  {" \3 F. @! ^' t: u5 l* ?
    get_fre=get_fre_number();% K6 D3 l' Y/ u* X. @
        if(get_fre/1000<0x0A)
# a' q2 E% Y3 O) d        {* N6 \% s& V8 Z# j* g
          displayBuff[0]=get_fre/1000+'0';            //计算频率千位,放在缓冲区第0位4 |6 ?) Q! y, ~# p
        }
7 E; v# f. q4 T$ r# ?- r% B2 m5 B        displayBuff[1]=(get_fre/100)%10+'0';          //计算频率百位,放在缓冲区第1位
5 h* {! ~( V1 ~  O5 a7 J4 F2 ~    displayBuff[2]=(get_fre%100)/10+'0';          //计算频率十位,放在缓冲区第2位
' n" A+ B+ H% d0 s$ J# N* z        displayBuff[3]=get_fre%10+'0';                          //计算频率个位,放在缓冲区第3位+ |2 I, H7 H$ c  d# g3 P$ {
    ledSweepDisplay(displayBuff,displayMode,0x04);//循环显示数码管缓冲区中数据/ F" W5 X- p9 J: x9 \$ P
  }
2 q7 l! g; j4 e& T, }
: Z5 l3 l; ?- a. w8 o+ Y}' G! Y4 S; d: G3 y

( O" A' J) O. R* }: mled.c文件:
3 _5 |* ~; _6 a$ `5 g#define LED_GLOBAL 18 W, f. ^% F4 ?& A# V: m8 {
#include "led.h"% y- v5 z0 Q' O2 B" h2 X6 |
/*******************************************************************************************
6 E: z" }! ]/ ^/ s9 N* y" F*函数名称:delay_us(uint us)* r! u3 M5 [) |5 ^8 n6 U
*函数功能:实现微秒级的延时& F3 |4 I6 Z  G  U! C9 E# y! J
*函数入口:us,延时函数循环后期数, U% e9 x6 {. o" j# ~& K& ]
*函数出口:无
  l; H# Q% X* {1 F$ `5 U* ]*******************************************************************************************/
  c2 @# j) D: e/ v" u& ]- Svoid delay_us(uint us)
9 _* ^7 Z9 `& x* q{
9 F/ [4 V# t1 G! V  uint i;4 M" U3 \& |2 ~& @# o/ M
  while(us--)7 i: Y- q+ b# ]9 p8 Z# Z: ]
  {
' n- M* k  F% `- s/ W    for(i=0;i<100;i++);
& n9 P& J7 H! \% C; d( j8 I  }9 f: g3 T3 N3 C
}
$ ^3 J, I& u8 e+ N) J/*******************************************************************************************# E% R/ b. S, w9 u+ i
*函数名称:led_init(void)& P' z1 O1 G" S1 B2 c( n, J
*函数功能:四位七段数码管显示初始化
" A: K9 r4 q, V* d- F. M" }- t*函数入口:无5 |$ k9 K) \0 L
*函数出口:无) L" {: W" D2 m
*******************************************************************************************/+ f2 _; q$ j4 F. b7 N# y# Z
void init_led(void)
; A: V9 e$ u9 L) _  }3 A; [' |+ `{
6 r. C% E, W$ S% d+ h   LED=segLedCode[0];
" {6 }6 _; r; w* C2 `   LED_CS1=0;
( J8 Q0 X( `+ c! @) o! j; z   LED_CS2=0;$ J' m1 F" {! c8 h$ D* N+ f
   LED_CS3=0;% l& ~# b: q0 C, C& t
   LED_CS4=0;# N0 I: t- M% U1 K6 h& U6 p
}
8 f* \+ }7 t6 @, ~9 ]/*******************************************************************************************
1 v* M: B" x1 r  ^, k*函数名称:ledWrite(uchar c,uchar n,uchar mod). N* ~( Z% @3 H! g. I3 N1 M+ D
*函数功能:对一组数码管的某一位进行短暂显示
6 G: W7 h2 I8 n1 q4 s0 U*函数入口:c,要显示的数据;n,显示一组数码管中的第n位;mod,c的数据形式! u5 w7 h* \" I
*函数出口:无7 x  x7 q9 b7 V
*说明:当mod==DIGITAL时,c为数字0~9的ANCII码形式,此时在n位数码管上显示想用数字5 }1 [7 g; ^4 r+ Y
       当mod==CHARACTER,直接将c输出数据口# P$ ~* R% ~/ g/ S2 a
*******************************************************************************************/7 w2 s1 n/ ^- Z; T( S1 v0 b
void ledWrite(uchar c,uchar n,uchar mod)$ S# s. V6 |' i" U
{' i9 u! g2 m# N7 t, n( o
   if(CHARACTER==mod)
: z6 ~+ s, k/ j9 C1 M% _- m$ q& m   {
6 r7 C1 u6 e- f7 u2 x6 q9 a5 M6 e          LED=c;  
8 d) d& F) e6 z* ~   }
7 z# G  y* x. m8 P( ^" o   else if(DIGITAL==mod)  a% ~+ Z, w4 T, g
           {
5 x5 g4 q$ @& P+ L              if((c-'0')<0x0a)5 [7 o5 {" \# m# K5 x9 m. l
                  {
6 j( X  \' K( u" V, V5 V0 }  K* |* K) ~                    LED=segLedCode[c-'0'];1 q9 `" J. e$ e* x( L1 r  q5 y
                  } ) }3 \9 O' @0 g5 b! m8 [& t
                  else
! y% I* R3 v5 R  m0 E                  {  
3 b' p) b$ d# k; x4 @& `. l2 [' B                        LED=segLedCode[0];' ?% T, `! i; q0 X$ v3 {
                  }7 x% ]% q7 A: x% n( D
           }( T7 K' @# C8 E4 Q# m
   switch(n)
* O7 F6 C% V5 l' F5 K; p   {
- J8 B. k0 t2 K) }                case 0x01:
) |1 O6 ~1 }' [8 Y; p. g                {
1 P; f' r/ k" @' U; d- ^: L) y                  LED_CS1=0;- e3 L8 \" p, a/ T6 e  L5 @
                  delay_us(10);
9 ~4 v& i: ^* ]0 ]                  LED_CS1=1;5 c6 m# X& }! D: F
                  break;
' d4 W0 K% Q* L5 t+ ~; W                }8 i* v! k3 J7 U' a5 {0 V' G
                case 0x02:
8 t3 j/ U! G1 S1 J: Z                {  j# A, m/ v; M* `9 Q1 z) N6 H
                  LED_CS2=0;
0 L7 r+ N4 ~! o5 `                  delay_us(10);( }, i" h2 e) m- U
                  LED_CS2=1;$ _3 w5 g6 Q8 c
                  break;9 Z$ L- h, Z: B6 s% c& |
                }4 a0 p  F$ {! k% I) T9 p# I
                case 0x03:  ^" r* {, g) ?8 v( |% h
                {& Y3 I: v( R+ S" Y" T
                  LED_CS3=0;" k) {+ R" f8 s5 M
                  delay_us(10);
% j* J4 q/ q0 s8 l* s- K                  LED_CS3=1;; N& ~7 r0 N7 o9 [
                  break;
/ s: X( S+ d: _8 x+ |! }: K' _" w- v                }' H+ v1 H9 @! P* A
            case 0x04:  y, [3 _# W% d  Q- a
                {
! H1 ^1 L) _& O$ K" s3 k                  LED_CS4=0;
7 g- W' J" p9 O; X3 N+ O                  delay_us(10);8 ?4 H) O- o: L1 i* [7 Z
                  LED_CS4=1;
: W# {2 H- l- U0 J% Z6 V                  break;
* f2 J8 [- S  ]' W7 l0 ~1 {  {' c                }' N0 O* z1 T9 T3 ]& b) U2 C  a
                default:
+ [& U. ?2 a( p6 [: v6 t7 Q3 l                  break;
" Q5 t; Z9 n" I* k6 [1 T
' l" }# z" d  c) c6 k- V   }( {2 A! F  z# {, K* ~/ B9 [
  B9 V. Y7 V; D, w
}
# C* }9 z/ }( o/*******************************************************************************************& J2 y9 m$ j) r7 o. s0 }7 q
*函数名称:ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)
1 @8 C1 U: ^9 \" _* {0 W*函数功能:循环在数码管上显示缓冲区中的数据
" S( [$ \& r5 Y. o2 J*函数入口:segCode,指向显示缓冲区中的指针;segCodeMod,0~7位为1或0标示1~8位数码管显示的数据的类型(DIGITAL或者CHARACTER);segNumber,代表要显示数码管的位数' @9 E/ H+ U/ s  W. k
*函数出口:无
7 C! R4 d3 S: ?9 C9 I*说明:本函数主要实现将显示缓冲区中的数据在数码管上显示出来
- I, ?/ O& I5 J; d: S% ?7 n& Y; ^*******************************************************************************************/                     2 o) D! z, x2 d( M9 F  `9 @/ {
void ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)
, z' b( f2 L$ A  h& x{
# M+ X& V/ w& Q# @9 b  R8 f/ ~( Y           uchar segCount;7 ~, D2 l- ?% X. [  d- |5 s
        for(segCount=0;segCount<segNumber;segCount++)6 {$ T$ M8 t9 w/ N
        {
1 ?9 W( O# I' _! f. ^! L' v% m8 Y           if(segCodeMod&0x01)           /*1代表此处显示任意字符 */% g" D* E4 S/ J2 s+ ~9 A
           {
8 I7 ^, A( O5 b' \4 x  u             ledWrite(segCode[segCount],segCount+1,CHARACTER); ) L- n) K% }: Q2 l" l) l: x, @
           }
5 M! T/ ]! t3 ?. q+ D  f; l- p           else
% F* v8 A0 ]- y2 G( V           {
/ Y; w- W& k# q8 m             ledWrite(segCode[segCount],segCount+1,DIGITAL);+ o3 a: b) ]2 `1 n, `3 D" u
           }
+ h3 t0 E- L3 W8 W0 f: ^/ z. O/ A           segCodeMod=segCodeMod>>1;2 q! q* E; \0 T
        }
$ f8 _& Z5 U* N$ N, U  m+ U7 H$ o) O}' e$ k1 v% v" H. C1 K# a4 R& |

, J" i  d$ ^7 m$ z) [( i
% S6 k& D. c% L) G, ?1 _全部资料下载(含仿真工程文件和完整代码):
3 e% I" u, j" e6 T2 v1 h; c2 y& P; |
游客,如果您要查看本帖隐藏内容请回复
/ q7 h8 ~( ?2 _  b" `7 r

) i1 r8 D' d* C& {
) i: r3 ]# T) D1 s' z

该用户从未签到

4#
发表于 2019-9-22 17:28 | 只看该作者
多谢分享                           
1 Q9 W, Y3 _  `  G: m

该用户从未签到

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

该用户从未签到

6#
发表于 2020-7-13 02:23 | 只看该作者
谢谢楼主,感谢分享
" a! R- J' J5 m6 \# G

该用户从未签到

7#
发表于 2021-2-20 19:47 | 只看该作者
非常不错nice3 a6 o( c, t5 {! ]) T
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-15 08:10 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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