打印
[国产单片机]

求解:使用pcf85917作DA转换,大家帮忙看看

[复制链接]
1956|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjr075017|  楼主 | 2012-4-13 08:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define  PCF8591 0x90    //PCF8591 地址
sbit SCL=P2^0;//时钟脉冲
sbit SDA=P2^1;//双向输入输出数据端
void delay(uint cnt)
{
while(--cnt);
}
void init()
{
  SCL=1;
delay(2);
SDA=1;
delay(2);
}
void Start_I2c()
{
  SDA=1;        
delay(1);
  SCL=1;
delay(5);   
  SDA=0;        
delay(5);      
  SCL=0;      
  delay(2);
}
void respons ( )
{
  uchar i=0;
  SCL=1;
  delay(3);
  while((SDA==1)&&(i<255))
   i++;
  SCL=0;
  delay(5);
     
}
void Stop_I2c()
{
  SDA=0;      
  delay(1);      
  SCL=1;      
  delay(5);
  SDA=1;      
  delay(4);
}
void write(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
  {
   temp=temp<<1;
   SCL=0;
   delay(5);
   SDA=CY;
   delay(2);
   SCL=1;
   delay(3);
  }
  SCL=0;
  delay(2);
  SDA=1;
  delay(2);
}
void DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
{
   Start_I2c();              //启动总线
   write(sla);
   respons ( );            //发送器件地址
   write(c);
   respons ( );              //发送控制字节
   write(Val);
   respons ( );            //发送DAC的数值  
   Stop_I2c();               //结束总线
}
void main()
{
init();
while(1)
{
    DACconversion(0x90,0x40, 0xff);
}

}

相关帖子

沙发
zjr075017|  楼主 | 2012-4-13 09:41 | 只看该作者
大家帮帮忙

使用特权

评论回复
板凳
yxl15972291790| | 2012-9-16 12:28 | 只看该作者
最后面为啥是0X90,0X40.0XFF啊

使用特权

评论回复
地板
B40614061| | 2013-6-17 15:29 | 只看该作者
这个问题搞定没?我也是这么写的,郁闷!!!!,不输出结果啊

使用特权

评论回复
5
B40614061| | 2013-6-17 16:03 | 只看该作者
我修改了一下程序,发现输出电压了!!!!
unsigned int DACconversion(unsigned char c)
{
        IICstart();
        WriteByte(0x90);
        answer();
        WriteByte(c);
        answer();
}

void main()
{
     TRISB=0B11000111;      //初始化RB7-RB0的输入输出方向
     TRISC=0B00000000;      //初始化RC7-RC0的输入输出方向
     TRISD=0B00000000;      //初始化RD7-RD0的输入输出方向
     PORTB=0B00000000;      //初始化RB7-RB0的数值
     PORTC=0B00000000;      //初始化RC7-RC0的数值
     PORTD=0B00000000;      //初始化RD7-RD0的数值

     IIC_init();
     DACconversion(0x40);
        while(1)
        {
                for(i=40000;i>0;i--)
                {
                        WriteByte(0xFF);       
                        Delay(20);
                }
        }
}

我感觉Stop_I2c()没有必要,开始start后,输入地址和控制字节以后,重复输入0xff就行了,没必要重复调用DACconversion。

你是怎么解决的?

使用特权

评论回复
6
B40614061| | 2013-6-17 16:14 | 只看该作者
还是有问题,没有输出了!!!!!!!

使用特权

评论回复
7
B40614061| | 2013-6-17 17:02 | 只看该作者
最终,我把两个answer()给删掉了,然后就点亮了!!!!难道是answer()有问题!!

使用特权

评论回复
8
B40614061| | 2013-6-17 17:28 | 只看该作者
这下彻底搞定了,我已经发现我的问题在哪里了,你的respons ( )里面是不是应该把你的SDA接口改为读属性,然后在respons ( )程序最后再改为写属性,我用的是PIC单片机可能和你的不一样。

使用特权

评论回复
9
B40614061| | 2013-6-17 18:21 | 只看该作者
我把我写的贴给你,希望对你有用。

#include <pic.h>

__CONFIG(HS&WDTDIS&PROTECT&LVPDIS);

#define SCL RC6
#define SDA RC7
unsigned int i;


//延迟函数,粗略延迟
void Delay(unsigned int k)
{
        unsigned int i;
        for(i=0;i<k;i++);
}


//IIC开始启动函数
void IICstart(void)
{
     SDA=1;               
     SCL=1;               
     Delay(50);               
     SDA=0;                 
     Delay(50);            
     SCL=0;               
     Delay(50);              
}

//IIC结束函数
void IICstop(void)
{
     SDA=0;               
     SCL=1;               
     Delay(50);            
     SDA=1;               
     Delay(50);              
     SCL=0;                 
     Delay(50);              
}

void answer(void)
{
     TRISC7=1;            
     asm("NOP");           
     SCL=1;               
        if(SDA)
        {
                SCL=0;
                IICstop();
        }
        else
        {
                SCL=0;
                asm("NOP");
                asm("NOP");
                    TRISC7=0;            
        }
}


//IIC写数据函数
void WriteByte(unsigned char Buf1)
{
     unsigned char k;      //1个字节要分8次写入,需要定义一个寄存器用来计数
     for(k=0;k<8;k++)      //做一个8次的循环,每次写入1位,需要写8次
     {
         if((Buf1&0x80)==0x80)     //从最高位开始写
         {
             SDA=1;        //如果欲写入数据为1,就将数据线置1
         }
         else
         {
             SDA=0;        //如果欲写入数据为0,就将数据线写0
         }
         asm("NOP");       //略做延时
         asm("NOP");       //略做延时
         SCL=1;            //时钟线做一个上升沿,将一位数据写入
         Buf1=Buf1<<1;     //数据左移一位,将下次要写入的位数据移到最高位
         asm("NOP");       //略做延时
         SCL=0;            //将SCL=0,以准备通过上升沿将数据写入
         asm("NOP");       //略做延时
     }
}


unsigned int DACconversion(unsigned char c)
{
        IICstart();
        WriteByte(0x90);
        answer();
        WriteByte(c);
        answer();
}

void IIC_init(void)
{
        SCL=1;
        SDA=1;
}

void main()
{
       
     TRISC=0B00000000;      //初始化RC7-RC0的输入输出方向
     PORTC=0B00000000;      //初始化RC7-RC0的数值

     IIC_init();
     DACconversion(0x40);
        while(1)
        {
                for(i=40000;i>0;i--)
                {
                        WriteByte(0xFF);       
                        Delay(20);
                }
        }
}

使用特权

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

本版积分规则

0

主题

8

帖子

1

粉丝