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

51单片机学习:利用ADC0804模数转换器采集电压

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
51单片机学习:利用ADC0804模数转换器采集电压4 h3 P1 |1 N" J/ ]/ y; P' f8 a
  M" x' [* ], L" K' ~, ?. G# ~2 g) z

8 g* s7 F( w' ~5 }; T- g( p电位器调节待检测电压值,在数码管上显示出来,
/ s9 D& E& f/ n! u( l# X代码大多从书上搬过来的,书上例5.3.1要求前3个数码管显示AD转换后的8位数字量(即0~255)8 ?4 z: m: ~: a+ z8 H9 K
我这里让前4个数码管显示具体电压值,比如1.352

% A2 T" g- S9 R: Y- L  x
" |1 i; ^7 U" e. m) Z
9 W8 J, k0 P+ U
    #include <reg52.h>  ! J4 v& c$ F$ p$ ]9 W
    #include "MY51.H"  
  X/ z. q) K/ h, I( }) k3 U$ q2 g
* X; a/ e7 ^+ D2 v  j    void initSMG()      //数码管初始化信息  
6 ?* R7 A0 [6 z    {  
- Y! h( B* i  x/ `; `2 y        //上电时,都为高电平  . p$ j+ v: m3 i& r
        P0=0xff;  ! @/ |) ^! J6 j8 Z" y6 ^
        wela=open;  ) v0 e5 ~/ I% ?+ p0 B
        P0=0xff;  
6 c6 b$ G8 V/ L        wela=lock;  7 A0 v& g7 d$ L

. ^* X, s5 h) s( U, r        P0=0;  
$ T% ~" f( k6 Z        dula=open;  - z4 X& F3 o3 U& Y/ `* ]: g
        P0=0;  6 |2 K, B! M9 @8 _
        dula=lock;  
: \4 v) v( g$ _+ X2 P9 v. H8 l) x! }    }  / c! ]: |* B! M3 D2 U  m

. R5 ]$ ?; @1 N5 I2 \" k3 G    void ADC0804_csToLow()  //cs置低电平  
5 a, a6 B+ I/ F$ S    {  
% {5 {% ~" w" L, Z        wela=open;  //打开锁存器  
. E1 V! a4 _2 q6 B        P0=0x7f;        //锁存器最高位送0,也就是CSAD置0  # C% {2 x) T  Q( l
        wela=lock;  
4 b- Y5 ]; a( _7 w3 F, d    }  
. G2 |6 {; G4 E8 d1 n" v6 m/ G( C' {5 \# u  b$ x- d
    void ADC0804_startConvert() //P3.6口是wr,由高到底,再拉高后,ad开始转换  
6 u( ]% W, Y5 S" F# ~    {  ( o  t6 x! `$ ]8 u  T% q. y
        adwr=high;  //虽然原本就是高的,但我们要养成好习惯,该是什么就是什么  
6 v3 e" a6 n! j: v, @        _nop_();  
8 r) L) p) R8 i; z  ]; w* k        adwr=low;   //wr置低后,过小会后AD内部开始执行转换,转换完成后INTR自动置低触发中断  
* \8 D# I" r1 J0 g. b" L9 S        _nop_();  & q% }1 Y! u- E; y
        adwr=high;  3 _: m+ G0 o* G
        //由于我们用的不是150pF电容,而是104pF,所以转换比较慢,在调用本函数后最好延时10毫秒以上  
: ?+ n* f" ]. a! N, w! H; i' V    }  ) G/ h) p* x/ y. w
0 n0 W+ {, ?, F' R
    uint8 ADC0804_readResult()  //读转换结果  
/ T& t3 [3 B5 _* F7 d# v' b    {  
5 {. i) m' f, [) [) X8 c* ^' S        uint8 result=0;  " a  C$ b4 S/ _8 M
        //延时一会儿,转换就完成了,由于我们将INTR和CS都拉低了,直接操作RD后就可以读了  
' M+ N) F. I7 g6 {3 c5 t, A( o        P1=0xff;    //防止由于转换未完成原因引起的误读  
+ a( P5 S% c+ L3 d$ e        adrd=high;  % r" _& Q' v; V
        _nop_();  
5 d5 |* a) G$ z! q9 G0 r9 Y" Z        adrd=low; //rd置低电平后数据总线P1口得到数据,并由led显示现象  
5 f& O$ R2 m0 Z( ?7 t% D% Q9 d( z        _nop_();  % ?: A- W, s* Z' t9 f% }: D6 K- ]% w
        result=P1;  7 B& I7 |! k! O* F5 `  D4 e# J
        adrd=high;  7 Y& `" e$ @  ~; s4 I
        //读完以后,如果ad芯片不用了,就把cs拉高,注销片选  
/ N5 Z* h( A8 j5 L6 `" R( O0 i        return result;  ) l9 M$ k  o8 ^1 V& |& g" i
    }   
4 Y0 V6 K( P/ E: f- R( B/ U2 E1 x) g5 G
    void show(uint8 value)   //基准电压是2.5V 为了计算方便扩大到2500  6 }4 [9 q0 @! ^# O
    {  
+ p2 u# }( m1 T; ?  C# }/ g. D        uint16 temp=value*(2500/255.0); //扩大到4位整数,小数点另外附加显示    ~- c4 f9 K4 B. o* k3 V" ], D
        uint8 oneWela,twoWela,threeWela,fourWela; //oneWela是最左边的数码管  
' ?4 c( a& L' q$ t# R( a, |2 t" ?; X. m+ R        oneWela=temp/1000;  / @- W- q( `9 y2 V! Z1 m) H
        twoWela=temp%1000/100;  7 C, P$ W& O- _2 o; n& l
        threeWela=temp%100/10;  
  Z4 y0 X( h; X( I, A5 J+ Z/ y; f        fourWela=temp%10;  
! n: ^. c( M4 w2 S+ Z/ w        displaySMG(oneWela,twoWela,threeWela,fourWela,dark,dark,dotTable[1]); //最左边的数码管显示小数点  4 x* S& |! ^, c1 ~2 H
    }  
3 O+ c# ?6 {7 H6 J1 S) ^
4 q& r& x# F- k" U7 M) a+ w    void main()  
$ u8 h: n) r7 A$ O0 U    {  ! g3 Q9 J: D) l. M

9 i2 o: G3 T! N9 J. Q3 B# ]1 J        uchar i=0;  ; u% A& g0 l( M! S. j
        uchar adTemp=0;  
7 a: p1 D$ O! @( c( T2 h        initSMG();          //数码管数据初始化  7 i# Q! ]( b  j; }& L% p& O
        ADC0804_csToLow();   //cs置低  # x# }7 d; L' A0 v/ k8 ^9 B$ t
        while(1)  
- m+ M) Q( ?$ p4 j8 }' Y* R/ a        {  ; u8 y, `. L  {5 t
            ADC0804_startConvert(); //开始将电压数据转换成数字信号      ! \4 B4 {: w+ a) p, a
            for(i=5;i>0;i--)   //主要是延时一段时间,让ad完成转换  1 @3 H+ m, D% N" @  C% C6 I0 _
            {  
8 P. W) g5 s3 h" X% p, S                delayms(1);  
% N, B. f" [! I: ?2 q# r                show(adTemp);   //延时的时候,数码管继续动态显示   7 J+ b  ]& A3 }: x) P
            }  ) V$ B9 H* d8 m" b' _
            adTemp=ADC0804_readResult(); //读取数据  8 d: G3 I4 L& y/ ~7 z
            show(adTemp);  ' U. g/ G* h* d) x: n5 T
        }  
8 T* t* p2 ?) b# @    }  
3 K( p: O8 ]7 d5 t$ [8 w0 A# m" u* A

0 w- h4 q& u! |4 z- G
3 R+ t% w2 V( S& t4 _
0 Q( D* f! l  j+ @, Z" ^
游客,如果您要查看本帖隐藏内容请回复

' ]5 N6 p% s; n) ?% m3 f# B

$ O/ {# F3 P' }( P8 ?

该用户从未签到

2#
发表于 2019-1-16 21:41 | 只看该作者
收藏收藏,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-21 00:19 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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