谁用过GP2Y1051AU0F 能否给一个51单片机的程序?

作者&投稿:鲍欢 (若有异议请与网页底部的电邮联系)
谁用过gp2y1010au0f 能否给一个51单片机的程序~

我用过,这个传感器刚毕业,做的毕设就是用的这个,详细咨询等晚上我还在上班,2 ,,6,0,1,4,5,,,7,,,3,,,2,

你 硬件做好了吗
我看看

#include <reg52.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

#define ushort unsigned short

uchar TxBuf[32];



sbit re=P2^5;  //液晶接口

sbit rw=P2^4;

sbit rs=P2^3;

sbit psb=P2^6;

sbit rst=P2^7;

sbit LED=P1^5;//粉尘传感器控制接口

sbit ADCS=P2^0;//AD0832接口

sbit ADCLK=P2^1;

sbit ADDI=P2^2;

sbit ADDO=P2^2;

sbit SET=P3^3;//按键接口

sbit ADD=P3^4;

sbit DEC=P3^5;

sbit BEEP=P3^6;//蜂鸣器接口


uchar set_st;

uchar tab[4];

uint DUST_SET=35;//固体颗粒物的阀值

int x;    //计数器

//定义标志

uchar FlagStar=0;

float  DUST_Value;

uint DUST;

uchar num=0;

uchar mm;

uchar abc;

uchar ADC_Get[10]={0};//定义AD采样数组

uchar str[5]={0};

uchar code tab0[]="pm2.5:";

uchar code tab1[]="温度值:";

uchar code tab2[]="报警阀值:";

void delaym1s(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void DelayMs(uchar k)

{ uchar i;

i=k;

while(i--);

}

void wr_date(uchar date)//写数据 

uint i;

uchar a,p;

delaym1s(10);

a=date;

rs=1;                //数据命令选择=1时读取数据

re=0;             //串口时钟,未开 

rw=1;              //选择串口方式 

for(i=0;i<5;i++)    //开启字节 

{

  re=1;

  re=0;

}

rw=0;             // 写 

re=1;           //开启时钟脉冲 

re=0;

rw=1;           //选择数据 

          

re=1;         

re=0;

rw=0;          

re=1; 

re=0;

for(p=0;p<2;p++)

{

  for(i=0;i<4;i++)

  {

   a=a<<1;    //左移目的是为了将溢出数据(即0或1)赋予std     

   rw=CY;    //单片机特殊功能寄存器,“CY”用于存放字符串溢出字符    

   re=1;   //一开一锁将数据显示 

   re=0;

  }

  rw=0;         

  for(i=0;i<4;i++)

  {

   re=1;

   re=0;

  }

}

}

void wr_com(uchar com) //写命令

{

uchar a,p;

uint i;

delaym1s(10);

a=com;

rs=1;              //数据命令选择=1时读取数据 

re=0;            //串口时钟,未开 

rw=1;            //选择串口方式 

for(i=0;i<5;i++)   //开启字节 

{

  re=1;

  re=0;

}

rw=0;          

re=1;         //开启时钟脉冲 

re=0;

rw=0;         

re=1;       

re=0;

rw=0;         

re=1;

re=0;

for(p=0;p<2;p++)

{

  for(i=0;i<4;i++)

  {

   a=a<<1;//左移目的是为了将溢出数据(即0或1)赋予std

   rw=CY;//单片机特殊功能寄存器,“CY”用于存放字符串溢出字符    

   re=1;//一开一锁将数据显示

   re=0;

  }

  rw=0;   

  for(i=0;i<4;i++)//延时一下为下一数据到来做准备   

  {

   re=1;

   re=0;

  }

}


}


void write_lcd() //向液晶写入显示内容

{

uchar num;

wr_com(0x80);

for(num=0;num<7;num++)

{

  wr_date(tab0[num]);

  delaym1s(1);

}

wr_com(0x90);

for(num=0;num<7;num++)

{

  wr_date(tab1[num]);

  delaym1s(1);

}

wr_com(0x88);

for(num=0;num<10;num++)

{

  wr_date(tab2[num]);

  delaym1s(1);

}

// wr_com(0x98);

// for(num=0;num<16;num++)

// {

//   wr_date(tab3[num]);

//   delay(1);

// }

}

void init_lcd()

{

rst=1;

psb=0;         //选串口 

wr_com(0x30); //30---基本指令动作 

wr_com(0x01); //清屏,地址指针指向00H

delaym1s(1);

wr_com(0x06); //光标的移动方向即读入或写入数据后指针加一

wr_com(0x0c); //开显示,关游标类似1602

return;

}

void init()

{

init_lcd();

write_lcd();



/*******初始化定时器0***********/

void InitTimer(void)

{

TMOD=0x01;

TH0=(65536-8881)/256;//定时10ms

TL0=(65536-8881)%256;

TR0=1;

ET0=1;

EA=1;

}


/****************显示函数********************/

void disp(uint Data)//PM2,5值显示

{  

uint Temp;  

Temp=Data%10000;

TxBuf[0]=Temp/1000+0x30;//千位             

Temp%=1000;               

TxBuf[1]='.';               

TxBuf[2]=Temp/100+0x30;//百位

Temp%=100;

TxBuf[3]=Temp/10+0x30;//十位

TxBuf[4]=Temp%10+0x30;//个位

wr_com(0x83);  

wr_date(TxBuf[0]);

wr_date(TxBuf[1]);

wr_com(0x84);

wr_date(TxBuf[2]);

wr_date(TxBuf[3]);

wr_com(0x85);

wr_date(TxBuf[4]);

wr_date('u');

wr_com(0x86);

wr_date('g');

wr_date('/');

wr_com(0x87);

wr_date('m');

wr_date('3');

}


/*********报警值显示**********/

void baojing()

{

wr_com(0x8d);

wr_date(TxBuf[12]);

wr_date(TxBuf[13]);

wr_com(0x8e);

wr_date(TxBuf[14]);

wr_date(TxBuf[15]);

}

// /******延时********/

// void Delay(uint num)

// {

// while(--num);

// }

//


/*******按键检测********/

void checkkey()

{

if(SET==0)

{

delaym1s(10);

do{}while(SET==0);

set_st++;

if(set_st>1)set_st=0;

}

if(set_st==0)

{

}

else if(set_st==1)

{

if(DEC==0)

{

delaym1s(10);

do{}while(DEC==0);


if(DUST_SET>0) DUST_SET--;

if(DUST_SET==0) DUST_SET=0;

}

if(ADD==0)

{

delaym1s(10);

do{}while(ADD==0);

DUST_SET++;

if(DUST_SET>80) DUST_SET=80;

}

}

TxBuf[12]=DUST_SET/100;

TxBuf[13]='.';

TxBuf[14]=DUST_SET%100/10;

TxBuf[15]=DUST_SET%100%10; 

}


///******报警子程序*******/

//void Alarm()

//{

// if(x>=10){beep_st=~beep_st;x=0;}

// if(DUST/10>DUST_SET&&beep_st==1) BEEP=1;

// else BEEP=0;

// if(DUST/10>0&&DUST/10<10){LED2=0;LED3=1;LED4=1;}

// if(DUST/10>=10&&DUST/10<30){LED2=1;LED3=0;LED4=1;}

// if(DUST/10>=30){LED2=1;LED3=1;LED4=0;}

//}


/*******AD0832转换程序**********/

uchar AD0832(bit mode,bit channel)      //AD转换,返回结果

{

uchar i,dat,ndat;


ADCS=0;// 拉低CS端

_nop_();

_nop_();


ADDI=1;  //第一个下降沿为高电平

ADCLK=1;  //  拉高CLK端

_nop_();

_nop_();

ADCLK=0;// 拉低CLK端,形成下降沿1

_nop_();

_nop_();


ADDI=mode;  //低电平为差分模式,高电平为单通道模式。

ADCLK=1;  //  拉高CLK端

_nop_();

_nop_();

ADCLK=0;// 拉低CLK端,形成下降沿2

_nop_();

_nop_();


ADDI=channel;  //低电平为CH0,高电平为CH1

ADCLK=1;  //  拉高CLK端

_nop_();

_nop_();

ADCLK=0;// 拉低CLK端,形成下降沿3

ADDI=1;// 控制命令结束(经试验必须)

dat=0;

//下面开始读取转换后的数据,从最高位开始依次输出(D7~D0)

for(i=0;i<8;i++)

{

dat<<=1;

ADCLK=1;//拉高时钟端

_nop_();

_nop_();

ADCLK=0;//拉低时钟端形成一次时钟脉冲

_nop_();

_nop_();

dat|=ADDO;

}

ndat=0;   //记录 D0

if(ADDO==1)

ndat|=0x80;

  //下面开始读取反序的数据从(D1到D7)

  for(i=0;i<7;i++)

  {

  ndat>>=1;

ADCLK=1;//拉高时钟端

_nop_();

_nop_();

ADCLK=0;//拉低时钟端形成一次时钟脉冲

_nop_();

_nop_();

if(ADDO==1)

ndat|=0x80;

  }

  ADCS=1;//拉高cs端,结束转换

  ADCLK=0;//拉低CLK端

  ADDI=1;//拉高数据段,回到初始状态

  if(dat==ndat)

  return(dat);

  else

  return 0;

}


/**********定时器0中断服务程序***************/

void timer0(void) interrupt 1

{

uint j;

x++;

TH0=(65536-8881)/256;//定时10us

TL0=(65536-8881)%256;

LED=1;

for(j=0;j<30;j++);//延时0.28ms

abc=AD0832(1,0);   //开启ADC采集

FlagStar=1;

for(j=0;j<5;j++);          

TR0=0;

EA=0;


LED=0;  //关闭传感器LED

}


/**************************************************************

中值滤波  算法:先进行排序,然后将数组的中间值作为当前值返回。

**************************************************************/

uchar Error_Correct(uchar *str,uchar num)

{

uchar i=0;

uchar j=0;

uchar Temp=0;


//排序

for(i=0;i<num-1;i++)

{

for(j=i+1;j<num;j++)

{

if(str[i]<str[j])

{

Temp=str[i];

str[i]=str[j];

str[j]=Temp;

}

}

}

//去除误差,取中间值

return str[num/2];

}


/*******主函数*********/

void main()

{

// uchar a;

InitTimer();  //初始化定时器  

LED=1;


DelayMs(255);//等待电源稳定,液晶复位完成

init(); //12864 液晶初始化

// DS18B20_Init(); //18B20 初始化,可不用初始化,因为18B20 出厂时默认是12 位精度

delaym1s(100);

while(1)

{

checkkey(); //按键检测 

  baojing(); //显示报警值

disp(DUST);  //显示粉尘浓度值

if(set_st==0)

{

// write_com(0x0c);

if(FlagStar==1)

{

num++;

ADC_Get[num]=abc;

if(num>9)

{

num=0;

DUST=Error_Correct(ADC_Get,10);//求取10次AD采样的值

DUST_Value=(DUST/256.0)*5000;   //转化成电压值mv

DUST_Value=DUST_Value*0.17-0.1; //固体悬浮颗粒浓度计算 Y=0.17*X-0.1  X--采样电压

// if(DUST_Value<0)  DUST_Value=0;

// if(DUST_Value>19600)  DUST_Value=760;  //限位

DUST=(uint)DUST_Value;

}

 TH0=(65536-8881)/256;//定时10ms

 TL0=(65536-8881)%256;

 TR0=1;  //开启定时器0

 EA=1;

 FlagStar=0;           

}

// Alarm();  //报警检测

}

// write_com(0x80+0x4f);

// write_data('3');

// if(set_st==1)  //报警值闪动

//  {

//   write_com(0xca);

// write_com(0x0d);

// delaym1s(150);

//  }

}

}



LED的脉冲我当时也弄错了,最后修改后才正确。你先置LED高,延时0.28MS,然后读取ADC值,再延时0.04MS,然后再置LED低,9.68MS。就行了。

需要给你写一份吗


红外测距传感器
红外测距传感是用红外线为介质的测量系统。分类:一.按探测机理可分成为光子探测器和热探测器。二.按照功能可分成五类:(1)辐射计,用于辐射和光谱测量;(2)搜索和跟踪系统,用于搜索和跟踪红外目标,确定其空间位置并对它的运动进行跟踪;(3)热成像系统,可产生整个目标红外辐射的分布图像;(4)...

禁毒常识
Su6GP2y!n 4.戒毒人员应当在户籍所在地接受社区戒毒;在户籍所在地以外的现居住地有固定住所的,可以在现居住地接受社区戒毒。 正确 错误 mb=]op>?V.~TC"nAv 5.教育行政部门、学校应当将禁毒知识纳入教育、教学内容,对学生进行禁毒宣传教育。 正确 错误 #E_`;l`Jg#<\\.6.邮政企业...

谁能告诉我跑跑里面的一些漂移秘笈
第五篇 漂移的种类http:\/\/www.maidee.com\/program\/25105第六篇 连飘与双飘的差别http:\/\/www.maidee.com\/program\/25115oRASENo的L3考试向导~ 一步一步教你过L3~http:\/\/www.tvix.cn\/v\/?v=PAmtdygTpHZ李光教学视频李光教学视频第一弹 连续漂移http:\/\/www.tudou.com\/programs\/view\/_3kQkzzGp2Y\/李光教学...

高一数学必修5练习题
洒洒水啦(小意思啦。)设这3个数分别是x、y、z。由条件一知:x+y+z=30,且x、y、z成AP(等差数列)又有等差中项得:x+z=2y 所以y=10, x+z=20,从这里得x=20-z 由条件二得:x-5,y-4,z成GP(等比数列)即20-z-5,10-4,z成GP 由等比中项得z(15-z)=6^2,解得...

GP2Y1010AU0F 灰尘传感器怎么与AVR单片机相连啊?能不能给一份程序啊...
1 Vled –> 5V (150ohm resistor)2 LED-GND –> GND 3 LED –> Digital pin 2 4 S-GND –> GND 5 Vo –> Analog pin 0 6 Vcc –> 5V 传感器的输出为电压信号,其幅值与粉尘浓度成正比。你把输出引脚连接到AVR单片机的AD引脚,直接用单片机内部的AD转换就可以。

创新创业指导老师评语
2. 室内空气质量与局部雾霾探测器:该方案利用单片机、粉尘传感器等部件对雾霾浓度进行监控,着眼于解决当下生活中的环境问题。所提方案可行,但工作内容仅是围绕实现GP2Y1010AUOF传感器功能来开展,缺乏一定的创新性。3. 电磁灭虫枪:所提设想立意新颖,具有一定创新性,但上交材料缺乏具体的方案表,缺乏对...

跑跑卡丁车怎样漂移啊
第五篇 漂移的种类http:\/\/www.maidee.com\/program\/25105第六篇 连飘与双飘的差别http:\/\/www.maidee.com\/program\/25115oRASENo的L3考试向导~ 一步一步教你过L3~http:\/\/www.tvix.cn\/v\/?v=PAmtdygTpHZ李光教学视频李光教学视频第一弹 连续漂移http:\/\/www.tudou.com\/programs\/view\/_3kQkzzGp2Y\/李光教学...

盱眙县14738103800: 谁用过夏普gp2y1010au0f烟尘传感器,能否给一个51单片机的程序加原理图? 先谢过大神!
紫高赫迪: 我用过,这个还是挺灵敏的一个回城传感器,用0832测量输出就行了

盱眙县14738103800: pm2.5传感器 GP2Y1051AU0F模块 说明书中的输出特性为什么有2条线啊?Ud=A*Vo -
紫高赫迪: 两条线,是说不同的传感器对应不一样; 有的传感器特性曲线是上一条,有的是下一条,大部分是在中间的区域; 具体可以通过别的传感器标定来实现,例如激光传感器SDS018;

盱眙县14738103800: 有用过GP2Y1010AU0F粉尘传感器的吗 -
紫高赫迪: 没有 楼主要这作甚 激光粉尘仪具有新世纪国际先进水平的新型内置滤膜在线采样器的微电脑激光粉尘仪, 在连续监测粉尘浓度的同时, 可收集到颗粒物,以便对其成份进行分析,并求出质量浓度转换系数K值.可直读粉尘质量浓度(mg/m), 具有PM10、PM5、PM2.5、 PM1.0及TSP切割器供选择. 仪器采用了强力抽气泵,使其更适合需配备较长采样管的中央空调排气口PM10可吸入颗粒物浓度的检测,和对可吸入尘PM2.5进行监测.

盱眙县14738103800: 如何用单片机控制pm2.5红外传感器 -
紫高赫迪: 通常选串口控制的,直接连单片机的串口就可以完成数据交换,一个单片机引脚控制传感器的使能端.也有电压输出的,得用AD采集 具体得看你的传感器是哪种

盱眙县14738103800: stc15单片机和pm2.5传感器GP2Y1051AU0F的问题 -
紫高赫迪: 说明单片机没有采集到传感器GP2Y1051AU0F的数据.它与单片机是怎么连接的,即采用什么形式通信的,即是什么总线连接的.是单片机读取它数据的格式不符.看图片,它与单片机是3条线连接吗?这应该是串行通信,那串行通信的时序就非常关键,还是查一下它的技术资料吧,是怎么通信的.

盱眙县14738103800: 有用过GP2Y1010AU0F粉尘传感器的吗,求一份51单片机的程序加电路图,急求!如果可行必采纳 -
紫高赫迪: 那个不需要adc,因为测的是一段时间内高电平的比例

盱眙县14738103800: 有哪位熟悉夏普的GP2Y3A003红外测距传感器吗? -
紫高赫迪: GP2Y3A003K0F是夏普的一款距离测量传感器模组,测量范围为:40cm-300cm. 它由PSD(position sensitive detector) 和IRED (infrared emitting diode) 以及信号处理电路三部分组成.由于采用了三角测量方法,被测物体的材质、环境温度以及测量时间都不会影响传感器的测量精度.传感器输出电压值对应探测的距离.通过测量电压值就可以得出所探测物体的距离. 五通道的设计,可以让传感器检测角度为25°内的物体.这款传感器可以用于较长距离测量、避障等场合.在超声波串扰较大的场合,使用这款传感器非常合适.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网