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

STC8H1K08 ADC获取数值始终为0

[复制链接]

2

主题

8

回帖

52

积分

注册会员

积分
52
发表于 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

回复

使用道具 举报 送花

2

主题

8

回帖

52

积分

注册会员

积分
52
发表于 2023-2-22 14:03:20 | 显示全部楼层
更正一下,main()调用 MotorAdc= GetMotorAdc(); 实际是调用了GetAdc();
在实际电路上,我已在MOT_ADC(P10端口)加了3.2V电压,通过串口打印ADC转换结果一直是00
  • 打卡等级:以坛为家I
  • 打卡总天数:328
  • 最近打卡:2025-03-09 19:40:01

9

主题

328

回帖

4501

积分

荣誉版主

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

aa2.png
  • 打卡等级:常住居民III
  • 打卡总天数:136
  • 最近打卡:2025-06-19 15:40:05

47

主题

1350

回帖

8056

积分

荣誉版主

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

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

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

串口打印ADC.rar

27.02 KB, 下载次数: 187

  • 打卡等级:以坛为家II
  • 打卡总天数:454
  • 最近打卡:2025-06-28 21:18:20
已绑定手机

40

主题

2079

回帖

7167

积分

论坛元老

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

2

主题

8

回帖

52

积分

注册会员

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

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

2

主题

8

回帖

52

积分

注册会员

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

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

2

主题

8

回帖

52

积分

注册会员

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

ADC_Vref有连接到VCC,我测过电压了,芯片也换过了
  • 打卡等级:常住居民III
  • 打卡总天数:136
  • 最近打卡:2025-06-19 15:40:05

47

主题

1350

回帖

8056

积分

荣誉版主

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

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

对的,刚刚好是STC8H1K08

2

主题

8

回帖

52

积分

注册会员

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

本版积分规则

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

GMT+8, 2025-6-30 06:40 , Processed in 0.124484 second(s), 105 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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