link123 发表于 2024-7-12 13:47:09

请教一下,为什么我的ADC_DMA进不了中断 | 已给例程

#include "stc8h.h"#include "eeprom.h"#include "stdio.h"#include "intrins.h"


typedef         unsigned char      u8;typedef         unsigned int      u16;typedef         unsigned long      u32;
/*************      ±¾µØ³£Á¿ÉùÃ÷      **************///1~16,使用的ADC转换通道数量,必须和中启用的ADC通道数量一致#define ADC_CH_NUM          1//ADC转换次数,必须和设置的一致#define ADC_SAMPLES_NUM   8    //每个通道ADC转换数据总字节数=2*转换次数+4#define ADC_DATA_SIZE       (ADC_SAMPLES_NUM*2 + 4)   
//存储ADC DMA转换结果,即ADC DMA的目的地址u8 xdata adc_samples_buff;   //ADC DMA转换完成标志bit DmaFlag;




void Uart1_Init(void);      //4800bps@11.0592MHzvoid sendByte(char dat);void sendString(unsigned char *dat);char putchar(char c);void adc_dma_config(void);void Delay500ms(void);      //@11.0592MHzvoid ADC_Init(void);

void main(){   u8 i,j;   u16 adc_value;      float voltage;   Uart1_Init();   ADC_Init();
   EA = 1;   printf("Hello");
   while(1)   {            if(DmaFlag)         {                      DmaFlag = 0;
                      adc_value=(adc_samples_buff<<8)+adc_samples_buff;                       voltage   = (5*adc_value)/4096;                              printf("voltage: %.2fV\r\n",voltage);   
                     DMA_ADC_CR = 0xC0;                }          Delay500ms();       }
}


void adc_dma_config(void){   P_SW2 = 0x80;   DMA_ADC_STA = 0x00;         //清零ADC DMA状态寄存器   DMA_ADC_CFG = 0x80;         //开启ADC DMA中断   DMA_ADC_RXAH = (u8)((u16)(&adc_samples_buff) >> 8); //ADC转换数据存储地址,即ADC DMA目的地址   DMA_ADC_RXAL = (u8)((u16)(&adc_samples_buff));   DMA_ADC_CFG2 = 0x0A;    //每个通道ADC转换次数:8   DMA_ADC_CHSW0 = 0x01;   //使能ADC通道1   DMA_ADC_CHSW1 = 0x00;      DMA_ADC_CR = 0xC0;      //启动ADC DMA转换}
void ADC_Init(void){      P1M0=0x00;               //设置P10为高阻输入      P1M1=0x01;
         ADCTIM = 0x3F;                  //设置ADC内部时许      ADCCFG = 0x2F;                  //设置ADC时钟为系统时钟,数据右对齐      ADC_CONTR = 0x80;    //使能ADC模块
}
void Uart1_Init(void)      //4800bps@11.0592MHz{      PCON &= 0x7F;                //波特率不倍速      SCON = 0x50;                //8位数据位,可变波特率      AUXR &= 0xBF;                //定时器时钟12T模式      AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器      TMOD &= 0x0F;                      TMOD |= 0x20;                      TL1 = 0xFA;                              TH1 = 0xFA;                              ET1 = 0;                              TR1 = 1;                        }


void sendByte(char dat){      SBUF = dat;      while(!TI);      TI = 0;      }
void sendString(unsigned char *dat){      while(*dat != '\0')      {                sendByte(*dat++);      }}
char putchar(char c){      sendByte(c);      return c;}
void ADC_DMA_Interrupt(void) interrupt 13{      DMA_ADC_STA = 0;      DmaFlag = 1;}

void Delay500ms(void)      //@11.0592MHz{      unsigned char data i, j, k;
      _nop_();      _nop_();      i = 22;      j = 3;      k = 227;      do      {                do                {                        while (--k);                } while (--j);      } while (--i);}

梁工 发表于 2024-7-12 20:01:16

请测试我下面的例子:“16-STC8H8K64U-15路12位ADC转换-DMA-串口1(P3.1)返回结果”。

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





miyuhao 发表于 2024-8-26 19:00:42

你好,梁工。这个程序下载到stc8a8k64d4通用么

乘风飞扬 发表于 2024-8-27 10:37:41

miyuhao 发表于 2024-8-26 19:00
你好,梁工。这个程序下载到stc8a8k64d4通用么

8系列单片机的ADC功能是通用的
页: [1]
查看完整版本: 请教一下,为什么我的ADC_DMA进不了中断 | 已给例程