|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 yxlk 于 2019-1-19 10:35 编辑 # C5 K- }3 n2 `; v/ v3 r
8 `1 Z3 @2 T' q% m7 q& g2 }/ K二氧化碳CO2检测显示的单片机程序及资料3 n( }$ e$ N5 P9 [& a2 a
% @! J. i: G1 f; l$ j
1.二氧化碳传感器MH-Z19模块的T(TXD)接单片机的RXD 二氧化碳传感器的R(RXD)接单片机的TXD ,二氧化碳的V+连接单片机5v正极,V-连接单片机的地(串口TTL通信就需要连接这四根线)
4 r |6 ?' Y1 X8 F/ ~, A! M" U2.测量电压选用5V
* f, f% U0 R- v3 b' ~$ d0 B3.单片机型号STC89C52,液晶显示屏型号LCD1602,电路连接按照那个测试图的
, b7 B! e9 f/ D8 z, w4.串口通信波特率9600,注意晶振要是11.0592M,否则会引起通信失败3 y3 b. Y: c4 d% ^
5.传感器上电需要预热3分钟( u1 {9 _$ R9 s% b% s, R) B+ M F
' B+ U; R7 a, d& H" G& d
! _+ B+ C& T2 t8 O" l. w+ O0 ]
! f' [) Y, {$ H O# p7 Y& M- `) b
0 H- S; {4 n5 u9 t2 E9 I$ L' T& k( N
CO2二氧化碳检测的51单片机原理图:) x( W' g( F7 L( @+ @
7 P% ~* `0 n/ g0 \
! q; i$ s! T$ c2 E7 T! c" Z3 Y+ @' ]+ X3 \
二氧化碳CO2检测程序的测试,用的串口调试助手:9 ~3 ?) b3 k5 i
5 k6 x+ {! J7 h; Y6 M Z1 r
- t; S6 G" i! S5 p+ `! J发送 ff 01 86 00 00 00 00 00 79 6 R9 F! V: F5 v
接收的数据中 第三个数据*256+第四个数据( 串口接收显示的是16进制数)
0 J4 Q' R* s7 ]) ~$ C, L: t; j c4 \/ D7 f
单片机源码:
1 a0 W5 t9 h% {! p% E, |, r0 S5 C) Q% I #include<reg52.h>
7 A8 o& y, n; C+ a1 j#include<stdio.h>* X3 f1 D8 E- v/ w8 ]0 S
#include<intrins.h>
$ ]! C4 |+ `3 L; M- a$ e9 [ }#include"lcd1602.H"
. L2 M" Z+ R1 O. }) L, A* x#define uchar unsigned char0 H- ?$ ^9 @4 t' n! X0 l
#define uint unsigned int# A$ L$ W: w/ t) J, A# a4 z
#define ulong unsigned long 6 c) i. j: v7 D4 U6 G( A
6 e6 r0 l ^# `7 Q# I0 l
$ _! x; a' R/ \0 C2 F! Cuchar code tab[9]={0xff,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};& P- y$ H! x' d% }7 s
uchar date[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};0 o. ?/ X3 `. f7 @* T9 a/ `* T
, I8 f& w' u3 i1 ]1 A
& @4 T% `+ X0 J+ [; F7 x /************************************
1 O8 j+ Q4 j9 L9 r2 q- m, k 延时子程序
7 \5 F% P0 a; W+ l+ N 延时时间(xms*1)ms1 m9 e* A8 g* b. r9 v4 w% q
*************************************/$ g+ Y: x% B% s2 o5 w2 r
void delayms(uint xms)( V, ]* b+ y7 J
{* N2 @" K; w+ C: |) U2 O( V/ j; s" n$ @+ P; f
uint x,y;
& J2 z# | `& e9 P% b for(x=xms;x>0;x--)
! ^8 m, F7 E. d# G! [* [5 P& R for(y=110;y>0;y--);4 V$ ?* F; ]7 y+ L5 [: O. B2 v
}
. v& ]& D6 b/ J1 }
" ]8 R. F- A( V- n void send(uchar dat) //发送一字节
I- l. g4 \ p E9 L+ v {
. l0 a9 q8 s: j4 u% K- z SBUF=dat;
2 A, @/ c: z6 G- e while(!TI);, J& N* ^$ D: j: L* u P
TI=0;1 k/ n, p( E* n+ Z! L" j
}! y$ n! w( e* z- _- p: g
( ^$ F' k# Q: p6 W5 s6 H5 Z& r8 v8 G- x+ @1 c
' e8 H9 F) F- `% Y3 D, l# S/ ^ ; o7 F2 w( S) s
: w2 e0 \( z' ]: C) _, Z! A
( {$ \/ ~' h; x6 M6 b+ s
void main(void)- G; G6 t( W8 X# X: G
{
) ]' h7 l3 i1 |9 n, I' k uint tmp;& O- Z. V" k F6 v$ V
uchar i;
7 }! [% ` q* |( f TMOD=0x20; // T1定时方式2
/ I1 m0 X0 [$ d SCON=0x40;//串行工作 方式1
& ^5 B( c. ~. u+ T5 S PCON=0x00; //不加倍2 T1 ]7 _/ ]" ?: |0 ]# R
TH1=TL1=0xfd; //定时器1赋初值 保证波特率9600
3 c% u" S* s; a$ R2 w9 G7 C TR1=1; //开定时器1
8 p1 e8 I' W) m8 r& [# j REN=1; //允许串口接收
- A: a) ?" y5 y7 kinit_1602(); //液晶初始化: C, Z2 H" m, P3 a- N6 y& \
delayms(10);
$ |$ `! S% t1 c& g; s; Q ES=1; //打开串口中断3 T8 a/ x" Z5 Y
EA=1; //开总中断8 F4 P: V! \; o9 W
while(1) s' x# G' w' A7 x* q/ R @
{
$ ~( z& v$ M/ U; y7 c+ T6 I for(i=0;i<9;i++) //向co2传感器发送数据7 c) V/ A; {1 Q. O8 h
{& m# L, E; A8 E+ H
send(tab);
4 A5 h/ X1 N5 f7 ]+ [ }
/ }& i n# y* M$ f/ U1 t, L delayms(1000); //延时一秒 刷新测得数据: n; w3 w* |* u/ P1 y6 s+ s
; l1 _2 o5 e7 ^1 I tmp=date[2]*256+date[3]; //计算出co2浓度值
% h: |: p) c! ^/ j; U* u3 Z% [/ ` if(tmp>9999), C) l! J# N$ j1 \3 q
tmp=0; , v9 h/ Z9 J% f4 \$ A8 y
WRITE_LCD1602_COM(0x80+8);
. e! T2 {$ @ h: @/ p+ v if((tmp/1000)>0)
3 P* f# I! \( c0 ?' o3 i* ^( g WRITE_LCD1602_DAT(LCD1602_Table[tmp/1000]);, ?, h' W# I8 M0 j* {( o: X N6 i
else WRITE_LCD1602_DAT(' ');
/ n. t( ~4 a* s6 ]/ o6 x- t WRITE_LCD1602_DAT(LCD1602_Table[tmp%1000/100]);( d, S" j* @5 V2 f; |
WRITE_LCD1602_DAT(LCD1602_Table[tmp%100/10]);1 h! H" K( C; e& H
WRITE_LCD1602_DAT(LCD1602_Table[tmp%10]);
1 S& {0 Y. Y: i/ Z }, X( ?, R8 B$ L
} o/ q4 ?3 h7 P" {9 R2 }% \
" G+ A" l+ n' l2 N7 r7 i5 M
9 f$ h) b. u" V c6 a# B void serial()interrupt 4 //串口中断服务函数
! x; J2 G& J* E" x' f {, P, [( j7 s; G3 f: s0 i, n$ y. E7 V
static uchar j;: f+ r$ q9 c, i2 ?4 r B# N
ES=0; //禁止中断
4 G8 \+ {! G7 d3 n7 Y/ a if(!RI); f* |' b# W6 r) _9 s% o- g
RI=0; //清楚接收完毕标志1 @* |6 R$ M* c4 Y
date[j]=SBUF; 7 L! |& s* n( p/ e) K: J) `, o9 k9 p
if(date[0]==0xff) //判断接收到的第一位为传感器所发数据
. ]% `+ R6 V) x% w p2 i2 [' [) i$ L j++;
1 ]) t! L- a! D9 v1 P) z else U7 V$ A2 o1 `
j=0;
, w0 [7 q) Z; C M! p/ O6 b3 F7 U/ o9 @
2 \4 e. v/ }- ]7 X% m下载:, F; s, `1 U* p/ S. X
# Z7 D8 p. a( ?. Q/ } |
|