标题: 二氧化碳CO2检测显示的单片机程序及资料 [打印本页]

作者: 51hei学习技术中    时间: 2017-3-6 23:51
标题: 二氧化碳CO2检测显示的单片机程序及资料
1.二氧化碳传感器MH-Z19模块的T(TXD)接单片机的RXD  二氧化碳传感器的R(RXD)接单片机的TXD  ,二氧化碳的V+连接单片机5v正极,V-连接单片机的地(串口TTL通信就需要连接这四根线)
2.测量电压选用5V  
3.单片机型号STC89C52,液晶显示屏型号LCD1602,电路连接按照那个测试图的
4.串口通信波特率9600,注意晶振要是11.0592M,否则会引起通信失败
5.传感器上电需要预热3分钟




CO2二氧化碳检测的51单片机原理图:



二氧化碳CO2检测程序的测试,用的串口调试助手:


发送 ff  01  86  00  00 00  00   00   79  

接收的数据中 第三个数据*256+第四个数据(  串口接收显示的是16进制数)


单片机源码:
  1. #include<reg52.h>
  2. #include<stdio.h>
  3. #include<intrins.h>
  4. #include"lcd1602.H"
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. #define ulong unsigned long

  8. uchar code tab[9]={0xff,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
  9. uchar  date[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

  10. /************************************
  11.     延时子程序
  12.         延时时间(xms*1)ms
  13. *************************************/
  14. void delayms(uint xms)
  15. {
  16.         uint x,y;
  17.         for(x=xms;x>0;x--)
  18.                 for(y=110;y>0;y--);
  19. }

  20. void send(uchar dat)         //发送一字节   
  21. {
  22.   SBUF=dat;
  23.   while(!TI);
  24.   TI=0;
  25. }




  26. void main(void)
  27. {
  28. uint  tmp;
  29. uchar i;
  30. TMOD=0x20;         // T1定时方式2
  31. SCON=0x40;//串行工作 方式1
  32. PCON=0x00; //不加倍
  33. TH1=TL1=0xfd; //定时器1赋初值  保证波特率9600
  34. TR1=1;                  //开定时器1
  35. REN=1;                  //允许串口接收
  36. init_1602();   //液晶初始化
  37. delayms(10);
  38. ES=1;                  //打开串口中断
  39. EA=1;                  //开总中断
  40. while(1)                                                        
  41. {
  42. for(i=0;i<9;i++)  //向co2传感器发送数据
  43.    {
  44.     send(tab[i]);
  45.    }
  46.   delayms(1000);  //延时一秒  刷新测得数据
  47.    
  48.              tmp=date[2]*256+date[3];        //计算出co2浓度值
  49.                          if(tmp>9999)
  50.                          tmp=0;   
  51.                  WRITE_LCD1602_COM(0x80+8);
  52.                          if((tmp/1000)>0)
  53.                  WRITE_LCD1602_DAT(LCD1602_Table[tmp/1000]);
  54.                  else WRITE_LCD1602_DAT(' ');
  55.              WRITE_LCD1602_DAT(LCD1602_Table[tmp%1000/100]);
  56.                  WRITE_LCD1602_DAT(LCD1602_Table[tmp%100/10]);
  57.                  WRITE_LCD1602_DAT(LCD1602_Table[tmp%10]);
  58.         }
  59.    }

  60. void serial()interrupt 4                //串口中断服务函数
  61.   {
  62.    static uchar j;
  63.    ES=0;                         //禁止中断
  64.    if(!RI);
  65.    RI=0;                    //清楚接收完毕标志
  66.    date[j]=SBUF;
  67.    if(date[0]==0xff)  //判断接收到的第一位为传感器所发数据
  68.       j++;
  69.   else
  70.       j=0;


复制代码



全部资料下载:
http://www.51hei.com/bbs/dpj-46992-1.html


作者: 房交会的谁    时间: 2017-5-6 10:47
楼主可以给我发一下资料么
作者: 通天塔2号    时间: 2018-6-8 14:36
本帖最后由 通天塔2号 于 2018-6-10 16:45 编辑

这个程序接收不到数据
作者: qqhqqb    时间: 2018-10-22 14:22
老哥,为啥四根线连接好了之后,单片机一直无法进行烧录
作者: qqhqqb    时间: 2018-10-22 14:22
老哥,为啥四根线连好之后,无法烧录,一直显示在检测单片机,rx和tx也没接反
作者: 一个小灰灰男人    时间: 2019-4-7 22:30
qqhqqb 发表于 2018-10-22 14:22
老哥,为啥四根线连好之后,无法烧录,一直显示在检测单片机,rx和tx也没接反

请问解决了吗
我也不能下程序
作者: 一个小灰灰男人    时间: 2019-4-7 23:25
为啥用楼主的程序不行呢,程序下不进去

作者: yhq123    时间: 2019-6-12 09:01
请问如果在这个代码基础上实现二氧化碳超过一定阈值时报警应该怎么改呢?
作者: lalale    时间: 2021-2-17 22:04
qqhqqb 发表于 2018-10-22 14:22
老哥,为啥四根线连好之后,无法烧录,一直显示在检测单片机,rx和tx也没接反

你可能是用串口烧录的,而你接好了线后,MHZ19B占了串口,所以你要先烧录再接线




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1