📄 ad.c
字号:
#include <main.H>
#include <intrins.h>
#include <C8051F020.H>
//*******************************************************************//
// NOTE:The max value of frequency is *//
// gain:1,2,4,8,16,0.5; *//
//*******************************************************************//
void SampFunc(long SYSCLK, int totalChannel , long sampleRate , float gain , volatile unsigned int *samples , long numSample)
{
//unsigned int *samples2;
static int channel=0;
volatile int i=0 ;
for(i=0;i<numSample;i++)
samples[i]=0;
// int j;
SFRPAGE=0x0;
AD0INT = 0; // 清除ADC0转换结束标志
EIE2 &= ~0x02; // 禁止ADC0中断
Timer3_Init(SYSCLK/sampleRate); //初始化定时器3以ADC0采样速率溢出
ADC0_Init(gain); //初始化ADC
SFRPAGE=0x0;
AD0EN=1; //允许ADC
//EA=1; //允许全局中断
SFRPAGE=0x01;
TMR3CN |= 0x04; // 启动定时器3
//for(i=0 ; i<numSample ; i++)
//{
//SFRPAGE=0x01;
//TMR3CN |= 0x04; // 启动定时器3
//SFRPAGE=0x00;
//while (AD0INT == 0); //ADC完成了一次数据转换
//AD0INT = 0; // 清除ADC0转换结束标志
//samples[i] = ADC0H;
//samples[i]=(samples[i]<<8)|ADC0L; // 读和存储ADC0值
// channel++;
// if(channel==totalChannel)
// {
// channel=0;
// }
// AMX0SL = channel;
//}
// EIE2 &= ~0x02; // 禁止ADC0中断
// ADC0_DONE = 1; // 设置DONE标志
// 上传采样值到UART0//////?????????
// LED = 0; // 上传其间关LED 灭///////?????????
//AD0EN = 0; // AD采集完NUM_SAMPLES个数据后,关闭ADC0
//EA=0;
//////如何停止定时器3的工作????????
i=0;
SFRPAGE=0x0;
while(1)
{
//AD0INT = 0; // 清除ADC0转换结束标志
while (AD0INT == 0);
AD0INT == 0;
samples[i] = ADC0; // 读和存储ADC0值
i++;
if(i ==numSample)
break;
}
SFRPAGE=0x0;
EIE2 &= ~0x02; // 禁止ADC0中断
AD0EN=0;
// ADC0_DONE = 1; // 设置DONE标志
SFRPAGE=0x01;
TMR3CN &= ~0x04; // 停止定时器3
EA=0;
}
//-----------------------------------------------------------------------------
// 定时器3初始化
//-----------------------------------------------------------------------------
//
// 配置定时器3 自动重装间隔由 <counts> 决定(不产生中断) 使用系统时钟为时基
//
void Timer3_Init (int counts)
{
SFRPAGE=0x01;
//TMR3CN = 0x02; // 停止定时器3; 清除TF3;
// 使用系统时钟作为时基
TMR3CF =0x08;
TMR3CN =0x00;
//TMR3RL = -counts; // 初始化重装值
TMR3L = 0xFF; // 立即开始重装
TMR3H = 0xFF;
RCAP3 = -counts; // 初始化重装值
//RCAP3 = 0x0;
EIE2 &= ~0x01; // 禁止定时器3中断
//EIE2 &= ~0x02;
//TMR3CN |= 0x04; // 启动定时器3
}
//-----------------------------------------------------------------------------
// ADC0初始化
//-----------------------------------------------------------------------------
//
// 配置ADC0 使用定时器3溢出作为转换开始信号,转换结束产生一个中断,
// 使用左对齐输出模式
// 使能ADC转换结束中断中断使能ADC0 但禁止ADC0转换结束中断
//
void ADC0_Init (float gain)
{
// ADC0CN = 0x45; // 禁止ADC0;低功耗跟踪方式;
//当定时器3溢出启动ADC0转换;
//ADC0数据左对齐
SFRPAGE=0x0;
ADC0CN = 0x04; // 禁止ADC0;低功耗跟踪方式;
//当定时器3溢出启动ADC0转换;
//ADC0数据右对齐
REF0CN = 0x07; // 使能温度传感器, 片内 VREF,和 VREF 输出缓冲器
//REF0CN = 0x03; // 不使能温度传感器,////???????????
AMX0CF = 0x00; //AIN0.0和AIN0.1为单端输入
//AMX0SL = 0x00; // 选择AIN0.0作为ADC多路转换输入!
AMX0SL = 0x01; // 选择AIN0.1作为ADC多路转换输入!
ADC0CF = (SYSCLK_AD/2500000/2-1) << 3; // ADC转换时钟2.5MHz
if(gain==1) //gain在哪定义的????????????????????????
{
ADC0CF&=~0x07; // PGA增益 = 1
}else if(gain==2)
{
ADC0CF&=~0x07; // PGA增益 = 2
ADC0CF|=0x01;
}else if(gain==4)
{
ADC0CF&=~0x07; // PGA增益 = 4
ADC0CF|=0x02;
}else if(gain==8)
{
ADC0CF&=~0x07; // PGA增益 = 8
ADC0CF|=0x03;
}else if(gain==16)
{
ADC0CF&=~0x07; // PGA增益 = 16
ADC0CF|=0x04;
}else if(gain==0.5)
{
ADC0CF&=~0x07; // PGA增益 = 0.5
ADC0CF|=0x06;
}
EIE2 |= 0x02; // 允许ADC0中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -