找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2030|回复: 1
打印 上一主题 下一主题
收起左侧

求助关于PCF8591和GP2Y1014传感器,帮忙看看代码哪里有问题,主要是AD转换那块

[复制链接]
回帖奖励 50 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:295381 发表于 2018-4-10 15:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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;
   }
  }
}
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:307472 发表于 2018-7-5 14:49 | 只看该作者
你好,现在你的程序好使了么???
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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