?? adc0_temp_pro.c.lst
字號(hào):
C51 COMPILER V6.14 ADC0_TEMP_PRO_C 01/03/2006 13:57:42 PAGE 1
C51 COMPILER V6.14, COMPILATION OF MODULE ADC0_TEMP_PRO_C
OBJECT MODULE PLACED IN ADC0_TEMP_PRO.c.OBJ
COMPILER INVOKED BY: C:\Cygnal\IDEfiles\C51\BIN\C51.exe ADC0_TEMP_PRO.c.c DB OE
stmt level source
1 //內(nèi)部溫度傳感器調(diào)試程序//
2 //利用過(guò)采樣實(shí)現(xiàn)16位精度//
3 //ADC0_TEMP_PRO.c
4 #include <C8051F040.h>
5 #include <absacc.h>
6 #define ADC0START temppage=SFRPAGE;SFRPAGE=0x00;AD0BUSY=1;SFRPAGE=temppage
7 #define STACK_LEN 128
8 //采樣128次,再將128個(gè)數(shù)據(jù)總和除以8
9 //處理后的數(shù)據(jù)相當(dāng)于16個(gè)原始數(shù)據(jù)之和,在數(shù)值表現(xiàn)形式上為16bit
10 typedef unsigned int uint;
11 typedef unsigned char uchar;
12 typedef unsigned long ulong;
13 sfr16 RCAP2=0xca;
14 sfr16 RCAP3=0xca;
15 sfr16 RCAP4=0xca;
16 sfr16 TMR4=0xcc;
17 sfr16 TMR3=0xcc;
18 sfr16 TMR2=0xcc;
19 sfr16 PCA0CP0=0xfb;
20 sfr16 PCA0CP1=0xfd;
21 sfr16 PCA0CP2=0xe9;
22 sfr16 PCA0CP3=0xeb;
23 sfr16 PCA0CP4=0xed;
24 sfr16 PCA0CP5=0xe1;
25 sfr16 ADC0VAL=0xbe;
26 sfr16 ADC0GT=0xc4;
27 sfr16 ADC0LT=0xc6;
28 sfr16 DPTR=0x82;
29 uchar temppage;
30 bit isnewdata;
31 bit canread;
32 uint kk;
33
34 float temp;
35 xdata uchar stack_index;
36 xdata ulong total;
37 xdata int t[15000],t12[4000];//存放溫度檢測(cè)數(shù)據(jù),為20個(gè)數(shù)據(jù)
38 xdata uint ad16[20],ad12[20];
39 xdata uint mystack[STACK_LEN];//過(guò)采樣數(shù)據(jù)數(shù)組
40 void adc0_mux(uchar type,uchar source);
41 void adc0_source(uchar source);
42 void p3anolog_ini(uchar port);
43 void HVDA_ini(uchar gaind);
44 void adc0_ini();
45 void delay1ms(uint time);
46 void config();
47 void adc0_mux(uchar type,uchar source){//type 配置測(cè)量方式為差動(dòng)還是單端輸入
48 1 //source 為ADC0通道選擇(共有9個(gè)通道)
49 1 SFRPAGE=0x00;
50 1 AMX0CF=type;
51 1 AMX0SL=source;
52 1 }
53 void adc0_source(uchar source){//ADC0通道選擇,為adc0_mux()的簡(jiǎn)化函數(shù)
54 1 SFRPAGE=0x00;
55 1 AMX0SL=source;
C51 COMPILER V6.14 ADC0_TEMP_PRO_C 01/03/2006 13:57:42 PAGE 2
56 1 }
57 void p3anolog_ini(uchar port){//配置p3口模擬輸入管腳
58 1 SFRPAGE=0x00;
59 1 AMX0PRT=port;
60 1 SFRPAGE=0x0f;
61 1 P3MDIN&=~port;//將相應(yīng)管腳配置成模擬輸入口
62 1 }
63 void HVDA_ini(uchar gaind){//高壓差動(dòng)放大器配置
64 1 SFRPAGE=0x00;
65 1 HVA0CN=gaind;
66 1 }
67 void adc0_ini(){
68 1 SFRPAGE=0x00;
69 1 ADC0CF=0x80;//ADC0時(shí)鐘為系統(tǒng)時(shí)鐘17分頻,PGA增益為1
70 1 ADC0CN=0x80;
71 1 /*AD0EN=1,ADC0模塊使能
72 1 AD0TM=0,ADC0為連續(xù)跟蹤模式
73 1 AD0CM1:AD0CM0=00b,為AD0BUSY啟動(dòng)方式
74 1 AD0LJST=0,數(shù)據(jù)存儲(chǔ)格式右對(duì)齊,即ADC0H存放12bit高四位*/
75 1 REF0CN&=0x0f;//AD0VRS=0,ADC0參考電壓為VREFA
76 1 REF0CN|=0x07;//TEMPE=1,內(nèi)部溫度傳感器工作
77 1 /*BIASE=1,偏移產(chǎn)生器工作
78 1 REFBE=1,內(nèi)部參考電平工作,電路部分須將VREF參考輸出(C8051F40的第12管腳)與VREF0(C8051F040的16管腳相連,并最
-好并聯(lián)一個(gè)4.7uF和0.1uF的旁路電容以電平濾波*/
79 1 adc0_source(9);//選擇第9通道,即選擇溫度信號(hào)為AD轉(zhuǎn)換
80 1 // EIE2 |= 0x02; //開(kāi)ADC0中斷
81 1 }
82 void delay1ms(uint time){//延遲1ms
83 1 uint i;
84 1 uint j;
85 1 for (i=0;i<time;i++){
86 2 for(j=0;j<300;j++);
87 2 }
88 1 }
89 void config(){
90 1 //看門狗禁止
91 1 WDTCN = 0x07;
92 1 WDTCN = 0xDE;
93 1 WDTCN = 0xAD;
94 1 SFRPAGE = 0x0F;
95 1 //交叉開(kāi)關(guān)使能,但沒(méi)有進(jìn)行外圍設(shè)備配置
96 1 XBR0 = 0x00;
97 1 XBR1 = 0x00;
98 1 XBR2 = 0x40;
99 1 XBR3 = 0x00;
100 1 //管腳輸出配置,P0口為開(kāi)漏輸出,其中P0.6接上拉電阻,P0為數(shù)字輸入口
101 1 SFRPAGE = 0x0F;
102 1 P0MDOUT = 0x00;
103 1 P1MDIN = 0xFF;
104 1 //晶振配置,采用內(nèi)部晶振8分頻
105 1 SFRPAGE = 0x0F;
106 1 CLKSEL = 0x00;
107 1 OSCXCN = 0x00;
108 1 OSCICN = 0x84;
109 1 }
110 void main(){
111 1 uchar i;
112 1 uchar dataindex;
113 1 config();
114 1 adc0_ini();//ADC0初始化
115 1 ADC0START;//ADC0啟動(dòng)
116 1 EA=0;
C51 COMPILER V6.14 ADC0_TEMP_PRO_C 01/03/2006 13:57:42 PAGE 3
117 1 i=0;
118 1 stack_index=0;
119 1 canread=0;
120 1 dataindex=0;
121 1 while(1){
122 2 SFRPAGE=0x00;
123 2 if(AD0INT){
124 3 XWORD<0x1020>=0X022;
*** WARNING C275 IN LINE 124 OF ADC0_TEMP_PRO.C.C: expression with possibly no effect
125 3 AD0INT=0;
126 3 isnewdata=1;
127 3 if(stack_index>=STACK_LEN){
128 4 /*STACK_LEN需小于等于256,否則stack_index要定義成uint型數(shù)據(jù)*/
129 4 stack_index=0;
130 4 canread=1;
131 4 }
132 3 mystack[stack_index]=ADC0VAL;
133 3
134 3 stack_index++;
135 3 ADC0START;
136 3 }
137 2 if(isnewdata&&canread){//由該位查詢ADC0轉(zhuǎn)化值是否更新
138 3 for(i=0,total=0L;i<STACK_LEN;i++)/*注意若i定義為char型,則進(jìn)入死循環(huán),因?yàn)闂l件判斷恒真*/
139 3 total+=mystack[i];
140 3 total/=8L;//此時(shí)total的值即為16bit精度采樣值
141 3 temp=(float)total/65536.0;
142 3 temp*=2.43;
143 3 temp-=0.776;
144 3 temp/=0.00286;//將測(cè)量值轉(zhuǎn)化成真實(shí)溫度值
145 3 isnewdata=0;
146 3 t[dataindex]=temp;//將溫度檢測(cè)值存入長(zhǎng)度為20的數(shù)組中
147 3 ad16[dataindex]=(uint)total;
148 3 ad12[dataindex]=mystack[stack_index];
149 3 total=mystack[stack_index];/*12bit測(cè)量溫度,以便與16bit過(guò)采樣比較*/
150 3 temp=(float)total/4096.0;
151 3 temp*=2.43;
152 3 temp-=0.776;
153 3 temp/=0.00286;
154 3 t12[dataindex]=temp;
155 3 dataindex++;
156 3 if(dataindex>19)
157 3 dataindex=0;//在此設(shè)斷點(diǎn),觀察程序運(yùn)行結(jié)果
158 3
159 3 }
160 2 }
161 1 }
162 void ADC0_ISR() interrupt 15{//ADC0中斷,此程序中采用查詢法,暫不用中斷
163 1 SFRPAGE=0x00;
164 1 AD0INT=0;
165 1 isnewdata=1;
166 1 if(stack_index>=STACK_LEN){
167 2 //STACK_LEN需小于等于256,否則stack_index要定義成uint型數(shù)據(jù)
168 2 stack_index=0;
169 2 canread=1;
170 2 }
171 1 mystack[stack_index]=ADC0VAL;
172 1 stack_index++;
173 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 735 ----
C51 COMPILER V6.14 ADC0_TEMP_PRO_C 01/03/2006 13:57:42 PAGE 4
CONSTANT SIZE = ---- ----
XDATA SIZE = 38341 ----
PDATA SIZE = ---- ----
DATA SIZE = 7 2
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -