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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
实现等精度频率测量 频率计+温度计 带仿真和单片机源码
, R9 A7 `2 l* ]! `4 k) k% t/ T. z' h# x7 d- M" e" p
' u- B9 Z2 G5 y6 }) j) O
等精度频率测量,有源代码,值得学习: A' D8 J. K" V) I3 g+ i6 h$ ?
5 k7 h4 I3 R6 {: {. D; U6 @
PPT教程:
" l# b% [! k: {- f8 r' Y8 P8 K
' z. r6 V( q% @8 z3 C
! @# F3 v4 l/ g6 J6 Q
# t1 D& X! z( ^9 `+ q5 _等精度频率测量51单片机源码:
) [6 z, p; `: P
#include"temp.h"
1 T2 e0 f% \* C8 v; k/*******************************************************************************4 |8 Y1 g  S1 E( \* A' r8 h1 b' q
* 函数名         : Delay1ms
/ R- w" F& w# E% T* }& f+ K* 函数功能                   : 延时函数
& U& h( s2 |& b7 V0 X! z* 输入           : 无4 l% Q; L5 @' A0 k' t
* 输出                  : 无
3 B) D! }7 O: @. ]$ o" i) L*******************************************************************************/
2 j  [  j( S+ c; t9 U
) L$ Q1 W5 Q9 Q. l
: K, n3 Z. ?7 I5 j8 x
void Delay1ms(unsigned int y); }. x# F1 h1 H4 b
{
2 j; l+ l( C7 B" o: N: b# E, L$ ]        unsigned int x;* K8 e) f% a4 v0 b; W7 _/ S6 E
        for(y;y>0;y--)4 l/ ~5 W# P# q! R6 D
                for(x=110;x>0;x--);% Z2 E+ P. w/ ~2 r3 b5 l- ~
}5 N, L* `; r1 c  @. |8 B0 z9 u' r( Y
/*******************************************************************************$ V9 G* t/ P+ y0 B; a2 y
* 函数名         : Ds18b20Init& ^! i0 J3 M8 T5 A! K
* 函数功能                   : 初始化
! k' e' v. V# T* 输入           : 无
$ Y7 _% D& b! Q, i& @* 输出                  : 初始化成功返回1,失败返回0( u2 C9 k7 y2 C! l; E
*******************************************************************************/
9 s) {! B5 Y8 q, W! b4 s+ Z
6 i! }$ I6 B9 Z: |9 Z2 r/ {4 C% Z

& [% v. ^% _9 Z. R! ~5 A0 H# Wunsigned char Ds18b20Init()" L+ V6 x/ Z; S6 C& u. B
{
* o* x) y  [4 u        unsigned int i;
0 k" Z! C8 ]9 @        DSPORT=0;                         //将总线拉低480us~960us
: `% j8 m( l2 i- M9 A  b        i=70;        + Z( x0 F! M% f- I# U
        while(i--);//延时642us) u2 |8 E" ?1 B; n
        DSPORT=1;                        //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低0 e! l4 l% J; z2 G3 e; x/ @: T+ h
        i=0;
  J) s# B2 m1 |8 H        while(DSPORT)        //等待DS18B20拉低总线
7 K; h0 D. L. @2 K% M5 Q" G        {
8 w4 \- [, y; g* O% {                i++;/ u% h% l- `- q& d+ A4 z' F
                if(i>5000)//等待>5MS
9 i. H/ v4 y  x/ l. t                        return 0;//初始化失败        # ]% \. z8 j8 S5 A& i
        }3 Q% M' v( M2 }# m: `6 {
        return 1;//初始化成功+ O& o) w0 A4 H: _2 B8 |# c
}
$ P$ ^4 W0 ~# E! m* p. i
+ c7 L  p/ W& P+ l5 l
% |/ g' a, |, R; f8 N
/*******************************************************************************% L0 d2 _6 }6 _  n- a% o
* 函数名         : Ds18b20WriteByte# K% K3 z$ O( ^% x1 v8 i7 }
* 函数功能                   : 向18B20写入一个字节" s+ }1 b5 o4 K( p2 f
* 输入           : com+ k* G% x7 g2 {" A& t
* 输出                  : 无
, L" V. c8 Y0 m8 g*******************************************************************************/5 K& H' u1 i, T  Y0 s* @; }/ B

, c! c" u) z( l' z( Y* k. `. E
) A  f6 @) v2 R0 V
void Ds18b20WriteByte(unsigned char dat)
2 M4 Y" X+ N, q" f{2 ^. N! `. z) x4 s$ r( Y- w+ K" p
        unsigned int i,j;- K8 X, `( R, i) v# K
        for(j=0;j<8;j++)
0 O! w) S/ u. r/ l% w4 T        {) k3 ]6 ]; ~; m, e! p
                DSPORT=0;                        //每写入一位数据之前先把总线拉低1us0 L9 M' t6 c9 k3 n1 s
                i++;
. [( _9 }: R8 A* u0 b- k! e7 v                DSPORT=dat&0x01; //然后写入一个数据,从最低位开始  U& l. O3 g# |- ?' i& J
                i=6;6 A! D9 B, b3 X# n- a
                while(i--); //延时68us,持续时间最少60us
. T& R8 ?* b4 d9 _! N& w, O                DSPORT=1;        //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
7 U+ s- f/ j0 [6 B& S- k: G                dat>>=1;
& y' O5 y+ G0 N2 _" a! \( a. N        }
( |, K% F3 g+ R7 f5 k}
' G- ?* i" Z6 P8 Y/*******************************************************************************
; v  I* c) j/ B8 i; U( z. H5 ?" \; \* 函数名         : Ds18b20ReadByte2 b* |6 @; c5 @" z) X$ B1 Y
* 函数功能                   : 读取一个字节5 O. @% K4 P: y( F5 I+ E  j
* 输入           : com
, L% T& D( S9 K* 输出                  : 无7 q: c4 G  X  ^* F( a5 p' l* W
*******************************************************************************/1 Y& h* R" I3 s  r
" Z  E( E3 f: h: \

( |; |( B2 f2 m
4 {  x- i; w0 p0 P$ ?/ H* w7 w) x" F

% o6 e0 e6 h$ R5 V( s- Junsigned char Ds18b20ReadByte()1 R2 ?, }. n% F* C9 v5 j
{* J. r$ ?0 U; E4 f# O; u+ |3 V
        unsigned char byte,bi;
: [1 e+ c) y! n' q/ k& m        unsigned int i,j;        
. o2 j- D4 ?9 W3 [- }+ I        for(j=8;j>0;j--)8 w/ S5 g( ~  W) Y1 i2 C; j
        {) j  U  \* A) i- u& ]) a1 h
                DSPORT=0;//先将总线拉低1us
. F7 s2 \, Q) ?+ F/ |                i++;
& `% Y: q- i& H* f! P" s                DSPORT=1;//然后释放总线
/ V- S3 W  W9 g: B                i++;
. {. N6 T$ X2 |& M& c6 Y+ A                i++;//延时6us等待数据稳定
" D3 f( L" x5 j1 R; L3 [                bi=DSPORT;         //读取数据,从最低位开始读取
+ J+ L* [: O2 H7 O                /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/3 @- `# ~3 J3 g0 @9 Y3 }
                byte=(byte>>1)|(bi<<7);                                                  
7 b9 X' X6 Y% s& U                i=4;                //读取完之后等待48us再接着读取下一个数6 x2 F3 c* ^$ P. A2 Y
                while(i--);
' u. T* f1 b3 D5 G2 S1 p' z        }                                - T" f7 s5 Q, a0 P
        return byte;
  G# ]* L( C8 ?, `  l$ K$ V* ]}) C) n% o* t: m# T
/*******************************************************************************
/ l' Z2 c$ D9 J+ a% R: a* 函数名         : Ds18b20ChangTemp
2 j- Q; G9 p7 j  q! [* 函数功能                   : 让18b20开始转换温度+ k9 I3 o# g8 s1 x$ z# t: l+ U" |
* 输入           : com- `# A6 w* d; T7 g* D! J
* 输出                  : 无% U4 g) F, {1 a" C
*******************************************************************************// o$ M3 @  `" m  \$ X, f5 E' w
' W5 Q7 r/ R2 K. c7 o: c9 k& K
$ H( L* ^. g$ W9 e& C
void  Ds18b20ChangTemp()
6 j/ \1 g) T2 O{* @0 j* ]( W* I: x: `0 w3 b
        Ds18b20Init();
% X9 M+ V8 C& V4 _2 n. t. W% R        Delay1ms(1);+ n* R) G% O% ?2 Q6 D& k
        Ds18b20WriteByte(0xcc);                //跳过ROM操作命令                 
! z! ?$ R6 [2 l0 ]! z* s+ r. C        Ds18b20WriteByte(0x44);          //温度转换命令
( t: g& r' ~1 v2 s2 d        Delay1ms(100);7 c9 `$ r8 s! _
}+ }: s( `, }, c8 V
/*******************************************************************************7 k8 j2 k  P+ r6 Q2 N
* 函数名         : Ds18b20ReadTempCom9 Z- e. e# F3 [
* 函数功能                   : 发送读取温度命令4 s8 P' u1 z. e5 g  u9 e
* 输入           : com% t5 C/ g( s$ Q" y! S( K
* 输出                  : 无
) O7 p& I/ Q/ S/ X. X*******************************************************************************/
" B4 h/ L* K# d1 P$ Z( o# R, g& U2 g2 e

" G) h' u+ F) X" n# [1 k3 @void  Ds18b20ReadTempCom()) _) h4 t: k5 K% O0 N! d
{        ! p; G5 F; P3 h/ U% ~( e/ }4 o9 N2 T" d
( I& w/ v# J" i
* O$ ]+ W/ \8 w2 |  v  n* O$ q
        Ds18b20Init();
) u6 i' ~0 i  X( B/ A        Delay1ms(1);
9 G* N7 O4 [2 N/ j        Ds18b20WriteByte(0xcc);         //跳过ROM操作命令
0 E4 Y7 R0 a. E4 f7 l        Ds18b20WriteByte(0xbe);         //发送读取温度命令
0 ^* p, _% }7 I* [/ Q( i/ K}
" I3 v# n6 z* Y7 p$ N! ]  i/*******************************************************************************
! O7 c% p+ e1 v9 p4 r6 t- X* 函数名         : Ds18b20ReadTemp
- V! X9 u  ]7 I# i1 H* 函数功能                   : 读取温度
% R& p6 l9 C8 ]8 l: t* 输入           : com
9 n: v- p- Y9 G0 i+ b# ~- }$ |* 输出                  : 无
3 u  [; F! R; R0 I*******************************************************************************// I1 G- ]4 u! b1 Y

% g5 P5 V8 J& F$ P" k! u
0 e' C0 ^* |$ ?8 Q% \  E
int Ds18b20ReadTemp()
! l  [8 |. ~, D$ `* w{
; V+ d' p& j& h& W8 F        int temp=0;" T' d, _9 l, S3 F) Z7 |! Y
        unsigned char tmh,tml;
( B8 Y7 C$ G5 c0 c8 y9 _8 b        Ds18b20ChangTemp();                                 //先写入转换命令* }$ [  P8 ^% Z4 }1 U, H
        Ds18b20ReadTempCom();                        //然后等待转换完后发送读取温度命令
# D; T0 ^) ^7 L( B% N3 I        tml=Ds18b20ReadByte();                //读取温度值共16位,先读低字节
- {/ f7 P5 A3 `! O' u' S        tmh=Ds18b20ReadByte();                //再读高字节8 S/ Y- |8 H/ r9 ~  ~. B+ a
        temp=tmh;
' Y5 {- G2 x& B7 a& A. I* W        temp<<=8;
1 D3 e- \+ u. ~        temp|=tml;3 t; u1 `9 x" K( l/ V
        return temp;
  H1 b' @' f2 u! C- s5 n}9 Z) u6 q% C0 |( E

0 J8 P7 k+ H5 d* Z4 W2 `等精度频率计全部资料下载:3 V, y, v& |+ E9 t
游客,如果您要查看本帖隐藏内容请回复

% S, g8 B' H8 l+ t6 G  H; m5 n& @
, u* M7 x7 I1 ?' m+ L1 H: j) z

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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