?? adc2.c
字號:
/////////ADC2調試程序,p1.2口單端輸入/////////////////
/////////T2定時采樣,ADC2監控中斷/////////////////////
/////////ADC2.c////////////////////////////////////////
#include "lcd.h"
#define ADC0START temppage=SFRPAGE;SFRPAGE=0x00;AD0BUSY=1;SFRPAGE=temppage
#define ADJRATEDIF 260L
#define ADJRATESE 130L
sfr16 RCAP2=0xca;
sfr16 RCAP3=0xca;
sfr16 RCAP4=0xca;
sfr16 TMR4=0xcc;
sfr16 TMR3=0xcc;
sfr16 TMR2=0xcc;
sfr16 PCA0CP0=0xfb;
sfr16 PCA0CP1=0xfd;
sfr16 PCA0CP2=0xe9;
sfr16 PCA0CP3=0xeb;
sfr16 PCA0CP4=0xed;
sfr16 PCA0CP5=0xe1;
sfr16 ADC0VAL=0xbe;
sfr16 ADC0GT=0xc4;
sfr16 ADC0LT=0xc6;
uchar temppage;
bit isnewdata;
bit adc_is_capture;
uchar kk;
long realvol;
void adc2_mux(uchar type,uchar source);
void adc2_source(uchar source);
void anologPort_ini(uchar port);
void adc2_ini();
void config();
void t2_ini();
void t2_baud(uint t2reload);
void t2_ini(){
SFRPAGE = 0x00;
TMR2CF = 0x08; // T2時鐘為系統時鐘
TMR2CN = 0x04; // 開啟T2定時器
}
void t2_baud(uint t2reload){
SFRPAGE = 0x00;
RCAP2=~t2reload+1;
TMR2=RCAP2;
}
void adc2_mux(uchar type,uchar source){//type 配置測量方式為差動還是單端輸入
//source 為ADC2通道選擇(共有8個通道)
SFRPAGE=0x02;
AMX2CF=type;
AMX2SL=source;
}
void adc2_source(uchar source){//ADC2通道選擇
SFRPAGE=0x02;
AMX2SL=source;
}
void anologPort_ini(uchar port){//配置p1口模擬輸入管腳
SFRPAGE=0x0f;
P1MDIN&=~port;//將相應管腳配置成模擬輸入口
}
void adc2_ini(){
SFRPAGE=0x02;
ADC2CF=0x09;//ADC2時鐘為系統時鐘2分頻,PGA增益為1
ADC2CN=0x86;//AD2TM=0,ADC2為連續跟蹤模式由T2溢出率啟動ADC2
SFRPAGE=0x00;
REF0CN|=0x0b;//采用AV+作為參考電壓
/*BIASE=1,偏移產生器工作,注意若AD啟動此位必須置1,不管是否采用內部參考電平
REFBE=1,內部參考電平工作,電路部分須將VREF參考輸出(C8051F40的第12管腳)與
VREF2(C8051F040的17管腳)相連,并最好并聯一個4.7uF和0.1uF的旁路電容以電平濾波*/
anologPort_ini(0x0f);//將P1.0-P1.3配置到AMUX2 0-3通道上,pdf文件上p2是錯誤的。
adc2_mux(0x01,2);
/* 0,1通道為差動輸入模式,其他為單端輸入模式,選擇2通道單端輸入進入AD轉化*/
EIE2|= 0x08; //開ADC2中斷
t2_ini();
t2_baud(6000);//設置6000個T2時鐘為采樣周期
SFRPAGE=0x00;
TR2=1;
}
void adc2_capture(uchar greater,uchar less){
SFRPAGE=0x02;
ADC2GT=greater;
ADC2LT=less;
AD2WINT=0;
EIE2|=0x10;
}
void config (void) {
//看門狗禁止
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
SFRPAGE = 0x0F;
XBR0 = 0x00;
XBR1 = 0x00;
XBR2 = 0x40; //交叉開關使能,使得P0-P3口能輸出
XBR3 = 0x00;
SFRPAGE = 0x0F;
P0MDOUT = 0x00; //端口配置,P0-P3,P6-P7口為開漏輸出
P1MDOUT = 0x00;
P2MDOUT = 0x00;
P3MDOUT = 0x00;
P4MDOUT = 0x00; //P4口為開漏,若為推挽式則無法讀取LCD數據
P5MDOUT = 0x07;
P6MDOUT = 0x00;
P7MDOUT = 0x00;
P1MDIN = 0xFF; //所有端口為數字輸入,沒有模擬輸入端口
P2MDIN = 0xFF;
P3MDIN = 0xFF;
SFRPAGE = 0x0F;
CLKSEL = 0x00;
OSCXCN = 0x00;
OSCICN = 0x84;
//采用內部晶振,為24.5MHZ8分頻
}
void main(){
uchar i;
config();
dispini();
adc2_ini();
i=0;
kk=0;
isnewdata=0;
adc_is_capture=0;
adc2_capture(64,128);//當電壓在0.83-1.65之內發生ADC2中斷
EA=1;
while(1){
if(isnewdata){
i++;
if(i>40){
i=0;
showline("AIN1.2 VAL",0);
showf(realvol,4,1);
}
isnewdata=0;
}
if(adc_is_capture){ //ADC2監控條件測試
adc_is_capture=0;
showline("ADC2 CAPTURE",0);
showf(realvol,4,1);
delay1ms(100);
EIE2|=0x10;//開ADC2監控中斷
}
}
}
void ADC2_WIN_ISR() interrupt 17{//ADC2監控中斷程序
//只要ADC轉化值在此監視范圍內,則一直處于此中斷
adc_is_capture=1;
SFRPAGE=0x02;
AD2WINT=0;
EIE2&=~0x10;//關ADC2監控中斷
/*
注意c8051f040.h頭文件定義錯誤
原定義為:
sbit AD2WINT = ADC2CN ^ 3;
sbit AD2CM2 = ADC2CN ^ 2;
sbit AD2CM1 = ADC2CN ^ 1;
sbit AD2CM0 = ADC2CN ^ 0;
改為:
sbit AD2WINT = ADC2CN ^ 0;
sbit AD2CM2 = ADC2CN ^ 3;
sbit AD2CM1 = ADC2CN ^ 2;
sbit AD2CM0 = ADC2CN ^ 1;
*/
}
void ADC2_ISR() interrupt 18{//ADC2轉化完畢中斷程序
AD2INT=0;
kk=ADC2;
realvol=(long)kk;
realvol*=ADJRATESE;//realvol為真實電壓值的1.0e4倍
isnewdata=1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -