LTB 发表于 2026-6-9 17:54:40

STC8H4K32TLCD-LQFP48单片机的ADC读取异常,只能读0喝4095

改了无数编代码还是用不了,官方的AI也试了还是不能用,大佬们帮看看啥情况
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- BBS: www.STCAIMCU.com-----------------------------------------*/
/* --- QQ:800003751 -------------------------------------------------*/
/* ���Ҫ�ڳ�����ʹ�ô˴���,���ڳ�����ע��ʹ����STC�����ϼ�����            */
/*---------------------------------------------------------------------*/

#include        "config.h"
#include        "STC8G_H_GPIO.h"
#include        "STC8G_H_ADC.h"
#include        "STC8G_H_UART.h"
#include        "STC8H_DMA.h"
#include        "STC8G_H_NVIC.h"
#include        "STC8G_H_Delay.h"
#include        "STC8G_H_Switch.h"

/*************   ����˵��   ***************

��������ʾ��·ADC DMA����.

��ʼ��ʱ�Ȱ�ҪADCת������������Ϊ��������.

����������������(DMA)���ܣ�����ͨ��һ��ѭ���ɼ��������Զ���ŵ�DMA�����xdata�ռ�.

ͨ������1(P3.0 P3.1)��DMA�����xdata�ռ����յ������ݷ��͸���λ����������115200,N,8,1

�ö�ʱ���������ʷ�����������ʹ��1Tģʽ(���ǵͲ�������12T)����ѡ��ɱ�������������ʱ��Ƶ�ʣ�����߾���.

����ʱ, ѡ��ʱ�� 22.1184MHz (�����������ļ�"config.h"���޸�).

******************************************/

/*************        ���س�������        **************/

#define        ADC_CH                1                                /* ADCת��ͨ����, ����P1.1 */
#define        ADC_DATA        12                                /* ÿ��ͨ��ADCת����������, 2*ת������+4 */
#define ADC_CHANNEL_P11        0x0002                /* P1.1 ��Ӧ ADC ͨ��1, bit1 */
#define VCC                        3300UL                        /* ��ѹ��λmV, ������VCCʵ�ʵ�ѹ�޸� */

/*************        ���ر�������        **************/

u8 xdata DmaAdBuffer;

/*************�ⲿ�����ͱ������� *****************/


/******************** IO������ ********************/
void        GPIO_config(void)
{
        P1_MODE_IN_HIZ(GPIO_Pin_1);                        //P1.1 ����Ϊ��������
        P1_PULL_UP_DISABLE(GPIO_Pin_1);                //����P1.1�ڲ�����
        P1_DIGIT_IN_DISABLE(GPIO_Pin_1);        //�ر�P1.1�������룬��������ADC
}

/******************** UART���� ********************/
void        UART_config(void)
{
        COMx_InitDefine                COMx_InitStructure;                //�ṹ����

        COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;        //ģʽ,   UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
        COMx_InitStructure.UART_BRT_Use   = BRT_Timer1;                //ѡ�����ʷ�����, BRT_Timer1,BRT_Timer2 (ע��: ����2�̶�ʹ��BRT_Timer2)
        COMx_InitStructure.UART_BaudRate= 115200ul;                //������,   110 ~ 115200
        COMx_InitStructure.UART_RxEnable= ENABLE;                        //��������,   ENABLE �� DISABLE
        UART_Configuration(UART1, &COMx_InitStructure);                //��ʼ������ UART1,UART2,UART3,UART4
        NVIC_UART1_Init(ENABLE,Priority_1);                //�ж�ʹ��, ENABLE/DISABLE; ���ȼ�(�͵���) Priority_0,Priority_1,Priority_2,Priority_3

        UART1_SW(UART1_SW_P30_P31);                //UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}

/******************** ADC ���� ********************/
void        ADC_config(void)
{
        ADC_InitTypeDef                ADC_InitStructure;                //�ṹ����

        ADC_InitStructure.ADC_SMPduty   = 31;                //ADC ģ���źŲ���ʱ�����, 0~31
        ADC_InitStructure.ADC_CsSetup   = 1;                //ADC ͨ��ѡ��ʱ����� 0(Ĭ��),1
        ADC_InitStructure.ADC_CsHold    = 3;                //ADC ͨ��ѡ�񱣳�ʱ����� 0,1(Ĭ��),2,3
        ADC_InitStructure.ADC_Speed   = ADC_SPEED_2X16T;
        ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED;
        ADC_Inilize(&ADC_InitStructure);
        ADC_PowerControl(ENABLE);
        NVIC_ADC_Init(DISABLE,Priority_0);

        TSCTRL &= ~0x01;        // �رմ�����
        LCDCFG = 0;                        // �ر�LCD����(TLCD�ͺſ���Ĭ�Ͽ���)
}

/******************** DMA ���� ********************/
void        DMA_config(void)
{
        DMA_ADC_InitTypeDef                DMA_ADC_InitStructure;                //�ṹ����

        DMA_ADC_InitStructure.DMA_Enable = ENABLE;                        //DMAʹ��        ENABLE,DISABLE
        DMA_ADC_InitStructure.DMA_Channel = ADC_CHANNEL_P11;        //ADCͨ��ʹ�ܼĴ���, bit1=P1.1
        DMA_ADC_InitStructure.DMA_Buffer = (u16)DmaAdBuffer;        //ADCת�����ݴ洢��ַ
        DMA_ADC_InitStructure.DMA_Times = ADC_4_Times;        //ÿ��ͨ��ת������, ADC_1_Times,ADC_2_Times,ADC_4_Times,ADC_8_Times,ADC_16_Times,ADC_32_Times,ADC_64_Times,ADC_128_Times,ADC_256_Times
        DMA_ADC_Inilize(&DMA_ADC_InitStructure);                //��ʼ��
        NVIC_DMA_ADC_Init(ENABLE,Priority_0,Priority_0);                //�ж�ʹ��, ENABLE/DISABLE; ���ȼ�(�͵���) Priority_0~Priority_3; �������ȼ�(�͵���) Priority_0~Priority_3
        DMA_ADC_TRIG();                //��������ת��
}

/******************** task A **************************/
void main(void)
{
        u16 adc_val;
        u32 volt;

        EAXSFR();
        GPIO_config();
        UART_config();
        ADC_config();
        EA = 1;
        while (1)
        {
                adc_val = Get_ADCResult(1);
                volt = (u32)adc_val * VCC / 4096;
                printf("CH1=%u (%umV)RES=%02bx RESL=%02bx\r\n",
                        adc_val, (u16)volt, ADC_RES, ADC_RESL);
                delay_ms(500);
        }
}




LTB 发表于 2026-6-9 17:55:45

一直都是输出满量程,不懂什么情况,万用表测量了io电压是2V

神农鼎 发表于 2026-6-9 20:17:18



深圳国芯人工智能有限公司-实验箱

有完整的 ADC 测试程序

狂热主宰 发表于 2026-6-9 20:30:52

可对比寄存器程序看看
库函数使用较少
可能少了步骤

狂热主宰 发表于 2026-6-9 20:33:55

对应单片机型号参考该版主
https://www.stcaimcu.com/thread-7252-1-1.html

乘风飞扬 发表于 2026-6-10 09:23:21

先查一下硬件连接是否正常,特别是ADC基准电压(ADC_Vref)脚有没有提供稳定的基准电压。

LTB 发表于 2026-6-10 16:01:58

狂热主宰 发表于 2026-6-9 20:30
可对比寄存器程序看看
库函数使用较少
可能少了步骤

寄存器搞不定才去下库函数的,帮我看下是哪没配对
/*---------------------------------------------------------------------*/
/* 最简单ADC读取+串口1打印(STC8H8K64U, 24MHz)                      */
/* 使用P1.1(ADC1)读取外部电压,串口1打印原始ADC值                  */
/* 串口1: 9600,8,n,1,使用定时器2作为波特率发生器                     */
/*---------------------------------------------------------------------*/
#include "stc8h.h"
#include "intrins.h"

#define MAIN_Fosc   24000000L

typedef unsigned char u8;
typedef unsigned intu16;
typedef unsigned long u32;

// 串口1初始化(定时器2,9600)
void UART1_Init(void)
{
    SCON = 0x50;                  // 模式1,允许接收
    T2L= (u8)(65536 - MAIN_Fosc/4/9600);
    T2H= (u8)((65536 - MAIN_Fosc/4/9600) >> 8);
    AUXR = 0x14;                  // 定时器2 1T模式并启动
    AUXR |= 0x01;                   // 串口1选择定时器2
    TI = 1;                         // 允许首次发送
}

// 发送一个字符
void UART1_SendChar(u8 dat)
{
    SBUF = dat;
    while(!TI);
    TI = 0;
}

// 发送字符串
void UART1_SendStr(u8 *str)
{
    while(*str) UART1_SendChar(*str++);
}

// 发送一个16位十进制数(无符号)
void UART1_SendNum(u16 num)
{
    u8 buf, i = 0;
    if(num == 0) {
      UART1_SendChar('0');
      return;
    }
    while(num) {
      buf = num % 10 + '0';
      num /= 10;
    }
    while(i) UART1_SendChar(buf[--i]);
}

// 简单的毫秒延时
void delay_ms(u16 ms)
{
    u16 i, j;
    for(i=0; i<ms; i++)
      for(j=0; j<MAIN_Fosc/12000; j++);
}

// ADC初始化(P1.1作为ADC输入)
void ADC_Init(void)
{
    P1M1 |= 0x02;       // P1.1 设置为高阻输入(ADC通道1)
    P1M0 &= ~0x02;

    ADCTIM = 0x3f;      // ADC采样时间最大
    ADCCFG = 0x2f;      // ADC时钟 = fosc/2/16 = 750kHz,右对齐
    ADC_CONTR = 0x80;   // 开启ADC模块
    delay_ms(1);      // 等待ADC电源稳定
}

// 查询方式读取一次ADC结果(12位)
u16 Get_ADC12bitResult(u8 channel)
{
    ADC_RES = 0;
    ADC_RESL = 0;

    ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40 | channel;   // 启动转换
    _nop_(); _nop_(); _nop_(); _nop_();

    while(!(ADC_CONTR & 0x20));   // 等待完成
    ADC_CONTR &= ~0x20;             // 清除标志
    return ((u16)ADC_RES << 8) | ADC_RESL;
}

void main(void)
{
    u16 adc_val;   // 原始ADC值

    P_SW2 |= 0x80;          // 使能扩展寄存器访问

    UART1_Init();
    ADC_Init();

    EA = 1;               // 开启总中断
    delay_ms(500);
    UART1_SendStr("ADC Test Start\r\n");

    while(1)
    {
      // 读取P1.1上的外部电压ADC值(通道1)
      Get_ADC12bitResult(1);          // 丢弃第一次结果,稳定采样电容
      adc_val = Get_ADC12bitResult(1); // 读取有效值

      // 串口打印原始ADC值
      UART1_SendStr("ADC=");
      UART1_SendNum(adc_val);
      UART1_SendStr("\r\n");

      delay_ms(500);      // 每500ms打印一次
    }
}
页: [1]
查看完整版本: STC8H4K32TLCD-LQFP48单片机的ADC读取异常,只能读0喝4095