|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 yxlk 于 2019-1-19 10:35 编辑
1 m6 ?& v6 ?' [. c& `% q/ E, U& r/ }' p% @. Y# h
二氧化碳CO2检测显示的单片机程序及资料 |2 n5 z$ y& b! Q2 C* }7 M# j" o
& _( Q' H# Q, w/ ~
1.二氧化碳传感器MH-Z19模块的T(TXD)接单片机的RXD 二氧化碳传感器的R(RXD)接单片机的TXD ,二氧化碳的V+连接单片机5v正极,V-连接单片机的地(串口TTL通信就需要连接这四根线)
+ }. N+ p5 W8 W+ {8 N2.测量电压选用5V
* d( {+ c4 o0 q3.单片机型号STC89C52,液晶显示屏型号LCD1602,电路连接按照那个测试图的
- A0 l4 {( t3 m* a g1 U) ^4.串口通信波特率9600,注意晶振要是11.0592M,否则会引起通信失败( Z( V, N j8 f B7 U$ T! d: v( J9 B8 Q
5.传感器上电需要预热3分钟
/ P. r0 S# I; ?5 Y/ T m* _
; V( j# H3 h \$ i' }9 Y1 H
+ D: C9 O8 g5 Q& r8 `8 h+ h
; H3 Q* z. x! t$ H7 n) G, g
" `4 S) c0 x0 `9 j* x2 g
CO2二氧化碳检测的51单片机原理图:# v+ z* P# q& B# z, b2 S
: [4 F7 a2 J: m R' L W
& \/ N: E0 P: ^
7 |5 @% C7 {1 C, P7 v
二氧化碳CO2检测程序的测试,用的串口调试助手:
* ]2 U; |3 q @( n$ ~3 e' j# Z
, v, e8 X$ I# }" ~1 u& \: d2 K0 e# s ~* L+ e
发送 ff 01 86 00 00 00 00 00 79
9 W4 v3 O6 r4 y+ L M4 I0 l接收的数据中 第三个数据*256+第四个数据( 串口接收显示的是16进制数) / h9 P4 j, v! d( _; N& u
& R \) r" N$ t, q! w单片机源码:4 F+ g' q2 J3 h/ V+ P
#include<reg52.h>
$ ?. ]$ H! D' C6 t* [#include<stdio.h>: G% _3 }# F' g* n7 i: q
#include<intrins.h>0 J! U1 j! l/ [
#include"lcd1602.H"& e0 M0 m3 _) `+ @ h, ^8 I3 }+ b
#define uchar unsigned char
2 Y/ P/ h- l' H# e8 P#define uint unsigned int
3 Q' B7 q/ i# w& l% P Q#define ulong unsigned long
* U3 q& |3 D8 r+ j: d) T) h; M a- h/ |+ Y
M) v3 O7 Y$ D/ `
uchar code tab[9]={0xff,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
* f$ e- H; _9 x! I3 N8 F2 tuchar date[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};. `7 O3 c0 i6 a" |/ W* w
8 j' T' D9 B. z! z- |& i6 K
; i8 `* _9 }" q/ K- x /************************************
" S" q. d ^2 f8 N% p: ^& \' v( [ 延时子程序
- z# \/ v) O8 B: q: }8 M+ S" l 延时时间(xms*1)ms
& `2 P; i) |1 f9 Q$ z) h9 ?*************************************/# W% j4 f! i! x1 L8 |& t* w
void delayms(uint xms)
5 f% {/ G$ d- _: A: o# \3 Y{ |7 L6 F* V: @; S; A: M
uint x,y;: N. e& d, O: V9 t
for(x=xms;x>0;x--)
/ m1 v- ?: m6 p" N for(y=110;y>0;y--);
$ S2 `+ o7 G: ?5 Y# g}
2 [* p3 E3 z$ u' Z) ` e- H
. t+ Z0 \) J8 \+ Y1 D; b6 R# i9 K void send(uchar dat) //发送一字节
* D9 L; G: x9 S! w( |( m! C {$ @6 A& a6 R4 H8 o
SBUF=dat;
" y" a. z! n& ]0 O1 S: ~ while(!TI);
/ p8 X! A+ g. K3 q* r2 j4 I TI=0;7 e9 W: k8 e1 v) Y8 b) ]
}. n/ E2 ?1 [6 d( L( u7 ]% j! G
]2 ^- Y( n( K& A4 e
( s G3 L# G; T9 T l3 r' S' a
4 L- L: d) `8 T2 ~; s
7 U) w G2 U. d' p& Z% ^/ q: g
) b1 S+ e" _0 Q8 o& c* ^* Q( C" j: K" Z t c( y' A
void main(void)
2 I% A* `* B& l- U5 n{
; c/ ?" z6 j2 v# s c; J4 ^) h uint tmp;
6 Y k" x) v% [' D9 w* h' x4 C uchar i;
8 k8 n5 f8 E" u# b; z2 y TMOD=0x20; // T1定时方式2# {" @9 g' D$ D- n$ b
SCON=0x40;//串行工作 方式1
( h6 g' F; }: z* T! | PCON=0x00; //不加倍
, j. n+ y# ^/ P) X6 Z7 [6 @, K* q TH1=TL1=0xfd; //定时器1赋初值 保证波特率9600# w5 |) ]5 G/ o& H8 ?9 e
TR1=1; //开定时器1
/ J( H8 w! |! }$ {5 G) N& v REN=1; //允许串口接收
, x( |" o5 E) e! v+ a; w/ `init_1602(); //液晶初始化; q3 M" r. A" m" h% o+ K D) j
delayms(10);
3 p& p# |2 ^7 \' y ES=1; //打开串口中断: P/ r0 R4 g1 o6 Y% U
EA=1; //开总中断
% j8 [: g1 ?# P5 Q5 pwhile(1)
, N$ L& ?2 f8 l8 | N7 ~8 P$ A3 R# S{
h# @2 \" j* F9 ? for(i=0;i<9;i++) //向co2传感器发送数据( ]" h; V6 j. c' |* ~2 r
{
. P% Y7 q6 q8 e" ]; q send(tab);
( z) G* l, ], r* h }
5 u _. l4 Q; ^) F$ V delayms(1000); //延时一秒 刷新测得数据6 ?: E1 x5 M+ m2 e1 b2 ]
0 g2 X5 `- t: V9 @
tmp=date[2]*256+date[3]; //计算出co2浓度值
5 P" d# ~9 c3 J4 G% M if(tmp>9999)
2 r/ l5 M* D" h( ]4 c: S' z tmp=0; : t- u$ F7 ]8 a2 L. N
WRITE_LCD1602_COM(0x80+8);
" l$ ]( T9 R# ~9 K4 U if((tmp/1000)>0)
! H* J3 ~, h$ F* J- q WRITE_LCD1602_DAT(LCD1602_Table[tmp/1000]);0 z" a9 f7 R" c
else WRITE_LCD1602_DAT(' '); 5 ?" k8 O8 X, E' u( q3 \' V
WRITE_LCD1602_DAT(LCD1602_Table[tmp%1000/100]);) k% @- H2 Y3 a" Y: R: S
WRITE_LCD1602_DAT(LCD1602_Table[tmp%100/10]);
) p6 o1 c2 ?9 f# p' D# h WRITE_LCD1602_DAT(LCD1602_Table[tmp%10]);
; A9 V8 [0 q: }& R8 g3 M; ?+ _$ T, N }9 _& R# K7 o: ]& ^1 D
} v& X& O% G- }- A* b
& k1 H5 u: |* B; i
/ j# M1 | D$ j
void serial()interrupt 4 //串口中断服务函数" {% F- Z6 b! {
{
) R2 @ ?) F; K, v: _5 b static uchar j;
' ^$ }1 e% c% l4 v ES=0; //禁止中断
+ n" J8 ~/ Z) |6 F: ?( G8 Z if(!RI);
$ }& i4 e/ o: d& Q( c5 C/ K) V. M RI=0; //清楚接收完毕标志
$ z& P* f- l3 t" m5 R2 Q date[j]=SBUF;
) _; f& v& c" M2 a if(date[0]==0xff) //判断接收到的第一位为传感器所发数据3 W _4 L$ b9 @. ?" K* ^9 L
j++;5 I& ^0 ^' @) p
else
) q( W2 E2 K {3 f- f7 p' S) x" m- m j=0;
$ x8 p! Y5 J: y9 e" p+ T2 ~8 D6 G, d" k3 M
+ @% X9 E4 U3 x/ H- I. L/ m1 V Z$ L
下载:
+ r" S k* Z6 l& G
& [* g" q7 x! J& f/ d, p |
|