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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
单片机数字频率计仿真设计0~9000hz 数码管显示 带源码
) s$ I* I4 S& q3 Y( C2 n) `* c" F( G' C
, ]6 L2 K% ]+ [: d, l
今天给论坛的朋友们分享一个51单片机做的数字频率计,用数码管显示,有详细的程序代码.
. U  o5 L8 K9 ], O. Z% h( a! G仿真原理图如下:; v6 n7 v4 _; a7 f: e- Q
/ a% P  n$ _# _! m  U# ~8 c

! y6 U) f2 Z& t  }$ @) Y8 `; x2 L2 h# a
部分单片机源码预览:
/ w4 v- P& V% m" s/ [freCountMain.c文件:

3 y1 s6 \* a6 t( A/*************************************************************************
( D; y( T$ S6 N+ n6 f. |*实例名称:频率计
6 ]2 D, \2 B2 C*实例说明:实现0~9000hz频率计的统计7 I8 Z. |" h- t0 E6 Y
*作者:yd
# g! |: g- U6 |; \1 u8 l! N7 y*时间:09.06.20, O9 u: u( c  g, i4 I* B/ B
*************************************************************************/
; b" B9 ]$ ^, S. {0 \3 N#include "target.h"+ U+ e1 M  F7 T9 F  m7 K" ^& |
#include "led.h"
# G. [6 X  D/ B- ~( T4 b$ W6 p3 p; ruchar displayBuff[4]={'0','0','0','0'}; //数码管显示缓冲区,千,百,十,个: ^% |( a- n( L+ _2 I4 t  s2 @/ e
const uchar displayMode=0x00;           //后四位分别对应缓冲区中每位的数据类型,1为任意字符显示,0为数字显示3 p: `  L4 G6 T
void main()  ~+ v) O! o- @( H$ F" H( E
{
1 Y4 I  c1 M  f  uint get_fre;, ^/ g( q3 Z6 F2 S/ A
  target_init();" ?: J- g" O! t* e2 w% r7 V
  init_led();( g! M/ w9 V1 N' m2 K) J0 @
  sei();
5 Y" x3 ~+ \" G/ T  x  while(1)
$ ~+ Z% i$ P% I% g+ \7 k% h  {) ]2 k7 p5 h" {' q4 J" K
    get_fre=get_fre_number();1 f1 Z5 z5 ?4 \2 o' m
        if(get_fre/1000<0x0A)3 F$ a* {* V5 s/ h8 \
        {/ d, {$ }7 h4 Q3 W
          displayBuff[0]=get_fre/1000+'0';            //计算频率千位,放在缓冲区第0位
8 H" C# W" p' H: ?  x3 h% k3 ~        }
" C" _! u4 A# u2 X6 P. i        displayBuff[1]=(get_fre/100)%10+'0';          //计算频率百位,放在缓冲区第1位
. j3 `0 u) D& n# M4 L    displayBuff[2]=(get_fre%100)/10+'0';          //计算频率十位,放在缓冲区第2位" Y1 L1 i- Z# H- I! N
        displayBuff[3]=get_fre%10+'0';                          //计算频率个位,放在缓冲区第3位
8 {* V# X: L  ^0 I5 ]    ledSweepDisplay(displayBuff,displayMode,0x04);//循环显示数码管缓冲区中数据  d6 e6 f* U5 ^- `( W. O
  }  i' L$ v- z7 a7 i% I
( \" Z5 h; w) S* j
}- ~/ ~: N5 n0 h: Y2 ]

* D( x( I/ f" l9 {, Oled.c文件:
9 |7 \& v3 O$ g  y* o#define LED_GLOBAL 16 f2 ?2 f* \$ a4 }# C$ K; _  q
#include "led.h"
1 h9 L* i7 {% l1 v; ?, P6 X/*******************************************************************************************
. O+ T: U' n$ f% q*函数名称:delay_us(uint us)1 D. I# Y3 G9 {) v  x
*函数功能:实现微秒级的延时# c3 r2 B% H6 p; O6 ^# V; `
*函数入口:us,延时函数循环后期数
6 v- h- A2 ]) T0 {$ \*函数出口:无$ D6 l6 G" w2 w9 _3 B) f/ T* @* @
*******************************************************************************************/
! v( C+ _7 p/ T6 y8 P% lvoid delay_us(uint us)
9 k9 f- M6 Y# m, }# j5 T5 B+ k{
7 }& `2 U$ `) P, y% {! A  uint i;' K8 o# O+ d8 F$ \: ]
  while(us--)
. X5 G- o1 U* z  G1 i* m& s  {
3 ?  J+ x$ x4 [" M    for(i=0;i<100;i++);7 g' _1 h/ \! ?
  }
/ i& c9 O# e8 H8 N, R( D}
  A1 }  e% @/ f: K/*******************************************************************************************
/ ^* y9 k# c1 c9 P1 c*函数名称:led_init(void)
1 h2 z; s! [% \; ?$ x/ {' A*函数功能:四位七段数码管显示初始化! P) ]3 H& r7 V9 A
*函数入口:无
# m# x( [; a5 P' s4 X*函数出口:无( I8 M/ H3 {9 ]! T. L
*******************************************************************************************/9 W& b3 {  t" S) M/ h9 Z& G8 S
void init_led(void)
0 E. c9 a0 b; i) k6 W- q& E{7 ~9 J" T6 ]3 {2 q! S0 |
   LED=segLedCode[0];+ d  }6 O, a7 \$ P$ a
   LED_CS1=0;! U# N- K* k% c( m
   LED_CS2=0;
! c# {2 t6 t+ ?% T% y% r" @5 N  x4 N   LED_CS3=0;
. R# m* Z: ^8 Y- i; m) \   LED_CS4=0;8 B) U9 |  n7 N% n# P& Y9 m
}
/ n: t  p( A0 q. R  s/*******************************************************************************************
- ~8 T9 u) l* ]8 a4 k  r' l7 o*函数名称:ledWrite(uchar c,uchar n,uchar mod)
; Y5 B' K% R+ u% g/ A*函数功能:对一组数码管的某一位进行短暂显示
8 ^) C, s" {) ?* d+ s*函数入口:c,要显示的数据;n,显示一组数码管中的第n位;mod,c的数据形式
- z# }& f" ~! V& z8 P3 p*函数出口:无
% P% b( s& j$ N8 z7 t" [2 q$ s*说明:当mod==DIGITAL时,c为数字0~9的ANCII码形式,此时在n位数码管上显示想用数字
! i8 O  }. U# T* N% j5 }7 F       当mod==CHARACTER,直接将c输出数据口$ z: s. x6 I+ M. }' Y0 b
*******************************************************************************************/  Z) [. J$ ^1 {' G9 S! W
void ledWrite(uchar c,uchar n,uchar mod): E) P3 W  M7 D( v4 Q9 H7 M
{( c( t. K* D! |4 C, i/ R2 G+ V- n
   if(CHARACTER==mod)
. @! O- D# N2 {   {
% w/ o: S4 k% ?9 b% I" o) F+ R% _8 @          LED=c;  
% t: _& d1 X0 |0 ^   }+ h; Y+ @  R! ^3 x
   else if(DIGITAL==mod)9 f; v0 N; h! L& B
           {* L/ c6 [6 X+ Q" D4 z) L% o
              if((c-'0')<0x0a)
* F9 {" F1 o3 w5 |# e                  {3 U5 ]8 r# i. b! l
                    LED=segLedCode[c-'0'];
1 t# r+ V8 s5 u9 u                  } ( L" s/ B/ O( M* x% ^" |
                  else
6 t$ _# O; T- B% X9 o                  {  6 {. ^7 q* h! ~, H+ P5 g& S) z
                        LED=segLedCode[0];/ q- E) k% k' U' K$ H; c. P
                  }
0 J. a. z/ W6 S7 H+ c, k           }
5 ?0 n( j- P) m* q   switch(n)8 i. y  b& m4 M
   {. o  b) L2 O8 P+ h' ]9 c* y
                case 0x01:
% B1 w$ [: l$ c: w- t9 {9 b; \                {
' G1 @, }, @2 b. C4 ?4 x8 F+ l                  LED_CS1=0;& N  D. q2 S  p- t/ T9 K! A
                  delay_us(10);! `. g: W( v& j
                  LED_CS1=1;
; X6 J3 c! e' n- y6 |: X+ S1 ]4 b+ R% M/ _                  break;
, |0 P! U* x) K8 N4 U6 k9 F                }9 p/ U% W1 y. J; c
                case 0x02:
  s% V1 A( \! Y* w% t$ W& ^                {
! j$ p% s, H& s; H                  LED_CS2=0;! [' G5 ~0 w0 T7 i' u( x+ L0 J
                  delay_us(10);$ K& s4 z6 R, y
                  LED_CS2=1;
0 E. m* g1 _# Z( A$ z7 w* }                  break;6 Q1 ]) j4 H0 M% l" p
                }
$ U, U% T& c+ f8 l' a# W                case 0x03:
+ Q. |' b: r( b9 V' W  q% T                {* U9 E3 v0 t% h7 U; ^/ ^
                  LED_CS3=0;  y( u1 v8 A0 B
                  delay_us(10);2 ~, Z# j6 d- \6 b! j" B$ {
                  LED_CS3=1;/ ^% m- ^8 |2 ?; @- o
                  break;8 ~; c5 d! A5 u' i* W
                }
, e+ c* b( a/ f# v, O/ Q            case 0x04:
" u( v& s: N2 i7 |                {! f- D% I- ]2 o  b$ f: F6 ~0 f) T
                  LED_CS4=0;7 |  f, |. M( t- p8 f. M
                  delay_us(10);! g3 ^4 X. o  J3 M2 J
                  LED_CS4=1; 3 h  F( U- f- q2 I/ T4 u9 G" O
                  break;
2 W) m3 i! W/ z1 C                }
- D4 ?- [& J/ P( u) b6 t* [, d) {; i                default:* F" k* ~9 c4 f
                  break;1 ^9 O7 h4 r% |+ P

8 S  {. ~2 V6 R1 v+ M6 w   }! y1 ], k8 w. e7 Q- q% A7 [: Z
7 i- w8 I" n5 ~' P& ^& d( x
}
' e6 {! c" ?+ b4 Q, R5 i* U- `/*******************************************************************************************' y  u% p0 n+ r7 g5 X& h4 u7 y. m" `
*函数名称:ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)
8 I3 R& }4 w' E9 `: Z*函数功能:循环在数码管上显示缓冲区中的数据/ b! A( H2 ]& s! L$ i
*函数入口:segCode,指向显示缓冲区中的指针;segCodeMod,0~7位为1或0标示1~8位数码管显示的数据的类型(DIGITAL或者CHARACTER);segNumber,代表要显示数码管的位数
4 |* K& S+ n  D! l: O( r' Z; t*函数出口:无) @* V2 S, Y( E3 p- Q
*说明:本函数主要实现将显示缓冲区中的数据在数码管上显示出来$ t% c9 g# h# |# v, a. J5 c
*******************************************************************************************/                     
3 u7 ~, N7 h0 }0 ~* nvoid ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)
* X, C- M7 X0 [# n7 J" y{
, w: \0 b1 y/ g, X+ Q8 e6 d. e           uchar segCount;" V6 a: k' ?$ B' L
        for(segCount=0;segCount<segNumber;segCount++)
; }0 V4 ]0 L  l  N        {
( \6 @) {, i/ D2 n' J* y3 q           if(segCodeMod&0x01)           /*1代表此处显示任意字符 */
% ^6 m% S: E3 a0 k& a) v* D           {: S9 x4 y1 i, F% H. ~/ r. [/ X4 [: D
             ledWrite(segCode[segCount],segCount+1,CHARACTER); 3 \- u. q' q' c2 M
           }
- _4 _( [, Q* O           else
; Y4 A4 Z" l6 z# D           {3 X; r- Z2 E; q8 j
             ledWrite(segCode[segCount],segCount+1,DIGITAL);, j- w3 F: \* i/ m. h" r) n  V
           }
$ \% P1 o4 k8 }/ y4 M- p- g           segCodeMod=segCodeMod>>1;) c0 i8 l9 n9 G# h
        }0 t% q6 I5 h2 ^! |( o* l) F: O- L
}) h$ `" Y# S3 K9 b4 z6 H% a
6 `4 Q0 h) i  b3 M8 J( q

# S) U6 b: N; j: w9 L全部资料下载(含仿真工程文件和完整代码):
/ X2 F" `) J: P5 p8 R8 i7 c
游客,如果您要查看本帖隐藏内容请回复
2 T) Z! r+ e8 u- K7 ?

, c  q- Q6 R3 k
0 S" u/ `' T* [# {" o, |; b

该用户从未签到

4#
发表于 2019-9-22 17:28 | 只看该作者
多谢分享                            $ t  q  k! ]: p

该用户从未签到

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

该用户从未签到

6#
发表于 2020-7-13 02:23 | 只看该作者
谢谢楼主,感谢分享, m, c5 ]7 j" a! c9 Q

该用户从未签到

7#
发表于 2021-2-20 19:47 | 只看该作者
非常不错nice; o. k6 |0 g! q- X- I
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-24 20:20 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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