|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
PCF8591四路采集串口显示程序及原理图 附MQ2烟雾报警器资料
8 V8 O- @# {, ]3 `* Y4 K$ u; E$ x1 L4 o. ~" s, ?
! U1 S$ d" a$ h/ {+ B w
MQ2烟雾报警器,附带PCF8591模拟信号AD转化. ?) ~( R7 w" E3 H, }
+ g% K/ c F* }* s9 d& v; h
PCF8591原理图:
4 [ D i6 Y( a4 O0 D, t
' B" Q( h \: k$ J
6 D7 B! C! e& V \! X
单片机源程序:8 {+ H8 l3 Y+ g) N3 T, s
1 g% J2 _" A* f) `* \( @" q8 ?7 k; I; q
/*********************************************************************************- \8 u+ q: E: A; p. P$ \! S
* 【编写时间】: 07.07- {. G$ z3 m" {; x3 T M" Z2 C, B
* 【作 者】: 雁翎电子
- Q3 I, n5 M$ B1 d1 F* u# S: D* 【版 本】: V1.0+ B2 |( x1 y* a2 h
* 【声 明】: 此程序仅用于学习与参考,引用请注明版权和作者信息!
1 J; ^+ {7 c/ t2 y6 `' p3 G7 {* 【函数功能】: DA-AD试验 + m* I$ D8 {) ?3 u- |( x& o
* 【使用说明】: 单片机:STC89C52
9 G! F+ S8 P& H' F* d) a& I 串口波特率:96008 p/ T0 Q4 m! S) x4 E( Z( m
串口一共发送4个字节
- F# U& y$ [2 X 1 光敏电阻
9 f9 b) l# m/ v5 f 2 热敏电阻
1 f$ W4 }/ ~5 i& ]1 t 3 悬空
' u; t! [# S, X 4 可调0-5V电压(蓝色电位器调节)' C( V3 K3 y. E: N& e
- \! N& X* ?1 O2 e
**********************************************************************************/
* B: I/ t1 }9 z) O8 U/********************************************************************************************/0 n% m) u# y& [! e2 u/ E5 x2 E
( X3 ]' R2 E; v
+ @) |/ G$ S% A% s" Q( M#include<reg52.h> //包含单片机寄存器的头文件
2 s, F/ J7 I2 @# D#include <I2C.H>
" a& q7 N+ l& I/ A8 k7 R% |# K S) n
) u5 D, l6 K3 |; c# U z+ m1 R
#define uchar unsigned char6 a$ i' z* n! t- g
#define PCF8591 0x90 //PCF8591 地址
% ]: o( e/ l: q: [% G. d" t( E7 x0 e% O: M' o
4 j9 d L0 F3 U @* t8 J+ ~( p
/ r$ l& ^; i' {1 j. `7 m8 c
" \7 U% l; h3 u8 \, z
/ b. G6 |/ D( J$ H
o$ P# S" V4 G) M// 变量定义
% l7 H6 J1 W# `3 J& ]unsigned char AD_CHANNEL;& X4 X# l3 I. v5 m3 O; h5 j; A# q
unsigned long xdata LedOut[8];# s7 T- L& N/ p: `0 b
unsigned int D[32];
5 e; y3 h0 |# |6 u. Y! R! Psbit P2_0 = P2^0;$ {9 D f* }, B- y+ A; n" G/ {1 e
sbit P2_1 = P2^1;
! S4 n& R* R* C8 I3 Fsbit P2_2 = P2^2;/ z7 E. b, D E7 S
sbit P2_3 = P2^3;6 T9 g6 u4 {8 \3 C8 p
, @" `! s9 F. X7 x" R" ~
) a8 P. u' `/ A8 C/ Lunsigned char date;
; Z0 }5 z# m- P" k E" ?6 e1 Z8 c& {* N8 S
* s. S0 s; t* y2 {, k! G" zuchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,7 w- m; W/ V; n# f" w- p
0xf8,0x80,0x90};% U; D" I6 ?7 `
1 O' A, G, \" K- q2 Y' h- F% O
& f" E. H U' `$ d+ i2 }( E4 Y+ z N h
, q- L' D; y, ~4 M$ ] // 函数申明 / A9 c5 t! P) t
; F, P9 E; b; J& }! v* X s
) F. f6 P9 Y) G1 ?( \+ k! S8 C
void display();
- X a% s2 v1 ~) cvoid delay(uchar i);0 g$ y4 L4 I1 h5 O3 T: L6 g
bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val);2 ]5 q0 h& J. I6 _& M7 g! v8 A
bit ISendByte(unsigned char sla,unsigned char c);6 ~% n: S9 M2 a9 g; a) \; t2 G
unsigned char IRcvByte(unsigned char sla);
* b/ u5 F! t B1 {8 q$ n qvoid Initial_com(void);
( Y/ ? R# W1 j9 O/ H8 b//******************************************************************/5 ^2 i1 ?0 Y- Y' Z$ f& _
main()- g6 U9 Z f6 O2 o
{ ' Y) r, w0 F0 q1 Y8 Q
" Y% G/ s6 h) D4 X
2 f" d5 U% ^! f, G& i. h( C3 { Initial_com();
1 W4 G4 |, a; C1 z& o while(1)
! }* T) J: S. p" h% Q {
. u5 E' L% f M* Q8 i6 T. Q k4 Y; E' F' v" Z9 C4 J
, V) j& }% }5 Y# W& [
/********以下AD-DA处理*************/ ( B2 H5 A; K4 f- c
" M2 l9 X* g( g1 M" X4 G switch(AD_CHANNEL)
- v$ c1 r, A) \" b; @( S; Q {: w6 O' W8 H) ^6 [# J3 \' Z
case 0: ISendByte(PCF8591,0x41);1 l1 { X3 I) _3 R [5 r
D[0]=IRcvByte(PCF8591); //ADC0 模数转换1 光敏电阻, T) s7 u" c6 h" _' W9 y! c' M
break; $ o- ]3 ~5 Y I4 e$ L5 r
3 m1 t1 ]5 u3 c% S. Y; K u0 \ case 1: ISendByte(PCF8591,0x42);
( n6 p( B" E4 x' G! M9 ] D[1]=IRcvByte(PCF8591); //ADC1 模数转换2 热敏电阻
6 W5 v9 M( h; y6 \* S! x$ B! @ break;
+ ], O5 n4 F6 j6 F1 C0 N3 y8 D " `. c" s8 T8 b/ p& N
case 2: ISendByte(PCF8591,0x43);: g! L( w. N- N3 y1 p# S5 |( ]
D[2]=IRcvByte(PCF8591); //ADC2 模数转换3 悬空+ d& I4 c7 G9 r9 O# Y
break; # M% I; S1 h. H4 b. t
0 c3 ~- t. K+ O, I case 3: ISendByte(PCF8591,0x40);# \4 g5 ]2 v# U, P4 l! y$ C
D[3]=IRcvByte(PCF8591); //ADC3 模数转换4 可调0-5v
6 d$ Q9 o, {1 Z% K2 ^ break; , E4 H/ U n& | Q% ~
" Q0 @3 l Z9 t$ B% ~2 H
case 4: DACconversion(PCF8591,0x40, D[4]); //DAC 数模转换
1 k S$ y, H# C n3 _; _ break;' ]% ^" o% E4 {1 L
3 K& J6 ~1 a8 }! p$ K3 E }. l. d# @ _; L2 l8 s
% B) \0 u3 P+ P7 q. k1 J: B- U2 E
( P. b& l* ~5 v' ]! }) e# m D[4]=D[3]; //把模拟输入采样的信号 通过数模转换输出0 C$ K( h8 d6 T `0 C
6 ^: t5 s3 `8 T. o! W3 [$ F% O% W if(++AD_CHANNEL>4) AD_CHANNEL=0;( w e: P! d* }5 T: j; o6 a2 w) h" }
: n5 ^, o$ B* L, g( |
/********以下将AD的值通过串口发送出去*************/
( F3 S; ]2 {* O$ p% L delay(200); 7 v6 t) Y3 J n+ R
SBUF=D[0]; 2 D* t) F" O# u' E: l
delay(200); / D' {* x- C# H2 g8 B: Y
SBUF=D[1]; - d7 @7 H% f* Z z- G
delay(200);
7 U! G a* _% V: b1 ` SBUF=D[2];
- F, Q4 q0 J6 Q" e delay(200);
" U G$ m2 \+ t SBUF=D[3];) g+ a+ B! ~+ j3 |9 }' I- N
delay(200);
+ Q1 X9 K( A+ I' h2 w3 ? if(RI)
. q1 N3 L. {& a! R/ j: |. G2 h {
/ b; c' I0 P1 W6 f" N! j6 ^( q date=SBUF; //单片机接受4 U6 U0 n! ~0 R5 W
SBUF=date; //单片机发送4 D' H6 F; n) i, }: q, f
RI=0;
2 V2 i4 M$ u, E [/ |: l% t }
1 [- J' C6 l0 B! | }' O5 q+ D( ^ k+ f3 [" Q- N- m
}8 Q, ]& R: M1 I; y5 U* D
: x* W0 _; f T( D' I
2 v1 ~4 A' |8 e) N f# {! n+ [. w5 T) n9 _6 O8 D m0 y8 O
6 p$ J% B) ^0 h$ o: N& Cvoid delay(uchar i)' @% X V& {$ P3 p O' F( E
{
; q0 i! X" f8 T9 @3 V uchar j,k; + l; @! j3 ^( Z, w% @0 ?
for(j=i;j>0;j--)
- R! ~" r6 F9 T for(k=125;k>0;k--);6 h) y) p# \% W) n
}
/ I# T* y4 ]! K. b4 R
4 K& s/ ~' k0 m3 x
0 |% p3 Q6 f' m- |* v* V0 h/*******************************************************************
6 T S, Z" Y9 u' `DAC 变换, 转化函数
. d; [* F. _; @4 _6 | \3 J2 O*******************************************************************/- D( D5 y) Y1 H% _' X9 Z- J& |1 ]
bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val)8 L) z* }1 z5 F1 t$ Q
{. r1 P) J8 M/ @# A! n5 _
Start_I2c(); //启动总线% F) v T3 D, d
SendByte(sla); //发送器件地址3 T: Q* G! e0 w3 N0 Q2 ]- _
if(ack==0)return(0);; F6 ~* t: Y0 q5 o5 z; ?* Q
SendByte(c); //发送控制字节+ B# n9 F; ], p4 ]0 p
if(ack==0)return(0); S" G9 S8 ]2 S0 N5 c: {" T
SendByte(Val); //发送DAC的数值
6 ?7 N1 v5 C& B# X( _. }/ c* o if(ack==0)return(0);
4 j1 F% D# F# r, ~) s Stop_I2c(); //结束总线- `: j: d/ o6 i; @4 |" q$ V
return(1);
% D2 E0 T' H0 G}* ]$ x5 L# I$ ^
# z- o9 h: z* f, l" C, v6 T0 y
" S9 l2 ~: {& L+ ~, \4 z/*******************************************************************
5 |8 `$ d7 G$ [8 X- S- ?ADC发送字节[命令]数据函数
- G; h. S8 g$ d A8 X*******************************************************************/
; _6 k- M/ u* g% z* Ubit ISendByte(unsigned char sla,unsigned char c)
3 \7 h, {- r0 V{1 Z& M% {5 ^ @- N
Start_I2c(); //启动总线) {3 M- x1 r0 H* }
SendByte(sla); //发送器件地址0 U& b. b8 W2 v4 T: A% I% r! r- Z5 G
if(ack==0)return(0);8 u! t3 r* D4 V! b
SendByte(c); //发送数据$ F9 {2 e& a+ O+ [" A
if(ack==0)return(0);
7 A3 `" A/ E/ P" B. Y* \& E Stop_I2c(); //结束总线7 v8 l X0 v O1 D% W
return(1);
6 I; }) {: ]$ T7 p& q5 k" T}
: a% j' Q' O; n6 Z6 r9 y& h* m" {! D' K9 | \0 c) d
" a9 i3 M$ `2 ]8 y9 ~
/*******************************************************************
4 h; z. R" F* QADC读字节数据函数 / h1 T4 n% n+ q( p1 @
*******************************************************************/: N% j- Z# r% U& y: ^2 l
unsigned char IRcvByte(unsigned char sla)9 i8 o) E9 O2 R5 b0 H9 \
{ unsigned char c;
/ x- u6 W4 [% W+ z: Z6 L! B8 A: W/ V0 R: T) n/ M
$ j, Z9 e, x: j: `. d0 A3 N `
Start_I2c(); //启动总线5 P- m0 [- X" f3 H0 ?# Q
SendByte(sla+1); //发送器件地址/ S/ X( P) K5 L% @
if(ack==0)return(0);
1 ]' x- C* E! |9 i, e' s4 v c=RcvByte(); //读取数据01 n- X" K8 i& }% X- r1 Z
/ \: `! m9 t3 o) V* ]
8 U' M5 [6 d; Y/ Z$ |& B8 p
Ack_I2c(1); //发送非就答位2 F& Z6 @( m* c5 Q( n
Stop_I2c(); //结束总线6 z3 X1 j3 a7 c+ r. V0 M
return(c);
L, [2 \: Z0 f l3 ~& ?/ f3 Z5 H}
' b) W' e$ b2 \& X2 ?7 Q0 B7 o$ n& G, [: n: f
: g+ ^! H$ P+ {2 S
% S/ O/ E: S8 q8 B' @2 |% t4 K& u
% F/ ^2 h& H$ c( q$ G4 `# i* ]//*****串口初始化函数***********
6 K, {; M+ |! f3 P4 x) _" j) W: B* C. n0 I, w4 V. f! Y
$ k1 h# r0 t* Z( T; {! b: K//******************************% I* e+ @* l5 h- E! C7 c* A* o
& ^! M- P( U; a1 C, p3 }
" F6 |$ h- _9 q4 U8 n. t
+ O% D8 y; f: ?' K" D& U0 Y
! z# o7 c, m, y* _# ]
: s0 g4 s( W+ |4 h; j
+ V6 {9 `/ @0 }" E, {…………余下代码请下载附件…………' q* O- \/ ~$ h+ n- Z/ S1 N h/ i
" x# Q5 T5 v: z* m3 i5 R: K& w
( S' y' d/ F( K3 t
下载:3 D2 h {7 e% A7 s& N# l
4 J7 f, I( f4 m/ J. p" f( Y3 x9 N! T( ^$ \% ?) x W i5 D
|
|