|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
PCF8591四路采集串口显示程序及原理图 附MQ2烟雾报警器资料
0 G* ]6 `/ `! M8 m: @ O, A, n9 F
( _1 O9 Y3 T9 l! |" Y! G
MQ2烟雾报警器,附带PCF8591模拟信号AD转化.6 p' V" E; _1 r T
# g/ J- O: X( P: ]
PCF8591原理图:. `3 n Z8 H$ W) q6 ?
- t, {, j4 { T- ]6 V% g& T% ^
! l% t, h5 z! s. J P3 F0 Q
单片机源程序:+ q7 y3 C/ \# g& }/ `
: Y6 E3 I0 c5 _. u2 V9 s, t
: ~5 Q1 P' V( Z8 g f
/*********************************************************************************
8 P0 D/ ~! U1 g' G2 @* 【编写时间】: 07.07
2 T4 X) p" z6 u* 【作 者】: 雁翎电子+ j) h. n2 y* x2 {! `4 a
* 【版 本】: V1.0
1 y3 t6 V3 P7 Q Q& F; M8 V, k# L* 【声 明】: 此程序仅用于学习与参考,引用请注明版权和作者信息!
$ l. X2 s4 @2 Z* q- y9 u8 |: @* 【函数功能】: DA-AD试验 & T; U+ ]/ v" M* V [5 D
* 【使用说明】: 单片机:STC89C52
3 F; ^( B; u9 s* n. f: l 串口波特率:9600, P! Y: `" |* u% q9 }& B
串口一共发送4个字节
# V$ a& H5 m' f) k2 ] 1 光敏电阻9 F, U6 D7 ]# ]0 l2 U) w) {: z
2 热敏电阻$ b$ g6 J. b% f1 ?# `9 t0 `
3 悬空' I5 K0 C& }9 W% J
4 可调0-5V电压(蓝色电位器调节)
* x& P+ y+ m4 G & @% ]7 k0 ]( Q: d& l& p! E; k
**********************************************************************************/$ _; h1 ?4 Y. ]$ h. D) l
/********************************************************************************************/
5 y0 D0 F6 G4 {9 q, Y* O. A) H$ p- ^& b; b- ?0 }4 [
* |( p0 T* Y- |( ]. |# O! Y#include<reg52.h> //包含单片机寄存器的头文件4 l' |% p7 }( U, S
#include <I2C.H>5 w! J5 _0 E$ R! C# |6 p
/ v, }4 }3 a2 g- v* ~6 [$ M
+ ]( ^0 @1 A; x/ F#define uchar unsigned char
$ Z+ F2 y% Z# ~& [#define PCF8591 0x90 //PCF8591 地址
& g2 f. r: n! Q7 S5 Q0 h. _/ [( G
9 M% e; r4 a. c% A# g& _5 ?. N6 w+ ^. z. |& d
+ m) ~( S1 v/ v t; A" G
$ N T( Q6 X3 \$ I( g/ ~; h8 a1 o5 A; W' ^
// 变量定义: b/ e# j) t, F1 {" w O* Z. l
unsigned char AD_CHANNEL;
) u- A6 T0 F) lunsigned long xdata LedOut[8];! F( E; L+ D. O/ R2 M
unsigned int D[32];
! R+ r( A2 H! ]sbit P2_0 = P2^0;3 e- V9 t" Z0 t! C& o/ _& Z+ s6 t9 H
sbit P2_1 = P2^1;7 Q9 D* R2 a* H& W* P
sbit P2_2 = P2^2;
- Q1 o: `; w# I- J0 M7 h6 u5 Q9 e7 Hsbit P2_3 = P2^3;" x) Y; |0 A/ z
% d2 b, H* w% O! q% H* d' X
4 q2 H7 H; w. h" ^9 u0 punsigned char date;
1 K7 p/ f& g3 K) _# ^
P# h1 W8 r, T& L* _' X9 Q+ Y8 p2 I& A
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
6 F! H( M) |) E 0xf8,0x80,0x90};
, F6 M3 A% T& M6 g1 `
j* t# S k. R8 l7 x8 v0 Q% W8 @3 C: k1 m0 D
/ S! |/ } w/ F
4 {" k, B+ k* @1 E- | // 函数申明
3 X. ?) Y$ ^4 l/ Z+ q1 e- c1 N- a+ r' q4 O( L: s
1 ^6 B. g& i8 I Hvoid display();" z9 i" f# Q: h1 Y
void delay(uchar i);4 s+ b% j* M* K/ N r6 a
bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val);5 u7 ] r6 j9 S2 {1 V
bit ISendByte(unsigned char sla,unsigned char c);% U' F' d5 t1 B6 u- c
unsigned char IRcvByte(unsigned char sla);0 B" x. H8 I3 t" A; @
void Initial_com(void);, K$ Z2 a( Q& F% \ y+ q
//******************************************************************/
5 Y# f) k7 Q, N5 s, smain()
! O5 p/ c% f! q, Q- B3 W" O{
% f& n1 X1 ^" b3 i0 G `' o/ ?- v
1 ]) P- I$ F' f) o# d
* q7 m* L G4 l( ~ Initial_com();8 K E$ J: d* Q$ X
while(1): t% {2 H3 R: f. n
{; r0 h* `3 `- @
T$ Z. B+ {0 f/ T! g
7 D# t: ^+ p/ a /********以下AD-DA处理*************/
0 @+ c& M& [4 ]" j* M # R+ F% V5 ?+ o$ T7 E& H8 V
switch(AD_CHANNEL)0 ^: _& m' A4 g5 s: R; }, B
{- z$ N/ c, }# S% y7 p
case 0: ISendByte(PCF8591,0x41);( B6 H4 j5 y' L3 h4 [
D[0]=IRcvByte(PCF8591); //ADC0 模数转换1 光敏电阻
0 F! J) M8 X6 t, O* d( w break;
$ {# |1 ~8 X: B4 S
8 q. ?" a1 R+ G- O/ ]% _! E case 1: ISendByte(PCF8591,0x42);
- Y5 r i/ N6 h4 H6 F D[1]=IRcvByte(PCF8591); //ADC1 模数转换2 热敏电阻
8 s+ J; S0 e. w- e+ @) a. m9 X break; ) v% L1 K/ h# P1 Y5 W5 X
* @2 ~) w8 C; L; } case 2: ISendByte(PCF8591,0x43);
# K( m/ z- j$ M: x3 y D[2]=IRcvByte(PCF8591); //ADC2 模数转换3 悬空
' m2 q& H2 ?( x0 ~0 f2 w) k% k* K break;
0 f0 W9 b( s, q& h " ^# y% |$ S. `# b% \- J
case 3: ISendByte(PCF8591,0x40);
1 l4 u/ v$ z# \8 b D[3]=IRcvByte(PCF8591); //ADC3 模数转换4 可调0-5v
$ }. c3 ~6 v/ y# @* P! P6 O ? break; 7 U6 e% ^) E& Z
- g9 _. @; W. K3 q
case 4: DACconversion(PCF8591,0x40, D[4]); //DAC 数模转换
/ u: Y1 j' X# z1 }" @ break;
- N+ g9 G* B. i# P T4 G. g
2 E) d. D6 G# `! w0 g& v# u' E }" P, H" |: M4 W: G& r
2 X7 Y/ T6 o7 B0 @9 d G3 L
+ R1 `3 x# L# l1 G D[4]=D[3]; //把模拟输入采样的信号 通过数模转换输出
7 W7 U) |+ s4 T! q- m1 A
. S+ R) B f, W. \4 G0 C if(++AD_CHANNEL>4) AD_CHANNEL=0;7 n/ Z: Q; |9 f+ Z9 ~5 w
! O/ u$ ]; k l0 e' N4 e
/********以下将AD的值通过串口发送出去*************/0 E6 X: ^& m- n9 n
delay(200); $ |2 r0 @. G0 s
SBUF=D[0];
) d5 _: [, r' j delay(200);
& Z. |. d7 @$ p5 M/ ? SBUF=D[1]; % x3 o0 V* g+ ]0 u& P& ^
delay(200);
5 k: B0 e& y) p: ~" i( r) S SBUF=D[2];
! z- w# q9 Q5 a7 a5 e0 W# i# O delay(200);+ L" C& q4 u6 Y
SBUF=D[3];( @* Y8 z/ m$ K4 f6 U9 m
delay(200);* `3 J5 Y/ }4 v( E& \% d6 z
if(RI)
( G: Y1 O6 a8 O# Q+ a {+ Q6 E( z$ x- ]
date=SBUF; //单片机接受
9 s b- i: J/ ?! \& H+ o SBUF=date; //单片机发送/ g$ O/ Y% ~* e8 A% g1 J c, o
RI=0;
3 S- e7 H) Y% l3 J } # l; S9 N1 E, |- G* E
}( u. h; l& m2 ^
}. L8 {& P8 L: I" I( ^7 \
$ L& f3 m1 r5 e% c; u+ M
: R* U$ J5 t7 x; K0 y$ e: J7 M* D$ I) X6 M$ S% y1 T
0 Z& k5 C' s- P5 b$ j3 Uvoid delay(uchar i)
4 v- t% i D7 T{ ~9 e' m5 d9 `" R/ b
uchar j,k;
6 a$ l9 b' B, _6 l; {* s for(j=i;j>0;j--)7 B* Y; N8 D* a/ T3 Q$ N
for(k=125;k>0;k--);
1 |1 R8 |# F G; I- \/ R3 H( w3 F}* }, U3 k7 o: F7 s" ^2 _+ x) g' h! v
9 M# K: F- l5 p7 ?* C1 e
6 ^5 p! ]% ?2 h6 w. |
/*******************************************************************$ W& S$ n/ `2 h
DAC 变换, 转化函数
% y2 \0 G0 A2 f*******************************************************************/& d2 G. V' W! o/ _
bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val)
( j! `1 Z& y/ m{
( j' w* L5 j" s. I, Y Start_I2c(); //启动总线- ^0 l+ W2 \0 n; I% z+ b, T
SendByte(sla); //发送器件地址 `- \' ]3 O- z# x8 E
if(ack==0)return(0);3 [3 i% H e1 h, ?* _' Q' P
SendByte(c); //发送控制字节! N- A0 f/ a/ e# g$ U1 `- B1 U
if(ack==0)return(0);
5 O w% [( x. S5 p1 w SendByte(Val); //发送DAC的数值 E# ^6 P/ d# f& W3 P" ]$ I
if(ack==0)return(0);; U8 j7 a( k- A8 M
Stop_I2c(); //结束总线
$ L; x$ c7 y5 I9 V! w+ S; S! ` E return(1);: h% d& i$ U5 p) C5 M% w
}
% ]) ?5 z0 S7 \3 a' l. W* O7 \7 n& C; [0 Z. j
" p& i6 C2 |; s/ a8 g1 _/*******************************************************************( W: j4 p& T1 x# S! o8 o( Q0 i
ADC发送字节[命令]数据函数
1 @& h7 ? Y, W; S" Z*******************************************************************/
3 T0 z4 V3 @+ U9 l: y/ M/ Tbit ISendByte(unsigned char sla,unsigned char c)
5 t2 k$ J7 ~4 s/ a{4 X8 f" n8 G, B; {# r
Start_I2c(); //启动总线" T9 ~ P* r6 v' X! g
SendByte(sla); //发送器件地址
8 b2 s/ l0 ]7 \ t! ~2 D1 b' R if(ack==0)return(0);
0 w7 E, j$ Q# ] SendByte(c); //发送数据5 p7 S5 ~; T4 P
if(ack==0)return(0);' F N# ^( V9 ^8 D
Stop_I2c(); //结束总线6 v; ~! Z: b1 M0 M- X/ Y3 b2 K' _/ ]
return(1);
4 n; F m4 N9 N0 {4 z}
" g8 T, W/ |! v) h. ]3 M1 g) Y5 I7 e9 ^( H6 W) n3 t
% e! T/ q! r2 H9 Y! ^! D9 m/*******************************************************************
5 r7 A/ h, k: N7 nADC读字节数据函数 V/ D; L( ]+ \/ ]. U9 {
*******************************************************************/- o' G2 c# S( Y" p+ Q+ g
unsigned char IRcvByte(unsigned char sla)
* @- T/ x7 c& o- H ^+ P{ unsigned char c;
! T2 @; W, S6 W5 B
( Y. P, O/ B! c+ M5 y2 V1 ?( E: S/ N
Start_I2c(); //启动总线. |; G8 x7 \% B; {: J
SendByte(sla+1); //发送器件地址
% D) W' o% W7 \ if(ack==0)return(0);; N' f) N5 Z2 K( v9 L. A; L( r
c=RcvByte(); //读取数据0) r) c' C; e& B7 ?* L
6 \& x0 J- K+ s) |- b' v ] r2 g. G4 I) g4 l: T/ N3 M4 u. b
Ack_I2c(1); //发送非就答位
2 b% q0 D& _% R1 q A' E$ h: X Stop_I2c(); //结束总线2 S1 q, `8 T1 e* d/ a) l
return(c);
2 S) Y5 y/ L0 H7 `, J}
3 B! n, t$ Q' O: ]( q
# q4 x! X' ^+ P5 H
6 t$ P! `5 S& I
$ ~* R, C% D$ \4 v
* P6 O1 {9 j; X0 h. L- h//*****串口初始化函数***********
1 w( s' G I! p9 W3 t3 o+ Z/ ?' V0 X9 p' _# `4 A' A9 c3 a6 R2 N
- [9 l( Z* J5 P2 f. }3 x//******************************( a# s( ^* |) Y, [
# P* e8 g4 W- l' s m
- K: ?) B" V( R+ X1 E" e$ [9 h4 Z2 N( i& g U
( B3 g( E8 s! D+ a
6 i: L) e% d$ ^; m, D! M9 K1 w; k
+ P6 y$ |# x$ [4 f/ {' h* S8 f…………余下代码请下载附件…………5 `2 \5 ~% W7 \* {7 C4 m7 H
1 U% g8 j. D' i, [0 h6 k: X F8 T# y6 F4 B; u4 N, i& l
下载:6 S: H$ I& B9 | q8 D: x0 B
8 f- W) e4 m7 g7 D- ~! B! D3 k" k
m6 G4 F" B v; s4 b- h7 n+ K% ^ |
|