jinmandou 发表于 2026-3-9 00:19:48

8脚的STC8G1K08A带ADC功能吗?

想用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



//========================================================================
// 函数: voiddelay_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);

    }
}

lcwswust 发表于 2026-3-9 16:46:43

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




jinmandou 发表于 2026-3-9 16:50:24

lcwswust 发表于 2026-3-9 16:46
下载规格书:https://www.stcai.com/cp_stc8gxl
然后看一下ADC相关章节,有例程,有些位你搞错了。
(ADC_CO ...

谢谢,找到相关例程了,也跑通了,找到的。A是带的,待会吧跑通的例程贴上来。
页: [1]
查看完整版本: 8脚的STC8G1K08A带ADC功能吗?