|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 yxlk 于 2019-1-19 10:35 编辑
% u9 Q5 [- E' Y2 `2 s1 S. h! ]$ B2 R/ t" R; F
二氧化碳CO2检测显示的单片机程序及资料
D1 n! b6 l& G) v& C3 c
; t9 C- M9 J0 k1.二氧化碳传感器MH-Z19模块的T(TXD)接单片机的RXD 二氧化碳传感器的R(RXD)接单片机的TXD ,二氧化碳的V+连接单片机5v正极,V-连接单片机的地(串口TTL通信就需要连接这四根线)
9 H' O1 K9 n! ^! N% N/ ~2.测量电压选用5V 9 I4 [& h3 z8 q( u
3.单片机型号STC89C52,液晶显示屏型号LCD1602,电路连接按照那个测试图的0 B" J c Q+ V6 a' W7 z# f
4.串口通信波特率9600,注意晶振要是11.0592M,否则会引起通信失败
& e0 G) _+ q6 `, i. s$ P5.传感器上电需要预热3分钟3 D. Z6 p& S$ B# ]4 v) b
* p# S3 x" f7 { u
5 v% D9 p2 l8 F- {5 J, b
9 a! Z& @! ]! R( E
& q1 w' ~: \, w# PCO2二氧化碳检测的51单片机原理图:
# |; s6 M8 U9 }% p! N8 h7 M; K
: T0 v4 z x2 F% H
& s" o: {6 r; K% T; U# k5 z8 h
/ _ a* a6 D/ |$ n二氧化碳CO2检测程序的测试,用的串口调试助手:6 ~" D a( T2 p9 C7 e- q" K4 C
6 n, T' p# t. b+ g( T
i& Z1 \7 G. c0 Z. o0 k
发送 ff 01 86 00 00 00 00 00 79
0 r, h1 d5 U9 J9 |( v+ r: b. `接收的数据中 第三个数据*256+第四个数据( 串口接收显示的是16进制数) & l* ?" v0 u& r) }$ U% \) i, {- D1 l
6 k2 Q5 D& |5 W/ \' V* v# f/ s单片机源码:+ D5 D" I3 t N$ P0 e! S5 G: e
#include<reg52.h>
7 v! v9 J6 D& X% [; N( \/ H#include<stdio.h>
k0 m, P% p6 Q+ V2 D# l0 ]#include<intrins.h>
& Q; p' n" W" F. @- W6 p#include"lcd1602.H"
4 ?2 q& P3 Y- L: }7 z% i* V# e: s#define uchar unsigned char2 b' i' o9 C9 h" m
#define uint unsigned int
/ U. n8 k2 n. b5 d1 h#define ulong unsigned long - M- S# V( i% Q$ r, E
7 W( ?# M7 y# o3 l# q" {& D! B0 O+ o0 k/ T9 l4 j# t
uchar code tab[9]={0xff,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
/ x7 s) V" N) E' U3 b9 nuchar date[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
" D% d9 J9 H0 H4 t6 K8 J7 w1 z
4 M2 I: Y1 V. b- M0 [/ L5 Y" J% o6 Z0 p5 v" S* r
/************************************7 F" c. F3 q% r4 v# `3 _
延时子程序+ Y* G* }) D, r- {6 D8 o
延时时间(xms*1)ms$ s% ^; M8 l+ r0 H8 R
*************************************/6 Z/ m- Q) x- m" \0 h
void delayms(uint xms)! q. w% P x1 a
{
# {5 e# B' F# i( U: y$ ^. t uint x,y;
0 R7 Y/ D: ], ~3 x$ |6 s for(x=xms;x>0;x--)
/ W/ }) E- z# Q% _( m4 \( | for(y=110;y>0;y--);
6 |+ ^) f U2 e8 V/ F9 m}% S. i( k* V0 [/ d- l+ J
4 K X: y; S' g void send(uchar dat) //发送一字节
" h5 z% |* V5 `, H {
3 N- A( L% d: U; [8 W& m$ a' R SBUF=dat;4 S5 F1 O0 W( v' e: p" q) _ u) L
while(!TI);) B8 G0 t; [" ~0 ^' f
TI=0; d4 D. o. V0 q; W7 v
}' i* J3 \1 M0 g. d/ ~4 C
$ z0 {* q: ]# j5 _- L4 ?) r9 e( l
; E2 t' T8 h( X) g/ w
% k' ?. d2 x0 N- n0 \; V" o, S, y
; c6 \" i- p3 p* K+ q9 ~7 l
. I7 @/ Q9 ?/ a4 o$ [& _, e' E" x# _, h# ^
void main(void)
+ k; ~0 C" O. J8 a{6 ` m7 P+ c! M, s3 O
uint tmp;
$ v, i1 z6 J6 z5 } uchar i;
& E! R# Y1 @ k% ` TMOD=0x20; // T1定时方式2& G9 {3 d- G! n, O; L0 h
SCON=0x40;//串行工作 方式18 c; V1 a5 O7 P
PCON=0x00; //不加倍
) j# o9 n V, W; m TH1=TL1=0xfd; //定时器1赋初值 保证波特率9600
# ^$ s, K. t& f* J TR1=1; //开定时器1) S* G" E N3 h/ }( R) m
REN=1; //允许串口接收
w/ @% W5 k% Y8 P5 h8 X- Dinit_1602(); //液晶初始化7 w8 V; v. L0 d1 j
delayms(10);
3 B& ?4 G- ^" g8 _) m4 W ES=1; //打开串口中断- `: P) t7 }. Y( y2 j- H
EA=1; //开总中断
" j) ?/ W6 O" ?& t- [9 Owhile(1) - k) M2 u7 O8 b( q9 z1 `
{% X! P- J a `# z! [) A) w! h
for(i=0;i<9;i++) //向co2传感器发送数据
) M& `& k+ I' J3 m {& `4 Y6 M' W/ T @4 a7 _$ d* ^, Q0 u. q
send(tab);
0 _, w. v# ?3 k. e3 t }
, H3 s; L- ~0 Q& n( f, G delayms(1000); //延时一秒 刷新测得数据; u# @( R/ ^ g @& [
- d1 i/ Y& p' @) D" b9 Y tmp=date[2]*256+date[3]; //计算出co2浓度值( t4 g, d+ L0 _: W& @
if(tmp>9999)
" Q- H: z+ s* i2 r! Q* W \& l1 J tmp=0;
' I2 D; f k% n! `# Q# p- F: f WRITE_LCD1602_COM(0x80+8);
& `3 `8 E# _. h- s( i# p if((tmp/1000)>0)2 o- ]$ Q2 k4 [
WRITE_LCD1602_DAT(LCD1602_Table[tmp/1000]);/ i5 v0 R3 a5 O4 o: c# A
else WRITE_LCD1602_DAT(' '); 0 R9 `8 i' y6 }. k
WRITE_LCD1602_DAT(LCD1602_Table[tmp%1000/100]);4 b3 ]( W* M' w( O
WRITE_LCD1602_DAT(LCD1602_Table[tmp%100/10]);! M& Y' ?2 o# W
WRITE_LCD1602_DAT(LCD1602_Table[tmp%10]);5 L, M5 A6 c1 P4 C( I; i7 A4 L; e
}
0 s4 W% T# V1 @ W0 e/ C }
, P, f1 D- w _1 V4 a" t0 H' B% n7 p
3 E3 l, N( z+ ~; p void serial()interrupt 4 //串口中断服务函数
, R+ T- B" L/ B7 \5 } {
# G% q3 t3 q @7 _3 I( ~5 V static uchar j;
2 W4 k7 o8 v) X3 p9 [ ES=0; //禁止中断
2 F" ?4 ~( C0 l& Z. L3 O- K1 ? if(!RI);
' x: X* h. I8 U j0 C* }- t RI=0; //清楚接收完毕标志
3 y% c& j2 y8 D, i" P, C1 l' t date[j]=SBUF;
$ y C1 X+ k& d0 v( c/ C9 F if(date[0]==0xff) //判断接收到的第一位为传感器所发数据0 N" p' l" c" s
j++;( Y- Q( {1 _1 g5 b3 u: O+ b& z4 C
else; a5 K* O$ y; [8 U
j=0;
# \! n0 b, L" k# r2 J0 e+ d& r, }% G0 N
8 z* A$ X* \% |
下载:) H, C, w2 t. f0 A4 |5 a* m
* @6 l) B ^+ Y/ r1 Y |
|