|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
自己做的简易频率计 单片机源程序+ \5 o# G1 L' ^/ y
& [ Y/ D7 r6 |/ Y
4 P; c) e+ {2 c8 K8 a& B( q1 {
希望高手指点一下!% C, O; G* ]; G7 a6 V
完整代码下载:4 b4 ]/ f1 y+ g% P
1 o; u' Z" l: Z' }% k
7 E' u1 e) d* J7 T0 H8 [
+ u6 e( V* u9 ]3 {3 R! x1 {主程序预览:* n0 u3 w" j+ G6 w
#include "reg52.h"
) u R. I+ c. a4 d- M#include "lsh.h" + J6 B5 S' a/ S" s
#include "intrins.h"
# K3 H; a7 D: n8 g. D2 v: z( M0 ]$ O' S8 o' X5 S
sbit SER = P3^4;
& ]8 Q1 R7 K2 A8 N# @: @sbit RCLK1 = P3^5;
' q+ |% Y' ~2 Esbit SRCLK = P3^6;; L, W- q1 z* t' u8 w7 i1 U
. h, c5 V; V# R: l
uchar code smgduan[17]=( T- ]( Q1 s9 X9 A0 Z- o; n# L, q7 [
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,8 J' K( `6 e: M1 S0 G+ e$ [
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值6 Q2 N& U: _3 A2 w4 u1 y
- G' w F4 w# l, S1 N
uchar code smgwei[] = //--- 数码管显示的位选通段代码表 ---1 A ^ M6 W- a. S6 c2 K D; w
{
4 z% U. T. s$ k* U* j0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,* _9 u0 g9 R8 Y, D" F
};+ r: p. ^3 \* H5 T& V
: F% [7 c. Z; b% \! D
uchar DispData[8];. _) ]/ n" [" A1 c8 N9 I- t% r" W
9 E% c( O7 e7 i! f5 k5 v3 {& Z//--定义全局变量--//) I" G- }5 r# J" m3 d
ulong Freq; //用来存放要显示的频率值
( y, Z7 c" s; l1 L; Y8 nulong TimeCount; //用于计算1S钟的3 A7 Y U7 o# S7 U B% ]( m( M
7 r: K9 ?* e/ a" G1 j1 A3 Svoid SerialSend(uchar DAT) //--- 串并转换函数(595控制数码管显示) ---. _5 y$ I: g" r' Q5 s+ P* A
{
}! S: G3 O t& {8 M uchar i;! F6 ~) w) ]$ Z2 o9 W4 F
for(i=0;i<8;i++)% K9 R- l7 R" E L* j2 v% Q
{
! p3 v* R, O, c% b) f! g& [ DAT <<= 1;
) c' t5 }/ I, U4 Y- K. h6 @2 u SER = CY;" j$ N1 u: V; D$ e9 @- k
SRCLK = 0;
% V `+ r, h8 t3 x! { _nop_(); 0 C9 e1 W3 s- |. H; M6 r ^: p% R) Z
_nop_();) E7 l" D2 A4 E0 B
SRCLK = 1;
$ l, `/ C' p5 q" F9 ^, g }% J! j/ V7 p; f1 J; R) e
}+ N7 ]. e% H8 @% y& @
8 j) a9 d& U( l' ]/*******************************************************************************( l& X+ V( g8 ?( _+ b7 i
* 函 数 名 : DigDisplay
R8 W: H- F# f2 Y' ~) l* 函数功能 : 数码管动态扫描函数,循环扫描8个数码管显示
6 l& E) y h! K2 t. I/ L) o*******************************************************************************/$ K! h# K& R9 q5 ?8 t
void Scan_Disp(); @3 [: _8 u: b& ?2 n7 P7 u+ M' c
{/ r; v- [; J* R" P
uchar i;
4 s! Y& @' k9 {% H6 N+ } for(i=0; i<6; i++), d# Y1 m# |2 S: A1 l# w
{
# t6 Q# \; H8 R+ J+ P3 p0 `* z. M( I RCLK1 = 0;
' _' ?; X4 G+ J$ d& O; f: D" k* P2 | SerialSend(DispData); //--- 送显示代码到串口引脚 ---
6 T4 v! r; J; \) O3 P SerialSend(smgwei); //--- 送选通代码到串口引脚 ---
6 A& u$ i8 N. J7 ^ RCLK1 = 0; ; r- }0 w& I+ A& ^9 ^5 s6 t5 k+ |
_nop_();
P: b9 [4 |: i _nop_();9 f+ a, z5 x2 Q$ S# S
RCLK1 = 1; //--- 扫描计数变量加1 ---
6 I/ i. J: e: U, P Delay(100);2 F7 [9 q0 u! L9 j
}
( ~" y* n# i U}+ i6 [% t9 j5 T7 C, A3 ?
/*******************************************
% h- q/ g3 R+ W% w3 P R2 h*函数名 :TIMER_Configuration
: z$ |8 o% B3 g0 s5 a0 n*功 能 :配置定时/计数器T0和T1% }, O: p/ p$ ~2 _3 N$ S4 a
*输 入 :无
9 _+ E$ M3 \6 u0 b*输 出 :无
$ M1 x" m+ I; @8 @*******************************************/- {/ G" M j2 b# |# T5 `2 ?
2 F8 c& Z$ _4 ]6 Evoid Timer_Init() J" t! T: e% \* S
{$ V4 [# ^/ |( n3 q* X/ s5 U" U
//--定时器T1做计数器,工作方式1(16位定时器),只由TRx打开计数器--//' x8 h) a5 B4 m0 g& X6 }
//--定时器T0做定时器,工作方式1(16位定时器),只由TRx打开定时器--// 2 Q: b3 h, [! A, Q/ \; X
TMOD=0x51;# ?; C; m! D- o7 P( ~
T2MOD = 0x02;//选择为定时器2模式,工作方式1,仅用TR1打开启动。
0 e7 o7 T8 z. S8 a5 u7 Z6 m& N- O8 R RCAP2H = 0xFD;
! x; i4 o, [& d" {+ T: L& F RCAP2L = 0xC8;7 i$ i: q& Y6 B1 H
1 T+ N1 r$ R# r7 L/ e
//--设置定时器晶振为12MHZ时定时50ms--//$ m7 t4 I& F0 ?/ W. e8 }- }
TH0=0xD8;0 a w0 c/ \% T7 {/ v( a
TL0=0xF0;7 w; B7 u7 H; _5 [: A& }% W
% K: g3 T3 Y1 a& y9 n# b% @5 e7 i TH2 = 0xFD;
) I+ b, s& y0 j8 K" L TL2 = 0xC8; //1us
+ W% F3 I ?' d2 a+ J; i' v) s `+ U, J8 ]1 r
//--打开中断-//0 Y- K+ I' u1 \, e A3 F9 @
ET0=1;
: M- j: }& B5 n4 \/ k7 M ET1=1;) E" s, {1 l2 f, T% `2 B0 S& d
ET2=1;//打开定时器1中断允许# \; L1 I, l) q' R. d; M
EA=1;$ h" A+ _4 A0 m; O8 P6 g
, T) H4 K) \, d5 C //--打开定时器*/7 _, U, ] `6 f3 V8 s9 e, O
TR0=1;
3 x8 G8 |6 d: B) @6 R. E. u TR1=1;
- p4 Z' z2 T9 \/ f- _+ E TR2=1;//打开定时器
5 |: D. z9 b* D5 Q$ j}& i$ y, |4 w- [+ C C3 f) G
4 P( K+ E, ]% a, Y+ a; U/*******************************************% N$ X, B$ G8 w
*函数名 :Disp_Fre I) u: L0 |" n. J1 t
*功 能 :显示所计算的频率值7 K8 S+ v }% n+ i S/ w
*输 入 :无# j6 x9 r- ~ k/ g6 J
*输 出 :无
. i5 w. ^! V! e( G4 S*******************************************/
$ O- S M" d# Z0 e* Q void Disp_Fre()7 c( k- N5 \# w4 W* w, [$ D
{- h q1 Z- u2 D _; `3 F( ?7 l
if(TR1 == 0) //当计数器停下的时候,表明计数完毕: V! a; {: Q$ W( D
{3 O9 k4 u2 z7 X' L( l
Freq = Freq + TL1; //读取TL的值+ G- ~" q M6 J$ h& R( O
Freq = Freq + (TH1 * 256); //读取TH的值- h! Q: w( p2 G8 E5 g
( k- x' m: F, v5 Z/ F. A
//--求频率的个十百千万十万位--//' [+ p& Q. A+ a; `2 G3 i T* @! Z
DispData[0] = smgduan[Freq%1000000/100000];
( ?6 {: N: x& G3 N2 k3 P# ~0 G& e" ] DispData[1] = smgduan[Freq%100000/10000]; % x2 E l& C# K+ @3 V
DispData[2] = smgduan[Freq%10000/1000]; 9 N6 p' `4 T1 l; [! y
DispData[3] = smgduan[Freq%1000/100]; / \9 }6 ~, X, ?; V1 T I, I) U# }
DispData[4] = smgduan[Freq%100/10]; o/ f+ Q1 D8 V) j8 V ]
DispData[5] = smgduan[Freq%10];" A& _5 a+ n. U. d
9 p% r$ S# j0 p/ K8 @ //--显示完,重新计算下一次频率。--// - H, N3 e* b* |; v
Freq = 0;//将计算的频率清零% W' J2 _8 e+ T
TH1 = 0; //将计数器的值清零
/ E; b4 c/ y( d: Z9 r' c9 o TL1 = 0;- B8 ^9 A9 [$ O8 O9 `% R! F
TR0 = 1; //开启定时器
. R* s. R& t" \% U2 K. J TR1 = 1; //开启计数器 0 K! N2 M! M% k/ A+ h* }+ W4 l& o
}/ A4 s# T, J0 ]5 m7 t+ ?( U
- c6 v" x/ d& O% g4 |: B- s g8 ~! d' |4 s
//--显示求得的数值--//# r) y$ \% n6 |$ Y! m& E
Scan_Disp();/ h$ v9 R" U' y3 J+ {8 T
}
& x! Y) i$ {7 O, b4 `
. V- L6 E5 h* A8 d1 t5 n; [' |0 e/*******************************************. {4 ?5 |& G1 o, ^0 Y2 G" O
*函数名 :Timer0( o2 U! i2 M5 O0 Z! Z0 I
*功 能 :定时器0的中断函数
, z) O1 S' g4 V& U7 Z% |+ y*输 入 :无
; _9 W8 ~6 p8 Y R*输 出 :无+ g3 J' A; M' |+ {$ _- M. L
*******************************************/- h1 G$ h$ K! s. w
# n" [9 @5 Y2 M
void Timer0() interrupt 1
]7 I2 X* c+ J% P$ l7 f$ ]- n{# x( B# C( M) v, y
Scan_Disp();
G1 S2 @3 s; b) N //--12MHZ设置定时50ms的初值--//
( v2 S! J% J1 A5 n/ f' [" P- ^# e' ]4 V TH0=0xD8;+ l4 M0 b$ E4 b" }+ N
TL0=0xF0;0 x( z/ \7 U2 w9 o: x. f6 l, P
& k) V( l) k* W# o- w c2 O) U! ~ TimeCount++;
6 W! Y0 j+ Y* \% ?) l9 C if(TimeCount==100)//计时到1S' |* B8 f, ~7 [# m
{4 r0 V3 r8 C: B" h
TR0=0;
) }5 `# E# k" n) h/ O6 B TR1=0;% S/ _: [1 ~+ M
TimeCount=0;
! ]5 W0 ^/ \9 I3 w }
: M' R1 C; H2 `% M}
8 p* r& A" b0 y1 X2 o ~/*******************************************
' Y& Z2 }" N, e*函数名 :Timer1
' s5 ?& i0 i0 K) q& p*功 能 :计数器1的中断函数4 e4 W: h+ J. k% W/ m1 W3 k0 p
*输 入 :无8 I& `8 Q% {, ~# \: o) u7 r
*输 出 :无; v$ c- D n, E/ G
*******************************************/9 o! E: W" z4 ~0 t2 R0 n! |
( Z* f/ B! q# o. c
void Timer1() interrupt 3
8 J% h1 c) Y3 `* C& E2 S{ . x$ v0 f& I) a# C6 i. @, L
//--进入一次中断,表明计数到了65536--//; l: b, ]3 k) _$ A+ l
Freq=Freq+65536;
. \3 U2 u5 y9 } }. y0 j* V}
0 E3 P# f3 T: ~: h1 H
4 H3 R1 V9 a" Q& c D# Rvoid Timer2(void) interrupt 5 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断' m! Y4 Z/ n" A' x% M% x
{6 S3 N4 X+ O/ |3 d: m
TF2 = 0;
z0 O- S% v; c" F9 X, L% H* b7 h1 ~- p L; A l/ i% ^/ P. t
} |$ ]% Z( A) |+ }) y- z
0 |" v. b* ^; J" Q
/*******************************************************************************
6 o# |% {8 Z6 \3 H* c9 y7 @- Q5 T6 U* 函 数 名 : main
: g0 r+ o5 {1 W% Q9 R* 函数功能 : 主函数) ~ Y3 s! R: w( C
* 输 入 : 无+ R9 K* B5 W$ t% t9 `
* 输 出 : 无. [6 z/ E/ {2 r \: C1 z/ t
*******************************************************************************/2 d; X+ S/ a9 R. c$ k! {0 E5 K
void main()
8 C$ N# t( Y" S. g{
3 U! y9 y* k# \- w! k Timer_Init(); " c) c& H1 w! f5 ]; Y
while(1)) P' S+ D1 D( \( Q9 y
{# I( g/ S, G V2 b$ ?! O+ q5 ~( Y
Disp_Fre(); ( f5 O0 t3 V# b$ D1 t! k- S
} ! ]8 t K* R' i f
}
+ d b" `- e& z" i
% ^9 g& B, d7 a& o |
|