|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
ADC0809程序和原理图中文资料 51单片机例程实测可用 8 r3 e+ v9 q! Z+ m# t
, }- x+ t2 o h# e9 G0 e; r* [. f
i) L+ R" d5 ^6 q# u% J4 o* t) H& o7 S; v. z
5 p- q& h0 B V, N
adc0809中文资料:
' {4 ^9 V! j o9 Y! h* @![]() ![]()
3 T, b$ x5 {% h% W3 P, S; {) \/ ^! M: E. Y) z l3 A
本次单片机实验的adc0809原理图$ \5 E9 P! U9 y- S( u9 m. h
8 w3 {( m& p, d, R
8 ~( B! A3 m8 D& n
adc0809模块pcb:* ?% m" m W+ a9 m8 b
4 @ B+ ?8 H3 E
. W" s4 s7 q7 J- p
如果用例程测试时需要注意以下: 一、先调试单片机控制系统,也就是先不接模块,1602液晶会显示: Xingxiangrong AD=255 VIN=4.92v 能这样显示后证明单片机控制系统没有问题,然后再接入AD模块 二、插针
0 v6 T, J7 l' A7 K# @1 X, Y. t9 B1 ]5 M8 X
J7短路帽套上,使模块上面的可调电位器可调端和IN3接通 ^+ I7 T9 j; i' e
J3 和J4用短路帽把中间和VCC插上,使A和B为1 J5用短路帽把中间和GND插上,使C为0,选择通道IN3;
$ H! x0 e/ [& K/ u/ \- c 3 Z; S: g1 m1 T p$ Z
3 v8 y: x2 C. N* g" Q8 H
源程序:
( g% j/ X4 ]/ b* k* S& ~//功能:ADC0809模块测试,读取IN3口的模拟电
$ x2 Q$ t- j2 ] p# L0 X9 T& d- L//编译环境: KEIL UVISION20 Q- X, Y/ `. {2 {3 r
//单片机晶振:12M 单片机型号AT89S52
, u3 D* C9 y1 k( g9 H//单片机晶振: 无特殊要求
- `4 d! X' }* J0 i& E5 f//作者:兴向荣电子元件店' \ ?" F% S2 K7 X$ u1 J, A
//日期:2013.06.20
" _# l3 ]# g, x, F' n" h! O//功能:* K: Y: ^* h% ~# i
0 N) ~8 ~$ L& \% u3 |& Z
7 x: ]* f5 Y% {5 n& y% t
#include <reg52.h>
& w( H- e0 m- Y" p7 q#include <intrins.h>
9 O* j' W$ z0 R, @0 |/ I9 M2 s) {6 ~8 P% i3 Z4 {
4 o) _! T+ I$ y' Z7 x#define uchar unsigned char, u+ e2 _- c S8 F* D# ]
#define uint unsigned int: `$ E$ |. O0 h) ]( k) b/ S
+ X$ o; ^* j2 \0 S/ ^
. H+ m+ A2 d9 ?
+ `3 q5 q( ?8 L. Y* S0 C6 o7 K4 H
8 q7 l1 p% f/ b0 P6 S2 l y7 F// adc0809模块接线1 p+ h4 q7 {+ }1 ]" b! D
#define uchar unsigned char
5 ]9 \( o3 n) e, o4 \sbit STR=P1^0; //单片机P1.0接模块STR引脚, 启动转换信号
^: ^, H; O' vsbit EOC=P1^1; //单片机P1.1接模块EOC, 转换结束信号,高电平有效- D2 l' M/ _3 U6 \; ^- T( L8 G
sbit OE=P1^2; //单片机P1.2接模块OE,输出允许信号,高电平有效2 C& S, t4 \$ L4 c" a
sbit CLK=P1^3; //单片机P1.3接CLK ,ADC0809时钟,输入50-800KHZ的频率7 o# @/ B$ m/ p G- t1 Z
//一般选用500K
6 v6 Z( `" h) f+ J#define adc0809_data P3// ADC0809模块的D0-D7分别接P3.0-P3.7
0 f! b3 i5 q. R/*地址选择 A 接H
' k$ Y$ h! t0 C+ b B 接H0 e: n6 c7 s: h8 M; N: i
C 接L# Z& x8 z. h/ p q) p
选择通到IN3,当然也可以通过软件设置地址2 e) M8 x7 }; N% a E9 a
REF+ 接VCC
) u# w ?. ?" d( K% E1 v REF- 接GND, h) b$ D/ x u7 S! |( E
这样 AD=256*(VIN-(VREF-))/(VREF+)-(VREF-)7 D- E7 k- {! l2 [- D+ Q! ]
(VREF+)=5V;0 @' E- x4 o9 G
(VREF-)=0V;
/ {0 u8 ^2 f( y: v AD=256*VIN/5. I0 ~( K0 ?8 h @$ `
所以IN3口的电压VIN=AD*5/256;1 c5 J9 I4 `, f( v) W; E3 x: h3 s4 i
*/& E1 Y! K, U: k! e/ \6 I
uchar AD_DATA[1]; //保存IN0通道转换后的数据
; G) h3 |4 d P1 R( i& Buint addata2;
' X2 g* Y2 Q* L, Y0 A//==============LCD1602接口连接方法=====================, {6 v4 t% }) f
/*-----------------------------------------------------+ w& C! T! L1 z! Q8 V6 \( S/ C$ ?
|DB0-----P0.0 | DB4-----P0.4 | RW-------P2.3 |
1 X8 ^& f* k/ g: |7 } |DB1-----P0.1 | DB5-----P0.5 | RS-------P2.4 |/ s% L( |9 a) G; a
|DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |
: d% U6 ]- l" D* {0 Q) _ |DB3-----P0.3 | DB7-----P0.7 | 3 D6 c9 X$ ~) U* ]% I& M6 b
---------------------------------------------------*/
: d$ P e6 j% x" w//================================================*/ 7 \" \- `. m2 M5 r& O/ h
#define LCM_Data P0 //LCD1602数据接口
( |3 n3 o1 a4 X5 q* U#define Busy 0x80 //用于检测LCM状态字中的Busy标识
* S. G( |* s" F* I3 ?' Z; t( y/ Zsbit LCM_RW = P2^3; //读写控制输入端,LCD1602的第五脚7 u0 t4 D4 X- i& k3 V
sbit LCM_RS = P2^4; //寄存器选择输入端,LCD1602的第四脚 r+ ~; B9 F; X# e
sbit LCM_E = P2^2; //使能信号输入端,LCD1602的第6脚- M2 R2 y! I7 c, A$ s
$ r, b1 f% V1 U; `& l
" `3 x6 o; \0 q8 A3 H
! `1 H: n$ s9 R: a# y; ?3 d, f4 {% H. z
4 M! i& W2 Z4 C$ j" A! B' x% z
+ s& F& S! c- t8 B1 h2 O1 w6 I5 ~' t$ v
" K& G `! ~& j+ r3 J' d
' M9 e* {$ O1 k& n
1 R* i. Q" O2 I& z7 L; ]% \//**************函数声明***************************************
6 M6 G) x$ o, U6 Z2 C1 n2 svoid WriteDataLCM (uchar WDLCM);//LCD模块写数据7 i% Q- J/ V% @- \
void WriteCommandLCM (uchar WCLCM,BuysC); //LCD模块写指令
- ~4 C1 m. @) f& E7 l) _" O$ Auchar ReadStatusLCM(void);//读LCD模块的忙标
1 f5 @- ]8 `. k# x$ M1 @void DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符
' F5 P' c) D4 A2 Z# u% ovoid LCMInit(void);//LCD初始
' b7 N0 c/ b8 Y: Kvoid delayms(uint ms);//1MS基准延时程序
! o: g4 `6 X' y! @: ^* Tvoid delay(uchar i); //延时函数2
" ^" }' n3 N* j+ Lvoid DisplayListChar(uchar X,uchar Y,uchar delayms, uchar code *DData);6 k; c: ?& I3 t2 ~
void judge_xianshi(void);//显示处理程序
% h$ \9 i- I. k; m$ `. C
% h0 f) F( {4 v# P3 x( v3 r3 r0 I! x# j# f- N& b0 n) \
void init();//系统初始化设置
: V6 ~& _2 D. D# j* jvoid AD();//读取AD数据1 U( Y/ P3 I. s6 Z6 ]8 | T" W! {
/ |* a% ?/ A v* Q2 F# b6 O
A( F( K" H" ]/ U2 o- [uchar flag1;
1 S$ M8 q0 O# F" P- ^//***********************主程序******************************
. R {- ^8 D4 y9 Nmain()
3 R: m7 h3 r) }/ i) r- o7 @1 G, \{
+ h+ V% Y9 y: t+ @% N# b, s8 g init();//系统初始化设置
) X: T' |6 O8 c0 E; {3 h& z LCMInit();
5 H7 r! S+ f5 i. }& F5 [& j N while(1)" Z4 U, i% e% c k* S4 r4 S
{
# m& V2 S& F% I7 J9 ]' l AD();0 T6 T+ T- T% y" t5 L5 d
judge_xianshi();+ Y2 b. z7 P7 n
delayms(100);
+ S+ E' z) R/ i C: T. X4 g1 K
: m+ b: e) w$ X }
% {& `6 {6 z, g$ [
( ^: t* ?8 }) D! q8 y
5 ?; e' z4 C L1 D}
: e4 A" P2 t+ \: g( }/*********7 P" R" H/ U8 E" i
系统初始化$ n! i. ^/ |5 x7 T
***********/
# [' I5 k j& |: b( ^. B/ gvoid init()
0 c0 {& Y% d2 i: `4 b, k1 J) G7 }{ 8 }" y7 d6 r, U4 y( X6 |8 r1 ~
EA=1; //开总中断, U' e s, v" H- r, Z7 ^- ^' ^
TMOD=0x02; //设定定时器 T0工作方式
9 {2 i c& I& ^! A( J. o8 u/ A TH0=216; //利用T0中断产生CLK信号
$ I: o" s. z9 o- V, A& ^/ [7 k2 O* p TL0=216;
% f' U+ D w: }6 } TR0=1; //启动定时器T0
" H4 e7 H) K0 K* A5 m ET0=1; + ?! Q6 T& w/ `7 E. m Z4 O
STR=0;
# c e+ i$ d; V# Y4 _ OE=0;
+ a* H( B. a+ u" G$ a4 n( R6 a
9 f, s6 J3 L3 C( ^$ y}
* U, U1 `$ P+ Wvoid judge_xianshi()
- g( y2 E* u2 Z3 P+ A! q2 G{! _' T: Z( h5 X6 M
addata2=AD_DATA[0]*100;//把数据扩大100,为下面求取小数位后2位做准备5 s$ a7 c/ c+ j2 W6 o* {8 X
DisplayListChar(0,1,0, "xingxiangrong");//在液晶的第一行显示字符"XINGXIANGR"6 ]- e1 _/ q: |, `8 F# X: }
DisplayListChar(1,0,0, "AD="); //在液晶的第二行第0位开始显示"AD="
. E' z1 G& _. _6 Z" C/ k; |5 m6 z DisplayOneChar( 1, 3, AD_DATA[0]/100+0x30); //显示AD数据的百位
& j/ `9 c' ~. s! W) L, p( z DisplayOneChar( 1, 4, AD_DATA[0]/10%10+0x30);//显示AD数据的十位
: ~- A8 K& Q" ~- R3 ~' B DisplayOneChar( 1, 5, AD_DATA[0]%10+0x30);//显示AD数据的各位" s+ T9 ~0 T, q" ] T% T
DisplayListChar(1,7,0, "Vin="); //在液晶的第二行第8位开始显示"Vin="
9 ~$ N+ Z6 ?/ {5 ]4 Z//根据VIN=AD*5/256,求取IN3通到输入的电压* ?7 _. M. |! e) b, C+ E
DisplayOneChar( 1, 11, AD_DATA[0]/51+0x30);//显示输入电压的整数位
# P- i; Z0 p. R5 Q( P4 C* o DisplayListChar(1,12,0, ".");//显示小数点, e3 v" I6 ~8 B" o5 n# u) @& b( g
DisplayOneChar( 1, 13, addata2/51/10%10+0x30);//显示输入电压小数后1位$ h4 S. ^6 V* L7 x% P. }7 H
DisplayOneChar( 1, 14, addata2/51%10+0x30);//显示输入电压小树后2位
( O2 b' I) l& b9 E3 C0 n DisplayListChar(1,15,0, "V");
2 i+ w# ^, c% T$ _( H8 b# Y}9 p9 @6 L$ c0 M; W
/***********AD
& C- f# ^+ ^3 f; L- |转换函数
' P- r _) \, }6 y& {**********/
/ y8 q3 u: I- w0 L |7 Dvoid AD()
- N0 h- b7 V& q9 m3 R# R' b$ }{ ; r2 R) q7 Q: E0 U# L' `
STR=0; : S$ C; {6 d" ]7 c, W
//ADDR这样如果不是通道0,可以在这边加一条其他地址的程序 " n" ^5 @3 j7 e
delay(10);
6 y, c( s l2 o7 E: w STR=1; //启动AD转换
& j2 z- L( t# I% K) d' n delay(10);
' a% g9 l# @( Z) e1 H" n STR=0; : B) j; c* s2 E( `- l8 p- r$ B1 Q
while(0==EOC);//等待转换结束
$ W1 e8 v& J% `/ t6 [+ u OE=1;
* {( ^; Z" Q6 _, Q% _ AD_DATA[0]=adc0809_data; //读取AD数据,数据范围为0-255
2 n: X! r" U% g! Z OE=0;
# n+ r1 A4 C$ f4 _) C5 S
4 Y! k) S3 c# G1 u9 M* J. _( d/ i# D& U6 P& h
! e9 P0 P2 C# b5 B
# {! r1 \1 l+ V…………限于本文篇幅 余下代码请下载附件…………
9 K! Y1 o* _' |. Z6 t" b: }4 L- @; E1 }3 D5 h4 J2 Y7 ^
/ N7 Y+ ?4 Q, |5 n$ [5 Z; O
完整的中文资料和程序等下载:, M& _; M# J4 J; D
% Y6 A- I4 E3 R0 Q8 x2 H# S: l
7 P* Q5 y* G/ Y( V% P) J! X2 [8 e" s v
|
|