打印

DAC无电压输出

[复制链接]
2574|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 zhaohualiang 于 2012-8-13 16:59 编辑

想用51单片机控制DAC输出模拟电压,单片机选用stc11f32xe,dac选用max517,运行程序后没有电压输出,一直是0V。VEF电压为2.5v.


下面是测试程序:
/*****************************************************************************************/
//DAC:MAX517   起始条件子函数
/*****************************************************************************************/
void DAC_Start(void)
{
SDA=1;
nop();
SCL=1;
nop();
SDA=0;
nop();
}
/*****************************************************************************************/
//DAC:MAX517   停止条件子函数
/*****************************************************************************************/
void DAC_Stop(void)
{
SDA=0;
nop();
SCL=1;
nop();
SDA=1;
nop();
}
/*****************************************************************************************/
//DAC:MAX517    应答子函数
/*****************************************************************************************/
void DAC_Ack(void)
{
SDA=0;
nop();
SCL=1;
nop();
SCL=0;
}
/*****************************************************************************************/
//DAC:MAX517   发送数据子程序,Data为要发送的数据
/*****************************************************************************************/
void DAC_Send(uchar Data)
{
uchar BitCounter=8;//位控制
uchar temp;//中间变量控制
do
  {
  temp=Data;
  SCL=0;
  nop();
  if((temp&0x80)==0x80)//如果最高位是1
   SDA=1;
  else
   SDA=0;
  SCL=1;
  temp=Data<<1;//左移
  Data=temp;
  BitCounter--;
  }
while(BitCounter);
SCL=0;
}
/*****************************************************************************************/
//DAC:MAX517   读一个字节的数据,并返回该字节值
/*****************************************************************************************/
uchar DAC_Read(void)
{
uchar temp=0;
uchar temp1=0;
uchar BitCounter=1;
SDA=1;
do
  {
  SCL=0;
  nop();
  SCL=1;
  nop();
  if(SDA)
   temp=temp|0x01;
  else
   temp=temp&0xfe;
  if(BitCounter-1)
   {
   temp1=temp<<1;
   temp=temp1;
   }
  BitCounter--;
  }
while(BitCounter);
return(temp);
}
void main(void)
{
DAC_Start();
DAC_Send(0x5a);
DAC_Ack();
while(DAC_Read()!=0);
DAC_Send(0x00);
DAC_Ack();
while(DAC_Read()!=0);
DAC_Send(0xff);
DAC_Stop();
while(1);
}

相关帖子

沙发
IJK| | 2012-8-13 17:07 | 只看该作者
估计I2C通信有点问题。有条件的话,最好用示波器查查。
另外,如果max517有ID可以读的话,读ID看是否正确。

使用特权

评论回复
板凳
zhaohualiang|  楼主 | 2012-8-13 17:11 | 只看该作者
没有示波器,不知道这样检测应答对吗,id是什么啊

使用特权

评论回复
地板
ayb_ice| | 2012-8-13 17:23 | 只看该作者
10成是通信都没有通

使用特权

评论回复
5
zhaohualiang|  楼主 | 2012-8-14 08:12 | 只看该作者
是软件原因还是硬件连接的原因啊

使用特权

评论回复
6
zhm8508| | 2012-8-14 08:42 | 只看该作者
时序明显有问题嘛,while(DAC_Read()!=0)干什么用的?

使用特权

评论回复
7
zhaohualiang|  楼主 | 2012-8-14 08:45 | 只看该作者
读应答信号,是否为0

使用特权

评论回复
8
zhm8508| | 2012-8-14 09:17 | 只看该作者
1、地址对不对
2、NOP指令延时够不够

使用特权

评论回复
9
zhaohualiang|  楼主 | 2012-8-14 10:20 | 只看该作者
1.地址一开始是AD1=0;AD0=1,所以地址是0x5a,现在改成AD1=0;AD0=0,地址设成0x58,还是不行。
2.nop()增加到十多个了还是不行。

使用特权

评论回复
10
zhaohualiang|  楼主 | 2012-8-14 14:25 | 只看该作者
我改了下应答子程序,应该是有应答,但是 还没有电压输出。
void DAC_Ack(void)
        {
        nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();
        SDA=1;
        SCL=1;
        nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();        while(SDA==1);
        SCL=0;
        }
void main(void)
               {
                DAC_Start();
                DAC_Send(0x58);
                DAC_Ack();
                DAC_Send(0x00);
                DAC_Ack();
                DAC_Send(0x00);
                DAC_Stop();
               }

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

216

帖子

1

粉丝