- 打卡等级:初来乍到
- 打卡总天数:1
- 最近打卡:2025-06-02 08:27:01
已绑定手机
新手上路
- 积分
- 9
|
//多文件编程,这里是ADC_DMA.c文件
#include "STC8A8K64D4.H"
#include "ADC.h"
#include <intrins.h>
#include "oled.h"
#include "delay.h"
#include "adc_dma.h"
unsigned char xdata adc_samples_buff[50] = {0};
void DMA_ADC_Isr() interrupt 48
{
if(DMA_ADC_STA & 0x01)
{
DMA_ADC_STA = 0x00;//清零中断标志位
DMA_ADC_RXAH = ((unsigned char)&adc_samples_buff); //ADC转换数据存储地址,即ADC DMA的目的地址
DMA_ADC_RXAL = ((unsigned char)&adc_samples_buff);
adc_dma_complete = 1;//转换完成
DMA_ADC_CR = 0xc0; //启动ADC_DMA转换
}
}
void adc_dma_init()
{
DMA_ADC_STA &= 0x00; //清零中断标志位
DMA_ADC_CFG = 0x80; // 开启DMA完成中断 ADC_DMA中断优先级最高
DMA_ADC_RXAH = ((unsigned char)&adc_samples_buff); //ADC转换数据存储地址,即ADC DMA的目的地址
DMA_ADC_RXAL = ((unsigned char)&adc_samples_buff);
DMAFinished = 1; //初始化完成标志位
DMA_ADC_CFG2 = 0x00; // 单次转换
DMA_ADC_CHSW0 = 0x00; // 关闭高通道
DMA_ADC_CHSW1 = 0xff; // 开启低通道
DMA_ADC_CR = 0xC0; //允许 ADC_DMA 功能 开始 ADC_DMA 操作
}
void adc_dma_voltage()
{
float xdata voltage; //存放ADC采样值计算后的电压值
unsigned char i;
if(adc_dma_complete)
{
adc_dma_complete = 0;
for (i=0;i<8;i++)
{
voltage = ((adc_samples_buff[6*i]*256)+adc_samples_buff[7*i])*15/4096;
(voltage>9) ? (Pin_EC = 1) : (Pin_EC = 0);
//OLED_ShowNum(10,7,7,1,8);
OledShowFloatWithoutPole2(i*16,7,voltage,2);
}
}
}
//这里是ADC_DMA.h文件
#ifndef __ADC_DMA_H_
#define __ADC_DMA_H_
void adc_dma_init();
void adc_dma_voltage();
extern bit adc_dma_complete;
extern unsigned char xdata adc_samples_buff[50];
extern bit DMAFinished;
extern unsigned int xdata Pin_EC[8];
#endif
|
|