|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
PCF8591四路采集串口显示程序及原理图 附MQ2烟雾报警器资料1 z% ^1 m3 H+ a V
9 G9 h1 \, G( c. E
: I8 L: P4 L8 _2 B; S0 ~
MQ2烟雾报警器,附带PCF8591模拟信号AD转化.# v/ ^! V' S$ r, n/ p
5 w5 f# L2 c$ R, T( ]
PCF8591原理图:1 B N# d. |( d2 {( B3 T/ K, H
* }* [- }3 x Z3 m# Z( v* a) n
0 w0 j9 I; s' h! u2 R* K. f! Q$ t ^
单片机源程序:6 ]# M( w! O9 k9 [5 o6 V+ |
, U! X/ w1 J, q: t
! O' J- V5 |8 }. o) w) l& t
/*********************************************************************************
: C0 l$ {4 [' V i5 l8 K0 w* 【编写时间】: 07.07& [3 [, O9 a7 d
* 【作 者】: 雁翎电子: K: W8 ~9 J9 y' I
* 【版 本】: V1.0
3 k' e1 u: ^# I8 i S# s* 【声 明】: 此程序仅用于学习与参考,引用请注明版权和作者信息! _+ P8 V3 G: n
* 【函数功能】: DA-AD试验 9 X4 J# s: b' D- w7 N7 v( a
* 【使用说明】: 单片机:STC89C52
m- i6 f+ Q$ a& m8 A 串口波特率:96003 {0 k" O6 b( P* h3 l9 C! [% o, ^
串口一共发送4个字节 4 x+ T; F+ {& G2 ^
1 光敏电阻
1 C4 A; k+ ^1 n' |( e6 y, Y 2 热敏电阻
7 g4 p5 q' b4 Y3 C2 L 3 悬空
( o) ^, F9 u4 q# T8 p 4 可调0-5V电压(蓝色电位器调节)
) Z0 \1 \- x# M6 T 2 m% Y4 c- @$ [1 c& E' c
**********************************************************************************/
* g% s. x, p; x* e/********************************************************************************************/) m/ H+ p& X0 l. A
+ J/ h# m! e H+ ~
* p8 V" F$ l+ a t( \! [" R
#include<reg52.h> //包含单片机寄存器的头文件$ R* A% m$ {/ q' @: h
#include <I2C.H> k2 Z4 j* z; K2 h; J! ~
9 X( T" V2 a+ S' x
! y0 h4 ~: S5 ]$ j8 b1 ~7 f+ C& R
#define uchar unsigned char5 a0 w, e D/ L. }8 d$ e3 g
#define PCF8591 0x90 //PCF8591 地址$ n) y9 j* x$ O+ q3 }
7 }6 V3 A0 t( ?( x7 [! |# x5 n8 \3 F8 a" s( t
/ \' X9 {' {0 z
( f2 R: S! L3 G( o- H" }2 S( B7 n
3 J4 M l* G. n// 变量定义
; ~7 d8 X4 E# A5 `# iunsigned char AD_CHANNEL;( `, N7 T( @ I
unsigned long xdata LedOut[8];
5 G" a E% ?- `: p( Z5 q. lunsigned int D[32]; i' e( K, y8 ^
sbit P2_0 = P2^0;" j; E6 a4 r9 U& o* u2 N
sbit P2_1 = P2^1;! b1 E% m. @4 a( |( G$ F, Z2 j6 F
sbit P2_2 = P2^2;
# y( t" r+ ^% F! G; j5 L; Ssbit P2_3 = P2^3;" X4 J# J Q# V* u* ]% ^) \
3 I# r& m: r& b, h X( S1 [: \; B0 I. M: M2 |+ b, ]; m
unsigned char date;! P) \' C- P+ E2 O- T5 W
6 T8 G6 e8 p; `% @0 H9 R4 o5 {1 P5 F; H A8 c
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,2 n" D9 @, B, D. T- }1 r, y
0xf8,0x80,0x90};) e9 X4 w8 w& x7 V
' s& Y6 }! ^3 c5 Q; e3 d) j* i) T* @# w7 ?6 Q; x4 g4 X; e
m2 A7 J/ n U) r4 t
j4 ~* d6 l. @" w6 S' ^+ e
// 函数申明 7 v, S' P2 \8 q; a* A, r; }3 }. `
' S6 Z5 [8 k9 }8 _- l" d/ M$ R6 ^) J/ I5 J- ~0 L
void display();8 a' L* P# ]: v6 w; f0 E
void delay(uchar i);
, J4 L. B1 g* I- l: rbit DACconversion(unsigned char sla,unsigned char c, unsigned char Val);2 w. M' \ R# s6 x) L
bit ISendByte(unsigned char sla,unsigned char c);6 g) P8 F3 C# q, g x
unsigned char IRcvByte(unsigned char sla);& A& M' W3 \' l V4 r+ V( `2 M& |
void Initial_com(void);3 P( Z/ t. M3 [0 I/ s5 P5 d5 @
//******************************************************************/. ]+ g0 B% H2 ? F1 i
main()6 }9 i- u2 f! L6 E: m( C
{
+ g/ L& \5 l5 G5 F. b# R" z- H. I" a, i, Z9 {2 R, L
9 d8 D% u- q3 i9 B
Initial_com();% p. n( ^1 Z; O) x5 |, v
while(1)" _& z8 t. d& P+ U6 z+ n
{3 j3 V1 c% o) q% Q# e1 O
6 |3 a. F5 v& B$ f3 T4 ?$ h5 R
7 f+ h0 r: Q5 w' v4 \ /********以下AD-DA处理*************/ - Y6 o( J6 Q5 [$ Z! G9 K
2 j+ i" L1 \9 d# {8 } switch(AD_CHANNEL)
9 u$ ~# P( b5 ~6 ]( }5 T: S, P {
: u/ w0 O' _" a0 s+ d8 T case 0: ISendByte(PCF8591,0x41);4 A. z* \+ f& l
D[0]=IRcvByte(PCF8591); //ADC0 模数转换1 光敏电阻- K6 e& v. y0 c8 u3 q! R
break; " l4 f( t1 R/ v; [ U- Z
5 W2 n. ^. o# d" D
case 1: ISendByte(PCF8591,0x42);4 T F* q6 s! T
D[1]=IRcvByte(PCF8591); //ADC1 模数转换2 热敏电阻/ m$ @% f; f6 x1 t( Q$ A% Z
break; d6 x" p: n- {! B/ Q- ~
0 W( d) L( U4 P/ x case 2: ISendByte(PCF8591,0x43);
- U! x Q, M5 M4 B' L D[2]=IRcvByte(PCF8591); //ADC2 模数转换3 悬空! d& b3 T* v. A
break;
! S4 z2 Z7 n3 L
" q3 }# N+ X% `- y case 3: ISendByte(PCF8591,0x40);/ u2 { i. G+ H9 u. z. d$ D3 H9 \
D[3]=IRcvByte(PCF8591); //ADC3 模数转换4 可调0-5v/ |9 n/ V6 h7 B% E9 G' H4 ~
break;
9 S, V: s& T7 ]- X1 T, g 9 w0 s& B: M. W
case 4: DACconversion(PCF8591,0x40, D[4]); //DAC 数模转换
. @% e( t$ a' G* v! u break;
! n$ @7 p/ t( K! M- G2 g s0 B" ^$ y/ q
}
/ R4 a# x+ I. [$ Y/ d
; k1 `) }0 ]7 {0 [/ l$ X) p5 l* d( Z+ r- x1 w: @
D[4]=D[3]; //把模拟输入采样的信号 通过数模转换输出
9 N# v% U2 h: H$ \1 |! S# h2 u+ u1 G 5 X* l9 ]8 H* g. Q! ~6 U
if(++AD_CHANNEL>4) AD_CHANNEL=0;/ j0 L) e7 C2 a3 Y5 z( e1 X
' k+ `- Y: \0 ^4 c; w, K: K. @
/********以下将AD的值通过串口发送出去*************/
( S/ c8 F6 B8 Q | delay(200);
: B+ ?6 I$ a+ @0 Q8 L: } SBUF=D[0]; 3 i# L1 i( X, K- i
delay(200);
6 R, }% d( B+ G SBUF=D[1];
3 m" O9 n' F8 D% w4 Z' r* F delay(200);
: g7 ~5 l- s: N+ [9 J SBUF=D[2];
& r y9 L1 p& `& T4 r$ U delay(200);; Z( `# N& H0 S/ a C
SBUF=D[3];, K' ] D4 \( @
delay(200);
- |3 [3 ^- `2 d- ~3 B5 [2 X) s! ]2 { if(RI)
; \) \& z$ z0 a$ u1 ? {/ k$ m' \/ G B" l C( W
date=SBUF; //单片机接受
/ J! |, Y$ s& i" C. g/ @9 u SBUF=date; //单片机发送
6 ?% T1 m" `2 Q8 }3 [% o/ o RI=0;8 O& D0 }2 T U" _$ ?- b
} O. o P1 L) i& F; E: r( Y* _
} N O( z# V$ ^- l9 r# m
}) _" }' B! e/ w
0 }7 m' {4 P- y6 V/ R: C% M. t7 E: i9 `4 W) t% Z2 r6 J
, q& ~7 t% I! Y0 N n) M+ P# Y+ R
void delay(uchar i): K! K$ C1 p8 u- @ _+ P
{
* I3 |1 ]( M* L! G4 e3 ? uchar j,k;
3 X* C5 j% q8 z: B; k1 n for(j=i;j>0;j--)3 O6 S- G0 g9 T, d: g6 }8 a% j
for(k=125;k>0;k--);
( w# b; e @ n8 X( D X}8 @% Q& @6 n m9 F
+ L6 {( O( I: E2 I$ }6 F( h. ?5 {1 z* E# K) q1 e" ^
/*******************************************************************! O) R r7 m7 [2 }' p
DAC 变换, 转化函数 % `. Z2 U3 Q x S5 K2 E3 k: G' D
*******************************************************************/
- `% E/ @6 h7 Z: Y1 E+ i p0 C* \bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val)
?. O: B' q9 B8 n{5 C, s5 w% Q a* Q% ^* N
Start_I2c(); //启动总线/ R. r- e0 s" g2 C# l2 x
SendByte(sla); //发送器件地址
0 [" z7 x4 q7 t3 P# V9 t7 D: t if(ack==0)return(0);
. [; M' k7 M# W! ~( c) x$ F& O; L SendByte(c); //发送控制字节
7 b6 n' l6 Z# x if(ack==0)return(0);
! L0 p3 N, A2 B! x( v SendByte(Val); //发送DAC的数值 3 P& s6 E: u. j5 B
if(ack==0)return(0);2 {' L0 L2 R; r3 _, P) k
Stop_I2c(); //结束总线
0 b& l K) U7 a return(1);
2 r M, b0 z5 L( _; f' O/ y}4 k/ O L# @5 K$ R* g, ?
: T% o+ P/ v/ R$ @6 {
! j" p- o2 T% ~' o' [
/*******************************************************************' ?6 M! C6 I8 K$ A; X1 b" L
ADC发送字节[命令]数据函数 7 \% C/ a- }& y! _4 d2 K
*******************************************************************/
6 M8 m' }4 K+ N- p5 M+ |bit ISendByte(unsigned char sla,unsigned char c)4 z* _% |" F; j
{) l$ a5 q% A: R
Start_I2c(); //启动总线4 ~ u% u$ {) J* a c. @! v# E% S
SendByte(sla); //发送器件地址% z1 p6 `; A- r& y
if(ack==0)return(0);6 J( W3 q; i, i# c( x8 \
SendByte(c); //发送数据
! A% _" I% I) T$ q7 y0 \ U- D( p if(ack==0)return(0);
. i/ i) s) [) _- S Stop_I2c(); //结束总线
6 {, B3 i" {3 d return(1);
3 U: [# {7 z% g1 ^/ U}
- V: q# d" D; ~0 D; ^5 D6 d) I7 E+ P+ p
7 E8 E: E* }* B/ X) A+ W/ G8 N# V/*******************************************************************
Y# x8 s0 e F4 D. V8 r- TADC读字节数据函数
4 I$ p/ [, H% N1 X- C' D*******************************************************************/, `* g4 s0 Y2 _# w7 T4 i
unsigned char IRcvByte(unsigned char sla)) J' ?' o7 }) V4 ^6 ?* W0 U8 s: ?
{ unsigned char c;
# \: o0 L1 p2 |6 W! b# w
, U6 s1 E0 x |4 M( B* M" i5 w4 P9 c+ Q! u0 O
Start_I2c(); //启动总线) e; C: |* A- b$ R* ^
SendByte(sla+1); //发送器件地址/ U) e: f0 x0 {2 {5 {
if(ack==0)return(0);0 @7 }4 I5 y% e& h: t4 Z
c=RcvByte(); //读取数据0
: h* T! l! d; d y& Y6 U3 O. H
' W/ g% W& }8 n8 ]
9 C% H! J0 w3 D! Q8 f% J Ack_I2c(1); //发送非就答位
- \4 `9 I2 ~3 Z( o2 Z Stop_I2c(); //结束总线 S, R4 ]+ e+ ^; e/ D% I& }& k: S
return(c);) R, H) ?5 [4 O% b
}
# ]3 Q. U" u- i+ ]: c% \
* l) w7 Y' v% N
& Q/ W) V: W. S" T0 t' `2 t4 S$ b5 F6 G# i' c! H' W/ D
5 w6 k1 N4 L! T* Q$ ]9 U$ f5 K, Z
//*****串口初始化函数***********- e, _* Y1 o5 U+ B" I
! \) I m- D3 w u4 @+ D
3 ~9 ]0 L9 i' C, N2 h% B" O//******************************
3 r0 m+ s% f5 {* L3 [/ c: n% b4 _$ L( D' I- c9 M
# r4 e# `4 {0 j/ W0 U/ I8 O
& o6 u v6 B+ B) q7 K1 M2 C9 h
9 w' u7 j2 Y( E: q4 f& y3 y. ?8 F. c+ w9 t, p
1 b5 D9 g/ X) I) \+ y, m$ ^+ t% M" X…………余下代码请下载附件…………
7 D8 @2 N/ I q. D
7 l0 N0 v F1 U
: V3 ^4 E% h( E8 h下载:. g+ s2 @$ q' L! z" n' w
6 u$ m! ?6 L8 s v$ D
! }( a% F2 L+ Y) u, b4 ] |
|