|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
PCF8591四路采集串口显示程序及原理图 附MQ2烟雾报警器资料" z6 S$ T8 [9 F/ t( J
" q( F7 I/ n# b% U+ w. g$ o5 t
- M+ K# h! z1 f* iMQ2烟雾报警器,附带PCF8591模拟信号AD转化.' e! n( s8 L- [. s
) N3 @5 U6 o* k) j7 h
PCF8591原理图:
% T5 K. N+ \$ m r1 a
% L0 K" }( w# E& r1 z& E
: q) l+ i8 s5 r2 y2 |+ k; N单片机源程序:# P* N$ o2 H* X7 k. @0 A
7 U/ q2 z+ D- h, f2 `* l
1 d* W4 c3 H `1 w9 Z
/*********************************************************************************5 L2 ~! H( i9 A
* 【编写时间】: 07.07
, J% s1 z0 M* Q2 |( v- o8 Z4 L* 【作 者】: 雁翎电子
0 h+ z. Y+ {/ }4 N* 【版 本】: V1.0
2 N2 f- d/ D/ r" B# C( ]8 v. f4 e* 【声 明】: 此程序仅用于学习与参考,引用请注明版权和作者信息!
, Q, t' M/ h3 H( k* 【函数功能】: DA-AD试验
/ z; b# L% v5 T7 w, S' t% |* 【使用说明】: 单片机:STC89C52
3 }" }, X5 T( ~, O: Y+ S$ f 串口波特率:9600
/ o% @) C6 h5 p 串口一共发送4个字节 " ~) Y) l9 S% o% S5 l5 L: F: x
1 光敏电阻) h: o& L8 L! c9 I
2 热敏电阻$ B' R3 M6 z8 L
3 悬空
% Y0 J* ?2 k* h 4 可调0-5V电压(蓝色电位器调节)
% R3 V |$ u- N4 a 5 l- b" w I- }& F( Z
**********************************************************************************/
" g2 N! e$ J9 o" S, I/********************************************************************************************/7 X2 [% X0 O \, @% {0 Y
9 U' Z' W4 K; V- O, O8 o/ _; i
3 K+ P+ ~) G1 J& S) d, w& J9 ~#include<reg52.h> //包含单片机寄存器的头文件+ u3 g( s( n5 E
#include <I2C.H>
# A% [3 i' w# ?$ G7 _
8 O/ c+ K+ z# q1 r2 f3 `7 e8 u. m e4 n
#define uchar unsigned char+ G, O* B- s; u& _3 L( y/ b: G
#define PCF8591 0x90 //PCF8591 地址) K, N5 W/ k( d9 }5 L- K3 R
0 i" i; y% m+ s9 x Y9 V! j$ }# U9 e
* f! C: B8 h8 `( P) T/ H- u
. c( H( X9 T2 ]* ^; K
! w+ g n3 y; f C% C# Y' Z
V9 Z3 M5 w c2 O) a, ~7 i5 x' F
// 变量定义7 _( H( i% i9 p" T
unsigned char AD_CHANNEL;
* z8 G7 f) A9 t: A- K1 Yunsigned long xdata LedOut[8];4 H* t. V( \3 X4 `
unsigned int D[32];
- k2 T$ t' p7 p2 t; y* isbit P2_0 = P2^0; `* C) W0 a: O& B( s2 G5 g0 P& C
sbit P2_1 = P2^1;
0 M3 Z+ a9 h9 A" ?, R8 Y# w, Qsbit P2_2 = P2^2;
5 X1 D( J- C9 Z& r3 l8 v; Tsbit P2_3 = P2^3;
2 b- ~; e, ^/ |" K; A& U p$ l& M
' P% W [4 w7 a- ]
unsigned char date;
' \+ ?2 E- ?: R7 w1 u
6 L q: T/ I; N7 h7 @ ` V8 \6 q& ?5 _4 O" m
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,# ^# C5 [. H; O8 V0 Q( O& i% K& G' o b0 d
0xf8,0x80,0x90};
( X. H' f J0 K5 o5 J/ y
K$ Z) G$ ], p. l* _7 q' G$ i# R
( {2 @1 r0 a6 ^2 _* U! U, y
; \; V$ |7 x! i' B- G: Y
. I5 p# C+ C* j5 t+ X // 函数申明
# Q8 Z% i; {4 ]' y
6 k7 R# z, @ q+ @. b8 I* Y! a* o# d2 Z2 ^
void display();
& }2 E+ _4 F$ ~. X3 q8 ~5 Nvoid delay(uchar i);
7 a4 ]' T/ q8 \. G; qbit DACconversion(unsigned char sla,unsigned char c, unsigned char Val);+ k5 w& i2 E- G0 e
bit ISendByte(unsigned char sla,unsigned char c);) _5 s: g8 T3 q2 K
unsigned char IRcvByte(unsigned char sla);
' K3 j3 Y0 j. C$ }; Q8 yvoid Initial_com(void);
5 r; `% E& `" C l2 j//******************************************************************/
' O7 ~8 \' }* |9 J3 q+ t. @0 Pmain()! T( G$ B; K4 S
{
& @7 {# T/ f& G4 N' F
2 D' R4 w8 y* R6 L/ \. [) R" ~' m8 A- L
Initial_com();
% Y8 F! W- I1 `% ?/ }4 \( S0 f while(1)1 _2 u! S# h8 X9 r
{$ f6 H! n+ X" I7 f' Y3 T" U' f% R0 Z
2 \9 `4 S: l% K3 ^) h. i% D9 m
" |( l5 A7 o; L: D& v- Y2 B! D3 N /********以下AD-DA处理*************/ # d' E5 c1 o9 V( u; [
! d4 b7 F8 _3 m/ o' t! } switch(AD_CHANNEL)
2 q9 e7 r4 F4 q) X' x0 x A! ? {1 I9 K) A: k; N4 o$ P+ ^2 z2 D
case 0: ISendByte(PCF8591,0x41);' d& C* y7 J8 _
D[0]=IRcvByte(PCF8591); //ADC0 模数转换1 光敏电阻' p4 l; o* W8 o+ n
break;
6 Y% p! G% ?4 b7 n# \0 [
2 c+ n* c, |; j3 r4 D7 z7 h% Y case 1: ISendByte(PCF8591,0x42);
8 S; [: R* t! M3 D6 Z' v D[1]=IRcvByte(PCF8591); //ADC1 模数转换2 热敏电阻7 J6 A; U/ J) B
break;
& L$ _% W" i7 Y3 A
( A3 m* G* I" ?8 R8 Y/ o5 [ case 2: ISendByte(PCF8591,0x43);
) i" m2 |! n2 d6 u3 Q; l D[2]=IRcvByte(PCF8591); //ADC2 模数转换3 悬空
9 F# o; B2 l% i5 ]# h9 F break;
( P% ~8 N) `9 o8 G2 X
1 k* m/ R6 g) n G case 3: ISendByte(PCF8591,0x40); h2 F7 t+ R1 P; o, v
D[3]=IRcvByte(PCF8591); //ADC3 模数转换4 可调0-5v$ `4 D6 A7 t, G
break;
& K5 V$ Z9 V3 t4 C7 x* A: c 0 q( L8 U& Y) D7 e8 o6 M
case 4: DACconversion(PCF8591,0x40, D[4]); //DAC 数模转换2 U3 @' f3 K9 q: g5 ^
break;
1 a* @5 H! D( n& R* g$ M
. T" D8 C5 O% B: W& }& R) g$ z' m }
' V6 f# h+ f- j7 M4 }/ G! b7 |! S/ e( i! x
/ w4 ^$ V% O6 T& E6 @
D[4]=D[3]; //把模拟输入采样的信号 通过数模转换输出
. M* c$ W4 L0 W
. H& M- b8 z7 ~4 }, s& U if(++AD_CHANNEL>4) AD_CHANNEL=0;( ~8 h0 G# ~4 p1 o, {) \$ [
* V* q/ W: y/ n4 g- l Q /********以下将AD的值通过串口发送出去*************/
" K. n0 Q9 k w) J0 h" ^/ x- \1 f delay(200); - q: ` j' c2 w+ z* n5 K0 h e
SBUF=D[0];
8 S$ S% Q/ j' b) \$ T: n delay(200); ; b5 w( M, q1 [$ x2 z) C
SBUF=D[1];
! T5 [9 H- E2 k/ p# c( g$ v; {/ `$ | delay(200); ' r0 b {$ p0 n; y8 g, o
SBUF=D[2];
; _# F& D1 f2 \% h6 F delay(200);
9 }1 B( J" ~% P8 p6 d* |1 i! u" a$ [" F SBUF=D[3];4 h; v) L8 F& Y1 A! b+ Y& o
delay(200);3 T( ^1 K- ]2 z2 N/ p
if(RI)" o/ l1 y& V/ g% Y1 X7 P! r
{
. D q0 O* I8 d' u& a. y6 g date=SBUF; //单片机接受8 Z1 L. C# {6 i/ S Q( Y5 {5 B2 X: w# u
SBUF=date; //单片机发送
. K R; j! y1 l. X$ V4 d* j+ J6 o RI=0;
" H( l! x4 L9 \ } , T0 }) j, T2 X" W3 o
}6 x" L; _# S: M" N
}3 q5 i3 z) ~. l$ G- L. H
' {& s8 c8 p O" q7 A& H: L1 ]
4 a/ U7 h4 }+ J; j2 D o1 {
. d( D5 E5 J8 S8 B( o
( E( _: {- o$ {void delay(uchar i) r. m! A% L9 }7 `2 }' ^9 A% x
{
4 }% U3 Z) r8 ^/ l* f( b" z/ z& v6 o uchar j,k;
6 m0 y# B% K: i for(j=i;j>0;j--)
0 L: T; x! ~2 V5 J6 e# } for(k=125;k>0;k--);
5 F; U4 t8 j' \+ M}6 d" }( W! Y! J) R7 ]2 e+ E, Y
# j, P/ @: S$ p# [. ^- Y% z
: C: `; Y M; @, S! {/*******************************************************************
- p3 Z* y1 @3 _, rDAC 变换, 转化函数
; E0 `4 \2 z0 d4 f*******************************************************************/5 Z. H, b% ?& w( J0 _
bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val)
! Q' j, e/ h/ l7 e% _. s q: S7 }{# N! C' Y! d0 w( y; B7 I9 y
Start_I2c(); //启动总线* J9 C8 O3 h9 J' q
SendByte(sla); //发送器件地址
) B E7 g+ T8 d% l4 n' }8 `) g if(ack==0)return(0);
7 U n0 {5 `6 Q6 y$ d8 i3 ] SendByte(c); //发送控制字节
6 U& W! S0 p8 n6 J( s: c$ ] if(ack==0)return(0);
" J6 g6 m# l# B9 g SendByte(Val); //发送DAC的数值 8 f7 e. U9 x* g) f
if(ack==0)return(0); G; Z' _# |0 h$ E7 Z: k9 L
Stop_I2c(); //结束总线3 C4 b) }! u: p- r
return(1);
% Z3 R5 t; n3 o}* h1 Z: p, b8 Y" E; C+ X8 b
3 ~' G9 o5 M4 u) p6 d
! W% |6 }: X- x1 V5 M
/*******************************************************************
" L; o* x- P b) z8 bADC发送字节[命令]数据函数 . j7 m U Z: d5 K( W; s6 t; c
*******************************************************************/
7 C1 l% i P2 ebit ISendByte(unsigned char sla,unsigned char c)# J8 {0 X+ T5 g% T$ P$ d
{5 I8 z& Z1 a5 V/ v3 q
Start_I2c(); //启动总线
, L9 s1 \- q1 e/ z4 Q' H SendByte(sla); //发送器件地址' e2 c. \3 s' | Z
if(ack==0)return(0);
/ f. b, b/ k6 d! ]- q* t1 ^7 ] SendByte(c); //发送数据) k% _* ^! X3 ^9 @8 e
if(ack==0)return(0);
% D+ a3 X" t5 s( F* u Stop_I2c(); //结束总线, W2 ?% @( w1 {5 n' _' a" l9 h- `
return(1);) u: D# O' }* ?
}
' C: x7 T0 c. L4 E+ d0 _0 }* O4 C' }( h$ v
; `& Z6 @$ V! p% b% G: k( R8 s
/*******************************************************************
! ^! D, z( M/ U5 xADC读字节数据函数
6 ?! P! ~( ^, |*******************************************************************/
# K" G/ f* ~4 @" uunsigned char IRcvByte(unsigned char sla)7 F1 ~" Q* m9 Q9 u. ?7 u
{ unsigned char c; J/ F F! N, z2 c h0 y
! u. I+ H7 A1 U2 s6 `5 u7 ?* j5 l; P4 T! X2 O y( s4 d2 t0 S
Start_I2c(); //启动总线
/ k W9 ?# w2 V- {3 n1 @ SendByte(sla+1); //发送器件地址( z7 E, {5 |4 G' {1 k2 V
if(ack==0)return(0);: G& |7 M5 k8 Z7 c3 H8 U
c=RcvByte(); //读取数据0
' Q% m2 Y" A! Q+ L: M
* g ?& G) G8 k/ g0 E3 [' j( S4 [
Ack_I2c(1); //发送非就答位
5 i* T+ o) @( h1 Z' |( k Stop_I2c(); //结束总线, y$ `5 j1 z( E, u: t0 u
return(c);; ]- H& n7 I" l0 |- `+ t
}
3 c5 H( l+ u$ l0 E) C3 U4 H% \: ?
7 y& a7 c. H; P) U( m- A' T5 j' n; M7 x2 B2 D0 I5 n9 Y
/ M( ]0 b; }) t2 ]//*****串口初始化函数***********
/ n: T9 @% k0 v8 E1 A3 k3 E
+ G8 b2 U. N l# q) d( x2 e& [0 J8 ?% P& f
//******************************
$ ? T- E- j) O# N( u0 }: W- G6 ~$ r9 K
, W4 F/ G8 F: L) E: F8 T8 M
0 P4 q" o$ Z! I3 ~5 g. O
) j: ^4 f1 [7 A" ?
- w. I+ a3 A, [! m* b
: E- E! i8 k$ h% Z& u…………余下代码请下载附件…………5 \# E+ K) k5 I! O& W; j
$ J/ O: X' b# j
% |) n' W# c- v! R; v9 |# b下载:
7 @, f1 {; w! L _: h7 n" }$ C8 f6 v5 a
2 s4 w9 p" [7 H2 R3 [/ g, V
|
|