调试了好久终于调试出来了啊,原来罪魁祸首竟然是一个时钟的问题:
DAC0(uchar t)
{ uchar i;
uint x,y;//控制转换的命令字节
uint p_up;
p_up=0xffff;
EN138=1;
A138=0;
B138=0;
//DA_CLK=1;//由于在下降沿输出,故先拉高
delay(5);
for(i=0;i<16;i++)
{
DA_DIN=(bit)(p_up&0x8000);//取最高位传送
DA_CLK=1;
delay(10);
DA_CLK=0;
delay(10);
p_up<<=1;
}
EN138=1;//将5307的CS端拉高,准备下次的数据输入.
A138=1;
B138=1;
delay(10);
//********************************************以上将全部DA使能输出
EN138=1;
A138=0;
B138=0;
//DA_CLK=1;//由于在下降沿输出,故先拉高
delay(5);
for(i=0;i<16;i++)
{
DA_DIN=(bit)(dandc&0x8000);//取最高位传送
DA_CLK=1;
delay(10);
DA_CLK=0;
delay(10);
dandc<<=1;
}
EN138=1;//将5307的CS端拉高,准备下次的数据输入.
A138=1;
B138=1;
delay(5);
//**********************以上部分仅仅完成了数据的传送
x=0x0010;
x=x<<t;//用1选中要进行转换的通道.
y=0xe000;//启动转换的命令
y=y|x;
EN138=1;
A138=0;
B138=0;
//DA_CLK=1;//由于在下降沿输出,故先拉高
delay(10);
for(i=0;i<16;i++)
{
DA_DIN=(bit)(y&0x8000);//取最高位传送
DA_CLK=1;
delay(10);
DA_CLK=0;
delay(10);
y<<=1;
}
delay(10);
EN138=1;
A138=1;
B138=1;
}
以上为正确的程序,呕心沥血啊。有看的就要回贴啊,哪怕是骂两句。
下面把错误的程序也贴出来,以供参考学习:
DAC0(uchar t)
{ uchar i;
uint x,y;//控制转换的命令字节
uint p_up;
p_up=0xffff;
EN138=1;
A138=0;
B138=0;
DA_CLK=1;//由于在下降沿输出,故先拉高
delay(5);
for(i=0;i<16;i++)
{
DA_DIN=(bit)(p_up&0x8000);//取最高位传送
DA_CLK=0;
delay(10);
DA_CLK=1;
delay(10);
p_up<<=1;
}
EN138=1;//将5307的CS端拉高,准备下次的数据输入.
A138=1;
B138=1;
delay(10);
//********************************************以上将全部DA使能输出
EN138=1;
A138=0;
B138=0;
DA_CLK=1;//由于在下降沿输出,故先拉高
delay(5);
for(i=0;i<16;i++)
{
DA_DIN=(bit)(dandc&0x8000);//取最高位传送
DA_CLK=0;
delay(10);
DA_CLK=1;
delay(10);
dandc<<=1;
}
EN138=1;//将5307的CS端拉高,准备下次的数据输入.
A138=1;
B138=1;
delay(5);
//**********************以上部分仅仅完成了数据的传送
x=0x0010;
x=x<<t;//用1选中要进行转换的通道.
y=0xe000;//启动转换的命令
y=y|x;
EN138=1;
A138=0;
B138=0;
DA_CLK=1;//由于在下降沿输出,故先拉高
delay(10);
for(i=0;i<16;i++)
{
DA_DIN=(bit)(y&0x8000);//取最高位传送
DA_CLK=0;
delay(10);
DA_CLK=1;
delay(10);
y<<=1;
}
delay(10);
EN138=1;
A138=1;
B138=1;
}
两个程序中斜体的部分为不一样的地方,其实也就是时钟的下降沿的时间有没有延时的问题,由于DA转换和单片机部分用了光藕隔离所以才会出现这种需要延时的情况,如果没有隔离的话,完全可以不用延时,因为MAX5307的最高可以达到15MHZ的转换和数字传输频率。