好奇异 发表于 2023-1-7 20:41:35

ADC不进入中断(STC8G2K64S4)

#include "ADC.h"
int ADC_DATA;

/*----- ADC初始化函数 ----*/
void ADC_Init()
{
    P1M0 = 0x00;            //ADC IO口模式配置(高阻)
    P1M1 = 0x04;
    P_SW2 |= 0x80;         //打开XFR特殊外部设备寄存器
    ADCTIM = 0x3f;         //设置ADC内部时序
    P_SW2 &= 0x7f;      //关闭XFR特殊外部设备寄存器
    ADCCFG = 0x2f;            //设置ADC时钟为系统时钟/2/16,以及数据对齐方式(右对齐)
    ADC_CONTR = 0x82;         //使能ADC模块设置ADC输入IO----P1.2
    EADC = 1;               //使能ADC中断
    ADC_CONTR |= 0x40;      //启动AD转换
}

/*----- ADC数据处理及返回值函数 ----*/
int ADC_read()
{
unsigned char i = 0;
       int ADC_Res;
        ADC_Init();
        ADC_Res = 0;                   //全局变量函数返回值保留不清零加上次值,故此循环前清零。
        for(i=0; i<8;i++)
        {
                ADC_Res += ADC_DATA;                //循环读取8次数据进行累加,
        }
        ADC_Res >>= 3;            //右移三位 2^3=8,等价与÷8
        return ADC_Res;             //返回数值
}

/*----- ADC中断 ----*/
void ADC_Isr() interrupt 5
{
    ADC_CONTR &= ~0x20;                        //清中断标志
    ADC_DATA = (ADC_RES << 8) | ADC_RESL;           //读取ADC结果,针对于右对齐
    ADC_CONTR |= 0x40;                         //继续AD转换
}


直接在return ADC_Res; 上一步对(ADC_Res = 0xf0)这里写一个固定的参数可以正常显示,但是如果在中断中给ADC_DATA直接赋值(ADC_DATA =0XF0)没有一点用
请问一下是哪里有问题呢?

好奇异 发表于 2023-1-7 21:02:20

好像找到问题了(我在主函数将返回数据处理后,直接关闭了EADC中断),我将ADC中断开启和关闭放置在int ADC_read()函数中就可以了,不知道为什么。

神农鼎 发表于 2023-1-7 22:43:21

还是用 一箭双雕之USB转双串口,或 STC-USB Link1D 来仿真效率高

使用STC-USB Link1D的CDC串口仿真8位单片机-深圳国芯人工智能有限公司 (stcai.com)

140711 发表于 2023-4-24 21:40:07

楼主,这个中断程序STC32也能使用吗
页: [1]
查看完整版本: ADC不进入中断(STC8G2K64S4)