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

自己做的简易频率计 单片机源程序

[复制链接]

该用户从未签到

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

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

该用户从未签到

2#
发表于 2019-1-21 14:18 | 只看该作者
不错,看看楼主是怎么弄的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-22 03:39 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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