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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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