社区导航

 
查看: 1889|回复: 9

[求助] 最近在用SDS011激光PM2.5传感器,想用数码管显示数值,但是一直收不到数据,,求助

[复制链接]

9

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-6-8 23:10:46 | 显示全部楼层 |阅读模式
代码如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit led=P1^1;
uchar rebuf[32],renum=0,flagRI=0,numpm25=0;
uchar code table[]={
   0x3f,0x06,0x5b,0x4f,
   0x66,0x6d,0x7d,0x07,
   0x7f,0x6f,0x77,0x7c,
   0x39,0x5e,0x79,0x71};
void delayms(uint xms);
void display(uchar t)
{
uchar ge,shi,bai;
ge=t%10;
shi=t%100/10;
bai=t/100;
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(5);

dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(5);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(5);
}

void init()
{
TMOD=0x20; //设定T1定时器工作方式2
TH1=0xfd;  //装初值
TL1=0xfd;
TR1=1;    //启动T1定时器
REN=1;//允许串口接收
SM0=0;  //设定串口工作方式
SM1=1;
EA=1; //开总中断
ES=1; //开串口中断
}
void main()
{
init();
while(1)
{
  if(flagRI==1)
  {
  // led=0;
  
  // display(numpm25);
   flagRI=0;
  }
}
}
void receive() interrupt 4
{
if(RI==1)
{
// led=0;
  RI=0;  //清除标志位
  rebuf[renum++]=SBUF; //单片机接收串口数据
  
  if(!(rebuf[0]==0xaa))  //如果帧头错误,清缓存
  {
   renum=0;
   rebuf[0]=0;
  }
  led=0;
  if(renum==10)    //数据接收完毕
  { //led=0;
   if(rebuf[9]==0xab)    //判断帧尾
   {
    numpm25=(rebuf[3]*256+rebuf[2])/10;
   
    flagRI=1;
   }
   renum=0;  //清缓存
  }
}
}
有没有大佬能帮我看一下,,

此帖出自51单片机论坛


回复

使用道具 举报

3515

TA的帖子

11

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

发表于 2018-6-11 19:32:00 | 显示全部楼层
检查硬件连接,传感器串口本身是否输出信号。,看程序串口配置是否有问题。


回复

使用道具 举报

9

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-6-13 00:00:06 | 显示全部楼层
ienglgge 发表于 2018-6-11 19:32
检查硬件连接,传感器串口本身是否输出信号。,看程序串口配置是否有问题。

手里有一块开发板,我是将传感器的TX RX 分别接到单片机P3^0和P3^1口,程序烧好后将传感器GND接GND,VCC接VCC,这样对吗?串口配置除了波特率又那些要特别注意?
请问我的代码有问题吗?

点评

有设备就测一下 传感器发送的波形。确定 传感器发送了了数据。就检查一下单片机能不能进入接收中断。。  详情 回复 发表于 2018-6-13 13:41


回复

使用道具 举报

3515

TA的帖子

11

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

发表于 2018-6-13 13:41:21 | 显示全部楼层
gaoyingjia 发表于 2018-6-13 00:00
手里有一块开发板,我是将传感器的TX RX 分别接到单片机P3^0和P3^1口,程序烧好后将传感器GND接GND,VCC ...

有设备就测一下  传感器发送的波形。确定 传感器发送了了数据。就检查一下单片机能不能进入接收中断。。


回复

使用道具 举报

9

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-6-13 23:28:35 | 显示全部楼层
ienglgge 发表于 2018-6-13 13:41
有设备就测一下  传感器发送的波形。确定 传感器发送了了数据。就检查一下单片机能不能进入接收中断。。

打开串口助手可以接收到十六进制的数据,如何检测是否进入串口中断呢?之前用LED灯检测一下,发现串口并不能完整读入10个数据,就是我把LED=0加到 numpm25=(rebuf[3]*256+rebuf[2])/10;这条语句前面,灯不亮

点评

在中断里,把一个变量置为1. 主循环,里,进行判断,根据变量值 串口打印数据 。  详情 回复 发表于 2018-6-15 00:49


回复

使用道具 举报

3515

TA的帖子

11

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

发表于 2018-6-15 00:49:23 | 显示全部楼层
gaoyingjia 发表于 2018-6-13 23:28
打开串口助手可以接收到十六进制的数据,如何检测是否进入串口中断呢?之前用LED灯检测一下,发现串口并 ...

在中断里,把一个变量置为1. 主循环,里,进行判断,根据变量值 串口打印数据 。


回复

使用道具 举报

9

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-6-19 23:18:30 | 显示全部楼层
ienglgge 发表于 2018-6-15 00:49
在中断里,把一个变量置为1. 主循环,里,进行判断,根据变量值 串口打印数据 。

代码里设置了flagRI,收到10个数据判断帧尾帧尾正确后flagRI置1,主函数里判断flagRI是1的话数码管扫描数据,是这样吗?

点评

不用等到一帧数据接收完成,收到数据就可以把变量置1.先确定能收。再看值。  详情 回复 发表于 2018-6-21 23:42


回复

使用道具 举报

3515

TA的帖子

11

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

发表于 2018-6-21 23:42:12 | 显示全部楼层
gaoyingjia 发表于 2018-6-19 23:18
代码里设置了flagRI,收到10个数据判断帧尾帧尾正确后flagRI置1,主函数里判断flagRI是1的话数码管扫描数 ...

不用等到一帧数据接收完成,收到数据就可以把变量置1.先确定能收。再看值。


回复

使用道具 举报

9

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-7-21 16:45:24 | 显示全部楼层
非常感谢,程序已经编出


回复

使用道具 举报

3

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-9-20 17:47:28 | 显示全部楼层
gaoyingjia 发表于 2018-7-21 16:45
非常感谢,程序已经编出

能麻烦楼主分享一下完整的程序和仿真电路图吗,谢谢你


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-10-19 13:30 , Processed in 0.281287 second(s), 15 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表