|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
自己做的简易频率计 单片机源程序
; K7 Q/ o7 N5 L9 Q% J- U5 k7 s: z0 D9 e
# Q& m4 B* @% a2 j
希望高手指点一下!
3 U1 Z8 S' A( \- B: q完整代码下载: z: `0 q3 ?- r. E) V
6 |2 O( q6 y3 [% P
, k/ Y/ w1 d6 L) r* l
. f: J2 M7 L% k9 P* S主程序预览:- h6 U$ X) {1 {% F! K
#include "reg52.h"
! e$ t( N B# S/ R8 u2 e#include "lsh.h" ; n' t4 g0 _" s3 \2 ~- a
#include "intrins.h"
5 G0 M% S5 `( `7 X& g* Y- y
1 }1 J; [+ o0 ]/ [! msbit SER = P3^4;# X$ a: @& \$ {( k, |" b4 g! f
sbit RCLK1 = P3^5;
, l' ^. Y, ?! S5 h/ M' osbit SRCLK = P3^6;5 {0 [, t! N$ s) R0 E1 c o
: p6 U. W3 g- B: @8 b$ w) A: K0 O! s
uchar code smgduan[17]=* r( a& I, j2 X* ~4 z
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
) D( Z3 n& b, H& ^ 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值0 J+ Z' P5 m4 V, U ~
5 I& D+ U) l% U& guchar code smgwei[] = //--- 数码管显示的位选通段代码表 ---
) I; q9 p0 D4 }8 Q6 j# F6 `( i{
3 b1 N3 l( J! Q0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
. x' c0 F' r7 y};
- T& K( d. g/ H- S( W) |
" D' U* C7 A1 S# N+ R4 Iuchar DispData[8];% u+ ~! C& N0 A5 M1 w7 e
~+ F+ i6 s5 W6 y- a; o2 \% I7 Y
//--定义全局变量--// @% }7 w1 F6 E g- Q7 i) g$ n
ulong Freq; //用来存放要显示的频率值
" x, f3 v# K# O* c0 Dulong TimeCount; //用于计算1S钟的
. x8 T+ p# L4 z7 m/ }2 R E7 I ^+ S+ Z
void SerialSend(uchar DAT) //--- 串并转换函数(595控制数码管显示) ---: L& Z6 S8 k' F$ ~3 O
{# Q' V9 L6 N$ A
uchar i;
) @, @2 y, o# [0 | for(i=0;i<8;i++)
8 H v0 ?6 L! z" t* n2 G {
0 `+ n7 V+ S. t7 Z9 G* H5 } DAT <<= 1;) Q8 }6 J: |( W/ v: Y
SER = CY;
* d: p8 J! K# W {4 e, W- T SRCLK = 0;( U+ f2 d0 M' \5 B6 l
_nop_();
) e) d2 G" Z0 ~" [- M$ `$ K _nop_();
$ }+ z N0 _) m SRCLK = 1;
! n/ D. t" h: U$ \# w+ T. H: O }$ f4 Q7 p0 r3 A4 D2 N; \) P1 v" Z7 {
}
/ t- E( R8 z7 K8 q& A) v) x, Y3 M; e* \; E$ q
/*******************************************************************************
0 |5 G5 z7 R7 T0 B- o* 函 数 名 : DigDisplay+ U9 ]+ O; u2 J3 k5 b3 F
* 函数功能 : 数码管动态扫描函数,循环扫描8个数码管显示
$ X0 t9 d! r" z' m) q( G*******************************************************************************/
- g9 ^1 W, O* e8 H1 I j0 m; Dvoid Scan_Disp()2 l1 N& }1 _3 O, s" q4 l1 |- m
{' I' y. U: [/ O( {
uchar i;
. h7 \$ N1 T0 k* W9 S% X, }4 i& [ for(i=0; i<6; i++)5 z' G; w4 l/ t5 [/ M
{
C) m0 }! F! r) ^- t, O RCLK1 = 0;
5 [0 P8 Q {0 i: W SerialSend(DispData); //--- 送显示代码到串口引脚 ---
# ^6 Y0 p( c/ Q( O/ J' ~% N SerialSend(smgwei); //--- 送选通代码到串口引脚 ---" y# U" k/ c+ r" _+ T" c \
RCLK1 = 0;
7 b8 e* c' n5 J1 k* z) X6 ~ _nop_();
- c% Y0 a9 b' P& @: V. X _nop_();
2 p% t2 w' Z3 @" Z RCLK1 = 1; //--- 扫描计数变量加1 ---
* h/ M; @6 K6 g% P$ n& d9 f* l Delay(100);
) c) F6 r" q( c1 x* M X }
- c, B( R" K9 m2 g; k}; G' o5 i" g" r; I3 B
/*******************************************3 R; g3 P+ \7 e
*函数名 :TIMER_Configuration8 W5 o! T. S5 v S, Z
*功 能 :配置定时/计数器T0和T1
& j/ l" [( h9 g$ j0 T* ~*输 入 :无
& U& G" Q/ V- f7 C2 f% t: I*输 出 :无
8 m8 J9 W5 ?. R1 m+ J& S2 V( Q*******************************************// Y" E. v! |( |. f8 |
$ E* v' [3 P' M, f" h) \
void Timer_Init()
/ m( H3 g' _9 X% f* c; X{3 i" ^8 b$ b2 L' z! Q/ B
//--定时器T1做计数器,工作方式1(16位定时器),只由TRx打开计数器--//) Z5 `& i. [/ b1 }9 j" `
//--定时器T0做定时器,工作方式1(16位定时器),只由TRx打开定时器--//
5 a' [) N% ?9 T9 Z- G: D6 Z! q TMOD=0x51;- Z7 g: G( N7 C: c2 {; S! y
T2MOD = 0x02;//选择为定时器2模式,工作方式1,仅用TR1打开启动。) E, y6 T* p2 [+ D
RCAP2H = 0xFD;
# f% k" U/ j0 H+ p4 C! |" |+ B: b RCAP2L = 0xC8;
P" {' c. ^5 E4 ~* z; V, S
2 g: Z/ q0 Y+ }3 }0 X0 E3 C% { //--设置定时器晶振为12MHZ时定时50ms--/// A. I/ e" I4 h7 O# j
TH0=0xD8;2 n1 Y' l' z. W/ L
TL0=0xF0;
' m' k& {) \& p& I- e7 S( C) @3 p# N7 ?2 `$ a' P7 J
TH2 = 0xFD;
2 P$ q* o" J# I1 R2 v: P8 P TL2 = 0xC8; //1us3 u* s5 l! G# O4 q3 A# M
& G0 R9 ?' O$ t1 i+ K" `& l# x //--打开中断-//% [8 [; z1 n+ e4 V: x" A
ET0=1;8 F; q) z" I" b. ~" S% B# k
ET1=1;
& K$ Z, U: ~- _% c ET2=1;//打开定时器1中断允许& o2 S9 t8 c& ^+ X( I
EA=1;
& T# A* B* c }4 j! I. q1 i: Q4 B u. z: l3 F
//--打开定时器*/* h4 e% y* K, M' ~
TR0=1;
" \5 c1 ]& q4 k w TR1=1;
8 ]" }4 C1 p% n+ W TR2=1;//打开定时器
8 Y( ?# R3 q: E7 E}) _/ G$ z, B0 k' `- \6 A- `
! P) z" n; p$ Z' N) b& V" b& d0 H* S/*******************************************
9 f' p3 B, [3 Q0 Q9 _*函数名 :Disp_Fre# Q9 e% E$ X6 J6 Y) Z4 T
*功 能 :显示所计算的频率值
+ X0 i ]4 f3 x1 r+ {1 e*输 入 :无: x; [* J$ ]$ {$ l/ k8 G; |
*输 出 :无
# C2 S6 f% o7 t( F*******************************************/9 Y$ t) }" E- i$ g/ P3 }) f Z
void Disp_Fre()
. W. |2 s1 m2 z, y{
% }! K& H. [9 Y) J if(TR1 == 0) //当计数器停下的时候,表明计数完毕9 Q( M9 ?# Y4 L' p* L) Y
{
( p7 B0 a9 Y7 g Freq = Freq + TL1; //读取TL的值5 l. S7 y( g, @3 H- U. G
Freq = Freq + (TH1 * 256); //读取TH的值
- V( }4 P1 d& R& s0 e
" D; {2 K% P3 e+ J% Q# B5 k //--求频率的个十百千万十万位--//
. z$ }8 F% I) B2 i0 s$ O DispData[0] = smgduan[Freq%1000000/100000]; . o! U2 V; L; O
DispData[1] = smgduan[Freq%100000/10000];
% v8 A" i/ M6 u1 j ~+ r DispData[2] = smgduan[Freq%10000/1000];
2 s7 G; y9 D4 [ DispData[3] = smgduan[Freq%1000/100];
: T8 U" P7 {+ G& D5 N DispData[4] = smgduan[Freq%100/10];
3 [3 `, _8 f* L D" v DispData[5] = smgduan[Freq%10];
( _' j( D# K O% |9 [% r
, l0 C; e7 v* M //--显示完,重新计算下一次频率。--//
9 t; f. Y6 O% P( J! G5 X( x Freq = 0;//将计算的频率清零7 D% g2 W4 D5 H) h1 \2 p
TH1 = 0; //将计数器的值清零- j, _: L L0 G
TL1 = 0;# v" Z" Y( Y) o' f) {
TR0 = 1; //开启定时器
; i7 H. L, x( m% h: L TR1 = 1; //开启计数器 $ Z" e9 [5 \: \7 K& k! `
}$ q S( ?# C, F. D: x9 j% G! J1 |
4 q/ m% r6 ]. r, U6 T# _" F% \
//--显示求得的数值--//
) S$ M% g- C2 I+ e Scan_Disp();0 i+ I6 t. R. V9 n
}/ a2 ^1 J3 H) @6 H& M& ]: W
# b7 J; y% M7 S: r! L) @; I/*******************************************' o! @& `: v" b, }
*函数名 :Timer0* @' l s& z3 Q# x D' }3 U: [
*功 能 :定时器0的中断函数' R7 A2 R' C. L
*输 入 :无% E6 H/ H U1 ?
*输 出 :无8 r' q( e) R8 R
*******************************************/
6 }! [$ J# m6 i4 F+ F3 L4 ^7 U6 u# b8 y9 i8 o7 s* P' B
void Timer0() interrupt 14 Y( m% Y9 C$ y1 j- d3 c. x
{9 {- z$ D* K- P# @; B2 V
Scan_Disp();
2 T0 z" }2 [# T. C$ M$ R) Z& y //--12MHZ设置定时50ms的初值--//
: o/ D4 E1 u/ P& n& R: |: r TH0=0xD8;
- j }: P5 w- z/ N6 k" h+ x TL0=0xF0;
* g% H( T8 b) L, }8 o8 f8 Z$ ]6 @) m4 a( k7 X; b/ s+ U/ I2 Z
TimeCount++;
) ]* [) Z* b" O, e- g' d- C$ ]- B if(TimeCount==100)//计时到1S' D& j( S- O2 H+ S: y
{
$ Y3 C, n2 d0 E* p1 N( u TR0=0;4 U+ q# _2 f+ e' a
TR1=0;
6 K2 i8 ^: i+ S& s TimeCount=0; 3 y5 }5 g) _0 ?% H' @+ B* _0 s
} 6 K4 ~8 n- d+ }3 M
}* S0 Z. ]8 M( w* r! y. M l
/*******************************************& o# c, E; J2 \- o
*函数名 :Timer1
- c& J, R! {: l; j*功 能 :计数器1的中断函数
8 i1 h% c* o9 h: a: D*输 入 :无
_1 }: P: X6 V# L# b2 R2 _/ a*输 出 :无' l7 o8 Y( N! E4 [) g3 E
*******************************************/7 t8 R2 c0 I9 i7 Z, l
4 N! s: A7 b7 m0 L! kvoid Timer1() interrupt 3$ _; W2 P" r5 `, h& V D3 p
{
- k; a" P# J& w$ C //--进入一次中断,表明计数到了65536--//
1 r: c6 x( ^: h1 X' R% N/ A X4 Q7 @ Freq=Freq+65536;
4 N" ]7 q$ e/ f. O* T. N}
0 j+ Z7 h7 T5 e* V
" L) T4 j7 _8 P# z' L3 nvoid Timer2(void) interrupt 5 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断
* @6 v; D+ Y& n) j' {7 n/ \4 g{7 \( P# ?" @: U) m" a
TF2 = 0;
( q' E- a* M2 j9 ^, Z
, ]# Q2 S: g( t3 O g}
1 i3 A+ J5 }, j+ U. t2 B* I
: X/ P$ b; o6 l/ G- W0 V/*******************************************************************************9 X- s8 A! \5 a, Y' { t/ c
* 函 数 名 : main( d* K3 ]9 M% A# y, z; i* a6 j
* 函数功能 : 主函数5 c3 J6 u, V, H& H
* 输 入 : 无
! M' K) y4 g# ?: l k* 输 出 : 无
) Z( l/ b# x' P*******************************************************************************/1 f7 k5 g8 z X" {1 X: v2 B: I
void main(). L9 p1 Y, [+ N9 _+ x5 L
{ : p( e! y# g) H4 Y* E+ |! g
Timer_Init();
, Q/ P5 m, ?2 q7 i% ]2 A while(1)
: I. A' h9 `6 G; G% l. l% U6 f U {
0 ~% m7 i0 [& D' ~8 r6 X0 y Disp_Fre();
0 P- t5 x3 Z# u* { }
" }9 D1 |) M& B& X7 M}$ P0 X7 U# r; l& c7 d
. o2 e+ Q. ?/ J' l5 F
|
|