|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
PCF8591四路采集串口显示程序及原理图 附MQ2烟雾报警器资料
0 z: }& M/ q& e
{6 s4 }3 V- G) O
% C, v2 R2 z; ZMQ2烟雾报警器,附带PCF8591模拟信号AD转化.
, X2 U5 e3 U5 |7 Q+ D3 f2 U9 w3 e2 Q# t$ r+ P* M3 R) P
PCF8591原理图:
. r/ U* Y x. L+ I
4 C' L2 K4 C2 k% G: S! z! L% D- m1 H5 ^: K0 ^; L5 B1 }
单片机源程序:
8 x" S6 v: u9 k+ x6 n+ y6 ?' \! N, g2 a# f! _7 ]' `3 e
4 H4 u5 l0 T0 P/*********************************************************************************& x' Y" v" I* g7 b3 v
* 【编写时间】: 07.07
% Q( n& G J1 o5 O* 【作 者】: 雁翎电子1 B3 O$ k: m1 ^5 x$ E# E3 p/ {+ ^
* 【版 本】: V1.02 e. V4 t: P, {3 H8 g2 ?: r
* 【声 明】: 此程序仅用于学习与参考,引用请注明版权和作者信息!4 f4 F3 \7 J& a4 l1 j; ^
* 【函数功能】: DA-AD试验 , G* u3 l& R& F6 {3 t/ B2 M
* 【使用说明】: 单片机:STC89C52 ; n& F2 d+ P; d' y* z
串口波特率:9600
2 m& R1 k+ k* [+ O/ r 串口一共发送4个字节
$ K, x( B5 U; F( o( r- u1 E+ O 1 光敏电阻2 Q3 _2 O# q" Q. g
2 热敏电阻
! p. \' x; X& _% |- X5 h6 m 3 悬空
+ [) z9 ~5 o1 s+ l7 d& j! T5 C 4 可调0-5V电压(蓝色电位器调节)4 j+ {+ }8 A/ w( d- b
- y6 p0 z8 Z9 D/ u& C3 O6 P& l% U
**********************************************************************************/
8 }- r7 c' p* r2 H8 A* {/********************************************************************************************/5 `" w9 l2 {. h1 O& ?- c
9 X' i' |0 a- N- O5 F, D
; d! b5 n5 M F Z
#include<reg52.h> //包含单片机寄存器的头文件
1 g5 _" G+ Q* X#include <I2C.H>
1 n& x; y8 L' M+ W
7 B! A7 E9 X3 M9 m, U
( w% l' |; U, j. }2 L#define uchar unsigned char
& ^7 y$ o7 B5 h, k3 [#define PCF8591 0x90 //PCF8591 地址
- i( O1 d* f! r: h- ~) h7 ] Z7 x/ ?) o6 N `/ Q- C
% M; \/ i: R# B9 H
5 W0 f0 @+ k9 f& e3 w
, n) K8 Y0 E9 I1 O0 l4 ? f
% @- a$ m! i+ R M9 u% ~
8 w& T8 _% p0 ?5 a// 变量定义
1 y+ m( j1 n/ a" L9 L1 tunsigned char AD_CHANNEL;, f6 T# l) t" l/ y
unsigned long xdata LedOut[8];
. z: b1 {! F, n0 z' xunsigned int D[32];, g' E$ Y: \; Y& A
sbit P2_0 = P2^0;: ?( K2 ]! k0 T
sbit P2_1 = P2^1;. M$ W4 M/ \0 J. c
sbit P2_2 = P2^2;* s/ u$ E9 h O5 f
sbit P2_3 = P2^3;* G" b, |5 v1 N* }$ U3 T( |! \, x l
: q- e' W! ^4 U$ f$ j% f' ]$ E
2 r) M/ n9 Z0 N/ c6 c
unsigned char date;/ Q' O( u `' V' m+ `7 f
! _0 g+ H( X4 R% N2 q8 j
/ j* S6 {* @) U ]+ P/ j& j( D
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
$ f0 h: z5 P/ G' |, j 0xf8,0x80,0x90};
! r9 \% A6 V4 F' _+ u
! V- I/ S3 }6 a& V" O' O- a8 Q) s' y3 s& b' }: c, ?: h% w2 A
+ Y6 a* y9 i( c
" \5 B5 K/ w% {( A2 A; M // 函数申明 8 F, m0 p6 A8 X0 @% V2 S- u# w9 q
! Q. H `0 \- C# X1 d2 L8 w- f0 v: ^, D* J# u- N8 O6 j
void display();
) W0 l! ~# X% U4 Dvoid delay(uchar i);
- U7 Z8 t$ v" a- `# C. v* U! Obit DACconversion(unsigned char sla,unsigned char c, unsigned char Val);5 f! J& n7 C% V# j, n3 [
bit ISendByte(unsigned char sla,unsigned char c);* r, L6 ?; n0 m* N) @
unsigned char IRcvByte(unsigned char sla);
+ _# d) a4 U/ j1 y) p, @void Initial_com(void);8 t: x/ W* F4 }4 T6 Z: n1 A' ?
//******************************************************************/
. p, X3 B t( y a _main()8 i- E$ Z* m/ q$ S' e
{
9 O8 F+ d8 U5 y4 j2 D' y6 o; n% l, _7 s
9 q1 Q8 A+ [' I% P Initial_com();
6 E* h! ]0 W+ M) j5 G8 A while(1)
; V& W; {! D3 x1 Z {3 A" g3 [8 X8 r) f
, ?0 Q0 z5 i: \$ S3 S
2 }: C6 Z4 g/ H% J' a: c0 L- D /********以下AD-DA处理*************/
& h2 @* y7 v7 v1 T: ]$ R N: {5 h% h s6 v
switch(AD_CHANNEL)
/ ~; t3 f, j+ _ v1 g" | {9 r! r p7 A, X& A/ n, A# e
case 0: ISendByte(PCF8591,0x41);
0 Q/ n' u6 F) R: k/ u' s- X D[0]=IRcvByte(PCF8591); //ADC0 模数转换1 光敏电阻
2 G# f* p' C8 \5 K break;
" h. C" t' w8 h5 ?6 B / }$ Q P( E1 \0 G) u) E2 E
case 1: ISendByte(PCF8591,0x42);
+ q% C2 K* ?! O1 l; i, | D[1]=IRcvByte(PCF8591); //ADC1 模数转换2 热敏电阻8 s2 D. h7 H. N. r
break; 2 f- p# E3 [3 c- ^" O- y
V+ T) W( g7 m/ i$ n& n
case 2: ISendByte(PCF8591,0x43);9 V5 `- ]& ^4 R9 m' r
D[2]=IRcvByte(PCF8591); //ADC2 模数转换3 悬空. W! s; V$ v9 j* ^
break;
$ s. K; b3 a- @+ O 6 w- `. [# K1 w6 y1 K' s
case 3: ISendByte(PCF8591,0x40);$ f6 F! E* X; d3 x, i+ V# }
D[3]=IRcvByte(PCF8591); //ADC3 模数转换4 可调0-5v
' r+ T4 ^. Z* E/ b4 i( i break; 5 F; \, N! N3 w4 Q' M
. `8 h a1 W# D1 p4 i7 z' z case 4: DACconversion(PCF8591,0x40, D[4]); //DAC 数模转换3 P3 C% S) c: l6 m
break;% W3 m% n3 x! w/ p7 j0 D
. [3 B S& L' t3 i1 [
}+ }& [' _* `* f1 R! r/ q) Z+ L. i
( N1 N0 M: S9 I& k2 p: H" K* K
+ A; `- w3 R3 K& _3 R# Z D[4]=D[3]; //把模拟输入采样的信号 通过数模转换输出/ R5 ]4 u: r& _$ D
- \8 d! g, ^, w+ [4 P L if(++AD_CHANNEL>4) AD_CHANNEL=0;7 X$ L* A1 u/ c1 x& R8 s
' I9 w4 @" {) Y. S7 R6 v /********以下将AD的值通过串口发送出去*************/
$ [" y' l& _( b' X) R: d% B4 |; i* V delay(200);
. e6 ]- ^ X9 `- _ SBUF=D[0];
( R: ^4 M0 ?) ` delay(200);
/ c0 B3 L+ W( a: f# ~ SBUF=D[1]; ! { p* C) i4 r# k
delay(200); ( B1 O2 w$ D! X |5 o5 t& g: u
SBUF=D[2];
/ ?# R' `/ x, G. J3 G/ c6 ^ delay(200);
: r: V% z9 K- n) t SBUF=D[3];
+ K; z$ e* G9 R. c, g delay(200);
. \- [3 U6 W( s8 W! f& \ w if(RI)3 R. `% p5 S4 t6 [0 b4 Q
{
f. q1 T$ o3 t9 f date=SBUF; //单片机接受0 Z0 ~! A- Z8 j, g% U5 j' ~. U. z! E
SBUF=date; //单片机发送
1 W" q2 k' I! H, b4 _ RI=0;0 v: ~4 {0 G; Z& h6 i) a
} " @( Y1 o: o) P0 W' _8 f' g
}
6 a, d! T1 A B! x. A}, {/ k3 G5 S, w$ M# n
% W5 w! j4 Q% f$ z+ s. }9 D% V! w* i- W) V6 |" Z& i' m7 K6 D( q
- B3 |3 \' \. ?2 x4 R
) u& e' {2 D) F% n. l5 q- Q2 K/ G+ w
void delay(uchar i)) K5 q, F. ?9 w
{
W" ]$ O" N7 q5 K% y" _ uchar j,k; % p, d3 q9 Z5 I0 q0 }3 R$ \
for(j=i;j>0;j--)$ B: [0 q5 `5 K; G4 ^7 O
for(k=125;k>0;k--);7 t: z) I0 d8 _3 J4 y
}
! h k2 Q/ r+ R$ r
( Q. p* b" ~7 A, M4 U# l/ M& G6 u" o
/*******************************************************************
, K1 g1 H ^2 P3 T: ]DAC 变换, 转化函数 7 r+ J7 ~& @+ I e
*******************************************************************/
* b, g$ q! @% @; Ebit DACconversion(unsigned char sla,unsigned char c, unsigned char Val)- U9 t$ d, I/ [) G: U' V
{8 }9 l4 s7 V: l. N/ W
Start_I2c(); //启动总线
$ z( {3 a% E. ^& ~5 o SendByte(sla); //发送器件地址' n( ?$ Z9 y' q7 s, y7 I4 K
if(ack==0)return(0);
L. I" g/ f5 o7 B# I4 _ SendByte(c); //发送控制字节- D2 J0 }/ M0 ]3 K$ P3 A
if(ack==0)return(0);
+ d2 k' H3 @, s- ?/ U SendByte(Val); //发送DAC的数值 4 Y: ^, o7 r# `! U# b) v4 _
if(ack==0)return(0);/ b; x, Z& H9 r( m
Stop_I2c(); //结束总线/ E# k1 q1 K4 h- x) E A* b
return(1);& v. A/ @8 h7 a. ]( d$ I: s
}
+ X6 X4 t% T) z+ V2 h% K. Q5 S" ]- X7 L% J" [
9 F" B4 M/ s# x/*******************************************************************
( x3 C" D) Q) F5 n ZADC发送字节[命令]数据函数 " A8 y0 S! X1 f! H5 _3 X
*******************************************************************/
! V; c' i0 h' C$ L3 |9 Tbit ISendByte(unsigned char sla,unsigned char c)
3 U. k; m2 o4 q{
+ w) Y7 V6 n7 a! B Start_I2c(); //启动总线+ J' P& z6 s- J7 N8 G `
SendByte(sla); //发送器件地址
" v5 u8 m+ ^, t7 g if(ack==0)return(0);
+ p7 I9 F/ ]2 Q$ Y2 Q SendByte(c); //发送数据
, b' G+ F% a- B4 m" I8 e3 g% |+ Q' n! E if(ack==0)return(0);3 ?2 D* e& C% Q; N" P% F
Stop_I2c(); //结束总线- |0 c5 i; } J: X7 Y
return(1);
- |9 M$ K a# j# u( P+ n}
7 ?! p# X9 c# G! s1 d. h$ `& g) Q7 O
R+ ]8 F2 f H: k0 l6 F
/*******************************************************************
$ u J4 j7 x2 i% N) ZADC读字节数据函数 ) @2 f' L/ X$ X, l
*******************************************************************/; Q8 m1 E& K; D
unsigned char IRcvByte(unsigned char sla)
~8 `; m2 B& @# u$ i* B% f8 e$ p& c{ unsigned char c;" u" K7 r3 d0 N- \7 ^! E- w% t2 l/ y
. M; G% Y! ]" r9 O: c: _' B
; u' |! p/ M7 ~% S Start_I2c(); //启动总线7 `( _, A8 s1 c1 m2 j0 k2 e
SendByte(sla+1); //发送器件地址
+ K( F5 G& o! u' f$ X0 E if(ack==0)return(0);
& R) J: u: b5 g. Z) Y c=RcvByte(); //读取数据05 k6 n& I7 |# R' |! m4 T& F# A
' f! \( g/ W0 |+ d# M9 t- y4 ^
$ h- a- i" ~( S% ^' A
Ack_I2c(1); //发送非就答位
) e' a# ^, F) R6 s0 p1 E0 l2 i! b2 q Stop_I2c(); //结束总线
9 i$ D) z9 O% B1 t6 M5 \ O return(c);
) s0 K: E( x9 ]- j8 J}9 n1 s, ^$ `4 C+ x* T1 C% u# L
' d, X7 V' g4 B
9 P4 r$ u* y' ~
/ S2 { m; X+ J& p( S
, ?' z4 y" V6 \3 W. v+ S7 o2 M//*****串口初始化函数***********! V7 h' F5 U3 P- P+ O- _ L
, K& H9 C8 \" Y2 }' Q/ w
$ U Z5 x8 A; D! k1 M% F6 `! S" t7 W//******************************0 M& A- e) [0 G+ r% A; S+ L: |
~& Q1 [3 P8 D1 K' W
* C% r8 L' Q0 b% y/ Z' a' v! R7 f! R+ i: z& c
1 `- }# _) w( d/ X, M1 L
7 Z/ F. M+ L# ?. J: a
; j1 u& \3 b, b6 @…………余下代码请下载附件…………, V# I/ ?. F4 F+ P9 Q6 H
: x. M1 O5 V% w2 x* i9 b J' l* B
下载:
+ p3 ^! n: o/ F( b! G4 \# x3 H" b+ E+ j' E2 i8 K$ z$ w6 a
. V2 z) |: N6 {( Y
|
|