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_();
}
#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();
} //应答信号
嗯嗯,我已经改过了