📄 adc.lst
字号:
ARM COMPILER V2.53, ADC 22/09/07 23:08:05 PAGE 1
ARM COMPILER V2.53, COMPILATION OF MODULE ADC
OBJECT MODULE PLACED IN ADC.OBJ
COMPILER INVOKED BY: D:\Keil\ARM\BIN\CA.exe ADC.c ARM BROWSE DEBUG TABS(4)
stmt level source
1 /**********************************************************************
2 ADC.c file
3 ADuC7020的ADC函数
4 作者:lig&lij
5 建立日期:2006-4-25
6 修改日期:2006-4-25
7 版本:V1.0
8 **********************************************************************/
9
10 #include "My_type.h"
11 #include <ADuC7020.H>
12 #include "ADC.h"
13 #include "others.h"
14 ////////////////////////由软件启动一次转换,并将ADC结果返回//////////////////////////
15 uint16 ADC_software_conversion(void)
16 {
17 1 uint16 result;
18 1
19 1 ADCCON=0x00A3; //开始一次软件启动转换
20 1 while(!(ADCSTA & 0x01)); //等待转换完成
21 1 ADCCON=0x0020; //停止转换
22 1 WatchDog();
23 1 result=ADCDAT>>16; //保存结果
24 1 return result; //返回结果
25 1 }
26 /////////////////////////////////////////////////////////////////////////////////////
27
28 /////////////////////////////ADC校准/////////////////////////////////////////////////
29 void ADC_calibration(void)
30 {
31 1 uint16 i;
32 1 uint16 result;
33 1
34 1 ADCCP=0x11; //将输入接内部地
35 1 for(i=0;i<0x03FF;i++) //零点偏移校准
36 1 {
37 2 ADCOF=i; //设置ADCOF的值
38 2 result=ADC_software_conversion(); //读回ADC的值
39 2 if(result==0x01)
40 2 { //校验到的结果为1时,往回调整一点,就是0了
41 3 ADCOF=i-3;
42 3 break;
43 3 }
44 2 }
45 1 ADCCP=0x12; //将输入连接到内部参考电压
46 1 for(i=0;i<0x03FF;i++) //增益校准
47 1 {
48 2 ADCGN=i; //设置ADCGN的值
49 2 result=ADC_software_conversion();
50 2 if(result==4094)
51 2 { //校验结果为4094
52 3 ADCGN=i+6; //再将ADCGN加的一点
53 3 result=ADC_software_conversion();
54 3 if(result==4095)
55 3 { //如果读回的值为4095,则说明往增大的方向调整一点就是满量程了
56 4 ADCGN=i+4;
57 4 break;
58 4 }
59 3 else
ARM COMPILER V2.53, ADC 22/09/07 23:08:05 PAGE 2
60 3 { //否则,应该按相反的方向调整一点
61 4 ADCGN=i-4;
62 4 }
63 3 }
64 2 }
65 1 }
66 //////////////////////////////////////////////////////////////////////////////////
67
68 ////////////////////////////ADC初始化/////////////////////////////////////////////
69 void ADC_init(void)
70 {
71 1 ADCCON=0x0023; //ADC时钟1MHz,打开ADC电源,单端模式,并选择软件转换模式
72 1 ADCCP=0x00; //通道0
73 1 ADCCN=0x00; //通道0
74 1 REFCON=0x01; //使用内部2.5V参考电压
75 1 ADC_calibration(); //ADC校准
76 1 ADCCP=0x00; //选择通道0
77 1 }
78 //////////////////////////////////////////////////////////////////////////////////
79
80
81 //////////////////////////选择通道ch,启动转换,并将ADC结果返回///////////////////
82 uint16 read_ADC(uint8 ch)
83 {
84 1 ADCCP=ch & 0x1F; //设置通道
85 1 return ADC_software_conversion();
86 1 }
87 //////////////////////////////////////////////////////////////////////////////////
ARM COMPILER V2.53, ADC 22/09/07 23:08:05 PAGE 3
ASSEMBLY LISTING OF GENERATED OBJECT CODE
*** PUBLICS:
PUBLIC ADC_init?A
PUBLIC read_ADC?A
PUBLIC ADC_software_conversion?A
PUBLIC ADC_calibration?A
*** CODE SEGMENT '?PR?ADC_software_conversion?A?ADC':
16: {
00000000 ; SCOPE-START
19: ADCCON=0x00A3; //开始一次软件启动转换
00000000 E3A010A3 MOV R1,#0xA3
00000004 E5100000 LDR R0,=0xFFFF0500
00000008 E5801000 STR R1,[R0,#0x0]
20: while(!(ADCSTA & 0x01)); //等待转换完成
0000000C L_1:
0000000C E5100000 LDR R0,=0xFFFF050C
00000010 E5900000 LDR R0,[R0,#0x0]
00000014 E3100001 TST R0,#0x0001
00000018 0AFFFFFB BEQ L_1 ; Targ=0xC
21: ADCCON=0x0020; //停止转换
0000001C E3A01020 MOV R1,#0x20
00000020 E5100000 LDR R0,=0xFFFF0500
00000024 E5801000 STR R1,[R0,#0x0]
22: WatchDog();
00000028 E3A01A01 MOV R1,#0x1000
0000002C E5100000 LDR R0,=0xFFFF0360
00000030 E5801000 STR R1,[R0,#0x0]
00000034 E3A010FF MOV R1,#0xFF
00000038 E5100000 LDR R0,=0xFFFF036C
0000003C E5801000 STR R1,[R0,#0x0]
23: result=ADCDAT>>16; //保存结果
00000040 E5100000 LDR R0,=0xFFFF0510
00000044 E5901000 LDR R1,[R0,#0x0]
00000048 E1A01821 MOV R1,R1,LSR #16
0000004C E1A01801 MOV R1,R1,LSL #16
00000050 E1A01821 MOV R1,R1,LSR #16
00000054 ---- Variable 'result' assigned to Register 'R1' ----
24: return result; //返回结果
00000054 E1A00001 MOV R0,R1 ; result
00000058 E1A00800 MOV R0,R0,LSL #16 ; result
0000005C E1A00820 MOV R0,R0,LSR #16
00000060 ; SCOPE-END
25: }
00000060 E12FFF1E BX R14
00000064 ENDP ; 'ADC_software_conversion?A'
*** CODE SEGMENT '?PR?ADC_calibration?A?ADC':
29: void ADC_calibration(void)
00000000 E92D4010 STMDB R13!,{R4,LR}
30: {
00000004 ; SCOPE-START
34: ADCCP=0x11; //将输入接内部地
00000004 E3A01011 MOV R1,#0x11
00000008 E5100000 LDR R0,=0xFFFF0504
0000000C E5801000 STR R1,[R0,#0x0]
35: for(i=0;i<0x03FF;i++) //零点偏移校准
00000010 E3A04000 MOV R4,#0x0
00000014 E1A03004 MOV R3,R4 ; i
00000018 ---- Variable 'i' assigned to Register 'R3' ----
00000018 EA000015 B L_8 ; Targ=0x74
0000001C L_9:
37: ADCOF=i; //设置ADCOF的值
0000001C E1A00003 MOV R0,R3 ; i
00000020 E1A01800 MOV R1,R0,LSL #16 ; i
ARM COMPILER V2.53, ADC 22/09/07 23:08:05 PAGE 4
00000024 E1A01821 MOV R1,R1,LSR #16
00000028 E5100000 LDR R0,=0xFFFF0534
0000002C E5801000 STR R1,[R0,#0x0]
38: result=ADC_software_conversion(); //读回ADC的值
00000030 EBFFFFF2 BL ADC_software_conversion?A ; Targ=0x0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -