?? adc0_temp.c
字號(hào):
//內(nèi)部溫度傳感器調(diào)試程序//
//ADC0_TEMP.c
#include <C8051F040.h>
#define ADC0START temppage=SFRPAGE;SFRPAGE=0x00;AD0BUSY=1;SFRPAGE=temppage
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
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;
uint kk;
float temp;
xdata float t[20];//存放溫度檢測(cè)數(shù)據(jù),為20個(gè)數(shù)據(jù)
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 delay1ms(uint time);
void config();
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)放大器配置
SFRPAGE=0x00;
HVA0CN=gaind;
}
void adc0_ini(){
SFRPAGE=0x00;
ADC0CF=0x80;//ADC0時(shí)鐘為系統(tǒng)時(shí)鐘17分頻,PGA增益為1
ADC0CN=0x80;
/*AD0EN=1,ADC0模塊使能
AD0TM=0,ADC0為連續(xù)跟蹤模式
AD0CM1:AD0CM0=00b,為AD0BUSY啟動(dòng)方式
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_source(9);//選擇第9通道,即選擇溫度信號(hào)為AD轉(zhuǎn)換
EIE2 |= 0x02; //開ADC0中斷
}
void delay1ms(uint time){//延遲1ms
uint i;
uint j;
for (i=0;i<time;i++){
for(j=0;j<300;j++);
}
}
void config(){
//看門狗禁止
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
SFRPAGE = 0x0F;
//交叉開關(guān)使能,但沒有進(jìn)行外圍設(shè)備配置
XBR0 = 0x00;
XBR1 = 0x00;
XBR2 = 0x40;
XBR3 = 0x00;
//管腳輸出配置,P0口為開漏輸出,其中P0.6接上拉電阻,P0為數(shù)字輸入口
SFRPAGE = 0x0F;
P0MDOUT = 0x00;
P1MDIN = 0xFF;
//晶振配置,采用內(nèi)部晶振8分頻
SFRPAGE = 0x0F;
CLKSEL = 0x00;
OSCXCN = 0x00;
OSCICN = 0x84;
}
void main(){
char i;
config();
adc0_ini();//ADC0初始化
ADC0START;//ADC0啟動(dòng)
EA=1;
i=0;
while(1){
if(isnewdata){//由該位查詢ADC0轉(zhuǎn)化值是否更新
kk=ADC0H*256;
kk+=ADC0L;//可用sfr16一次性讀取
temp=(float)kk/4096.0;
temp*=2.43;
temp-=0.776;
temp/=0.00286;//將測(cè)量值轉(zhuǎn)化成真實(shí)溫度值
isnewdata=0;
t[i]=temp;//將溫度檢測(cè)值存入長(zhǎng)度為20的數(shù)組中
i++;
if(i>19)
i=0;//在此設(shè)斷點(diǎn),觀察程序運(yùn)行結(jié)果
delay1ms(100);
ADC0START;
}
}
}
void ADC0_ISR() interrupt 15{//ADC0中斷
SFRPAGE=0x00;
AD0INT=0;
isnewdata=1;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -