找回密码
 立即注册
查看: 107|回复: 6

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2026-06-18 18:10:17
已绑定手机

2

主题

2

回帖

16

积分

新手上路

积分
16
发表于 2026-6-9 17:54:40 | 显示全部楼层 |阅读模式
改了无数编代码还是用不了,官方的AI也试了还是不能用,大佬们帮看看啥情况
  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC 1T Series MCU Demo Programme -------------------------------*/
  4. /* --- Mobile: (86)13922805190 ----------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
  7. /* --- Web: www.STCAI.com ---------------------------------------------*/
  8. /* --- BBS: www.STCAIMCU.com  -----------------------------------------*/
  9. /* --- QQ:  800003751 -------------------------------------------------*/
  10. /* ���Ҫ�ڳ�����ʹ�ô˴���,���ڳ�����ע��ʹ����STC�����ϼ�����            */
  11. /*---------------------------------------------------------------------*/
  12. #include        "config.h"
  13. #include        "STC8G_H_GPIO.h"
  14. #include        "STC8G_H_ADC.h"
  15. #include        "STC8G_H_UART.h"
  16. #include        "STC8H_DMA.h"
  17. #include        "STC8G_H_NVIC.h"
  18. #include        "STC8G_H_Delay.h"
  19. #include        "STC8G_H_Switch.h"
  20. /*************   ����˵��   ***************
  21. ��������ʾ��·ADC DMA����.
  22. ��ʼ��ʱ�Ȱ�ҪADCת������������Ϊ��������.
  23. ����������������(DMA)���ܣ�����ͨ��һ��ѭ���ɼ��������Զ���ŵ�DMA�����xdata�ռ�.
  24. ͨ������1(P3.0 P3.1)��DMA�����xdata�ռ����յ������ݷ��͸���λ����������115200,N,8,1
  25. �ö�ʱ���������ʷ�����������ʹ��1Tģʽ(���ǵͲ�������12T)����ѡ��ɱ�������������ʱ��Ƶ�ʣ�����߾���.
  26. ����ʱ, ѡ��ʱ�� 22.1184MHz (�����������ļ�"config.h"���޸�).
  27. ******************************************/
  28. /*************        ���س�������        **************/
  29. #define        ADC_CH                1                                /* ADCת��ͨ����, ����P1.1 */
  30. #define        ADC_DATA        12                                /* ÿ��ͨ��ADCת����������, 2*ת������+4 */
  31. #define ADC_CHANNEL_P11        0x0002                /* P1.1 ��Ӧ ADC ͨ��1, bit1 */
  32. #define VCC                        3300UL                        /* ��ѹ��λmV, ������VCCʵ�ʵ�ѹ�޸� */
  33. /*************        ���ر�������        **************/
  34. u8 xdata DmaAdBuffer[ADC_CH][ADC_DATA];
  35. /*************  �ⲿ�����ͱ������� *****************/
  36. /******************** IO������ ********************/
  37. void        GPIO_config(void)
  38. {
  39.         P1_MODE_IN_HIZ(GPIO_Pin_1);                        //P1.1 ����Ϊ��������
  40.         P1_PULL_UP_DISABLE(GPIO_Pin_1);                //����P1.1�ڲ�����
  41.         P1_DIGIT_IN_DISABLE(GPIO_Pin_1);        //�ر�P1.1�������룬��������ADC
  42. }
  43. /******************** UART���� ********************/
  44. void        UART_config(void)
  45. {
  46.         COMx_InitDefine                COMx_InitStructure;                //�ṹ����
  47.         COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;        //ģʽ,   UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
  48.         COMx_InitStructure.UART_BRT_Use   = BRT_Timer1;                //ѡ�����ʷ�����, BRT_Timer1,BRT_Timer2 (ע��: ����2�̶�ʹ��BRT_Timer2)
  49.         COMx_InitStructure.UART_BaudRate  = 115200ul;                //������,     110 ~ 115200
  50.         COMx_InitStructure.UART_RxEnable  = ENABLE;                        //��������,   ENABLE �� DISABLE
  51.         UART_Configuration(UART1, &COMx_InitStructure);                //��ʼ������ UART1,UART2,UART3,UART4
  52.         NVIC_UART1_Init(ENABLE,Priority_1);                //�ж�ʹ��, ENABLE/DISABLE; ���ȼ�(�͵���) Priority_0,Priority_1,Priority_2,Priority_3
  53.         UART1_SW(UART1_SW_P30_P31);                //UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
  54. }
  55. /******************** ADC ���� ********************/
  56. void        ADC_config(void)
  57. {
  58.         ADC_InitTypeDef                ADC_InitStructure;                //�ṹ����
  59.         ADC_InitStructure.ADC_SMPduty   = 31;                //ADC ģ���źŲ���ʱ�����, 0~31
  60.         ADC_InitStructure.ADC_CsSetup   = 1;                //ADC ͨ��ѡ��ʱ����� 0(Ĭ��),1
  61.         ADC_InitStructure.ADC_CsHold    = 3;                //ADC ͨ��ѡ�񱣳�ʱ����� 0,1(Ĭ��),2,3
  62.         ADC_InitStructure.ADC_Speed     = ADC_SPEED_2X16T;
  63.         ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED;
  64.         ADC_Inilize(&ADC_InitStructure);
  65.         ADC_PowerControl(ENABLE);
  66.         NVIC_ADC_Init(DISABLE,Priority_0);
  67.         TSCTRL &= ~0x01;        // �رմ�����
  68.         LCDCFG = 0;                        // �ر�LCD����(TLCD�ͺſ���Ĭ�Ͽ���)
  69. }
  70. /******************** DMA ���� ********************/
  71. void        DMA_config(void)
  72. {
  73.         DMA_ADC_InitTypeDef                DMA_ADC_InitStructure;                //�ṹ����
  74.         DMA_ADC_InitStructure.DMA_Enable = ENABLE;                        //DMAʹ��          ENABLE,DISABLE
  75.         DMA_ADC_InitStructure.DMA_Channel = ADC_CHANNEL_P11;        //ADCͨ��ʹ�ܼĴ���, bit1=P1.1
  76.         DMA_ADC_InitStructure.DMA_Buffer = (u16)DmaAdBuffer;        //ADCת�����ݴ洢��ַ
  77.         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
  78.         DMA_ADC_Inilize(&DMA_ADC_InitStructure);                //��ʼ��
  79.         NVIC_DMA_ADC_Init(ENABLE,Priority_0,Priority_0);                //�ж�ʹ��, ENABLE/DISABLE; ���ȼ�(�͵���) Priority_0~Priority_3; �������ȼ�(�͵���) Priority_0~Priority_3
  80.         DMA_ADC_TRIG();                //��������ת��
  81. }
  82. /******************** task A **************************/
  83. void main(void)
  84. {
  85.         u16 adc_val;
  86.         u32 volt;
  87.         EAXSFR();
  88.         GPIO_config();
  89.         UART_config();
  90.         ADC_config();
  91.         EA = 1;
  92.         while (1)
  93.         {
  94.                 adc_val = Get_ADCResult(1);
  95.                 volt = (u32)adc_val * VCC / 4096;
  96.                 printf("CH1=%u (%umV)  RES=%02bx RESL=%02bx\r\n",
  97.                         adc_val, (u16)volt, ADC_RES, ADC_RESL);
  98.                 delay_ms(500);
  99.         }
  100. }
复制代码


21-ADC采样数据自动存入DMA-串口输出结果 (2).zip

564.61 KB, 下载次数: 2

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2026-06-18 18:10:17
已绑定手机

2

主题

2

回帖

16

积分

新手上路

积分
16
发表于 2026-6-9 17:55:45 | 显示全部楼层
一直都是输出满量程,不懂什么情况,万用表测量了io电压是2V
截图202606091755125925.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2026-07-03 08:57:36

830

主题

1万

回帖

2万

积分

管理员

积分
23929
发表于 2026-6-9 20:17:18 | 显示全部楼层
截图202606092016488147.jpg

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

有完整的 ADC 测试程序
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:299
  • 最近打卡:2026-07-04 00:01:55
已绑定手机

66

主题

808

回帖

3037

积分

论坛元老

DIY玩家

积分
3037
发表于 2026-6-9 20:30:52 | 显示全部楼层
可对比寄存器程序看看
库函数使用较少
可能少了步骤
永怀这学徒心
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:299
  • 最近打卡:2026-07-04 00:01:55
已绑定手机

66

主题

808

回帖

3037

积分

论坛元老

DIY玩家

积分
3037
发表于 2026-6-9 20:33:55 | 显示全部楼层
对应单片机型号参考该版主
https://www.stcaimcu.com/thread-7252-1-1.html
永怀这学徒心
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:712
  • 最近打卡:2026-07-03 09:07:06
已绑定手机

50

主题

2691

回帖

9338

积分

论坛元老

积分
9338
发表于 2026-6-10 09:23:21 | 显示全部楼层
先查一下硬件连接是否正常,特别是ADC基准电压(ADC_Vref)脚有没有提供稳定的基准电压。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2026-06-18 18:10:17
已绑定手机

2

主题

2

回帖

16

积分

新手上路

积分
16
发表于 2026-6-10 16:01:58 | 显示全部楼层
狂热*** 发表于 2026-6-9 20:30
可对比寄存器程序看看
库函数使用较少
可能少了步骤

寄存器搞不定才去下库函数的,帮我看下是哪没配对
  1. /*---------------------------------------------------------------------*/
  2. /* 最简单ADC读取+串口1打印(STC8H8K64U, 24MHz)                      */
  3. /* 使用P1.1(ADC1)读取外部电压,串口1打印原始ADC值                    */
  4. /* 串口1: 9600,8,n,1,使用定时器2作为波特率发生器                     */
  5. /*---------------------------------------------------------------------*/
  6. #include "stc8h.h"
  7. #include "intrins.h"
  8. #define MAIN_Fosc   24000000L
  9. typedef unsigned char u8;
  10. typedef unsigned int  u16;
  11. typedef unsigned long u32;
  12. // 串口1初始化(定时器2,9600)
  13. void UART1_Init(void)
  14. {
  15.     SCON = 0x50;                    // 模式1,允许接收
  16.     T2L  = (u8)(65536 - MAIN_Fosc/4/9600);
  17.     T2H  = (u8)((65536 - MAIN_Fosc/4/9600) >> 8);
  18.     AUXR = 0x14;                    // 定时器2 1T模式并启动
  19.     AUXR |= 0x01;                   // 串口1选择定时器2
  20.     TI = 1;                         // 允许首次发送
  21. }
  22. // 发送一个字符
  23. void UART1_SendChar(u8 dat)
  24. {
  25.     SBUF = dat;
  26.     while(!TI);
  27.     TI = 0;
  28. }
  29. // 发送字符串
  30. void UART1_SendStr(u8 *str)
  31. {
  32.     while(*str) UART1_SendChar(*str++);
  33. }
  34. // 发送一个16位十进制数(无符号)
  35. void UART1_SendNum(u16 num)
  36. {
  37.     u8 buf[6], i = 0;
  38.     if(num == 0) {
  39.         UART1_SendChar('0');
  40.         return;
  41.     }
  42.     while(num) {
  43.         buf[i++] = num % 10 + '0';
  44.         num /= 10;
  45.     }
  46.     while(i) UART1_SendChar(buf[--i]);
  47. }
  48. // 简单的毫秒延时
  49. void delay_ms(u16 ms)
  50. {
  51.     u16 i, j;
  52.     for(i=0; i<ms; i++)
  53.         for(j=0; j<MAIN_Fosc/12000; j++);
  54. }
  55. // ADC初始化(P1.1作为ADC输入)
  56. void ADC_Init(void)
  57. {
  58.     P1M1 |= 0x02;       // P1.1 设置为高阻输入(ADC通道1)
  59.     P1M0 &= ~0x02;
  60.     ADCTIM = 0x3f;      // ADC采样时间最大
  61.     ADCCFG = 0x2f;      // ADC时钟 = fosc/2/16 = 750kHz,右对齐
  62.     ADC_CONTR = 0x80;   // 开启ADC模块
  63.     delay_ms(1);        // 等待ADC电源稳定
  64. }
  65. // 查询方式读取一次ADC结果(12位)
  66. u16 Get_ADC12bitResult(u8 channel)
  67. {
  68.     ADC_RES = 0;
  69.     ADC_RESL = 0;
  70.     ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40 | channel;   // 启动转换
  71.     _nop_(); _nop_(); _nop_(); _nop_();
  72.     while(!(ADC_CONTR & 0x20));     // 等待完成
  73.     ADC_CONTR &= ~0x20;             // 清除标志
  74.     return ((u16)ADC_RES << 8) | ADC_RESL;
  75. }
  76. void main(void)
  77. {
  78.     u16 adc_val;   // 原始ADC值
  79.     P_SW2 |= 0x80;          // 使能扩展寄存器访问
  80.     UART1_Init();
  81.     ADC_Init();
  82.     EA = 1;                 // 开启总中断
  83.     delay_ms(500);
  84.     UART1_SendStr("ADC Test Start\r\n");
  85.     while(1)
  86.     {
  87.         // 读取P1.1上的外部电压ADC值(通道1)
  88.         Get_ADC12bitResult(1);          // 丢弃第一次结果,稳定采样电容
  89.         adc_val = Get_ADC12bitResult(1); // 读取有效值
  90.         // 串口打印原始ADC值
  91.         UART1_SendStr("ADC=");
  92.         UART1_SendNum(adc_val);
  93.         UART1_SendStr("\r\n");
  94.         delay_ms(500);      // 每500ms打印一次
  95.     }
  96. }
复制代码

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-7-5 09:50 , Processed in 0.078131 second(s), 68 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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