做多路巡回系统,proteus 里51单片机仿真没有问题,实物焊接时出了问题,用adc0809两个通道输入,一个通道输入是正常的能实现0~5v变化,但另一个通道调电位器的时候,数码管显示的值乱跳,而且往一个方向转,值从1.2到1.8之间乱跳是怎么回事,是虚焊吗,确定照着仿真焊没有焊错
不知道你这个问题是否已经解决, 如果还没有解决的话: 本项目这里采用的是ADC0832模数转换模块,通过电压大小来模拟浑浊程度,从而在选择智能洗的时候根据浑浊程度来进行相对应的洗涤时间。其VCC引脚接5V,GND引脚接地,CLK引脚接51单片机P1.1引脚,DI引脚接51单片机P1.2引脚,DO引脚接51单片机P1.3引脚,CS引脚接51单片机P1.4引脚,CH0引脚接滑动变阻器,
//浑浊度
#include "ADC.h"
sbit ADC_CS =P1^4; //片选端
sbit ADC_CLK= P1^1;
sbit ADC_DATI= P1^2;
sbit ADC_DATO =P1^3;
//adc转换
uchar adc0832(uchar temp_CH)
{
uchar temp_data =0x00; //ad值
uchar i,temp_ad_val1,temp_ad_val2;
temp_ad_val2 =0x00;
temp_ad_val1 =0x00;
ADC_CLK =0;//初始化
ADC_DATI =1;
_nop_();
ADC_CS =0;
_nop_();
ADC_CLK =1;
_nop_();
if (temp_CH ==0x00)
{
ADC_CLK =0;
ADC_DATI =1; //通道0的第一位
_nop_();
ADC_CLK =1;
_nop_();
ADC_CLK=0;
ADC_DATI =0; //通道0的第二位
_nop_();
ADC_CLK =1;
_nop_();
}
else
{
ADC_CLK =0;
ADC_DATI =1; //通道0的第一位
_nop_();
ADC_CLK =1;
_nop_();
ADC_CLK=0;
ADC_DATI =1; //通道0的第二位
_nop_();
ADC_CLK =1;
_nop_();
}
ADC_CLK =0;
ADC_DATI =1;
for(i =0;i<8;i++) //读取前八位
{
_nop_();
temp_ad_val2 <<=1;
ADC_CLK =1;
_nop_();
ADC_CLK=0;
if(ADC_DATO)
temp_ad_val2 |=0x01;
else
temp_ad_val2 |=0x00;
}
for(i =0;i<8;i++) //后读取8位的值
{
temp_ad_val1 >>= 1;
if (ADC_DATO)
temp_ad_val1 |= 0x80;
else
temp_ad_val1 |= 0x00;
_nop_();
ADC_CLK = 1;
_nop_();
ADC_CLK = 0;
}
if (temp_ad_val2 == temp_ad_val1) //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
temp_data = temp_ad_val1;
_nop_();
ADC_CS = 1; //释放ADC0832
ADC_DATO = 1;
ADC_CLK = 1;
return temp_data;
}
由于数据显示出现了乱跳,并且只往一个方向发生变化,值从1.2到1.8之间乱跳,可以考虑以下几个可能的原因和解决方案:
电位器接错或损坏导致的数据问题:检查电位器的引脚是否正确连接,确保接地和电源线没有接错,同时可以尝试更换一下电位器看看是否能解决问题。
通道选择引脚连接错误导致的问题:检查ADC0809的通道选择引脚和实际电路是否连接正确,特别是要确保所选通道的引脚在不工作时是高电平(即不接触电位器时)。
电源或信号线噪声干扰导致的问题:使用降噪电容和滤波器,确保电源和信号线的稳定性,特别是要确保通道之间的互相干扰尽量小,例如可以尝试分别给不同通道的信号线和电源线分别设置降噪电容。
微处理器内部的问题:检查单片机内部的AD采样程序是否正确,可以使用示波器监测ADC0809的输出信号是否正常,同时可以将不正常的通道连接到允许使用的正常通道上,检测是否还会出现相同的问题。
需要注意的是,在进行实际硬件操作时,受到的环境和设备影响较大,一些问题可能难以预见和排除,需要结合实际情况进行调试,尽量隔离掉各种可能的影响因素。