📄 adc0_temp.lst
字号:
C51 COMPILER V7.05 ADC0_TEMP 03/17/2006 10:09:13 PAGE 1
C51 COMPILER V7.05, COMPILATION OF MODULE ADC0_TEMP
OBJECT MODULE PLACED IN ADC0_TEMP.OBJ
COMPILER INVOKED BY: D:\Program Files\SiLabs\MCU\IDEfiles\C51\BIN\C51.exe ADC0_TEMP.c DB OE
stmt level source
1 //内部温度传感器调试程序//
2 //ADC0_TEMP.c
3 #include <C8051F040.h>
4 #define ADC0START temppage=SFRPAGE;SFRPAGE=0x00;AD0BUSY=1;SFRPAGE=temppage
5 typedef unsigned int uint;
6 typedef unsigned char uchar;
7 typedef unsigned long ulong;
8 sfr16 RCAP2=0xca;
9 sfr16 RCAP3=0xca;
10 sfr16 RCAP4=0xca;
11 sfr16 TMR4=0xcc;
12 sfr16 TMR3=0xcc;
13 sfr16 TMR2=0xcc;
14 sfr16 PCA0CP0=0xfb;
15 sfr16 PCA0CP1=0xfd;
16 sfr16 PCA0CP2=0xe9;
17 sfr16 PCA0CP3=0xeb;
18 sfr16 PCA0CP4=0xed;
19 sfr16 PCA0CP5=0xe1;
20 sfr16 ADC0VAL=0xbe;
21 sfr16 ADC0GT=0xc4;
22 sfr16 ADC0LT=0xc6;
23 uchar temppage;
24 bit isnewdata;
25 uint kk;
26 float temp;
27 xdata float t[20];//存放温度检测数据,为20个数据
28 void adc0_mux(uchar type,uchar source);
29 void adc0_source(uchar source);
30 void p3anolog_ini(uchar port);
31 void HVDA_ini(uchar gaind);
32 void adc0_ini();
33 void delay1ms(uint time);
34 void config();
35 void adc0_mux(uchar type,uchar source){//type 配置测量方式为差动还是单端输入
36 1 //source 为ADC0通道选择(共有9个通道)
37 1 SFRPAGE=0x00;
38 1 AMX0CF=type;
39 1 AMX0SL=source;
40 1 }
41 void adc0_source(uchar source){//ADC0通道选择,为adc0_mux()的简化函数
42 1 SFRPAGE=0x00;
43 1 AMX0SL=source;
44 1 }
45 void p3anolog_ini(uchar port){//配置p3口模拟输入管脚
46 1 SFRPAGE=0x00;
47 1 AMX0PRT=port;
48 1 SFRPAGE=0x0f;
49 1 P3MDIN&=~port;//将相应管脚配置成模拟输入口
50 1 }
51 void HVDA_ini(uchar gaind){//高压差动放大器配置
52 1 SFRPAGE=0x00;
53 1 HVA0CN=gaind;
54 1 }
55 void adc0_ini(){
C51 COMPILER V7.05 ADC0_TEMP 03/17/2006 10:09:13 PAGE 2
56 1 SFRPAGE=0x00;
57 1 ADC0CF=0x80;//ADC0时钟为系统时钟17分频,PGA增益为1
58 1 ADC0CN=0x80;
59 1 /*AD0EN=1,ADC0模块使能
60 1 AD0TM=0,ADC0为连续跟踪模式
61 1 AD0CM1:AD0CM0=00b,为AD0BUSY启动方式
62 1 AD0LJST=0,数据存储格式右对齐,即ADC0H存放12bit高四位*/
63 1 REF0CN&=0x0f;//AD0VRS=0,ADC0参考电压为VREFA
64 1 REF0CN|=0x07;//TEMPE=1,内部温度传感器工作
65 1 /*BIASE=1,偏移产生器工作
66 1 REFBE=1,内部参考电平工作,电路部分须将VREF参考输出(C8051F40的第12管脚)与VREF0(C8051F040的16管脚相连,并最
-好并联一个4.7uF和0.1uF的旁路电容以电平滤波*/
67 1 adc0_source(9);//选择第9通道,即选择温度信号为AD转换
68 1 EIE2 |= 0x02; //开ADC0中断
69 1 }
70 void delay1ms(uint time){//延迟1ms
71 1 uint i;
72 1 uint j;
73 1 for (i=0;i<time;i++){
74 2 for(j=0;j<300;j++);
75 2 }
76 1 }
77 void config(){
78 1 //看门狗禁止
79 1 WDTCN = 0x07;
80 1 WDTCN = 0xDE;
81 1 WDTCN = 0xAD;
82 1 SFRPAGE = 0x0F;
83 1 //交叉开关使能,但没有进行外围设备配置
84 1 XBR0 = 0x00;
85 1 XBR1 = 0x00;
86 1 XBR2 = 0x40;
87 1 XBR3 = 0x00;
88 1 //管脚输出配置,P0口为开漏输出,其中P0.6接上拉电阻,P0为数字输入口
89 1 SFRPAGE = 0x0F;
90 1 P0MDOUT = 0x00;
91 1 P1MDIN = 0xFF;
92 1 //晶振配置,采用内部晶振8分频
93 1 SFRPAGE = 0x0F;
94 1 CLKSEL = 0x00;
95 1 OSCXCN = 0x00;
96 1 OSCICN = 0x84;
97 1 }
98 void main(){
99 1 char i;
100 1 config();
101 1 adc0_ini();//ADC0初始化
102 1 ADC0START;//ADC0启动
103 1 EA=1;
104 1 i=0;
105 1 while(1){
106 2 if(isnewdata){//由该位查询ADC0转化值是否更新
107 3 kk=ADC0H*256;
108 3 kk+=ADC0L;//可用sfr16一次性读取
109 3 temp=(float)kk/4096.0;
110 3 temp*=2.43;
111 3 temp-=0.776;
112 3 temp/=0.00286;//将测量值转化成真实温度值
113 3 isnewdata=0;
114 3 t[i]=temp;//将温度检测值存入长度为20的数组中
115 3 i++;
116 3 if(i>19)
C51 COMPILER V7.05 ADC0_TEMP 03/17/2006 10:09:13 PAGE 3
117 3 i=0;//在此设断点,观察程序运行结果
118 3 delay1ms(100);
119 3 ADC0START;
120 3 }
121 2 }
122 1 }
123 void ADC0_ISR() interrupt 15{//ADC0中断
124 1 SFRPAGE=0x00;
125 1 AD0INT=0;
126 1 isnewdata=1;
127 1
128 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 346 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 80 ----
PDATA SIZE = ---- ----
DATA SIZE = 7 1
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -