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