PB12 发表于 2025-6-17 09:53:35

AI8H1K17 ADC检测

AI8H1K17P1.0(ADC0)采用官方例程检测1.3V电压实际输出ADC一直为0

/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{   P1M0 = 0x00;                              //设置P1.0为ADC口
    P1M1 = 0x01;
    P_SW2 |= 0x80;
    ADCTIM = 0x3f;                              //设置ADC内部时序
    P_SW2 &= 0x7f;
    ADCCFG = 0x2f;                              //设置ADC时钟为系统时钟/2/16
    ADC_CONTR = 0x80;                           //使能ADC模块
}
/*----------------------------
读取ADC结果
----------------------------*/
uint16 GetADCResult()
{         uint16 ADC_value;
                ADC_CONTR |= 0x40;                      //启动AD转换
                _nop_();
                _nop_();
                while (!(ADC_CONTR & 0x20));            //查询ADC完成标志
                ADC_CONTR &= ~0x20;                     //清完成标志
      ADC_value = ADC_RES;
      ADC_value= (ADC_value<<2)+ (ADC_RESL&0x03);
      return ADC_value;               //返回ADC结果
}




神农鼎 发表于 2025-6-17 10:22:20












#include "reg51.h"
#include "intrins.h"

sfr   ADC_CONTR   =   0xbc;
sfr   ADC_RES   =   0xbd;
sfr   ADC_RESL    =   0xbe;
sfr   ADCCFG      =   0xde;

sfr   P_SW2   =   0xba;
#define ADCTIM(*(unsigned char volatile xdata *)0xfea8)

sbit    EADC    =   IE^5;

sfr   P0M1    =   0x93;
sfr   P0M0    =   0x94;
sfr   P1M1    =   0x91;
sfr   P1M0    =   0x92;
sfr   P2M1    =   0x95;
sfr   P2M0    =   0x96;
sfr   P3M1    =   0xb1;
sfr   P3M0    =   0xb2;
sfr   P4M1    =   0xb3;
sfr   P4M0    =   0xb4;
sfr   P5M1    =   0xc9;
sfr   P5M0    =   0xca;

void ADC_Isr() interrupt 5
{
    ADC_CONTR &= ~0x20;                         //清中断标志
    P2 = ADC_RES;                               //读取ADC结果
    ADC_CONTR |= 0x40;                        //继续AD转换
}

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

    P1M0 = 0x00;                              //设置P1.0为ADC口
    P1M1 = 0x01;
    P_SW2 |= 0x80;
    ADCTIM = 0x3f;                              //设置ADC内部时序
    P_SW2 &= 0x7f;
    ADCCFG = 0x0f;                              //设置ADC时钟为系统时钟/2/16
    ADC_CONTR = 0x80;                           //使能ADC模块
    EADC = 1;                                 //使能ADC中断
    EA = 1;
    ADC_CONTR |= 0x40;                        //启动AD转换

    while (1);
}


神农鼎 发表于 2025-6-17 10:27:07





梁工 发表于 2025-6-17 10:54:29

用户请先别修改程序, 直接下载"100-STC8系列-ADC转换-串口1(P3.1)返回结果"里的"ADC.hex"测试. 下载时选择主频11.0592MHZ. 测试时, 电脑的串口助手设置115200,8,n,1.
本程序演示ADC查询采样,通过串口1(P3.1)发送给上位机,波特率115200,8,n,1.

本程序适用于10位或12位ADC。

下面为当输入为AVREF*1/4的电压时的测试结果截图,你也贴出你的测试结果截图看看。







PB12 发表于 2025-6-19 10:53:31

这个芯片绝对的颠覆了我想像,既然用VCC做参考电压是要外接到vref的。

梁工 发表于 2025-6-19 13:30:15

PB12 发表于 2025-6-19 10:53
这个芯片绝对的颠覆了我想像,既然用VCC做参考电压是要外接到vref的。

这个芯片哪个功能颠覆了你的想像?这么厉害。
ADC参考电压是AVREF,这是固定的,不能改变。
页: [1]
查看完整版本: AI8H1K17 ADC检测