标题: 求助关于PCF8591和GP2Y1014传感器,帮忙看看代码哪里有问题,主要是AD转换那块 [打印本页]

作者: 4553好难啊    时间: 2018-4-10 15:19
标题: 求助关于PCF8591和GP2Y1014传感器,帮忙看看代码哪里有问题,主要是AD转换那块
PCF8591:

#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define somenop() _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_()

#define  WRITEADDR 0x90  
#define  READADDR  0x91   
//PCF89C51??
sbit SCL=P1^0;
sbit SDA=P1^1;
bit ack;
void Init_I2c()
{
SDA=1;
somenop();
SCL=1;
somenop();
}

void Start_I2c()
{
  SDA=1;      
  somenop();
  SCL=1;
  somenop();   
  SDA=0;   
  somenop();      
  SCL=0;      
  somenop();
}

void Stop_I2c()
{
  SDA=0;   
  somenop();  
  SCL=0;
  somenop();
  SCL=1;   
  somenop();
  SDA=1;     
  somenop();
}

void  SendByte(uchar  c)
{
uchar  i;

for(i=0;i<8;i++)
    {
     if((c<<i)&0x80)SDA=1;   
       else  SDA=0;               
     somenop();
     SCL=1;         
     somenop();         
     SCL=0;
    }
   
    somenop();
    SDA=1;         
    somenop();   
    SCL=1;
    somenop();

    if(SDA==1)ack=0;     
       else ack=1;  
    SCL=0;
   somenop();
}

uchar   RcvByte()
{
  uchar  retc;
  uchar  i;
  
  retc=0;
  SDA=1;                    
  for(i=0;i<8;i++)
      {
        somenop();         
        SCL=0;                 
        somenop();
        SCL=1;               
        somenop();
        retc=retc<<1;
        if(SDA==1)retc=retc+1;  
        somenop();
      }
  SCL=0;   
  somenop();
  return(retc);
}

void Ack_I2c(bit a)
{
  if(a==0)
{
  SDA=0;
  somenop();
  SCL=1;
  somenop();
  SCL=0;
  somenop();
  SDA=0;
  somenop();
  SDA=1;
  somenop();
}
  else
{
  SDA=1;
    somenop();     
    SCL=1;
    somenop();  
    SCL=0;                     
    somenop();
    SDA=0;
    somenop();  
}  
}

bit ISendByte(uchar add,uchar channel)
{
   Start_I2c();            
   SendByte(add);         
   if(ack==0)return(0);
   SendByte(0x40|channel);            
   if(ack==0)return(0);
   Stop_I2c();            
   return(1);
}

uchar IRcvByte(uchar add)
{  
   uchar dat;
   Start_I2c();         
   SendByte(add+1);   
   if(ack==0)return(0);
   dat=RcvByte();        
   Ack_I2c(1);           
   Stop_I2c();      
   return(dat);
}
sbit vled  = P3^2;
void Delay1us(uint t)  
{
while(t--)_nop_();
}
uint read_data()
{
uint val=0;
//Init_I2c();
vled=0;
Delay1us(20);
ISendByte(WRITEADDR,0);
//val=adc0832(N,M);
val=IRcvByte(WRITEADDR);
vled=1;
Delay1us(400);
return val;
}


主函数:
#include <reg52.h>
#include <lcd1602.h>
#include <math.h>
#include <pcf.h>
#define uchar unsigned char
#define uint  unsigned int
void main(void)
{
double PM,pm1,pm2;
int PMVAL=0,HPM=200,PM_count=0,pm1_count=0;
uchar disp[16]  ={"PM2.5:0000ug/m3 "};                        
LCD_Init();
  WriteChar(1,0,16,disp);
while(1)
{

  pm1+=read_data();//这里为把AD转换后的值传过来
  if(++PM_count>=20)
  {
     PM_count=0;
      pm1=pm1/20;
   pm2+=pm1;
   pm1=0;
   if(++pm1_count>=5)
   {
    pm1_count=0;
    PM=pm2/5;
    PM=PM*50/255;
    PM-=4;
       PM/=5;
    PM*=1000;
    PMVAL=PM;
    PMVAL+=235; PMVAL=PMVAL/9;
    if(PMVAL>=9999)PMVAL=9999;
    WriteCOMorDATA(0x86,0);
    if(PMVAL<0)//PMVAL=0;
    {WriteCOMorDATA(0+0x30,1);PMVAL=abs(PMVAL);}
    else WriteCOMorDATA(PMVAL/1000+0x30,1);
    WriteCOMorDATA(PMVAL/100%10+0x30,1);
    WriteCOMorDATA(PMVAL/10%10+0x30,1);
    WriteCOMorDATA(PMVAL%10+0x30,1);
    PM=pm1=pm2=0;
   }
  }
}
}


作者: chb123    时间: 2018-7-5 14:49
你好,现在你的程序好使了么???




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