找回密码
 立即注册
查看: 34|回复: 2

8脚的STC8G1K08A带ADC功能吗?

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2026-03-15 07:28:29
已绑定手机

1

主题

1

回帖

47

积分

新手上路

积分
47
发表于 2026-3-9 00:19:48 | 显示全部楼层 |阅读模式
想用8脚的STC8G1K08A做个小玩意,要用到ADC功能,用的P3^3口,但怎么调试都调试不出来,到了while((ADC_CONTR & 0x10) == 0); 这句就卡死,大家帮我看看是代码哪里的问题啊



#define uchar unsigned char   
#define uint unsigned int  
#define MAIN_Fosc                11059200L        //定义主时钟
#include <STC8G.h>   
#include <intrins.h>  



#define ADC_CH     3   // ADC通道 P3.3



//========================================================================
// 函数: void  delay_ms(u8 ms)
// 描述: 延时函数。

//========================================================================
void delayms(uint ms)
{
    uint i,j;
    for(i=ms; i>0; i--)
        for(j=110; j>0; j--);
}



// ADC初始化
void ADC_Init(void)
{
                 P3M1 &= ~0x08; P3M0 &= ~0x08;  // P3.3设为准双向口
    P3PU |= 0x08;                  // 开启上拉(官方推荐)
   
    // 第一步:配置ADC内部采样时序(ADCTIM)
    P_SW2 |= 0x80;                 
    ADCTIM = 0x3f;                 // 官方值:最大采样时间
    P_SW2 &= 0x7f;                 
   
    // 第二步:配置ADC第二级分频+参考电压(ADCCFG)
    ADCCFG = 0x0f;                 // 官方值:分频16倍+VCC参考
   
    // 第三步:单独开启ADC电源(官方标准写法)
    P_SW2 |= 0x80;                 
    ADC_CONTR =  0x80;         // 等价于 ADC_CONTR = 0x80; 单独开电源
    ADC_RES = 0; ADC_RESL = 0;     // 清空结果寄存器
    P_SW2 &= ~0x80;               
   
    // 第四步:重新开锁,选通道(电源开稳定后再选通道)
    P_SW2 |= 0x80;                 
    ADC_CONTR |= (3<<2);           // 选ADC3通道(P3.3)
    P_SW2 &= ~0x80;                // 锁定扩展寄存器
   
    delayms(10);                   // 电源稳定(官方要求)
   
}

// 修复后的 ADC 读取函数
unsigned int ADC_Read(void)
{
    unsigned int adc_result;
                EA = 0; // 关总中断,避免干扰ADC转换
    P_SW2 |= 0x80;
   
    ADC_CONTR = 0x80 | 0x40 | (3<<2) | 0x08;             // 重新写入所有配置位(保留6分频+启动转换
    _nop_();_nop_();_nop_();_nop_();// 等待触发稳定
   
    //等待转换完成:只等标志位,不加超时(避免误判)
    while((ADC_CONTR & 0x10) == 0);
   
    adc_result = (ADC_RES << 8) | ADC_RESL; // 读取结果
   
    ADC_RES = 0; ADC_RESL = 0;     // 清空结果寄存器(防止叠加)
    P_SW2 &= ~0x80;
   
    EA = 1; // 开总中断
    return adc_result;
}



void main(void)
{
        uint adc_val;
   
    ADC_Init();
   


    while(1)
    {
                               
                                adc_val = ADC_Read();

      
        delayms(5000);

    }
}

回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:84
  • 最近打卡:2026-03-23 16:08:41
已绑定手机

4

主题

227

回帖

832

积分

高级会员

积分
832
发表于 2026-3-9 16:46:43 | 显示全部楼层
下载规格书:https://www.stcai.com/cp_stc8gxl
然后看一下ADC相关章节,有例程,有些位你搞错了,时序也过于复杂了。
(ADC_CONTR & 0x10)不是转换完成标志。
向ADC_CONTR 赋值的那条语句你再检查一下。
“P_SW2 &= ~0x80”建议去掉,不需要关EAXFR。




回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2026-03-15 07:28:29
已绑定手机

1

主题

1

回帖

47

积分

新手上路

积分
47
发表于 2026-3-9 16:50:24 | 显示全部楼层
lcws*** 发表于 2026-3-9 16:46
下载规格书:https://www.stcai.com/cp_stc8gxl
然后看一下ADC相关章节,有例程,有些位你搞错了。
(ADC_CO ...

谢谢,找到相关例程了,也跑通了,找到的。A是带的,待会吧跑通的例程贴上来。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-3-23 23:09 , Processed in 0.114145 second(s), 54 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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