|
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
|
|