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);
}
}
一直都是输出满量程,不懂什么情况,万用表测量了io电压是2V
深圳国芯人工智能有限公司-实验箱
有完整的 ADC 测试程序
可对比寄存器程序看看
库函数使用较少
可能少了步骤 对应单片机型号参考该版主
https://www.stcaimcu.com/thread-7252-1-1.html 先查一下硬件连接是否正常,特别是ADC基准电压(ADC_Vref)脚有没有提供稳定的基准电压。 狂热主宰 发表于 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]