|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
PCF8591四路采集串口显示程序及原理图 附MQ2烟雾报警器资料, \" [* B: T D! d7 H
% k8 ?9 r, m# S- i" y; |
6 S, A4 O: z3 w# H) Y7 x6 C& _MQ2烟雾报警器,附带PCF8591模拟信号AD转化.
: E: P# F i: f7 s% D- \ Q
" K$ Z, @5 O- g- KPCF8591原理图:4 ^7 d3 t) I% {# D1 z8 \
1 p: X8 Z7 h0 b) N. T; Q
4 C& W0 R4 B" |- r! Z9 y2 f# |5 B- z单片机源程序:
# g3 H. n7 T5 `
) G3 c5 f9 t1 Q6 n ~0 j( O, E- `% @0 O3 u
/*********************************************************************************. c w; @1 T. h+ O
* 【编写时间】: 07.074 z+ W# O4 Z, ~) J! P# Z
* 【作 者】: 雁翎电子0 s) y% t, K: E' {1 P
* 【版 本】: V1.0% E* d1 W" H Y& ?( S+ v
* 【声 明】: 此程序仅用于学习与参考,引用请注明版权和作者信息!# V5 X, B6 B( W0 q( `6 Q* [
* 【函数功能】: DA-AD试验 6 H1 b: i2 W, _( V
* 【使用说明】: 单片机:STC89C52
& _' j, M5 E! a 串口波特率:9600
0 F- o# G) F/ p, d& Z6 A( }! t 串口一共发送4个字节 7 d$ s$ x. D6 {; T. N, |+ n' R
1 光敏电阻
7 o! q4 A& {: {+ z2 ?% I I4 Z 2 热敏电阻/ p; Z( _$ S5 `0 z' n& G e
3 悬空, B: l4 O2 ^3 n5 o, p
4 可调0-5V电压(蓝色电位器调节)" Y$ x" F/ j8 d2 x5 H% l! f5 |# V
. R) ~3 N# Y ~$ z0 n
**********************************************************************************/
8 E' z4 f) t3 y, |/********************************************************************************************/6 i& d$ ]# g4 l/ d
' P% f9 F0 c, i) F& ]. K
+ {' {1 G* }# F9 u* h; w#include<reg52.h> //包含单片机寄存器的头文件
. U/ Q$ X/ {: F e: h* n1 w#include <I2C.H>
0 Q) H1 c' ?, P; m7 Z% @# s
* m& ~: T9 C4 b7 w: R
/ a1 k! o H; q/ x* _, v; C9 w#define uchar unsigned char
3 X/ {4 e4 x# i; [% B6 V5 c7 q#define PCF8591 0x90 //PCF8591 地址: x/ g2 B3 S$ R% C/ j! F
3 `$ H, s U! ^ x7 A# B: j0 r- h
7 I# W2 f8 f T8 ^
M. e m5 b: l; W9 [
* n6 b$ \; T5 N: Q; Y/ t) `
3 H5 i" |" A. J* n3 R! G8 H1 Z6 e& R! F) T; O) _
// 变量定义, x- b V( ]9 f; ^# x# q, n
unsigned char AD_CHANNEL;
e; e* l+ {7 G9 R: D: z$ T( ?unsigned long xdata LedOut[8];0 j4 T/ h( c. M3 b
unsigned int D[32];8 |6 Y! Q- o+ G$ }6 k
sbit P2_0 = P2^0;1 T" b1 n% @5 ?& r& N; G3 ^& z
sbit P2_1 = P2^1; N! |' d3 N( R
sbit P2_2 = P2^2;
* l. D- Y$ S% ^* Usbit P2_3 = P2^3;
8 a& n0 Q2 G4 z3 I1 V* `
% u: K h& \. m2 y8 |8 b9 r
) j* \. u9 q: I* s! i# r. E, ]unsigned char date;2 D) m4 o7 T1 {
7 A1 N& t' P5 ^2 u$ ]$ X! n, A3 }1 E) U
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
( Y2 h f2 \9 \5 H) K o 0xf8,0x80,0x90};
$ q, S2 P. {. i/ M$ {
( Z0 }$ X/ Z& o* C' S( k5 O# w5 u$ B
! K) J. H+ p7 D5 c; l
3 D# g. a+ X6 \( ]( l6 g
// 函数申明 * u- Z* E r6 d# s
8 y, L) _2 E4 I% A
. S i4 \+ f( J9 g5 U
void display();8 a+ g- P) {* J, l Z% }
void delay(uchar i);+ z) L( V& \# }
bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val);3 j" q+ n! c5 r' c! A- P: t7 f
bit ISendByte(unsigned char sla,unsigned char c);$ m* {/ A/ K% P+ A5 X* e
unsigned char IRcvByte(unsigned char sla);
$ P% s% B1 v. ^1 vvoid Initial_com(void);
& F. v2 ~* b* P k. Y% ~: Q: D//******************************************************************/6 w0 c7 W! z- p
main()
4 Z) B5 }# ^: ]' j' r/ J9 b{ 8 O# M9 O* h0 o, ~; q D
9 }# P \; n% p
* C n* H8 s9 H* N! A, [ Initial_com();
& S* i; |% p7 E* N' Q7 w: @ while(1)
4 u b* }3 q+ G+ z6 U {
* K) n2 L* L2 c' f
# ^1 m- ~: n. h3 I! i' l9 z: `7 j# ~0 t% T5 d. c
/********以下AD-DA处理*************/ 5 c$ K) J3 J1 s
+ |% V, M6 W! T: _1 \ r" J) ^9 |
switch(AD_CHANNEL)$ c3 f% j& b3 A) Y
{& Y* J: G2 l0 e
case 0: ISendByte(PCF8591,0x41);" q7 D8 S5 k# @: R+ L) [3 p3 Z
D[0]=IRcvByte(PCF8591); //ADC0 模数转换1 光敏电阻' N0 P4 `5 e1 T4 F) \
break; : W. K# n/ F" \: ^5 n5 X
2 i! A8 x4 _- E: E0 r
case 1: ISendByte(PCF8591,0x42);% h6 L8 M- t6 u K$ R: P
D[1]=IRcvByte(PCF8591); //ADC1 模数转换2 热敏电阻
7 k7 m5 K8 S% x" ]' E break;
4 i* X3 D. d: `% f* w# ]1 c/ a/ s# l
* w( Z( s) V, i1 x8 w) o( L* m case 2: ISendByte(PCF8591,0x43);+ \, \& ^6 s k6 Q0 y9 h
D[2]=IRcvByte(PCF8591); //ADC2 模数转换3 悬空3 b( W! S X* q \! ^
break; 4 x: E& ?7 ~0 z+ r- }( J
+ O! c( L I# O( v" w
case 3: ISendByte(PCF8591,0x40);0 j3 ]! J+ N) e+ F
D[3]=IRcvByte(PCF8591); //ADC3 模数转换4 可调0-5v
& m$ k8 {9 |1 k" P9 e* b2 s; j break; 2 }" v9 u, h; ^. L9 w
0 X" s9 X- U' K8 @( z' B4 y( C" H" v
case 4: DACconversion(PCF8591,0x40, D[4]); //DAC 数模转换! o3 Z- N7 A \2 D( ~! \5 h; R
break;7 R! a7 F" c- o* [( V* a
K1 Q3 ?# J7 u) P/ U9 ~
}
# p% s: l+ Q" _9 ~3 |/ X- M: d7 z4 Z
+ _) Z, J7 N' ?8 t D[4]=D[3]; //把模拟输入采样的信号 通过数模转换输出
& V7 b$ ]8 E4 w ?& s k w3 l$ c8 D0 h
if(++AD_CHANNEL>4) AD_CHANNEL=0;
* B* T! P& h% n. N 4 P2 e0 E# ]; H/ j8 D2 ^* i) S) Z
/********以下将AD的值通过串口发送出去*************/. ^" \6 i9 p9 n. H; O2 Z4 ]+ v
delay(200); : W, I& C& Z6 N. k4 ~1 S
SBUF=D[0];
; j' r1 V/ L7 N6 B) ^ delay(200);
: O, i) `( e2 c1 T* y( E! B k SBUF=D[1];
6 N" W- C4 k" ]" H$ ~' y& M delay(200);
! `5 M& J* F' e1 e2 ~: i5 r; Z+ e SBUF=D[2];' n) ~: D$ E9 Q5 N- s' K+ U( e9 h
delay(200);3 Y8 B0 z2 q6 g' ]& Y! C( z
SBUF=D[3];, R! c. B! i0 `2 O; j5 d0 ~
delay(200);5 q2 t4 K9 ?( }. h9 o
if(RI)
$ V+ ~5 F2 u7 T7 }8 w5 q, B {* b @% Y, K6 l# O
date=SBUF; //单片机接受! w/ [, n3 c- e
SBUF=date; //单片机发送
/ K) o7 t1 d0 [1 R( \% A0 T) B; ] RI=0;
$ n9 {- G7 o; \% y# B v2 n }
7 Q; u( f7 [" \: U }
; H. `& a7 Y- H6 N0 ?8 U5 V}
- O. w! r( E& j% f' Y- ]6 A4 R# b7 ~/ U8 w! ]
$ q; q- K. u+ W2 o7 K( H5 ^/ Y; v& [1 Z
2 {& e! N3 O5 K
# b8 q) n1 l/ Cvoid delay(uchar i)8 Z4 L, e x& u1 q, ~/ t$ Y
{5 C: r9 s* _# n( ?
uchar j,k; 6 L" j/ M# @2 A" r6 ?
for(j=i;j>0;j--)
2 d. B: i. g1 p2 c for(k=125;k>0;k--);5 q) v6 }0 }+ U$ n" |
}$ @5 |1 `3 K" `
: q- V$ ]7 D0 @& _1 `$ i
. i0 x+ @' o" }8 J* o' k/*******************************************************************
4 }1 l1 i1 c' IDAC 变换, 转化函数
$ z2 Z+ E5 R2 t*******************************************************************/" ^1 j! J9 F& G: r( k% t5 R; K
bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val)
( s2 D% {/ b' k; |! ]{7 e! D* l+ z0 ]$ j: n
Start_I2c(); //启动总线
8 n# V! ~+ P! r& A SendByte(sla); //发送器件地址
" S) w" I( C! t9 d. Y8 l if(ack==0)return(0);
" O* y/ f# m* P+ L; Q SendByte(c); //发送控制字节7 l }9 @8 v+ m, A* J5 D! Q, X
if(ack==0)return(0);% l6 h X1 X- K( Q, R: H
SendByte(Val); //发送DAC的数值 ! x% h1 j# \) I( f+ [- _
if(ack==0)return(0);
/ i# v, \" K+ `: h* ~/ n3 \1 D* x Stop_I2c(); //结束总线! M2 Q$ q1 e9 y
return(1);
' A3 `9 E! V9 X; `9 w( C# E}
8 `5 z' V0 N+ ?* c- v% G; Y3 d, Q9 [
3 A; L- `% ]) G' Y: K" `/ a/*******************************************************************
2 C+ n1 ?9 q* {7 iADC发送字节[命令]数据函数
( ?( f [' k% N: f% X5 w/ A*******************************************************************/- A8 b# ?) m+ [ e
bit ISendByte(unsigned char sla,unsigned char c)
. a8 w; I( ^# o0 Q+ S; B' g, S. _{
0 f2 ]' f" x' Y) H, Y& J" X) T: x Start_I2c(); //启动总线
" W' E5 E2 i7 Q" C SendByte(sla); //发送器件地址# [5 M# V+ e$ r8 H
if(ack==0)return(0);* z7 w0 x6 i) [- I% Y
SendByte(c); //发送数据
0 X$ x' A% x/ `9 A2 C- N3 e7 i if(ack==0)return(0);
1 y7 P0 S# E N4 R% R- l Stop_I2c(); //结束总线5 d1 x5 t5 o9 W' m
return(1);) a2 ^* ?+ k1 ]3 T: u, u8 D
}
, e' N9 \$ U0 w! h* y
' F9 z9 I4 A# d8 I$ V: ~( n; y6 h5 l2 d) k3 X: A6 N* s
/*******************************************************************
& I( g: `, \, O" V$ c3 cADC读字节数据函数 * D1 U7 @. T" M* O
*******************************************************************/$ \ |! }4 F1 D. R
unsigned char IRcvByte(unsigned char sla)) [- Z# Y1 A7 m, |
{ unsigned char c;; X# z+ o6 o, L- t# X3 M
" B( E8 z: G. h
4 ?- C. V& r* y; J, x Start_I2c(); //启动总线1 J0 Q1 q) _' w J% m0 _
SendByte(sla+1); //发送器件地址
( A3 R' Z1 Q1 H7 g' S- T% F if(ack==0)return(0);' ?5 H, X: m1 X- ^% F
c=RcvByte(); //读取数据0: ~) @+ o6 N- D3 r: M0 a" p
: H: [6 Z2 g5 e+ z! D% [7 o }5 o% ]1 k8 O; t! V
Ack_I2c(1); //发送非就答位/ b. o' U# [ h! s$ @: M) [
Stop_I2c(); //结束总线- C) _% U8 x# y+ v$ j- E% j. e
return(c);2 O7 g0 l' E" X& G, A" g9 _
}* m( `- a9 \! {5 v
. H- I0 n( G7 B7 }* x9 ]: E
2 t1 N, t4 q( j% i3 D: D7 G" R/ U. n7 D3 g. g' f* r. Y& n
% ~# Y1 n6 l- |' p4 u0 o. f3 Q//*****串口初始化函数***********! w5 K4 q8 |5 C7 G) o' k& _- ]
0 `: n* X# J" y9 i) E' v) G0 G
& h. M$ c) L% c! V( q& B8 n8 z9 A% [//******************************1 I: ~* o% p1 f% \8 g4 Y
9 H5 U+ D1 v6 y. G( f
i/ R4 t* U6 @6 f9 r
& h1 w; ^( V, p' e2 ]5 _ ^+ @2 x: d0 l9 `6 ]* H' D8 A5 U
6 c+ C- w8 A1 f& R
) w: w! c2 f5 r! o5 P8 w' V3 Z6 {…………余下代码请下载附件…………. k+ I4 n! C% Y: ]
+ Y( O9 h: }1 f
j& U: l3 m$ Z: F下载:
* Q9 ?. P2 E' @8 v P2 f+ B6 O- Y9 u `, P
* ~; f2 o5 ]- c( ]+ R; R* s
|
|