|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 yxlk 于 2019-1-19 10:35 编辑 4 K/ n4 @# {4 T* b) Z/ f7 r
/ f/ E8 S; t2 r* s. n
二氧化碳CO2检测显示的单片机程序及资料
5 [( F2 D" [& p' P. l
n9 g# M" e8 _1 p. w! y. v8 P1.二氧化碳传感器MH-Z19模块的T(TXD)接单片机的RXD 二氧化碳传感器的R(RXD)接单片机的TXD ,二氧化碳的V+连接单片机5v正极,V-连接单片机的地(串口TTL通信就需要连接这四根线); Y) T; o& y. W/ n4 T
2.测量电压选用5V
2 H% {, \+ M" H1 l" ?" i( ?) V3.单片机型号STC89C52,液晶显示屏型号LCD1602,电路连接按照那个测试图的& ^. M u# z. m: F$ ^( m
4.串口通信波特率9600,注意晶振要是11.0592M,否则会引起通信失败
! Q( w: x* k t! q) J6 m$ {8 W5.传感器上电需要预热3分钟
$ W5 [5 E" \3 J7 R0 t2 K4 G' c
1 o0 p( @. o- a% `( G4 d9 \
, l, y b& M% B4 D$ L
( e# Y( T4 V4 D! O) X
, Z( K5 y+ j: V; `# E! O' cCO2二氧化碳检测的51单片机原理图:
; [# _- J, Y5 t
& i; ?! U* a& ~* \/ v) J% @7 P1 e- S* l) [' @
5 I+ h& k8 R7 s3 D4 d: H+ L二氧化碳CO2检测程序的测试,用的串口调试助手:' ?* p& H* |- j3 g9 }2 Z8 e1 g
. ?7 n* K5 i; m+ B& e
q' z! R! {2 n; [. _
发送 ff 01 86 00 00 00 00 00 79 , Q2 k6 D" e9 i
接收的数据中 第三个数据*256+第四个数据( 串口接收显示的是16进制数) : s- L+ k: j$ N7 l9 w
* t% E( z% I) r+ N3 G单片机源码:6 w! B3 U1 P. d; |
#include<reg52.h>" p! ^& d5 U. Z1 m) s
#include<stdio.h>
$ j4 x- U) b" w; Z: ?7 M# Q7 [#include<intrins.h>! E, S& M+ P+ }/ T W4 ?6 P' L* S9 \5 f% N
#include"lcd1602.H", ?0 H1 ~4 S3 E5 E! {, ^" r Z" b
#define uchar unsigned char
# [% u& z& e/ c1 `+ x5 @# G- v#define uint unsigned int
% E$ g" U0 d. m#define ulong unsigned long
6 u: P, n! w( K1 B
: T; X( B8 R; x2 O R" N
# r% g" a4 h# F: R' E$ b( Buchar code tab[9]={0xff,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};: h1 I6 ^# E. b( y
uchar date[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};9 k+ C ~/ ~: d4 K
" P! Z4 U( {4 o& `" u: G! x& B- n" v1 w* _* k
/************************************
$ s& L! w: [% B5 { 延时子程序
9 D- Q. U% ~8 _2 G, I" S4 J 延时时间(xms*1)ms
3 a) y6 T0 P% m1 |6 w*************************************/5 F1 n4 d8 b/ }5 m& w x s
void delayms(uint xms), @3 v# I/ p1 v/ [( W- J4 j$ |
{
: h$ B8 K/ f- u0 T! L uint x,y;. D6 D9 [. J6 N& M5 z$ ~
for(x=xms;x>0;x--)) s5 \% Y! {5 S& \) i0 D) u8 K. {
for(y=110;y>0;y--);/ B! v5 i! L: {# W! u @7 o+ c
}
& ?" o; k5 J: k7 x
% b6 c" r9 g* R# t) ~" V( c void send(uchar dat) //发送一字节
* P# }5 n, a. t) M: Y [% E! _4 }: s {
0 I2 c/ x, A. d. Q SBUF=dat;
0 V- T9 a9 N7 j while(!TI);' {+ P% Q( M6 S
TI=0;+ d0 T" m% K! m' ]
}2 \, H' Y. V" a/ ^/ m* t1 G
1 N6 s b4 d0 }" Z; o5 U
7 X4 v6 w2 _6 p" _& g& u( p
. t }1 C+ I9 e1 a
0 g9 E8 h) K: a3 K8 i% d
% d3 g( e$ R5 w: M: L0 G
6 i2 g. s7 H" }1 S# f2 x0 Yvoid main(void)% P- J4 j1 f' c2 N
{
t! M) d$ m/ x8 E1 ~2 u1 k4 h uint tmp;
5 m& d+ y$ ]7 m1 S3 H uchar i;
1 M" }! W4 y$ i: ]) P$ D TMOD=0x20; // T1定时方式2
4 f: c/ v: c: k/ `7 A/ l& g SCON=0x40;//串行工作 方式1
3 ?, \) m. s, ` PCON=0x00; //不加倍, j; f6 L% D' `$ a- u5 k) _
TH1=TL1=0xfd; //定时器1赋初值 保证波特率9600
' [0 q( h" N/ G. f" n3 m. ~6 F TR1=1; //开定时器15 |' j, E0 O5 t5 s/ a6 f5 S* t" T
REN=1; //允许串口接收
2 u) _& V- G: |; v U; T2 X4 Ginit_1602(); //液晶初始化
+ U |, A K8 b1 f' H, q0 Zdelayms(10);
& Y' t& u, V+ x6 z. n$ n, X6 M ES=1; //打开串口中断
+ C% `$ T% q- }! t0 i3 e% U% Q& y EA=1; //开总中断& ]. g( @6 I3 @8 e, a5 a( m- y: z
while(1)
% D' T) f" l7 f. T$ L; u{
$ l7 J' H7 u; p7 l5 d1 y7 y for(i=0;i<9;i++) //向co2传感器发送数据
. x" W6 ?/ J& l) @ {
9 G8 g; v# U2 G: U( ~; M) g5 l send(tab);
! N4 r/ Q/ Z f. D: n }
4 L7 [& ~% C- v- W1 a5 K delayms(1000); //延时一秒 刷新测得数据
' z3 n& H- m' p% D
/ [* w. W3 G& X! \: N9 R* c# G( E% ^ tmp=date[2]*256+date[3]; //计算出co2浓度值4 f+ \+ k4 b: y+ s
if(tmp>9999)
; @$ P$ T' E8 u8 ^ tmp=0;
# n6 v; r3 u! k9 s7 V) T& J WRITE_LCD1602_COM(0x80+8);
. y) j! }- D( Y+ E( A' X- h if((tmp/1000)>0)
7 i8 M! r+ r+ C7 ~) s& P; e3 n WRITE_LCD1602_DAT(LCD1602_Table[tmp/1000]);* Q2 t J7 L8 Y6 M- p# |
else WRITE_LCD1602_DAT(' ');
R# } [. S; ~ WRITE_LCD1602_DAT(LCD1602_Table[tmp%1000/100]);2 L K5 T5 f& Q5 d
WRITE_LCD1602_DAT(LCD1602_Table[tmp%100/10]);
( Q8 u. a! _. K WRITE_LCD1602_DAT(LCD1602_Table[tmp%10]);
: ^" S* K Z# p- w' |, Q+ N }, S( |) U9 P& n4 U4 ^
}
7 _1 Z: f; w' \! Z0 d: ?* E. F8 B9 L( \' N. c
/ w, C/ t, ~$ ~" M
void serial()interrupt 4 //串口中断服务函数
: R3 V% S8 X. y9 d2 z1 k" S {) Y6 ]" \7 b3 ?
static uchar j;" x) Y; F p' d' I
ES=0; //禁止中断
# W' @0 w! a# d6 Y, k* v9 f: ?& a if(!RI);; i& }" G n; f8 N: K( X p
RI=0; //清楚接收完毕标志: Y4 m! {/ e+ c) F2 C+ f
date[j]=SBUF; : c1 Z/ P+ }3 H! h
if(date[0]==0xff) //判断接收到的第一位为传感器所发数据
! L. i" U3 @8 b) y# `0 t6 a2 k9 n( E( \, n j++;0 a" ?+ E3 m. B9 Y$ d0 F
else
" _% M6 p2 U9 p( _ K& ? j=0;
8 }; ` M% S5 V- j5 r" h8 }; j
/ p# G3 C6 o# U1 c& ~
: |- e* c* g( m, u& T% F" g下载:
, Y; o$ U% p. b6 y; \4 s" i1 }2 E+ N& X% s0 ]% C& a5 G
|
|