|
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) Z9 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 ? |
|