|
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 c2 T) Z! r+ e8 u- K7 ?
, c q- Q6 R3 k0 S" u/ `' T* [# {" o, |; b
|
|