|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
PCF8591四路采集串口显示程序及原理图 附MQ2烟雾报警器资料
7 z$ |) H. Z2 u6 _# W6 u$ v6 Z: P0 a# r" L, \
! b+ D; ^5 }' g# {MQ2烟雾报警器,附带PCF8591模拟信号AD转化. s5 G$ d$ v7 @! o/ e
& G+ }9 M. I. d9 H! @. q/ rPCF8591原理图:6 Y* f0 I) J# p; m6 o& s8 P
. m5 y5 L* s; v& J& [- H9 m3 e
- D6 Y; U( O% s/ Z单片机源程序:0 n8 ]8 |+ n m' o4 t
# x' t. r# D' B$ j- L* I4 U* B+ p7 X- I5 ?0 j4 s% [
/*********************************************************************************
/ |$ l2 m L* S& r* 【编写时间】: 07.071 H2 k( x1 V6 C% q/ ?/ S8 M8 r3 B
* 【作 者】: 雁翎电子
& m |& M2 {$ J; l2 }* 【版 本】: V1.0
+ q# l. `/ @5 l# k* 【声 明】: 此程序仅用于学习与参考,引用请注明版权和作者信息!+ v- I5 k/ _/ \! l
* 【函数功能】: DA-AD试验 . R* v: I' K* O% i7 m
* 【使用说明】: 单片机:STC89C52
" C: V4 L" a6 d 串口波特率:9600; q. d2 G& ?' J$ H! ^. i
串口一共发送4个字节 p% o) v& V+ [( I' d' W6 F. m
1 光敏电阻3 j* m Z8 }) D3 ^( r d) I* S" C
2 热敏电阻
2 v! G) x i" a/ C 3 悬空$ p1 v x6 N' x' I0 _; L
4 可调0-5V电压(蓝色电位器调节)
9 w4 I8 c6 `; `0 T, g4 {
0 ?0 m, `4 f7 B$ F; W K* ~**********************************************************************************/1 W; {: g, C& ^$ \) _8 z
/********************************************************************************************/0 {: Z; E% d. |/ _$ x( r
7 _6 T* K6 I) P' F6 j5 c
. U! d) r$ Q5 u#include<reg52.h> //包含单片机寄存器的头文件
2 a; j1 K9 x2 h6 F#include <I2C.H>" r( X" l) a) B3 d4 m6 u
# n; A2 A9 L$ ? l/ d# f
+ a M" p: \, Z, k4 l7 W
#define uchar unsigned char/ z0 [* k# E$ ^
#define PCF8591 0x90 //PCF8591 地址' n. h8 i n! G3 V# I' B# U8 ?
) v$ l5 d' V }, [
8 z; d2 Q9 L2 }3 e
6 M5 q0 h; c* a* x4 `% I0 T4 s# |
3 ?( E/ ~1 D: c7 K" t
5 E$ U d# z( H. c- O. b8 o2 }% G N1 F8 k* `' j; c
// 变量定义9 c$ g( r/ Q: [- [4 ]4 t: v( x% T
unsigned char AD_CHANNEL;0 f2 ~5 g8 X- b! C/ @! e
unsigned long xdata LedOut[8];& k. |! n9 ^# T7 J
unsigned int D[32];$ s/ a ]* {! H! @9 H1 r
sbit P2_0 = P2^0;* {& V! S7 z* L
sbit P2_1 = P2^1;5 Q! _% q+ U8 Y% K
sbit P2_2 = P2^2;- O) H( V0 L, H# ]3 V0 y
sbit P2_3 = P2^3;
' \! b U) I+ i; W& X9 o
, Y9 c7 ~2 R- |0 Z M
! ^) F X( u& Q7 K |unsigned char date;
$ }) v3 s, V/ Y! ^) Y! Q& a5 M7 P
3 T# t, O; V6 |7 b; \( R
6 _) }% j. c) I3 Xuchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
& h( n4 U' v/ B" L% h2 ? ^! r 0xf8,0x80,0x90};
! e6 d# Y3 w; s5 A' i. o+ [) Z
" n0 T/ g' g R, | Y0 }: q2 Q% D, [7 P& v; r0 U w
& X! h3 R0 _5 Q- L5 A& K8 Y
3 T7 Z4 r5 |4 a1 O: e' y
// 函数申明
* ]1 r M1 e5 p! X+ R' M% Q
" g1 M: v/ c# ]1 M) d7 u8 u) T
0 a! u7 T$ O# pvoid display();# C$ m" p* h7 w5 r9 j: |, _& J
void delay(uchar i);0 h \7 d9 `8 M7 n. K8 g# g
bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val);
( p3 g1 k3 l1 @0 J4 _% Hbit ISendByte(unsigned char sla,unsigned char c);
* `7 s! U2 A8 ]' T9 j9 [unsigned char IRcvByte(unsigned char sla);
, i) G( P3 y6 B0 {2 Evoid Initial_com(void);- [# M* c; }& q
//******************************************************************/
- w( Q6 |, u3 j! _' ~" ymain()1 |3 a. @' c, s9 _: H1 X( u, W
{
0 Q. P0 P' f/ U9 Y0 U
3 y. p/ j4 m; A: Z4 y
S$ b$ ~& j" D1 j* g6 z9 u" r Initial_com();# n9 r% P- a; V
while(1)5 m% m R) M$ E
{6 q8 y% i) X* p5 @6 v
1 E4 u+ J* {: h5 w
9 k/ P. g. B* J/ `, @5 [7 D+ C
/********以下AD-DA处理*************/ m" E1 \# D1 |- E/ D- Z
1 w+ I: F; M# x0 I: d9 G% Y9 a switch(AD_CHANNEL)
. o) s2 Q" }& P5 _: r {
; R4 m& o4 I- k case 0: ISendByte(PCF8591,0x41);( O$ v- ?+ H7 s" T- v n- B1 P% q
D[0]=IRcvByte(PCF8591); //ADC0 模数转换1 光敏电阻
6 G% V( W- ?3 R; |! ~ { break; / v% K3 V) V. @2 N
) @' u/ N$ x5 h+ |; l! }- t, _+ w% M case 1: ISendByte(PCF8591,0x42);
4 z) O' Z9 \5 ~ D[1]=IRcvByte(PCF8591); //ADC1 模数转换2 热敏电阻6 I6 V& a1 y$ r$ Y# y' X
break;
: S* S, j0 n0 g0 L* K1 q8 ] 5 J* F v) h$ C- G! x
case 2: ISendByte(PCF8591,0x43);; p: M- G8 j* c. k1 E. @
D[2]=IRcvByte(PCF8591); //ADC2 模数转换3 悬空
6 K* M% {, S& S7 j3 x9 D* C5 n3 J break;
/ {. B1 b3 P% Z! e6 i5 W1 U0 V
1 S9 d" q9 o1 z% u+ g& O: a7 } case 3: ISendByte(PCF8591,0x40);
* f' y) E& F* K* `( W D[3]=IRcvByte(PCF8591); //ADC3 模数转换4 可调0-5v
" k+ r. k* P8 E% y# b2 _, J4 X: Q7 G break;
- [" e Z2 C n- A' `
* ~! }: w% `4 J5 N6 ~, P case 4: DACconversion(PCF8591,0x40, D[4]); //DAC 数模转换
8 d# Q p: T8 F0 K, A break;
7 A4 ~, A# p" ? I/ q# V5 D: [
. d, n3 \1 A9 Z }! X3 |! j. l/ j1 a# h1 l0 \
) a7 q% G* Z, H0 `5 M1 }
2 `, ]- c. L! E& K+ W D[4]=D[3]; //把模拟输入采样的信号 通过数模转换输出- {' Y/ `- D2 H6 |# A o
* U3 v5 U8 o# k) d2 ?2 P: |+ _ if(++AD_CHANNEL>4) AD_CHANNEL=0;' O' M9 r% @2 u [2 I
- m z9 Z6 f9 w) v$ X- x2 F: O /********以下将AD的值通过串口发送出去*************/
7 \: h) A( k0 n/ Y7 ^9 g6 \3 J) { delay(200);
+ y/ H4 X; @. g% i# k; m7 G5 s SBUF=D[0];
! U+ ^ d- b G3 B% P l# q- \ delay(200);
/ b% U) y Y4 b1 B2 m6 W SBUF=D[1];
5 Z% ^: d! i2 @$ f1 T$ _ delay(200);
* _1 y4 _, @! Q, G$ E! _ SBUF=D[2];
4 P: ~: l& x( j8 h delay(200);& t3 [, B! q+ Y/ l1 z% j
SBUF=D[3];
) c! o0 k6 O0 D delay(200);$ P4 c/ z6 R2 H: _8 ~% e
if(RI)$ k4 a% e4 E' N0 \3 a" k
{: D. F+ Z2 i5 K8 `
date=SBUF; //单片机接受
- w% F* u" s9 H4 f- S SBUF=date; //单片机发送& x# x4 w0 t! s+ u" M1 H! R/ Z# w/ A
RI=0;
1 h& i4 {" `' ^' v- q4 Z } 1 b& M* W3 W& s y! Y
}2 J. \' s- F- Z- Q' M6 z
}5 \% k; F$ V W7 H$ w
+ g8 S, T, c! B
7 x/ c/ |& n5 V! b& M2 i/ c4 w
- |- g; Z, Z# t9 A; n% U
void delay(uchar i)8 k% m* N2 c# h! ~$ x/ b: }1 C
{
! T% i5 u& ]6 B uchar j,k; & q8 g3 t% s- g% X
for(j=i;j>0;j--)5 r B% {# ` O7 `+ A7 r* N% k! g
for(k=125;k>0;k--);
; r1 m2 L Y# z) j( \+ A( K( z9 C}
" r5 p- Z) M( `5 k
9 x3 r$ x) L% g9 [7 s5 d, i! [; K& A! H
/*******************************************************************) Z: ]3 D* [1 l6 e8 s+ ?" U
DAC 变换, 转化函数 & b, r( _7 \+ Z2 Q3 g
*******************************************************************/: b& [1 ~+ i; C2 F. Q5 H+ _
bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val)/ I" R0 A& g+ Q/ q
{
5 a& m6 l" I, U8 N e Start_I2c(); //启动总线
; A: g' P. U" y9 T0 b% _0 R. u SendByte(sla); //发送器件地址% `4 }$ R. [7 M7 x y0 y
if(ack==0)return(0);
" n/ `) |0 r7 _" K+ H SendByte(c); //发送控制字节
- @/ P- K, r A f* o _. x if(ack==0)return(0);* q; @) Q0 }! I1 l7 J
SendByte(Val); //发送DAC的数值
' f& p) ?6 a% {1 W. E2 a if(ack==0)return(0);
% @- E) e1 C- H1 h; z. d$ B H Stop_I2c(); //结束总线- D# V2 ?2 N6 z+ Y! Y) d
return(1);
* V/ Z6 ~! `4 Y( H( m4 l$ T}9 F. Y% p$ w% a+ _
{; y! b, x' z3 [+ T {* T3 `
4 M& O3 \8 N7 ]! [9 \/*******************************************************************9 a9 Q# s( m/ `2 _
ADC发送字节[命令]数据函数 - p" C" R1 M4 d0 r
*******************************************************************/8 `+ M& R: }! G( c- E% U/ Y
bit ISendByte(unsigned char sla,unsigned char c)
9 G% c3 X, d1 F8 [{
8 }3 @. h& L4 @! x. ^ Start_I2c(); //启动总线9 ~% C! t9 I& r/ L/ R1 z% r+ z5 c
SendByte(sla); //发送器件地址9 G- V2 O$ K$ ]9 S; J
if(ack==0)return(0);
/ ^! f" E l0 S( v, w8 E( w SendByte(c); //发送数据
0 [( {) K+ Q$ v) D, O' H( ~ if(ack==0)return(0);
( m- x3 F; |2 D* C4 j0 A& \9 ~ Stop_I2c(); //结束总线1 K( o3 d5 S2 B% c& X- y( V% e, A
return(1);
4 X: K* b( B% }& \! s3 W}
+ c, {$ t' d" C6 x' z" A$ w+ W" r- J
6 n2 Q' Q6 M. B( a5 `
# L6 l5 R' Z% p$ A5 f1 K8 h: S/*******************************************************************
" E( e3 }" o3 X8 |- L+ yADC读字节数据函数 : z+ m1 Y, A2 w8 D% E$ d
*******************************************************************/
9 T. N' B( y' I2 M4 ~, wunsigned char IRcvByte(unsigned char sla)
% w8 e% c% h, O/ a. @- R; J6 C{ unsigned char c;& l& }2 g0 Q3 F# [9 c) R1 t
# g, ]! ?' p, b
) [- x4 P( r- L+ j3 L' Y* m Start_I2c(); //启动总线
4 k0 D# r* E9 p# K" G- F8 t1 p SendByte(sla+1); //发送器件地址
& l" j4 D! W! [( o if(ack==0)return(0);- d n4 W+ U. X
c=RcvByte(); //读取数据0
* o2 B1 w6 p' E5 K! |* [8 D
. r! F2 m) }$ L5 @9 h, v$ D! y) ~( o& \* m
Ack_I2c(1); //发送非就答位5 D/ P/ B( L( C8 N/ y3 v
Stop_I2c(); //结束总线
9 L5 R' v1 z2 F1 W+ n1 f, D( ]- N return(c); a) C0 Y* K D# ~' x
}
. ?4 V: ~; y1 l, O. h* w2 O3 k- ^$ L4 @/ M4 g
8 h1 } q, a+ P+ c% i0 B
; F( H5 t9 v! O4 q+ ]! X# G' e
3 a, @) |6 a# J4 l//*****串口初始化函数***********( F6 l4 W. y3 C5 ^" n, Z" \
3 _2 g/ W m( J4 a" Z
$ {& J/ r% M2 E9 J" w: ~
//******************************
& t! Q: J5 [+ B$ T. s- P% z) l% l" [. ]* R
4 e, O( a% y1 A8 |7 K/ v
/ Y' d: q" f8 J6 E" f7 s& s. z: m
& ]7 _- M4 X9 B) S4 J# b
5 W( `! d6 |5 {+ [
; Q }0 M4 A5 g; _) |/ Y…………余下代码请下载附件…………
X) v' n3 B7 K$ {* l" _* S A) c( u; B6 z6 Z: R
1 J2 a( q" g2 k下载:/ E* Q7 ?& B- n9 ^
- X$ M- D1 g b) Z8 e% s( ^
Z3 A$ U' h4 X4 k1 |5 |
|
|