找回密码
 立即注册
查看: 1139|回复: 9

STC8H1K08 ADC获取数值始终为0

[复制链接]

该用户从未签到

1

主题

5

回帖

31

积分

新手上路

积分
31
发表于 2023-2-22 14:03:19 | 显示全部楼层 |阅读模式
本帖最后由 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;
*/
}



volatile  unsigned char  MotorAdc= 0;
volatile  bit  MotorAdcIntFlag= 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 char  RxBuff;
unsigned char  busy;
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;
}



void  main(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);
                }
               
        }
}


STC8H1K08 ADC获取数值始终为0-1.png

回复 送花

使用道具 举报

该用户从未签到

1

主题

5

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-2-22 14:03:20 | 显示全部楼层
更正一下,main()调用 MotorAdc= GetMotorAdc(); 实际是调用了GetAdc();
在实际电路上,我已在MOT_ADC(P10端口)加了3.2V电压,通过串口打印ADC转换结果一直是00
  • TA的每日心情
    开心
    昨天 08:40
  • 签到天数: 143 天

    [LV.7]常住居民III

    9

    主题

    304

    回帖

    3701

    积分

    荣誉版主

    积分
    3701
    发表于 2023-2-22 14:31:02 | 显示全部楼层
    使用8h4k64tl测试,串口输出固定为0x64,注意到GetADC没有return语句,按图修改后能正常运行

    aa2.png
  • TA的每日心情
    开心
    昨天 09:44
  • 签到天数: 86 天

    [LV.6]常住居民II

    38

    主题

    981

    回帖

    6743

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6743
    QQ
    发表于 2023-2-22 15:04:22 | 显示全部楼层
    1.png

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

    串口打印ADC.rar

    27.02 KB, 下载次数: 72

  • TA的每日心情
    奋斗
    昨天 09:07
  • 签到天数: 121 天

    [LV.7]常住居民III

    26

    主题

    1238

    回帖

    3875

    积分

    论坛元老

    积分
    3875
    发表于 2023-2-22 15:48:00 | 显示全部楼层
    从图纸看ADC_Vref脚是连接到VCC了,程序排查没问题情况下读取AD值都是0,很大可能是ADC_Vref脚没接好,检查一下有没有虚焊。

    该用户从未签到

    1

    主题

    5

    回帖

    31

    积分

    新手上路

    积分
    31
     楼主| 发表于 2023-2-22 18:05:03 | 显示全部楼层
    kksk 发表于 2023-2-22 14:31
    使用8h4k64tl测试,串口输出固定为0x64,注意到GetADC没有return语句,按图修改后能正常运行

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

    该用户从未签到

    1

    主题

    5

    回帖

    31

    积分

    新手上路

    积分
    31
     楼主| 发表于 2023-2-22 18:10:18 | 显示全部楼层
    电子DIY小家 发表于 2023-2-22 15:04
    手边有现成的硬件,不过我的ADC是P1.1端口,看着用咯

    我把ADC端口修改为P10,还是只能打印00,你用的硬件也是STC8H1K08吗?
    串口打印ADC(STC8H1K08).rar (31.54 KB, 下载次数: 66)

    该用户从未签到

    1

    主题

    5

    回帖

    31

    积分

    新手上路

    积分
    31
     楼主| 发表于 2023-2-22 18:11:55 | 显示全部楼层
    乘风飞扬 发表于 2023-2-22 15:48
    从图纸看ADC_Vref脚是连接到VCC了,程序排查没问题情况下读取AD值都是0,很大可能是ADC_Vref脚没接好,检查 ...

    ADC_Vref有连接到VCC,我测过电压了,芯片也换过了
  • TA的每日心情
    开心
    昨天 09:44
  • 签到天数: 86 天

    [LV.6]常住居民II

    38

    主题

    981

    回帖

    6743

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6743
    QQ
    发表于 2023-2-22 19:05:37 | 显示全部楼层
    fmin888 发表于 2023-2-22 18:10
    我把ADC端口修改为P10,还是只能打印00,你用的硬件也是STC8H1K08吗?

    对的,刚刚好是STC8H1K08

    该用户从未签到

    1

    主题

    5

    回帖

    31

    积分

    新手上路

    积分
    31
     楼主| 发表于 2023-2-24 11:46:21 | 显示全部楼层
    问题找到了,是我串口硬件上复用了其它功能,没注意TX线上有一个小电容的问题,硬件上的问题:L,感谢各位支持,谢谢了!
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-24 07:02 , Processed in 0.074526 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表