8065|18

9

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

SDS011 PM2.5检测器在51单片机上的编程 [复制链接]

 
最近在学习51单片机,买了个SDS011 PM2.5检测器 想来编出来检测家里的PM2.5的,结果编不出来(类目),求大神来帮忙,万分感谢。

WQ$)LP1Q]78H[@R[Y7(J{~I.png (130.27 KB, 下载次数: 33)

SDS011

SDS011
此帖出自51单片机论坛

最新回复

楼主麻烦发一份程序好吗?刚好想做这个,感激不尽 245910433@qq.com 再两天就要交了可是一直写的有错,麻烦了  详情 回复 发表于 2017-8-13 01:02
点赞 关注
 

回复
举报

9

帖子

0

TA的资源

一粒金砂(中级)

推荐
 
谢谢大家的建议,已经编出来了,说多了都是泪啊
需要的私聊
此帖出自51单片机论坛
 
 
 

回复

1798

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
这个我使用过,就是串口通讯而已,按照datasheet的格式读取解析就能得到数值了,在串口例程稍加改动就可以了
此帖出自51单片机论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

4
 
sint27 发表于 2016-10-8 13:53
这个我使用过,就是串口通讯而已,按照datasheet的格式读取解析就能得到数值了,在串口例程稍加改动就可以 ...

可以私聊吗,QQ1476763275,我加你也行
此帖出自51单片机论坛
 
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

5
 
可以是串口通信也可以是PWM检测嘛不是,这不就好办了嘛,不过你是用51单片机,脉冲PWM的话麻烦一点你就用串口好了,其实用PWM也可以,频率很低的这个,算ms数就行了。
不过我还是推荐用串口,通信协议也是有的,你要识别帧头帧尾,中间有个要注意的是不能收到帧尾那个字节就算是帧结束,因为数据字节也有可能和帧尾相同,所以计字节数吧还是。
此帖出自51单片机论坛
 
个人签名亚里士缺德
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

6
 
汤权 发表于 2016-10-8 14:40
可以是串口通信也可以是PWM检测嘛不是,这不就好办了嘛,不过你是用51单片机,脉冲PWM的话麻烦一点你就用串 ...

那个计字节数的怎么弄呀
此帖出自51单片机论坛

点评

数据手册上写了串口数据一共9个字节,帧头0xAA,帧尾0xAB。使用串口中断接收数据,如果收到了帧首部则表示一帧数据的开始,然后连续接收8个字节,判断最后一个字节是不是0xAB以及校验是否正确。 这样做会有一个问题  详情 回复 发表于 2016-10-8 16:51
 
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

7
 
飞你莫属 发表于 2016-10-8 16:30
那个计字节数的怎么弄呀

数据手册上写了串口数据一共9个字节,帧头0xAA,帧尾0xAB。使用串口中断接收数据,如果收到了帧首部则表示一帧数据的开始,然后连续接收8个字节,判断最后一个字节是不是0xAB以及校验是否正确。
这样做会有一个问题就是如果传感器发送的数据中包含一个0xAA字节,且帧首的0xAA没有收到的话就会导致帧序乱了,永远接收不到一个完整的帧,这是小概率事件其实,不过最求完美的话还是要考虑的。
此帖出自51单片机论坛
 
个人签名亚里士缺德
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

8
 
汤权 发表于 2016-10-8 16:51
数据手册上写了串口数据一共9个字节,帧头0xAA,帧尾0xAB。使用串口中断接收数据,如果收到了帧首部则表 ...

感觉可以用中间传感器地址进行限制,可以加你好友吗(qq1476763275),不懂的再请教。这个上面太麻烦了,聊天还受限,麻烦你了!
此帖出自51单片机论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

9
 
汤权 发表于 2016-10-8 16:51
数据手册上写了串口数据一共9个字节,帧头0xAA,帧尾0xAB。使用串口中断接收数据,如果收到了帧首部则表 ...

#include
#include
#define uchar unsigned char
#define uint  unsigned int
sbit we = P2^7;
sbit du = P2^6;
bit  RXAAOK;                        //接收到0XAA开头标志
bit  RXFRMOK;                       //接收一帧完整数据标
                                      //接收中断中如果是完整一条数据置位,主函数中
                                                      //处理完毕清零
uchar RXBUF[32],TXBUF[32];  //接收缓存
uchar RX_P;                         //数据个数

uchar code leddata[]={

                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x77,  //"A"
                0x7C,  //"B"
                0x39,  //"C"
                0x5E,  //"D"
                0x79,  //"E"
                0x71,  //"F"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x00,  //熄灭
                0x00  //自定义

                         };

void delay(uint z)
{
        uint x,y;
        for(x = z;x > 0;x--)
                for(y = 114;y > 0;y--);
}

void display_PM2_5(uchar t)
{
         uchar bai,shi,ge;
         bai = t / 100;
         shi = t / 10 % 10;
         ge = t % 10;

         we = 1;
         P0 = 0xdf;
         we = 0;
         du = 1;
         P0 = leddata[bai];
         du = 0;
         delay(5);

         we = 1;
         P0 = 0xbf;
         we = 0;
         du = 1;
         P0 = leddata[shi];
         du = 0;
         delay(5);

         we = 1;
         P0 = 0x7f;
         we = 0;
         du = 1;
         P0 = leddata[ge];
         du = 0;
         delay(5);
}

void display_PM10(uchar t)
{
         uchar bai,shi,ge;
         bai = t / 100;
         shi = t / 10 % 10;
         ge = t % 10;

         we = 1;
         P0 = 0xfe;
         we = 0;
         du = 1;
         P0 = leddata[bai];
         du = 0;
         delay(5);

         we = 1;
         P0 = 0xfd;
         we = 0;
         du = 1;
         P0 = leddata[shi];
         du = 0;
         delay(5);

         we = 1;
         P0 = 0xfb;
         we = 0;
         du = 1;
         P0 = leddata[ge];
         du = 0;
         delay(5);
}

void UART_init()
{
        TMOD = 0x20;        //T1工作模式2 8位自动重装
        TH1 = 0xfd;
        TL1 = 0xfd;         //比特率9600
        TR1 = 1;                //启动T1定时器
        SM0 = 0;               
        SM1 = 1;                //串口工作方式1 10位异步
        REN = 1;                //串口允许接受
        EA = 1;
        ES = 1;
}

void main() //主程序
{
    UART_init();
        while(1)
    {
                  if(RXFRMOK)
                  {
                           display_PM2_5((TXBUF[0]+TXBUF[1]*256)/10);
                        display_PM10((TXBUF[2]+TXBUF[3]*256)/10);  
                           RXFRMOK=0; //处理完毕,清除消息
                   }
         }  
}


void UARTO_ISR() interrupt 4  //接收中断
{
    uchar i,j;         //用处提取接收缓冲器的字符  
    if(RI)  
    {
                i=SBUF;        //提取字符
             RI=0;
                  if(RXFRMOK == 0)   //判断是否接收到起始字符0XAA
                  {  
                        if(RXAAOK)     //如果接收到0XAA,继续接收后面的字符
                      {
                                        RXBUF[RX_P]=i;                                                   //字符存入数组
                                    if((RX_P>3)&&(RXBUF[RX_P] == 0xab) )  //判断是是否接收完毕一帧数据
                                    {
                                                RXFRMOK=1;             //如果接收完成,置位RXFRMOK;
                                              RXAAOK=0;              //清零开始标志位RXAAOK
                                    }
                        RX_P++;                    //接收计数器加一
                               
                      }
                    if(!RXAAOK&&(i==0xaa))  
                      {
                                RXAAOK=1;
                               RX_P=0;
                    }
                }
        }
        for(j = 0;j < 4;j++)
        {
                TXBUF[j] = RXBUF[j+1];         //提取中间四位
        }
        /*for(j = 0;j < 4;j++)
        {
                SBUF = TXBUF[j];
                while(!TI);
                TI = 0;
        }*/
}
能帮我改改吗,收不到数据
此帖出自51单片机论坛
 
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

10
 
我不知道你串口接收程序和数码管显示程序有没有问题,单看你的接收逻辑的话是没什么毛病的,你先把收到串口数据先不管帧格式,直接将数据打印在数码管上,或者将数据发送到电脑串口调试助手上,可以把单片机的RX接传感器,TX接USB转串口模块的RX,测试好了再调试帧的接收。
此帖出自51单片机论坛
 
个人签名亚里士缺德
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

11
 
汤权 发表于 2016-10-9 11:03
我不知道你串口接收程序和数码管显示程序有没有问题,单看你的接收逻辑的话是没什么毛病的,你先把收到串口 ...

只能输出一次数据,后面都一样还乱的,我的天 ,已炸
可以PWM解析嘛
此帖出自51单片机论坛

点评

51单片机的调试是比较麻烦 不过你完全可以使用数码管把数据全部显示出来,一位数码管可以显示十六进制数的。慢慢弄吧,我手里也没有现成的这个模块,不过晚上回去之后可以帮你用串口调试器模拟这个传感器实验一下  详情 回复 发表于 2016-10-9 12:37
 
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

12
 
飞你莫属 发表于 2016-10-9 12:28
只能输出一次数据,后面都一样还乱的,我的天 ,已炸
可以PWM解析嘛

51单片机的调试是比较麻烦    不过你完全可以使用数码管把数据全部显示出来,一位数码管可以显示十六进制数的。慢慢弄吧,我手里也没有现成的这个模块,不过晚上回去之后可以帮你用串口调试器模拟这个传感器实验一下。至于说PWM检测的话其实也是可以的,先不用定时器什么的然后在主函数里面进行大致判断高电平时间吧。
此帖出自51单片机论坛

点评

好哒  详情 回复 发表于 2016-10-9 13:06
 
个人签名亚里士缺德
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

13
 
汤权 发表于 2016-10-9 12:37
51单片机的调试是比较麻烦    不过你完全可以使用数码管把数据全部显示出来,一位数码管可以显示十六进制 ...

好哒
此帖出自51单片机论坛
 
 
 

回复

1798

帖子

0

TA的资源

五彩晶圆(初级)

14
 
  1. #pragma vector=__UART0_DATA_RX_vector   //串口接收中断
  2. __interrupt void Uart0Rx(void)
  3. {
  4.         UART0CONH&=0xfe;
  5.         rxCnt=0;
  6.         com485Time1=0;
  7.         if(bit_RecDataOK1) return;  //接收数据处理中,不再接收
  8.         rx0Buf=UDATA0;
  9.         rx0Data[rec0Point]=rx0Buf;
  10.         rec0Point++;

  11.         //诺方

  12.         if(rec0Point<8)return;
  13.        
  14.         if(rx0Data[0]==0xaa && rx0Data[1]==0xc0)
  15.         {
  16.                 if(rec0Point>9)
  17.                 {
  18.                         rec0Point=0;
  19.                         bit_RecDataOK1=1;
  20.                 }
  21.         }
  22. }


  23. void GetPM25Value(void)//接收电源板数据后返回
  24. {
  25.         static uint cnt=3000;
  26.         uchar i=0;
  27.         uint checkSum=0;
  28.         uint temp;

  29.         if(cnt>0) //上电初始老化五分钟,不做检测
  30.         {
  31.                 cnt--;
  32.                 pm25Value=0;
  33.                 bit_RecDataOK1=0;
  34.         }
  35.        
  36.         rxCnt++;
  37.         if(rxCnt>500)
  38.         {
  39.                 rxCnt=0;
  40.                 pm25Value=0;
  41.         }
  42. //诺方
  43.         if(bit_RecDataOK1)
  44.         {
  45.                 temp=rx0Data[3];
  46.                 pm25Value=((temp<<8)+rx0Data[2])/10;
  47.                 bit_RecDataOK1=0;
  48.         }
  49. }
复制代码
  1. void Com485StuReset1(void)   //通信出现故障,通信状态复位
  2. {
  3.         com485Time1++;
  4.         if(com485Time1>50)//此处延时不可太短
  5.         {
  6.                 com485Time1=0;
  7.                 rec0Point=0;
  8.                 bit_RecDataOK1=0;
  9.         }
  10. }
复制代码


这是好久以前写的,就是这个传感器的串口通讯部分,
1、中断部分判断长度,符合长度的解析固定帧格式,提取数值
2、貌似是每秒发送一次的,所有有个故障处理,连续50ms没收到中断的话清除一些寄存器,可以避免一些干扰
此帖出自51单片机论坛

点评

有完整的程序吗,有点不明白  详情 回复 发表于 2016-10-9 18:39
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

15
 
sint27 发表于 2016-10-9 16:26
这是好久以前写的,就是这个传感器的串口通讯部分,
1、中断部分判断长度,符合长度的解析固定帧格式 ...

有完整的程序吗,有点不明白
此帖出自51单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

16
 
飞你莫属 发表于 2016-10-24 21:34
谢谢大家的建议,已经编出来了,说多了都是泪啊
需要的私聊

你好,请问你有SDS011传感器的51单片机的程序吗?可以发我一份吗,本人是广州的学生一枚,也正在学习单片机,想借你的程序学习一下,我邮箱是2892238267@qq.com,谢谢
此帖出自51单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

17
 
飞你莫属 发表于 2016-10-24 21:34
谢谢大家的建议,已经编出来了,说多了都是泪啊
需要的私聊

楼主可以求个程序吗?本人学生
此帖出自51单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

18
 
楼主可以分享一下程序吗?谢谢楼主!
此帖出自51单片机论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

19
 
飞你莫属 发表于 2016-10-24 21:34
谢谢大家的建议,已经编出来了,说多了都是泪啊
需要的私聊

楼主麻烦发一份程序好吗?刚好想做这个,感激不尽
245910433@qq.com
再两天就要交了可是一直写的有错,麻烦了
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表