?? single.c
字號(hào):
//////////單端輸入,定時(shí)啟動(dòng),由T2定時(shí),選擇AIN0.3為ADC0轉(zhuǎn)化通道////////////////
//////single.c///////////////////////////////////
#include "lcd.h"//筆者所寫的LCD顯示頭文件,具體見(jiàn)LCD章節(jié)
/*若讀者沒(méi)有條件使用"lcd.h"的各顯示和鍵盤函數(shù),則可在lcd.h文件中如下定義:
#include "c8051f040.h"
void dispini();
void showf();
*/
//則該調(diào)試文件能編譯通過(guò),用戶也可調(diào)試,只是要通過(guò)設(shè)斷點(diǎn)來(lái)觀察數(shù)據(jù)
#define ADC0START temppage=SFRPAGE;SFRPAGE=0x00;AD0BUSY=1;SFRPAGE=temppage
#define REAL_RATE 488L
#define ADJRATEDIF 237L
#define ADJRATESE 118L
/*
REAL_RATE為物理量轉(zhuǎn)化系數(shù),由具體對(duì)象而定
ADJRATEDIF為差動(dòng)模式下,增益為0.5時(shí)ADC0轉(zhuǎn)化值與真實(shí)電壓的轉(zhuǎn)換系數(shù)
ADJRATESE為單端輸入模式下,增益為0.5時(shí)ADC0轉(zhuǎn)化值與真實(shí)電壓的轉(zhuǎn)換系數(shù)
*/
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;//將ADC0H-ADC0L通過(guò)sfr16實(shí)現(xiàn)
sfr16 ADC0GT=0xc4;
sfr16 ADC0LT=0xc6;
uchar temppage;
bit isnewdata;
int kk;
long target_val;//工程量轉(zhuǎn)化值
long realvol;//真實(shí)測(cè)量電壓值
float temp;
void adc0_mux(uchar type,uchar source);
void adc0_source(uchar source);
void p3anolog_ini(uchar port);
void HVDA_ini(uchar gaind);
void adc0_ini();
void config();
void t2_ini();
void t2_baud(uint t2reload);
void t2_ini(){
SFRPAGE = 0x00;
TMR2CF = 0x08; // T2時(shí)鐘為系統(tǒng)時(shí)鐘,計(jì)數(shù)方向?yàn)樵鲋涤?jì)數(shù)
TMR2CN = 0x04; // T2為16bit定時(shí)器模式,并啟動(dòng)定時(shí)器運(yùn)行
}
void t2_baud(uint t2reload){//每隔t2reload個(gè)T2時(shí)鐘,產(chǎn)生一次定時(shí)溢出
SFRPAGE = 0x00;
RCAP2=~t2reload+1;//相當(dāng)于65536-t2reload
TMR2=RCAP2;
}
void adc0_mux(uchar type,uchar source){//type 配置測(cè)量方式為差動(dòng)還是單端輸入
//source 為ADC0通道選擇(共有9個(gè)通道)
SFRPAGE=0x00;
AMX0CF=type;
AMX0SL=source;
}
void adc0_source(uchar source){//ADC0通道選擇,為adc0_mux()的簡(jiǎn)化函數(shù)
SFRPAGE=0x00;
AMX0SL=source;
}
void p3anolog_ini(uchar port){//配置p3口模擬輸入管腳
SFRPAGE=0x00;
AMX0PRT=port;
SFRPAGE=0x0f;
P3MDIN&=~port;//將相應(yīng)管腳配置成模擬輸入口
}
void HVDA_ini(uchar gaind){
/*高壓差動(dòng)放大器配置,調(diào)的只是第二級(jí)的增益,整體增益還需再乘以0.05;*/
//HVDA禁止時(shí),HCAP+上檢測(cè)到的是HVAIN+的電壓
SFRPAGE=0x00;
HVA0CN=gaind;
}
void adc0_ini(){
SFRPAGE=0x00;
ADC0CF=0x0f;//ADC0時(shí)鐘為系統(tǒng)時(shí)鐘2分頻,PGA增益為0.5
ADC0CN=0x8c;//AD0TM=0,ADC0為連續(xù)跟蹤模式,由T2溢出率啟動(dòng)ADC0
//AD0LJST=0,數(shù)據(jù)存儲(chǔ)格式右對(duì)齊,即ADC0H存放12bit高四位
REF0CN&=0x0f;//AD0VRS=0,ADC0參考電壓為VREFA
REF0CN|=0x07;//TEMPE=1,內(nèi)部溫度傳感器工作
//BIASE=1,偏移產(chǎn)生器工作
/*REFBE=1,內(nèi)部參考電平工作,電路部分須將VREF參考輸出(C8051F40的第12管腳)與 VREF0(C8051F040的16管腳相連,并最好并聯(lián)一個(gè)4.7uF和0.1uF的旁路電容以電平濾波*/
adc0_mux(0x08,3);//PORT3IC=1,ADC0 6、7通道為差動(dòng)模式
//HVDA2C=0,4、5通道為單端模式
//AIN0.0-AIN0.3均為單端模式
//選擇AIN0.3為ADC0轉(zhuǎn)化通道
EIE2 |= 0x02; //開(kāi)ADC0中斷
t2_ini();
t2_baud(2000);//每隔2000個(gè)T2時(shí)鐘產(chǎn)生一次ADC0采樣
SFRPAGE=0x00;
TR2=1;
}
void config (void) {
//看門狗禁止
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
SFRPAGE = 0x0F;
XBR0 = 0x00;
XBR1 = 0x00;
XBR2 = 0x40; //交叉開(kāi)關(guān)使能,使得P0-P3口能輸出
XBR3 = 0x00;
SFRPAGE = 0x0F;
P0MDOUT = 0x00; //端口配置,P0-P3,P6-P7口為開(kāi)漏輸出
P1MDOUT = 0x00;
P2MDOUT = 0x00;
P3MDOUT = 0x00;
P4MDOUT = 0x00; //P4口為開(kāi)漏,也可推挽
P5MDOUT = 0x07;
P6MDOUT = 0x00;
P7MDOUT = 0x00;
P1MDIN = 0xFF; //所有端口為數(shù)字輸入,沒(méi)有模擬輸入端口
P2MDIN = 0xFF;
P3MDIN = 0xFF;
SFRPAGE = 0x0F;
CLKSEL = 0x00;
OSCXCN = 0x00;
OSCICN = 0x84;
//采用內(nèi)部晶振,為24.5MHZ8分頻
}
void main(){
uchar i;
config();
dispini();//LCD初始化,具體見(jiàn)LCD章節(jié)部分
adc0_ini();//ADC0初始化
EA=1;
i=0;
realvol=0;
while(1){
if(isnewdata){
i++;
if(i>40){//每采樣40次,顯示刷新一次
i=0;//若讀者沒(méi)有條件使用lcd.h,則可在此設(shè)斷點(diǎn)查看realvol和target_val的值
showf(realvol,5,0);//第一行顯示真實(shí)電壓值
showf(target_val,6,1);//第二行顯示物理量值
}
isnewdata=0;
}
}
}
void ADC0_ISR() interrupt 15{
SFRPAGE=0x00;
AD0INT=0;
kk=ADC0VAL;
realvol=(long)kk*ADJRATESE;
/*
ADC0轉(zhuǎn)化值乘以單端電平系數(shù),其結(jié)果為電平真實(shí)值乘以100000
例如ADC0VAL=1024時(shí),realvol=1024*118=120832,即表示真實(shí)電壓為1.20832v
*/
target_val=(long)kk*REAL_RATE;
/*
ADC0轉(zhuǎn)化值乘以物理量轉(zhuǎn)化系數(shù),來(lái)表示物理量值
例如某速度傳感器輸出為0-2.43V,其量程為0-1m/s,
則target_val為物理量值乘以1000000
例如ADC0VAL=1024時(shí),target_val=1024*488=499712,即表示真實(shí)物理量為0.499712m/s
這里存在計(jì)算誤差是因?yàn)闆](méi)有采用浮點(diǎn)運(yùn)算,對(duì)于精度要求低于0.2%,則采用上述長(zhǎng)整型計(jì)算即可滿足要求
若系統(tǒng)要求更高精度,則可考慮浮點(diǎn)運(yùn)算。
*/
isnewdata=1;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -