fmin888 发表于 2023-2-22 14:03:19

STC8H1K08 ADC获取数值始终为0

本帖最后由 fmin888 于 2023-2-22 14:03 编辑

各位大师们,有没有遇到过使用STC8H1K08读取ADC数值始终为0的问题?代码基本都是STC-ISP工具里面复制的,相关代码和电路贴出来,还请大师们帮忙指点迷津!


/**      ADC配置      **/




void ConfigADC(void)
{                                                                        

//查询方式
    P1M0 &= ~BIT0;                              //P10端口
    P1M1 |= BIT0;      
    P_SW2 |= 0x80;
    ADCTIM = 0x3f;                              //设置ADC内部时序
    P_SW2 &= 0x7f;
    ADCCFG = 0x0f;                              //设置ADC时钟为系统时钟
    ADC_CONTR = 0x80;                           //使能ADC模块

/*      
   //中断方式
    P1M0 &= ~BIT0;                              //P10端口
    P1M1 |= BIT0;      
    P_SW2 |= 0x80;
    ADCTIM = 0x3f;                              //设置ADC内部时序
    P_SW2 &= 0x7f;
    ADCCFG = 0x0f;                              //设置ADC时钟为系统时钟/2/16
    ADC_CONTR = 0x80;                           //使能ADC模块
    EADC = 1;                                 //使能ADC中断
    EA = 1;
    ADC_CONTR |= 0x40;                        //启动AD转换
   MotorAdcIntFlag= 0;
*/
}



volatileunsigned charMotorAdc= 0;
volatilebitMotorAdcIntFlag= 0;
void ADC_Isr() interrupt 5
{
         ADC_CONTR &= ~0x20;                         //清中断标志
         MotorAdc = ADC_RES;                         //读取ADC结果
         ADC_CONTR |= 0x40;                        //继续AD转换
         MotorAdcIntFlag= 1;
}

/** 查询ADC值
**
*******************************************************************/
unsigned char GetAdc(void)
{
               ADC_CONTR |= 0x40;                      //启动AD转换
                _nop_();
                _nop_();
                while (!(ADC_CONTR & 0x20));            //查询ADC完成标志
                ADC_CONTR &= ~0x20;                     //清完成标志
                MotorAdc = ADC_RES;                     //读取ADC结果
}



/** 串口中断
*********************************************************************/


unsigned charRxBuff;
unsigned charbusy;
void UartIsr() interrupt 4
{
                if (TI)
    {//发送
      TI = 0;
      busy = 0;
    }
    if (RI)
    {//接收
      RI = 0;
                        RxBuff = SBUF;
    }
}




/** 配置串口
********************************************************************/
void ConfigUart(void)
{
    SCON = 0x50;
    T2L = BRT;
    T2H = BRT >> 8;
    AUXR = 0x15;
    busy = 0;
    ES = 1;
    EA = 1;
}






/** 通过串口发送1byte数据
*************************************************************/
void Uart1Send(u8 dat)
{
          while (busy);
          _nop_();
      _nop_();
       busy = 1;
       SBUF = dat;
}



voidmain(void)
{
          P1M0= 0x00;
          P1M1= 0x00;
          P3M0= 0x00;
          P3M1= 0x00;
          P5M0= 0x00;
          P5M1= 0x00;
      
          MOTOR_CTRL= 1;
          BUZZER= 0;
          MotorStop();
         P3M0 |= (BIT6+BIT7);               
         P3M1 |= BIT5;
         
      //TimeConfig();
      ConfigUart();
               
               
      ConfigADC();
      while(1)
      {
                MotorAdc= GetAdc();
                //if (MotorAdcIntFlag)
                {
                        MotorAdcIntFlag= 0;
                        Uart1Send(MotorAdc);
                        DelayMs(100);
                }
               
      }
}




fmin888 发表于 2023-2-22 14:03:20

更正一下,main()调用 MotorAdc= GetMotorAdc(); 实际是调用了GetAdc();
在实际电路上,我已在MOT_ADC(P10端口)加了3.2V电压,通过串口打印ADC转换结果一直是00

kksk 发表于 2023-2-22 14:31:02

使用8h4k64tl测试,串口输出固定为0x64,注意到GetADC没有return语句,按图修改后能正常运行


电子DIY小家 发表于 2023-2-22 15:04:22



手边有现成的硬件,不过我的ADC是P1.1端口,看着用咯

乘风飞扬 发表于 2023-2-22 15:48:00

从图纸看ADC_Vref脚是连接到VCC了,程序排查没问题情况下读取AD值都是0,很大可能是ADC_Vref脚没接好,检查一下有没有虚焊。

fmin888 发表于 2023-2-22 18:05:03

kksk 发表于 2023-2-22 14:31
使用8h4k64tl测试,串口输出固定为0x64,注意到GetADC没有return语句,按图修改后能正常运行




这段是有点问题,没有return语句,因为当时准备使用ADC中断直接使用全局变量,后来改查询方式没有注意到:loveliness: 但我按图修改了查询函数还是只能返回00:L

fmin888 发表于 2023-2-22 18:10:18

电子DIY小家 发表于 2023-2-22 15:04
手边有现成的硬件,不过我的ADC是P1.1端口,看着用咯

我把ADC端口修改为P10,还是只能打印00,你用的硬件也是STC8H1K08吗?

fmin888 发表于 2023-2-22 18:11:55

乘风飞扬 发表于 2023-2-22 15:48
从图纸看ADC_Vref脚是连接到VCC了,程序排查没问题情况下读取AD值都是0,很大可能是ADC_Vref脚没接好,检查 ...

ADC_Vref有连接到VCC,我测过电压了,芯片也换过了

电子DIY小家 发表于 2023-2-22 19:05:37

fmin888 发表于 2023-2-22 18:10
我把ADC端口修改为P10,还是只能打印00,你用的硬件也是STC8H1K08吗?

对的,刚刚好是STC8H1K08

fmin888 发表于 2023-2-24 11:46:21

问题找到了,是我串口硬件上复用了其它功能,没注意TX线上有一个小电容的问题,硬件上的问题:L,感谢各位支持,谢谢了!
页: [1]
查看完整版本: STC8H1K08 ADC获取数值始终为0