找回密码
 立即注册
查看: 574|回复: 3

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-07-11 15:57:13

4

主题

16

回帖

84

积分

注册会员

积分
84
发表于 2024-7-12 13:47:09 | 显示全部楼层 |阅读模式
#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_DMA通道使能寄存器(DMA_ADC_CHSWx)]中启用的ADC通道数量一致
#define ADC_CH_NUM          1  
//ADC转换次数,必须和[ADC_DMA配置寄存器2(DMA_ADC_CFG2)]设置的一致
#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_CH_NUM][ADC_DATA_SIZE];   
//ADC DMA转换完成标志
bit DmaFlag;





void Uart1_Init(void);        //4800bps@11.0592MHz
void sendByte(char dat);
void sendString(unsigned char *dat);
char putchar(char c);
void adc_dma_config(void);  
void Delay500ms(void);        //@11.0592MHz
void 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[0][16]<<8)+adc_samples_buff[0][17];
                      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);
}

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 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.

STC8H系列-ADC相关程序.rar (918.47 KB, 下载次数: 124)



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-08-26 20:01:11

0

主题

3

回帖

32

积分

新手上路

积分
32
发表于 2024-8-26 19:00:42 来自手机 | 显示全部楼层
你好,梁工。这个程序下载到stc8a8k64d4通用么
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-8-27 10:37:41 | 显示全部楼层
miyu*** 发表于 2024-8-26 19:00
你好,梁工。这个程序下载到stc8a8k64d4通用么

8系列单片机的ADC功能是通用的
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 15:47 , Processed in 0.193075 second(s), 73 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表