小弟,最近在用C8051F020单片机,它有12位AD, 8个通道,共用时候就要进行通道切换,以前用的时候在通道切换后加了也就500ns级的小小的延时,正常, 这次没有加这个采样死活出不来,但是硬件调试的时候寄存器什么都很正确,频幕显示也没有什么问题, 一自己跑起来就出问题了
最后按照那样加了一个延时就可以了,
附上程序,我感觉要确认和切换最好不要吝惜这几个空指令
下面是好的程序
unsigned int Get_Value00(void)
{
//首先选择0通道 再开启转黄 再查询中断位
AMX0SL = 0x00; //通道选择
AD0INT = 0;
AD0BUSY = 0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
AD0BUSY = 1; //把此位写1 启动转换
while(!AD0INT);
return ADC0HL;
}
unsigned int Get_Value01(void)
{
//首先选择1通道 清理标记位 再开启装换 再查寻中断位
AMX0SL = 0x01;
AD0INT = 0;
AD0BUSY = 0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
AD0BUSY = 1;
while(!AD0INT);
return ADC0HL;
}
下面是出错的程序
//启动0路转换
unsigned int ADC_Start0()
{
AMX0SL = 0x00;
AD0BUSY = 1;
while(AD0BUSY); //这里其实是一样的 中断位会在它变为0的时候变为1 ,所以对它更好用
AD0INT = 0;
return ADC0HL;
}
//启动1路转换
unsigned int ADC_Start1()
{
AMX0SL = 0x01;
AD0BUSY = 1;
while(AD0BUSY);
AD0INT = 0;
return ADC0HL;
}
//启动2路转换
unsigned int ADC_Start2()
{
AMX0SL = 0x02;
AD0BUSY = 1;
while(AD0BUSY);
AD0INT = 0;
return ADC0HL;
}
|