当前位置: 代码迷 >> 单片机 >> 单片机PCF8591相关有关问题,求达人解释
  详细解决方案

单片机PCF8591相关有关问题,求达人解释

热度:30   发布时间:2016-04-28 15:54:46.0
单片机PCF8591相关问题,求达人解释
我看了PCF8591芯片的datasheet和自带的代码,发现DA转换时,先输入芯片地址(数据传输方式为I2C总线的方式),然后输入控制字节(似乎是选通道),最后输入输入数据。而AD转化时,则是先输入芯片地址,然后直接输入数据,在输入芯片地址+1,最后直接读取数据。我想问下的是:
1)、为什么DA时要比AD多输入个控制字节。
以下是原配代码:

/**********************************************************************************
* 标题: ************* DA-AD试验******************* *
* *
* 1.通过本例程了解并掌握AD-DA转换芯片的基本原理和使用 *
* 2.了解掌握I2C总线接口的工作原理及一般编程方法。 *
* *
* 连接方法:JP10 (P0)与J12用跳线连接 *
* *
* 通过改变学习板上的2个电位器对应的2段模拟输入,实现模拟输入,学员观察数码管的数字变化情况
* 通过改D[4]的值,实现模拟输出,学员观察学习板上DA处LED的亮度变化 *
* * *
* 注意:I2C驱动程序只能在12T模式下工作 6T模式自己修改相应时序 * *
* 请学员认真消化本例程,懂得AD-DA 在C语言中的操作应用 *
***********************************************************************************/

#include<reg52.h>
#include <I2C.H>

#define PCF8591 0x90 //PCF8591 地址


//else IO
sbit LS138A=P2^2;  
sbit LS138B=P2^3;
sbit LS138C=P2^4;  

//此表为 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);
}

/*******************************************************************
ADC发送字节[命令]数据函数  
*******************************************************************/
bit ISendByte(unsigned char sla,unsigned char c)
{
  Start_I2c(); //启动总线
  SendByte(sla); //发送器件地址
  if(ack==0)return(0);
  SendByte(c); //发送数据
  if(ack==0)return(0);
  Stop_I2c(); //结束总线
  return(1);
}

/*******************************************************************
ADC读字节数据函数  
*******************************************************************/
unsigned char IRcvByte(unsigned char sla)
{ unsigned char c;

  Start_I2c(); //启动总线
  SendByte(sla+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倍显示
break;  
 
case 1: ISendByte(PCF8591,0x42);
  D[1]=IRcvByte(PCF8591)*2; //ADC1 模数转换2
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
  相关解决方案