8G1K08A ADC中断进不去是什么原因 | 已解决
#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;
unsigned int PW;
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;
P5M0 = 0x00; //设置P5.5为ADC口
P5M1 = 0x01;
P_SW2 |= 0x80;
ADCTIM = 0x3f; //设置ADC内部时序
P_SW2 &= 0x7f;
ADCCFG = 0x0f; //设置ADC时钟为系统时钟/2/16
ADC_CONTR = 0x85; //使能ADC模块P5.5为ADC口
EADC = 1; //使能ADC中断
EA = 1;
ADC_CONTR |= 0x40; //启动AD转换
while(1);
}
void ADC_Isr() interrupt 5
{
ADC_CONTR &= ~0x20; //清中断标志
//P2 = ADC_RES; //读取ADC结果
ADC_CONTR |= 0x40; //继续AD转换
PW++;
if(PW>15000)
PW=0;
}
ADC中断void ADC_Isr() interrupt 5 没有进行中断是什么原因?请大佬指点!
针对STC8G1K08A ADC中断无法进入的问题,可能的原因如下:<br><br>1. ADC配置错误:请检查ADCCONTR和ADCCFG寄存器配置是否正确。确保ADC使能(ADCCONTR.7 = 1)和中断使能(ADCCONTR.5 = 1)已正确设置。<br><br>2. 中断优先级:检查中断优先级设置,确保ADC中断未被更高优先级的中断屏蔽。<br><br>3. 定时器配置:ADCTIM寄存器用于配置ADC采样时间,确保其值设置合理,避免采样时间过短或过长导致中断无法触发。<br><br>4. 中断向量表:确认中断服务程序(ISR)已正确映射到ADC中断向量(通常为ADCISR)。<br><br>5. 硬件连接:检查ADC输入引脚是否连接正常,确保信号源稳定。<br><br>6. 堆栈溢出:检查堆栈是否溢出,导致中断无法正常响应。<br><br>建议逐步排查以上问题,确保配置正确无误。若问题仍未解决,可提供更详细的代码和硬件连接信息以便进一步分析。<br><br>[本文内容由国芯人工智能辅助生成,仅供参考] 国芯人工智能 发表于 2025-3-21 09:48
针对STC8G1K08A ADC中断无法进入的问题,可能的原因如下:1. ADC配置错误:请检查ADCCONTR和ADCCFG寄存器配 ...
我用的例程,设置都检查过了,发现不了什么问题! 国芯人工智能 发表于 2025-3-21 09:48
针对STC8G1K08A ADC中断无法进入的问题,可能的原因如下:1. ADC配置错误:请检查ADCCONTR和ADCCFG寄存器配 ...
能发一个 STC8G1K08AADC中断详细例程!全部设置好的! 手册里设置的是P1.0 为 ADC 口,P5.5你设置的有问题
ercircle 发表于 2025-3-21 10:34
手册里设置的是P1.0 为 ADC 口,P5.5你设置的有问题
更改过还是没有用!估计那里还有问题! WZQ4115 发表于 2025-3-21 12:18
更改过还是没有用!估计那里还有问题!
拿擎天柱板子测了下可以进中断,你是如何观察没进中断的呢?另外用的哪个板子,自己的板子电路图也可以贴一下看看
#include "Ai8051U.H"
#include "intrins.h"
unsigned char Led = 0x01;
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;
P2 = ~Led;
P5M0 = 0x00; //设置P5.5为ADC口
P5M1 = 0x01;
P_SW2 |= 0x80;
ADCTIM = 0x3f; //设置ADC内部时序
P_SW2 &= 0x7f;
ADCCFG = 0x0f; //设置ADC时钟为系统时钟/2/16
ADC_CONTR = 0x85; //使能ADC模块P5.5为ADC口
EADC = 1; //使能ADC中断
EA = 1;
ADC_CONTR |= 0x40; //启动AD转换
while(1);
}
void ADC_Isr() interrupt 5
{
//清中断标志
ADC_CONTR &= ~0x20;
//读取 ADC 结果
//P2 = ADC_RES;
Led =Led<< 2;
if(Led==0){
Led=0x01;
}
P2=~Led;
//继续 AD 转换
ADC_CONTR |= 0x40; //继续AD转换
}
谢谢各位大佬!问题解决了!就是把Keil 重新安装了几次 !反正可以进ADC中断了! ercircle 发表于 2025-3-21 14:01
拿擎天柱板子测了下可以进中断,你是如何观察没进中断的呢?另外用的哪个板子,自己的板子电路图也可以贴 ...
谢谢!有了你的测试OK的程序!只有其它原因了!重新安装Keil 终于可以进ADC中断了!
页:
[1]