PCF8591A/D转换 模拟输入通道的问题

2019-07-16 01:11发布

AD电路图 和数据手册 均已上传  还是搞不懂四个模拟输入通道到底是怎么回事,从电路图上看不是只用到了AIN0和AIN1吗?AIN2和AIN3 就是没有输入了?? 还有就是 AD转换时的ADC发送字节[命令]数据函数在数据手册上AD转换就直接读就可以啦,为什么还要写这个函数,不懂??求大神指点,灰常感谢。。。
#include<reg52.h>
#include <I2C.H>
#include <PCF8951.H>
//else IO

//此表为 LED 的字模, 共阴数码管 0-9  -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char AD_CHANNEL;
unsigned long xdata  LedOut[8];
unsigned int  D[32];
   
/*******************************************************************
DAC 变换, 转化函数               
*******************************************************************/
bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
{
   Start_I2c();              //启动总线
   SendByte(sla);            
   if(ack==0)return(0);        
                                                
   SendByte(c);              //发送控制字节
   if(ack==0)return(0);
   SendByte(Val);            //发送DAC的数值  
   if(ack==0)return(0);
   Stop_I2c();               //结束总线
   return(1);
}
/*******************************************************************
               
*******************************************************************/
bit ISendByte(unsigned char sla,unsigned char c)
{
   Start_I2c();              //启动总线
   SendByte(sla);            //发送器件地址    谁是发送器??单片机还是8951????
   if(ack==0)return(0);
   SendByte(c);              //发送数据
   if(ack==0)return(0);
   Stop_I2c();               //结束总线
   return(1);

}
/*******************************************************************
ADC读字节数据函数    读取AD转换的数据           
*******************************************************************/
unsigned char IRcvByte(unsigned char sla)
{  unsigned char c;
   Start_I2c();          //启动总线
   SendByte(sla+1);      //发送器件地址 +1为了是读模式
   if(ack==0)return(0);
   c=RcvByte();          //读取数据0
   Ack_I2c(1);           //发送非就答位
   Stop_I2c();           //结束总线
   return(c);
}
//******************************************************************/
main()
{  char i,j;
while(1)
{/********以下AD-DA处理*************/  
  switch(AD_CHANNEL)     
   {        
                                                       //  四个通道又是起什么作用呢???
     case 0: ISendByte(PCF8591,0x41);
             D[0]=IRcvByte(PCF8591)*2;  //ADC0 模数转换1  放大2倍显示 case0是用来读取8591第一通道所采集到模拟量的值
    break;       //0x41是控制字节  D[0]=IRcvByte(PCF8591)*用来读取AD转换的数据

  case 1: ISendByte(PCF8591,0x42);
             D[1]=IRcvByte(PCF8591)*2;  //ADC1  模数转换2    4个模拟输入在该单片机中只用到两个
    break;  

  case 2: ISendByte(PCF8591,0x43);
             D[2]=IRcvByte(PCF8591)*2;  //ADC2 模数转换3
    break;  
   
  case 3: ISendByte(PCF8591,0x40);
             D[3]=IRcvByte(PCF8591)*2;  //ADC3   模数转换4
    break;  

  case 4: DACconversion(PCF8591,0x40, D[4]/4); //DAC   数模转换
          break;
   }

        D[4]=400;  //数字--->>模拟输出
    D[4]=D[0];  //   把模拟输入 采样的信号 通过数模转换输出 即把D0 转化成模拟量输出
   if(++AD_CHANNEL>4) AD_CHANNEL=0;

/********以下将AD的值送到LED数码管显示*************/
         
  LedOut[0]=Disp_Tab[D[1]%10000/1000];
     LedOut[1]=Disp_Tab[D[1]%1000/100];
     LedOut[2]=Disp_Tab[D[1]%100/10]|0x80;
     LedOut[3]=Disp_Tab[D[1]%10];
  
  LedOut[4]=Disp_Tab[D[0]%10000/1000];
     LedOut[5]=Disp_Tab[D[0]%1000/100];
     LedOut[6]=Disp_Tab[D[0]%100/10]|0x80;
     LedOut[7]=Disp_Tab[D[0]%10];  
   

  for( i=0; i<8; i++)
  {  P0 = LedOut;
   
   switch(i)   //使用switch 语句控制138译码器  也可以是用查表的方式 学员可以试着自己修改      
      {     
   case 0:LS138A=0; LS138B=0; LS138C=0; break;         
         case 1:LS138A=1; LS138B=0; LS138C=0; break;              
         case 2:LS138A=0; LS138B=1; LS138C=0; break;
         case 3:LS138A=1; LS138B=1; LS138C=0; break;
   case 4:LS138A=0; LS138B=0; LS138C=1; break;
   case 5:LS138A=1; LS138B=0; LS138C=1; break;
   case 6:LS138A=0; LS138B=1; LS138C=1; break;
   case 7:LS138A=1; LS138B=1; LS138C=1; break;
   
      }
  
      for (j = 0 ; j<90 ;j++) { ;}    //扫描间隔时间
   }
     P0 = 0;
}  
}


ADDA电路图.jpg
PCF8591_6.pdf 下载积分: 积分 -1 分
139.64 KB, 下载次数: 133, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
最近我很跳
1楼-- · 2019-07-16 01:30
第一个红 {MOD}部分当然要加,就算你直接读8591也要先发送读寄存器的地址呀(就是上面也的控制字),不然单片机都不知道去读哪个数据。
第二个红 {MOD}部分的程序只用到了CASE0、1、4。用来存取和处理都出的数据
独孤辉二
2楼-- · 2019-07-16 06:28
最近我很跳 发表于 2013-4-27 11:57
第一个红 {MOD}部分当然要加,就算你直接读8591也要先发送读寄存器的地址呀(就是上面也的控制字),不然单片机 ...

请问模拟输入4 都没有接输入,怎么用啊?
最近我很跳
3楼-- · 2019-07-16 08:05
本帖最后由 最近我很跳 于 2013-4-27 22:18 编辑
独孤辉二 发表于 2013-4-27 14:55
请问模拟输入4 都没有接输入,怎么用啊?

D[4]并不是模拟输入的第4通道,D[4]是数字信号转模拟信号,你看程序。把数字信号转成模拟信号后AOUT输出给LED。
SLoW_a_ClaP
4楼-- · 2019-07-16 13:20
 精彩回答 2  元偷偷看……
李晓龙@
5楼-- · 2019-07-16 17:38
#include <PCF8951.H>这个程序是??
李晓龙@
6楼-- · 2019-07-16 22:03
请指点.。。。。。。。。。。。楼主

一周热门 更多>