1. bread88lifa利发国际娱乐论坛/
  2. 嵌入式论坛/
    1. 电子论坛综合区
    2. 嵌入式论坛
    3. 电源技术论坛
    4. 硬件设计论坛
    5. 测试测量论坛
    6. 检测技术与质量
    7. EDA设计论坛
    8. 综合技术与应用
    9. 开源硬件
    10. IC设计论坛
    11. 消费电子论坛
    12. 无线通信论坛
    13. 个人版区
    14. 厂商专区
    15. 论坛服务区
    16. 高校联盟
    17. 供求信息发布
  3. 单片机/MCU论坛
    1. ARM技术论坛
    2. Android论坛
    3. Linux论坛
    4. FPGA|CPLD|ASIC论坛
    5. DSP论坛
    6. 嵌入式系统论坛
  4. / GP2Y1051的烟尘传感器与89C51的串口通信是怎么实现的 ...
    关闭提示

[问答] GP2Y1051的烟尘传感器与89C51的串口通信是怎么实现的

[复制链接]
实习生
发表于 2017-12-29 15:46:17   151 查看 1 回复 只看该作者 倒序浏览
分享
我打算用1051的烟尘传感器组一个pm2.5的检测,1051的传感器是数字输出的,不需要AD0832的模数转换,通过串口向51单片机发送数据,我现在打算把1051发送的7位数据放入一个数组里,通过利用这个数组中的数据进行运算,得到结果,但是不知道如何把传感器输出的数据写入一维数组里,有没有大神帮忙写一下具体的程序!!!急求
奖励3积分
标签:GP2Y1051AU0F 51单片机 AT89C51 C51单片机
举报
助理工程师
发表于 2018-1-3 13:00:47  
没有用过这款传感器,根据传感器资料,7位数据分为起始位、有效H位、有效L位、随机H位、随机L位、结束位。给你写了一个验证程序,用串口助手模拟及数码管检验无误,供参考:

//AA 00 10 00 4B 5B FF
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;                        //段选
sbit wela=P2^7;                        //位选
uchar code table[]={                //共阴数码管0~F数组
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71};
uchar table0[] ="OK ";        //用于串口助手返回验证
uchar table1[]="ERROR ";//用于串口助手返回验证
uchar rec_buf[7];                        //缓存
uint V_data;                                //收到的16位有效数据变量
uint swan,wan,qian,bai,shi,ge;//数码管显示位
bit flag=0;                                        //接收完成标
/*************初始化串口**************/
void InitUART()                //2400波特率@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        TMOD= 0x20;                        //设定定时器1为8位自动重装方式
        TL1 = 0xF4;                        //设定定时初值
        TH1 = 0xF4;                        //设定定时器重装值
        ET1 = 0;                                //禁止定时器1中断
        EA = 1;                                //开总中断
        ES = 1;                                //开串口中断
        TR1 = 1;                                //启动定时器1
}
/**********串口发送函数*************/
void SendOneByte(uchar c)
{
    SBUF = c;                //发送数据
    while(!TI);        //等待发送完成
    TI = 0;                        //发送中断请求标志位清0
}
/************数据解析程序*************/
void analysis()
{
        uchar i,j;                //临时变量
        if(flag==1)                //7位数据串接收完成
        {
                ES=0;                        //关串口中断
                flag=0;                //接收完成标志清0
                j=rec_buf[1]+rec_buf[2]+rec_buf[3]+rec_buf[4];//数据和
                if(rec_buf[5]==j)//验证数据和
                {
                        V_data=(rec_buf[1]<<8)|rec_buf[2];//恢复16位有效数据
                        for(i=0;i<3;i++)
                        SendOneByte(table0);//返回OK
                }
                else for(i=0;i<6;i++)
                        SendOneByte(table1);//返回ERROR
                ES=1;                //开串口中断
        }
}
/*************数据分解***************/
void Transformation()
{
        swan = V_data/100000;                        // 十万位
        wan  = V_data%100000/10000;        // 万位
        qian = V_data%10000/1000;                // 千位
        bai  = V_data%1000/100;                        // 百位
        shi  = V_data%100/10;                        // 十位
        ge   = V_data%10;                                        // 个位
}

/**********6位数码管显示程序************/
void display()
{
        static uchar xx=0;                        //分时显示变量
        switch(xx)
        {
                case 0:
                   dula=0;
                   P0=table[swan];                //显示十万位段码
                   dula=1;
                   dula=0;
               
                   wela=0;
                   P0=0x7e;                                                //显示十万位码
                   wela=1;
                   wela=0;
                        xx=1;
                 break;       

                case 1:
                   dula=0;
                   P0=table[wan];                //显示万位段码
                   dula=1;
                   dula=0;
               
                   wela=0;
                   P0=0x7d;                                                //显示万位位码
                   wela=1;
                   wela=0;
                        xx=2;
                 break;       

                case 2:
                   P0=table[qian];                        //显示千位段码
                   dula=1;
                   dula=0;
               
                   P0=0x7b;                                                //显示千位位码
                   wela=1;
                   wela=0;
                        xx=3;
                 break;       

                case 3:
                   P0=table[bai];                        //显示百位段码
                   dula=1;
                   dula=0;
               
                   P0=0x77;                                                //显示百位位码
                   wela=1;
                   wela=0;
                        xx=4;
                 break;       

                case 4:
                   P0=table[shi];                        //显示十位段码
                   dula=1;
                   dula=0;
               
                   P0=0xef;                                                //显示十位位码
                   wela=1;
                   wela=0;
                        xx=5;
                 break;       

                case 5:
                   P0=table[ge];                        //显示个位段码
                   dula=1;
                   dula=0;
               
                   P0=0xdf;                                                //显示个位位码
                   wela=1;
                   wela=0;
                        xx=0;
                 break;       
        }
}
/**************主程序**************/
void main()
{
        InitUART();                //初始化串口
        while(1)
        {
                analysis();        //数据解析
                Transformation();//数据分解
                display();        //数码管显示
        }
}
/*********串口中断服务程序**********/
void UARTInterrupt() interrupt 4
{
        static uchar num=0;        //静态计数变量
        RI=0;                                                //接收中断请求标志位清0
        rec_buf[num]=SBUF;        //接收到的数据串保存在缓存数组
        if(rec_buf[0]==0xAA)        //验证数据头(起始位)
        {
                num++;
                if(num>=7)
                {
                        flag=1;                        //接收完成标志置1
                        num=0;                        //计数变量清0
                }
        }
}
回复 点赞 举报
高级模式
您需要登录后才可以回帖 登录 | 注册
关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表
  1. time最新主题
  2. recommend推荐主题
  3. hot热门主题
  4. post 我的帖子
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区

88lifa利发国际娱乐

百度360搜索搜狗搜索