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);
}
}
下载规格书:https://www.stcai.com/cp_stc8gxl
然后看一下ADC相关章节,有例程,有些位你搞错了,时序也过于复杂了。
(ADC_CONTR & 0x10)不是转换完成标志。
向ADC_CONTR 赋值的那条语句你再检查一下。
“P_SW2 &= ~0x80”建议去掉,不需要关EAXFR。
lcwswust 发表于 2026-3-9 16:46
下载规格书:https://www.stcai.com/cp_stc8gxl
然后看一下ADC相关章节,有例程,有些位你搞错了。
(ADC_CO ...
谢谢,找到相关例程了,也跑通了,找到的。A是带的,待会吧跑通的例程贴上来。
页:
[1]