?? ad.#3
字號:
#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轉(zhuǎn)換結(jié)束標志
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完成了一次數(shù)據(jù)轉(zhuǎn)換
//AD0INT = 0; // 清除ADC0轉(zhuǎn)換結(jié)束標志
//samples[i] = ADC0H;
//samples[i]=(samples[i]<<8)|ADC0L; // 讀和存儲ADC0值
// channel++;
// if(channel==totalChannel)
// {
// channel=0;
// }
// AMX0SL = channel;
//}
// EIE2 &= ~0x02; // 禁止ADC0中斷
// ADC0_DONE = 1; // 設(shè)置DONE標志
// 上傳采樣值到UART0//////?????????
// LED = 0; // 上傳其間關(guān)LED 滅///////?????????
//AD0EN = 0; // AD采集完NUM_SAMPLES個數(shù)據(jù)后,關(guān)閉ADC0
//EA=0;
//////如何停止定時器3的工作????????
i=0;
SFRPAGE=0x0;
while(1)
{
//AD0INT = 0; // 清除ADC0轉(zhuǎn)換結(jié)束標志
while (AD0INT == 0);
AD0INT == 0;
samples[i] = ADC0; // 讀和存儲ADC0值
i++;
if(i ==numSample)
break;
}
SFRPAGE=0x0;
EIE2 &= ~0x02; // 禁止ADC0中斷
AD0EN=0;
// ADC0_DONE = 1; // 設(shè)置DONE標志
SFRPAGE=0x01;
TMR3CN &= ~0x04; // 停止定時器3
EA=0;
}
//-----------------------------------------------------------------------------
// 定時器3初始化
//-----------------------------------------------------------------------------
//
// 配置定時器3 自動重裝間隔由 <counts> 決定(不產(chǎn)生中斷) 使用系統(tǒng)時鐘為時基
//
void Timer3_Init (int counts)
{
SFRPAGE=0x01;
//TMR3CN = 0x02; // 停止定時器3; 清除TF3;
// 使用系統(tǒng)時鐘作為時基
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溢出作為轉(zhuǎn)換開始信號,轉(zhuǎn)換結(jié)束產(chǎn)生一個中斷,
// 使用左對齊輸出模式
// 使能ADC轉(zhuǎn)換結(jié)束中斷中斷使能ADC0 但禁止ADC0轉(zhuǎn)換結(jié)束中斷
//
void ADC0_Init (float gain)
{
// ADC0CN = 0x45; // 禁止ADC0;低功耗跟蹤方式;
//當定時器3溢出啟動ADC0轉(zhuǎn)換;
//ADC0數(shù)據(jù)左對齊
SFRPAGE=0x0;
ADC0CN = 0x04; // 禁止ADC0;低功耗跟蹤方式;
//當定時器3溢出啟動ADC0轉(zhuǎn)換;
//ADC0數(shù)據(jù)右對齊
REF0CN = 0x07; // 使能溫度傳感器, 片內(nèi) VREF,和 VREF 輸出緩沖器
//REF0CN = 0x03; // 不使能溫度傳感器,////???????????
AMX0CF = 0x00; //AIN0.0和AIN0.1為單端輸入
//AMX0SL = 0x00; // 選擇AIN0.0作為ADC多路轉(zhuǎn)換輸入!
AMX0SL = 0x01; // 選擇AIN0.1作為ADC多路轉(zhuǎn)換輸入!
//ADC0CF = (SYSCLK_AD/2500000/2-1) << 3; // ADC轉(zhuǎn)換時鐘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;
}
ADC0CF=0x00;
EIE2 |= 0x02; // 允許ADC0中斷
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -