EDA365电子论坛网

标题: 51单片机学习:利用ADC0804模数转换器采集电压 [打印本页]

作者: Demyar    时间: 2019-1-16 14:19
标题: 51单片机学习:利用ADC0804模数转换器采集电压
51单片机学习:利用ADC0804模数转换器采集电压
. J7 J2 B$ b& b2 {: a$ D1 N+ _* ]% C1 ]$ U! [

0 v* t# ?, U+ J" F% |电位器调节待检测电压值,在数码管上显示出来,# {3 T: F9 O- b/ M) _
代码大多从书上搬过来的,书上例5.3.1要求前3个数码管显示AD转换后的8位数字量(即0~255)/ Q7 }( `/ ~- l: \/ ]% y" F, _' A* n
我这里让前4个数码管显示具体电压值,比如1.352
/ g% V3 k1 q' X. g8 l( u% R- d

' n8 J3 a7 E  e+ Y1 I
# |, h. a2 S# H1 f, C; Y
    #include <reg52.h>  ; d9 f7 i$ `" }9 }' ^
    #include "MY51.H"  8 G9 c5 u. g4 J
$ S, q* [5 P/ s1 M% k* V
    void initSMG()      //数码管初始化信息  
! e- U1 `: d' F* a4 ]7 @    {  $ u! Q) X1 h! Y
        //上电时,都为高电平  
$ d0 W$ V& {4 {1 G6 q9 ~/ G, A        P0=0xff;  
# M' h& Y* ?$ E. S; s        wela=open;  
0 W0 F& Z4 l! @6 {        P0=0xff;  
; n( v* R2 D6 R( H9 e+ V4 P        wela=lock;  ( M6 m4 W1 g/ x
1 Z! l: d  {1 [& K! \4 f
        P0=0;  ; f+ w3 k1 ~2 O) r0 K  S" ^6 o8 }  V" J
        dula=open;  
+ @7 i; q2 x. M8 D        P0=0;  % L2 `4 d$ C. i2 y4 I& ^
        dula=lock;  " W' Z# t% b0 Q. j+ V3 q+ ^- w* N  p
    }  
) Z1 M! T. t2 y/ k
  r# R: z  B- k    void ADC0804_csToLow()  //cs置低电平  
/ i, F! E6 w0 Y9 \8 h    {  
6 x; `9 r8 O) h2 Q        wela=open;  //打开锁存器  . H; o+ M; j+ z1 W) o0 Q6 w. `/ b
        P0=0x7f;        //锁存器最高位送0,也就是CSAD置0  7 V! n- z- M1 W
        wela=lock;  
- ^; a, M! T3 {1 s- k1 ?    }  0 F% a0 v! q$ {6 O& y1 ]. J6 ^

4 S& h7 W7 Y/ \8 k: ]    void ADC0804_startConvert() //P3.6口是wr,由高到底,再拉高后,ad开始转换    i/ M' U$ X$ E) X0 d- P* T. N
    {  6 [: J; @/ V/ E- Y0 Z
        adwr=high;  //虽然原本就是高的,但我们要养成好习惯,该是什么就是什么  
6 G& S/ t' w, Y) l        _nop_();  
7 `! s6 B, O1 u) o/ H0 W/ _        adwr=low;   //wr置低后,过小会后AD内部开始执行转换,转换完成后INTR自动置低触发中断  : p8 \5 B: D1 i- o
        _nop_();  
% {" X5 {. I0 n- o/ X2 w' y" B, Q5 ?  b        adwr=high;  
) u0 p5 o4 d: U- a0 y( b  R8 a0 d+ @        //由于我们用的不是150pF电容,而是104pF,所以转换比较慢,在调用本函数后最好延时10毫秒以上  : K, i( h! h( [) Q4 o% J
    }  % ]* K1 @1 Y( U$ p
/ T( v) x5 B& f
    uint8 ADC0804_readResult()  //读转换结果  7 [7 A0 `+ F7 v$ E# w
    {  
6 X. b3 [3 q& i6 e. V9 `' [( r        uint8 result=0;  # @/ _2 I) s. f( S% Q
        //延时一会儿,转换就完成了,由于我们将INTR和CS都拉低了,直接操作RD后就可以读了  / @9 k% t! Q( ~) C. |
        P1=0xff;    //防止由于转换未完成原因引起的误读  
+ O# O# w. D; ^& U4 }& h8 e/ J        adrd=high;  & d5 [; u( ?9 O
        _nop_();  ) c% k( `) W5 N9 k+ Y+ ?
        adrd=low; //rd置低电平后数据总线P1口得到数据,并由led显示现象  
& V( M7 X) j" i! z7 c        _nop_();  
9 D% x, H8 }9 d1 j2 \" \0 H        result=P1;  % v: y; e# L0 K" H
        adrd=high;  0 @% j/ L0 B, q! E6 c
        //读完以后,如果ad芯片不用了,就把cs拉高,注销片选  
0 h/ u0 o! Z8 X) n        return result;  # h- R# E9 M$ M9 N. Y4 e; C; B+ N
    }   " b# f3 a: Y' p
9 I$ N7 q1 U7 T4 F2 N( _" o
    void show(uint8 value)   //基准电压是2.5V 为了计算方便扩大到2500  " |2 @7 i: g6 Y' Q
    {  
7 U7 C" }) X% h5 n# L        uint16 temp=value*(2500/255.0); //扩大到4位整数,小数点另外附加显示  . f8 M% q- G  a$ ?, p
        uint8 oneWela,twoWela,threeWela,fourWela; //oneWela是最左边的数码管  
- O' N0 K" X2 s' j- B8 o# h! }        oneWela=temp/1000;  
' m8 ]3 N; Y) S* Z) H        twoWela=temp%1000/100;  & j' Z4 y5 o1 H' {
        threeWela=temp%100/10;  2 t. b1 ]3 l- V7 y
        fourWela=temp%10;  # z$ w9 M: n# @, L& ^4 c, o3 I
        displaySMG(oneWela,twoWela,threeWela,fourWela,dark,dark,dotTable[1]); //最左边的数码管显示小数点  
) j* |* u5 v! _) G9 G    }  0 k" b( O& f  ]3 h- t9 V6 y" B

: q) b$ T: M, {) i. f9 q/ b& W" Y    void main()  6 \& `8 R6 P& r- t5 \* e$ o
    {  1 }& N) i# A3 i+ u' ^; D+ i$ g
7 w- |; ^& }$ Z- _+ k
        uchar i=0;  # Q3 p7 B% h( m5 h+ g  w. P
        uchar adTemp=0;  
( j9 _# k0 T4 n% l8 t* e5 r        initSMG();          //数码管数据初始化  % P4 F4 [8 l) \, R* j- |
        ADC0804_csToLow();   //cs置低  7 w  y: i2 B8 h5 Z+ J
        while(1)  + }9 x- j8 y5 \$ @7 B- d
        {  , `! R( ]. }# R% ]. t( e
            ADC0804_startConvert(); //开始将电压数据转换成数字信号      " }( x2 s1 ^& k! L
            for(i=5;i>0;i--)   //主要是延时一段时间,让ad完成转换  
3 y. }( t$ p9 F4 A5 F! K            {  
$ T6 v3 V. `+ a- Y/ ^) \2 f                delayms(1);  . t1 r/ g! |* t6 c% \) e2 Y
                show(adTemp);   //延时的时候,数码管继续动态显示   
8 y; e( d- X. w3 A, x            }  
# I2 M- O) x. |6 \5 [( L            adTemp=ADC0804_readResult(); //读取数据  2 }$ x* m$ ?( K0 m6 W
            show(adTemp);  
; S& V8 R( B) c8 N2 u- \9 d2 \( S        }  4 v5 K: ~- F9 p& Q( j; _0 I
    }  
7 U6 R& ]) ]* O0 \% D2 a* S9 W) A, k- \3 `- e2 w8 }! t

6 \  a7 A0 X: ?3 ^" G
0 p& R6 `" ~. k1 ~# ]5 S9 c9 u
2 o, V8 B0 A. b' s9 p: j& j
, S% O+ `- V; U; U; S

& E2 d6 y' }3 e( E( a
作者: abcde1234    时间: 2019-1-16 21:41
收藏收藏,谢谢




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2