实物焊接adc0809采样值乱跳

做多路巡回系统,proteus 里51单片机仿真没有问题,实物焊接时出了问题,用adc0809两个通道输入,一个通道输入是正常的能实现0~5v变化,但另一个通道调电位器的时候,数码管显示的值乱跳,而且往一个方向转,值从1.2到1.8之间乱跳是怎么回事,是虚焊吗,确定照着仿真焊没有焊错

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这篇文章:Proteus中ADC0808的使用注意事项
  • 除此之外, 这篇博客: 基于51单片机的多功能洗碗机(Protues仿真)中的 3.3 ADC0832模块 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    ​ 本项目这里采用的是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;
    }
    
    
  • 以下回答来自chatgpt:

    由于数据显示出现了乱跳,并且只往一个方向发生变化,值从1.2到1.8之间乱跳,可以考虑以下几个可能的原因和解决方案:

    1. 电位器接错或损坏导致的数据问题:检查电位器的引脚是否正确连接,确保接地和电源线没有接错,同时可以尝试更换一下电位器看看是否能解决问题。

    2. 通道选择引脚连接错误导致的问题:检查ADC0809的通道选择引脚和实际电路是否连接正确,特别是要确保所选通道的引脚在不工作时是高电平(即不接触电位器时)。

    3. 电源或信号线噪声干扰导致的问题:使用降噪电容和滤波器,确保电源和信号线的稳定性,特别是要确保通道之间的互相干扰尽量小,例如可以尝试分别给不同通道的信号线和电源线分别设置降噪电容。

    4. 微处理器内部的问题:检查单片机内部的AD采样程序是否正确,可以使用示波器监测ADC0809的输出信号是否正常,同时可以将不正常的通道连接到允许使用的正常通道上,检测是否还会出现相同的问题。

    需要注意的是,在进行实际硬件操作时,受到的环境和设备影响较大,一些问题可能难以预见和排除,需要结合实际情况进行调试,尽量隔离掉各种可能的影响因素。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^