我编写了ADC0838的驱动程序,用protues仿真,但仿真结果不正确,我不知道问题出在哪里,请朋友们指点,必谢!以下是驱动程序:
sbit AD8_CS= P2^1;
sbit AD8_DI_DO =P2^2;
sbit AD8_CLK = P2^0;
sbit AD8_INPUT =P2^3;
unsigned char AD(unsigned char addr)
{
unsigned char ke,num=0x10,MUX=0x18,count,dat=0;
//根据通道号产生配置字
switch (addr)
{
case 0:{MUX=0X18;break;}
case 1:{MUX=0x1c;break;}
case 2:{MUX=0X19;break;}
case 3:{MUX=0x1d;break;}
case 4:{MUX=0X1a;break;}
case 5:{MUX=0x1e;break;}
case 6:{MUX=0x1b;break;}
case 7:{MUX=0x1f;break;}
}
//产生配置字后启动(即初始化)AD转换
AD8_CLK=0; _nop_(); _nop_();
AD8_CS=1; _nop_(); _nop_();
AD8_CS=0;_nop_(); _nop_();
//输入配置,在CLK上升沿接收配置
for(count=4;count>=0;count--)
{
AD8_CLK=0;_nop_();
ke=pow2(count);
if(ke&MUX)
{AD8_DI_DO=1;b=1;}//b供测试用
else
{AD8_DI_DO=0;b=0;}
_nop_();
AD8_CLK=1;
_nop_();_nop_();
}
//产生一个空的脉冲,配置完后隔一个空脉冲AD转换器在CLK下降沿输出数据
AD8_CLK=0;
_nop_();_nop_();
AD8_CLK=1;
_nop_();_nop_();
//在CLK下降沿接收AD转换器的输出, 移位7次
for(count=0;count<7;count++)
{
AD8_CLK=0;
_nop_();_nop_();
if(AD8_INPUT)
{
dat=dat+1;dat=dat*2;b=1;//b为调试测试用
}
else
{ dat=(dat*2);b=0;}
_nop_();_nop_();
AD8_CLK=1;
_nop_();_nop_();
}
AD8_CLK=0;
if(AD8_INPUT) dat=dat+1;//转换的最后一位
_nop_();_nop_();
AD8_CS=1;
_nop_();
return dat;//返回转换结果
}
//上面的驱动程序我调试了N次了,弄得快吐血了还是找不到错误,不知是不是protues硬件电路有错误?硬件电路如下:
|