|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 yxlk 于 2019-1-19 10:35 编辑 - N6 _3 b9 b% S% g* N
' t3 m: Q/ S9 L/ C- V+ U
二氧化碳CO2检测显示的单片机程序及资料: u/ n) N* V* Q) r3 Y7 x; {: u
# y1 H3 ~: N$ p, H& N
1.二氧化碳传感器MH-Z19模块的T(TXD)接单片机的RXD 二氧化碳传感器的R(RXD)接单片机的TXD ,二氧化碳的V+连接单片机5v正极,V-连接单片机的地(串口TTL通信就需要连接这四根线)
' I0 j4 f; k, F W4 i$ L5 B2.测量电压选用5V , o$ L5 |: d' l
3.单片机型号STC89C52,液晶显示屏型号LCD1602,电路连接按照那个测试图的# p! N5 s$ X7 O
4.串口通信波特率9600,注意晶振要是11.0592M,否则会引起通信失败
& o# x3 l8 C) f+ Z9 B% j1 H& I5.传感器上电需要预热3分钟. d, D; D: n) `) g, K% ^
, R* a/ P3 b' E
. I+ P6 l) L, e4 M5 ^ J; ^
) ^" F1 j$ O! r& ]
8 N2 s- ^# I# y% Y0 SCO2二氧化碳检测的51单片机原理图:- D, i6 H5 F/ w
6 D" f7 T' k* w' {1 x1 T. s1 \# b& e; c; k
3 t' K7 j( i# M' x6 [二氧化碳CO2检测程序的测试,用的串口调试助手:2 _' b2 C0 d/ }0 z$ h
! C8 l/ e/ y; Y( z. ]( F
) z" ]9 X# ?' }! A4 ^% w, O% e4 [发送 ff 01 86 00 00 00 00 00 79
* h: h8 b, j9 |! ~% \9 Z接收的数据中 第三个数据*256+第四个数据( 串口接收显示的是16进制数)
. j N, j7 K) [) q) S8 H
- i* B: E) d6 ]6 [8 t, K单片机源码:
s8 g% H: A4 D& p/ C( j+ {) Y* R #include<reg52.h>* t9 X' E8 g6 C
#include<stdio.h>
/ J5 s3 o6 U& z#include<intrins.h>
* A8 ?* _4 q* K! L$ q#include"lcd1602.H"
. d# T4 s; ~4 |7 A2 U#define uchar unsigned char
9 H+ I' ^) w4 Z1 s% q#define uint unsigned int8 u. j2 A: j. t3 W
#define ulong unsigned long + I, K) m% y) F3 E' Y
6 M" {0 n, a3 r; Y3 z9 F5 ~! j( _2 F8 A: [$ M# N6 f {3 `2 v) V
uchar code tab[9]={0xff,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
1 J! V: W" L) B1 w5 v$ |uchar date[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/ N6 Q! x t& V2 G% E
2 v$ r' h* j6 Y/ X7 I; q
, X+ b' ]3 V# V# V @2 T6 ^* m. f- P
/************************************
1 H4 F% X% n; q9 N+ e7 i 延时子程序3 e2 q! P( p! J2 [2 M
延时时间(xms*1)ms
$ P& W7 E- \9 p% u*************************************/( K5 K* G# p! c% q! k, z
void delayms(uint xms)' N1 \ @0 @8 @5 g# S
{
; N( K( r' c3 x# f1 p9 o! ]& n% @ uint x,y;2 c9 t0 w% O+ A8 k1 l, S7 O" A% O
for(x=xms;x>0;x--)' Y( j+ W5 U. U9 f+ `
for(y=110;y>0;y--);. o# b/ ]! k9 y; p$ d+ h
} S7 o3 B j. |) F1 L( K9 M
% h4 {/ F3 ~& M- F& i' h8 ?2 P void send(uchar dat) //发送一字节 7 R) G! o- @# k8 C
{
8 m: R: w1 ~- `; e n) W, P% H SBUF=dat;7 Q& ^% Q" y' P
while(!TI);7 t k8 c! c- g S
TI=0;
6 k/ A+ b8 h( w: _8 I5 A }
2 s+ l* E# Q& @4 `( c% Y # U* j! a+ V! b3 K% p Q4 u# E
8 z5 f r" h( d& m6 M6 ^, X2 N7 s* R" U/ _" s1 ?! A$ h
4 l+ X$ t& Y$ ] t0 X/ ]
/ T$ s; q" ~& C6 u* V- F
9 ~& @5 u& v& j) B* A' {. l7 \void main(void)1 [ m$ k. z& P# u3 ?
{
, _* z2 D9 A2 T( I) H4 K# v uint tmp;4 G4 n/ t0 j, g2 U/ w
uchar i;
# }- v6 h" @ t: R; Q TMOD=0x20; // T1定时方式2/ v- B2 E& a4 a' c& {7 O; |
SCON=0x40;//串行工作 方式17 E- c( S J8 V) n3 W
PCON=0x00; //不加倍8 x" N+ A; O0 u" S) l
TH1=TL1=0xfd; //定时器1赋初值 保证波特率96000 ]% o1 p$ |/ M" I4 |6 ?- ^ R
TR1=1; //开定时器1 _; c6 o4 c' b% U1 t' b5 i
REN=1; //允许串口接收
' z1 ?3 Q+ c' a% ?init_1602(); //液晶初始化6 M j, G! o2 |/ ~0 r2 c& L
delayms(10);7 R- J1 ~0 ^2 g
ES=1; //打开串口中断# Z) K- z* h; L9 n
EA=1; //开总中断6 x T! Y0 R Z% l
while(1)
4 q6 t& \! O9 r) c( @- ^' k( y{5 B; u: Y8 X6 P5 p% p7 f
for(i=0;i<9;i++) //向co2传感器发送数据
9 W V, ^0 x% x& t& c) r/ H {6 G* ~' @- M* i0 j: Q7 F% d2 V
send(tab);( {9 }4 G0 e8 h; q6 O" W
}! L: \% A4 @; {" H7 r- E9 X
delayms(1000); //延时一秒 刷新测得数据
/ X. o, @" e* H2 e 8 a, [* Y; b9 c, _! B9 g
tmp=date[2]*256+date[3]; //计算出co2浓度值& [8 h; j* t) a+ A$ Q1 o
if(tmp>9999)/ b q" a* V, A7 D6 b l
tmp=0; 4 A4 m' s8 P$ b2 h
WRITE_LCD1602_COM(0x80+8);/ x. ?" J4 C* [8 ?: a, l! I
if((tmp/1000)>0)
& Y; N" m; z5 A3 i4 T% ~ WRITE_LCD1602_DAT(LCD1602_Table[tmp/1000]);
; T( Y1 w, {; M, {* s8 n- L6 M else WRITE_LCD1602_DAT(' ');
' F- ^- Y* s/ R4 n4 b# n WRITE_LCD1602_DAT(LCD1602_Table[tmp%1000/100]);
! Q7 {+ c# `9 [2 U3 e WRITE_LCD1602_DAT(LCD1602_Table[tmp%100/10]);9 W6 U0 `6 a$ C6 |$ G8 S9 Y* }
WRITE_LCD1602_DAT(LCD1602_Table[tmp%10]);
: @1 n7 ?% x. z- y* ?/ H6 M }
& C. ~' h9 V% }! H1 w! Z- R$ a' v }7 q. e: R) g+ }7 W/ y3 @
! J* J$ r$ a3 g* h/ x/ K8 r2 i( R
$ K0 L( k0 E4 M6 `# M+ {" D void serial()interrupt 4 //串口中断服务函数: h- V* F1 R$ [ q
{9 u7 ?3 f2 j! k' z# q+ [
static uchar j;
- H: K/ Y, a, J; d ES=0; //禁止中断
9 W+ q' n# d' z* P1 \$ a if(!RI);
9 C' w$ ^3 S! h! t4 K" L RI=0; //清楚接收完毕标志
. E7 {5 c' z" d6 G date[j]=SBUF; : T& U# l& z" u* m
if(date[0]==0xff) //判断接收到的第一位为传感器所发数据3 J# s6 J# I7 l
j++;* J V0 e2 b; }6 V! K# K& e! k( c
else
# h" \! n1 k+ C# c$ v j=0;* N3 Y; s r, j- k
7 u) K6 t% o3 `0 j
' D# `, `& H' }% c下载:
$ R8 x$ S0 i/ s. w4 f. r4 A/ A
- Q/ U" J+ I9 c: c: ~% b |
|