benjamin 发表于 2023-4-25 10:40:31

STC8H1K28 读取ADC值总为3ff,无论实际电压是多少

void ADC_init(void)
{
                P1M0 = 0x00;//P1 设置为准双向口,P1.7设置为高阻输入 做AD使用
                P1M1 = 0x80;
          P_SW2 |= 0x80;
    ADCTIM = 0x3f;                              //设置ADC内部时序
    P_SW2 &= 0x7f;
    ADCCFG = 0x2f;                              //设置ADC时钟为系统时钟/2/16 转换结果右对齐,ADC_RES 高2位,ADC_RESL低8位
    ADC_CONTR = 0x80;                           //使能ADC模块
    //EADC = 1;                                 //使能ADC中断
                //ADC_CONTR |= (0x40|7);                        //启动AD转换
}



u16        Get_ADCResult(u8 channel)        //channel = 0~12
{
        u16        adc;
        u8        i;
        ADC_RES = 0;
        ADC_RESL = 0;

        ADC_CONTR = (ADC_CONTR & 0xf0) | ADC_START | channel;
        NOP(30);                        //对ADC_CONTR操作后等待会儿再访问

        for(i=0; i<250; i++)                //超时返回,正常i等于10以内就可以转换完成
        {
                if(ADC_CONTR & ADC_FLAG)
                {
                        ADC_CONTR &= ~ADC_FLAG;
                        adc = ((u16)ADC_RES << 8) | ADC_RESL;
                        return        adc;
                }
        }
        return        4096;        //错误,返回4096,调用的程序判断
}


神农鼎 发表于 2023-4-25 10:54:57






#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);
}


benjamin 发表于 2023-4-25 12:10:27

神农鼎 发表于 2023-4-25 10:54
#include "reg51.h"
#include "intrins.h"



我的初始化参数看着没有区别哦,而且需要串口打出才能发现是否有问题,您这个采集完也看不到

benjamin 发表于 2023-4-25 12:28:53

本帖最后由 benjamin 于 2023-4-25 13:07 编辑

benjamin 发表于 2023-4-25 12:10
我的初始化参数看着没有区别哦,而且需要串口打出才能发现是否有问题,您这个采集完也看不到 ...这个是1.5-1.65之间电压的数值(供电电压5V);小于1.5 为0;大于1.65为3ff,型号为STC8H1K28 TQFP32封装

接收←00 00
接收←00 1F
接收←00 1F
接收←00 7F
接收←00 0F
接收←00 7F
接收←00 7F
接收←00 FF
接收←00 0F
接收←00 0F
接收←01 FF
接收←01 FF
接收←01 FF
接收←01 FF
接收←01 FF
接收←03 FF

神农鼎 发表于 2023-4-25 13:07:51

不要盲人摸象,用仿真器来仿真


【新提醒】用 STC-USB Link1D 仿真STC8系列MCU - 编译器/仿真器/ISP下载/做自己的ISP/ID号加密/程序加密后传输 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

神农鼎 发表于 2023-4-25 13:08:49

https://www.stcaimcu.com/data/attachment/forum/202301/30/170748bl5l157x6y9gqu45.png

benjamin 发表于 2023-4-25 13:09:47

我用串口调试工具来的,之前用过15系列的很少有问题,这个是第一次用

神农鼎 发表于 2023-4-25 13:10:42

盲人摸象,遇到自己软件问题卡几天正常

benjamin 发表于 2023-4-25 13:19:07

不是就上面那几个寄存器吗,而且我用咱们的demo库文件也是一样的现象

神农鼎 发表于 2023-4-25 13:39:12

那芯片错了 ?
页: [1] 2
查看完整版本: STC8H1K28 读取ADC值总为3ff,无论实际电压是多少