adc0_temp_pro.c.lst
来自「c8051单片机源程序」· LST 代码 · 共 205 行
LST
205 行
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 //内部温度传感器调试程序//
2 //利用过采样实现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个数据总和除以8
9 //处理后的数据相当于16个原始数据之和,在数值表现形式上为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];//存放温度检测数据,为20个数据
38 xdata uint ad16[20],ad12[20];
39 xdata uint mystack[STACK_LEN];//过采样数据数组
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 配置测量方式为差动还是单端输入
48 1 //source 为ADC0通道选择(共有9个通道)
49 1 SFRPAGE=0x00;
50 1 AMX0CF=type;
51 1 AMX0SL=source;
52 1 }
53 void adc0_source(uchar source){//ADC0通道选择,为adc0_mux()的简化函数
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;//将相应管脚配置成模拟输入口
62 1 }
63 void HVDA_ini(uchar gaind){//高压差动放大器配置
64 1 SFRPAGE=0x00;
65 1 HVA0CN=gaind;
66 1 }
67 void adc0_ini(){
68 1 SFRPAGE=0x00;
69 1 ADC0CF=0x80;//ADC0时钟为系统时钟17分频,PGA增益为1
70 1 ADC0CN=0x80;
71 1 /*AD0EN=1,ADC0模块使能
72 1 AD0TM=0,ADC0为连续跟踪模式
73 1 AD0CM1:AD0CM0=00b,为AD0BUSY启动方式
74 1 AD0LJST=0,数据存储格式右对齐,即ADC0H存放12bit高四位*/
75 1 REF0CN&=0x0f;//AD0VRS=0,ADC0参考电压为VREFA
76 1 REF0CN|=0x07;//TEMPE=1,内部温度传感器工作
77 1 /*BIASE=1,偏移产生器工作
78 1 REFBE=1,内部参考电平工作,电路部分须将VREF参考输出(C8051F40的第12管脚)与VREF0(C8051F040的16管脚相连,并最
-好并联一个4.7uF和0.1uF的旁路电容以电平滤波*/
79 1 adc0_source(9);//选择第9通道,即选择温度信号为AD转换
80 1 // EIE2 |= 0x02; //开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 //交叉开关使能,但没有进行外围设备配置
96 1 XBR0 = 0x00;
97 1 XBR1 = 0x00;
98 1 XBR2 = 0x40;
99 1 XBR3 = 0x00;
100 1 //管脚输出配置,P0口为开漏输出,其中P0.6接上拉电阻,P0为数字输入口
101 1 SFRPAGE = 0x0F;
102 1 P0MDOUT = 0x00;
103 1 P1MDIN = 0xFF;
104 1 //晶振配置,采用内部晶振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启动
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型数据*/
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转化值是否更新
138 3 for(i=0,total=0L;i<STACK_LEN;i++)/*注意若i定义为char型,则进入死循环,因为条件判断恒真*/
139 3 total+=mystack[i];
140 3 total/=8L;//此时total的值即为16bit精度采样值
141 3 temp=(float)total/65536.0;
142 3 temp*=2.43;
143 3 temp-=0.776;
144 3 temp/=0.00286;//将测量值转化成真实温度值
145 3 isnewdata=0;
146 3 t[dataindex]=temp;//将温度检测值存入长度为20的数组中
147 3 ad16[dataindex]=(uint)total;
148 3 ad12[dataindex]=mystack[stack_index];
149 3 total=mystack[stack_index];/*12bit测量温度,以便与16bit过采样比较*/
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;//在此设断点,观察程序运行结果
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型数据
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)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?