微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > PCF8591的DA转换问题

PCF8591的DA转换问题

时间:10-02 整理:3721RD 点击:
新手学单片机,没弄东PCF8591,照样子写了个程序。但是实现不了控制灯的亮度。而且只有几个值能发光
#include<reg52.h>
#include <intrins.h>
sbit SDA=P2^0;
sbit SCL=P2^1;
bit ack;
void start_IIC();
void stop_IIC();
void send_byte(unsigned char);
main()
{
        start_IIC();
        send_byte(0x90);
        if(ack==0)
                return(0);
        send_byte(0xf0);//这里是控制灯发光的数字量
        if(ack==0)
                return(0);
        stop_IIC();
}
void start_IIC()
{
        SCL=1;
        SDA=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SDA=0;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SCL=0;
        _nop_();
}
void stop_IIC()
{
        SCL=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SDA=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
}
void send_byte(unsigned char c)
{
        unsigned char count;
        for(count=0;count<8;count++)
                {
                         if((c<<count)&0x80)
                                SDA=1;
                        else
                                SDA=0;
                        _nop_();
                        SCL=1;
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        SCL=0;
                }
                SDA=1;
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                SCL=1;
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                if(SDA==1)
                        ack=0;
                else
                        ack=1;
                SCL=0;
                SDA=0;
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                       
}

这也行

根本实现不了。

我觉得你的开始停止有点问题,而且好像没有应答信号吧?
我是这么写:
void delay()
{;;}              //延时
void init()
{
      sda=1;
      delay();
      scl=1;
      delay();
}                                 //初始化
void start()
{
       sda=1;
       delay();
        scl=1;
        delay();
       sda=0;
       delay();
}                        //开始信号
void stop()
{
       sda=0;
       delay();
       scl=1;
        delay();
        sda=1;
        delay();
}                          //停止信号
void respons()
{
       uchar i;
       scl=1;
       delay();
       while((sda==1)&&(i<250))
        i++;
        scl=0;
        delay();
}                                  //应答信号

嗯嗯,我已经改过了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top