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

实现等精度频率测量 频率计+温度计 带仿真和单片机源码

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
实现等精度频率测量 频率计+温度计 带仿真和单片机源码1 @% b% E! m8 L7 Z( c

. ?; W. }" K4 A) C6 k6 b2 Y4 M

4 R( w6 B! V% l% g1 a3 F等精度频率测量,有源代码,值得学习3 |7 S+ f0 G9 c+ A
3 R* Z8 r6 v& ]" T4 R
PPT教程:
1 M( @% q4 S2 r. a0 B7 G " U* d- o4 y: P" t. P/ t

0 K! `* f  _& B1 H, P1 l4 X9 P1 g) L8 B% i) ]
等精度频率测量51单片机源码:

6 U( P2 v! }: ?) p( N3 j1 Z1 M#include"temp.h"
. ~: b  @$ X! O/*******************************************************************************3 {) Z- j! P5 y! b
* 函数名         : Delay1ms
% H0 Y# |: i8 L3 G1 E) D9 k* 函数功能                   : 延时函数
) M1 e8 |2 i" b* 输入           : 无7 q! |" J; I' t- Y# G! U- S
* 输出                  : 无. H1 E- F9 f* }: D( h9 G6 Q, R
*******************************************************************************/: Q: |! ]1 O$ W( I3 ~3 H

+ Q; N' B8 r# |8 n
5 Z: `, j2 q8 q) K7 x6 T5 q
void Delay1ms(unsigned int y)
0 P2 L8 f7 F0 ^1 t  [8 Z9 B8 B{
1 E, g) W& W7 J/ c        unsigned int x;
2 ^* v8 G5 [+ _# l$ H4 v" H        for(y;y>0;y--)
0 |7 G6 j) @$ [0 ~) {                for(x=110;x>0;x--);
) m+ ?, b8 `; h9 y. n}! c! B! `2 f2 c& j
/*******************************************************************************4 `# m* e8 B5 B! @6 i
* 函数名         : Ds18b20Init( M5 d2 V) a, y2 z  z/ u+ C
* 函数功能                   : 初始化
1 G/ y+ a5 k( n3 o4 I( q/ j% |* 输入           : 无
& ?" M& J6 o+ k5 ~8 S4 o* 输出                  : 初始化成功返回1,失败返回0! H- v5 G. F4 x
*******************************************************************************/
  q$ B! T! p2 K& ]+ S) t) }  x/ M4 g, `) l/ E

# o" }! u2 e- s7 y% l. z& punsigned char Ds18b20Init()$ u7 i9 P6 a* g0 }1 m
{3 y* }) R) n$ g' u) Z" t: w
        unsigned int i;: X, S- U3 L$ D2 ]. b
        DSPORT=0;                         //将总线拉低480us~960us
8 N5 d7 W4 G1 t7 Q  P2 T        i=70;        - o7 b& ]# O; _% [  H
        while(i--);//延时642us
* o- i* A* f& G) h) Y        DSPORT=1;                        //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低7 w- J- x+ U" U& I) [
        i=0;- }; l* R7 t1 n4 h7 q+ ~
        while(DSPORT)        //等待DS18B20拉低总线8 Y' b- B2 N& w6 p% ?" u; K
        {$ a# d8 {* f# l3 Q8 D4 I. K4 t
                i++;( L- a( D. E& D3 ?  [
                if(i>5000)//等待>5MS
1 Q5 `. W% q7 G3 T                        return 0;//初始化失败        
& F" _) w9 X/ D/ a+ t        }2 L" `2 H5 R( H0 G- H
        return 1;//初始化成功
# {, `$ a$ c% u}
8 [$ B' U) e- k
+ L; P0 U  p  Y# ]2 [

. F% w6 g) s! C2 W! z3 V/*******************************************************************************
! `/ n1 s6 m* L, {+ K6 z* 函数名         : Ds18b20WriteByte! F, M! X# H7 r& P
* 函数功能                   : 向18B20写入一个字节
0 Q$ E! w# y# C" N6 x* 输入           : com' [$ J" |. c. \7 o6 ~6 I+ i) B
* 输出                  : 无" C2 R4 N, \' }  Q0 B# ?* a8 ]/ {
*******************************************************************************/
. X. O' l2 H; n: }" ~
, U7 U- ~( w9 p& K' ]2 z! ?
4 a: n9 f: l& I# Z3 t
void Ds18b20WriteByte(unsigned char dat)" H. q, F! W0 H1 T4 h
{
2 i( A! [6 o8 q0 d# I        unsigned int i,j;1 Z1 B2 }& k% U$ T  ^+ y! s
        for(j=0;j<8;j++); C- Y9 w  h! C. I0 v) w
        {0 l% ?) X9 i( t; p3 S
                DSPORT=0;                        //每写入一位数据之前先把总线拉低1us
6 r) }5 B* q, {                i++;% U4 z$ ~) p2 r% j5 _
                DSPORT=dat&0x01; //然后写入一个数据,从最低位开始$ M: K3 D' n) d% F; n0 c' |3 q
                i=6;* ?0 Y* }) U* B! N1 j% x9 V. W' }
                while(i--); //延时68us,持续时间最少60us: `! Q  e( t* k
                DSPORT=1;        //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值- H9 e4 ~% R! W0 T
                dat>>=1;
( e  `* S* L# z        }
' R: M3 K- I  [$ j}0 H3 ^3 |/ c0 [; H3 F6 ~% D" ]& ]6 Z
/*******************************************************************************
& H/ R& L& w2 R! \% ]* 函数名         : Ds18b20ReadByte
+ B& n) d  d( [" W& S2 u* 函数功能                   : 读取一个字节
1 Q: R% A+ H: F: c* ]2 v' M* 输入           : com
* ]( _& j$ ], ]- \0 s+ U* 输出                  : 无
3 u+ q! r  _+ O5 ]: I. }7 A*******************************************************************************/) ^4 q4 B" y) V+ o8 G; t0 u9 O
" Q% P: s/ f) j& A

( m- @' F* R( ^' Z/ i) [' j
; i- k  R6 H4 T0 s3 V3 I3 l

. p0 y1 L) ?: Z4 ~% V) Munsigned char Ds18b20ReadByte()5 f: U* A4 I$ C- Y
{
1 G" U* S& l! ?$ L% k  o4 F1 ^; L        unsigned char byte,bi;3 A* L. Q9 l: t0 B
        unsigned int i,j;        
% A5 f* b5 Z8 W  v        for(j=8;j>0;j--)4 Y  h6 [' R& o/ n
        {/ L7 y4 E& k# _; p# W; Y; [& s; n9 z% [
                DSPORT=0;//先将总线拉低1us2 d/ \: |- m% j0 a+ ?7 D# O  i
                i++;
: g" B% M1 U7 c) j7 O! p3 M                DSPORT=1;//然后释放总线1 X& o* f/ B! s+ A
                i++;3 _& W7 W1 B- g! h5 W- w: |/ U' H: I
                i++;//延时6us等待数据稳定
+ M- ?9 M/ U  q/ ]8 m& C2 U! B% ^6 G, ]                bi=DSPORT;         //读取数据,从最低位开始读取/ Y) g! ~6 ?4 ~8 m  d2 Q, x( A
                /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/+ {; w% Y$ M) h
                byte=(byte>>1)|(bi<<7);                                                  / D# T, C6 n- O& T9 \. x0 U
                i=4;                //读取完之后等待48us再接着读取下一个数
3 \- l6 `4 s8 j# x7 S& c$ m8 E3 y                while(i--);
  o, O: E5 [" X+ A7 w9 {        }                                9 \- A, n& Q- M& V! \5 _/ G6 M
        return byte;7 R) j9 n% o$ g6 E
}
7 F3 X$ M- U7 M, r* y/*******************************************************************************
( G/ @& {/ a' v* 函数名         : Ds18b20ChangTemp: _2 d7 F- u; a0 N4 n5 d
* 函数功能                   : 让18b20开始转换温度
5 ]) Y8 c9 b" @  e* 输入           : com  t! q+ u' ]: h/ e5 n0 F% X
* 输出                  : 无+ G" x5 A& O9 `- \3 g8 R3 `- K. W1 K& ^
*******************************************************************************/, |& K! w5 E0 r7 n1 n% x5 c2 Z
# J2 I- Y5 Z2 E2 d

* V  ?' k& {4 i1 f  u& hvoid  Ds18b20ChangTemp()7 U7 K1 S! C  ?( C, A
{7 O" ]( E" C' X" c& [- R; Q4 o
        Ds18b20Init();
2 N- I* K  w. m        Delay1ms(1);
7 u- J3 @% J4 L9 b% Q0 f        Ds18b20WriteByte(0xcc);                //跳过ROM操作命令                 
6 |( I: F5 s$ i* y2 X2 J  x& h2 T        Ds18b20WriteByte(0x44);          //温度转换命令
+ l8 f, z6 w3 P        Delay1ms(100);
2 a2 c, f3 G' k2 G& v; ]( Q& y* n( P}
  [6 q5 o) h% q$ j7 o7 f, _& G/*******************************************************************************, B8 e' i# C: ~% g& N* H: K
* 函数名         : Ds18b20ReadTempCom
/ `$ A- f$ k& h# i* 函数功能                   : 发送读取温度命令
' X5 v; d2 H: |9 W" T( D7 b- v1 m* 输入           : com
$ k& W% o* V- y8 B# L: O* 输出                  : 无6 z6 H! o4 ]6 P
*******************************************************************************/% |% r. t  `; ?2 T* D" B) n- @
. p8 T1 M- b/ ^, y. D
$ a5 m; c" a8 t( i( l# U
void  Ds18b20ReadTempCom()) m9 V9 f: k9 q3 {$ e- x
{        
+ @! t  Y; [6 c+ {9 r) t
2 A, z- h( _+ U8 b5 Z

, E3 a- d! I/ g        Ds18b20Init();
, g( y2 K' l+ A# i/ \+ p        Delay1ms(1);1 g2 g- q3 @" y( m
        Ds18b20WriteByte(0xcc);         //跳过ROM操作命令8 ^. ~! r+ Y4 O2 V4 g: c  g# [
        Ds18b20WriteByte(0xbe);         //发送读取温度命令
+ M5 z4 a/ n/ M}
) z, g& Y3 M4 F: l/*******************************************************************************
6 V" r5 \; |4 [. o* 函数名         : Ds18b20ReadTemp* r0 S' i+ m3 J7 U3 ?
* 函数功能                   : 读取温度" K( a6 ~$ R1 \! Y# \1 G5 d$ N
* 输入           : com
0 g& z. P( T+ [* 输出                  : 无: l2 R9 d5 w* _; @
*******************************************************************************/
% G' {5 @& ~; n9 s1 A) m/ [; V8 |/ i4 @9 ]! E9 n) c$ L" {
8 W5 @& V$ g& R4 Y2 v
int Ds18b20ReadTemp()
8 }% C: s+ t  _{
7 f# v( f3 q/ b0 l/ s        int temp=0;7 \, p; l7 r. l9 o
        unsigned char tmh,tml;' m# G! z4 C9 }1 D' U
        Ds18b20ChangTemp();                                 //先写入转换命令
: C7 n8 F0 o, h3 ^$ |2 [# w: L7 ?        Ds18b20ReadTempCom();                        //然后等待转换完后发送读取温度命令) P  v, n" }" h
        tml=Ds18b20ReadByte();                //读取温度值共16位,先读低字节2 ^) @- `$ O- }0 {( C# W
        tmh=Ds18b20ReadByte();                //再读高字节5 h% X4 P9 q6 C/ |5 W
        temp=tmh;1 V  ]' G  A) Y" Z4 u
        temp<<=8;  n6 C3 }% F4 V  D! m: j& e: n, J
        temp|=tml;
. E( ~! i- f3 c: g, S3 Y5 e# Z5 F        return temp;
# i3 q! i4 H2 v" |}
0 @, M! F5 \+ i6 P) @* d" B1 ?3 x# Y+ O2 v) q  f1 R
等精度频率计全部资料下载:
3 P  H+ m3 B# Y2 v& ]
游客,如果您要查看本帖隐藏内容请回复

4 k; F& W% U1 I6 h6 Y+ A
: f( X& @( e* L8 H+ C: F3 P

该用户从未签到

2#
发表于 2019-1-21 11:25 | 只看该作者
好东东,学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-18 03:09 , Processed in 0.078125 second(s), 26 queries , Gzip On.

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

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

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