📄 adc.lst
字号:
ARM COMPILER V2.50a, ADC 16/05/06 14:55:46 PAGE 1
ARM COMPILER V2.50a, COMPILATION OF MODULE ADC
OBJECT MODULE PLACED IN ADC.OBJ
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe ADC.c THUMB WARNINGLEVEL(3) BROWSE DEBUG TABS(4)
stmt level source
1 /**********************************************************************
2 ADC.c file
3 ADuC7027的ADC函数
4 作者:Computer-lov
5 建立日期:2006-3-25
6 修改日期:2006-3-25
7 版本:V1.0
8 版权所有,盗版必究。
9 Copyright(C) Computer-lov 2006-2016
10 All rights reserved
11 **********************************************************************/
12
13
14 #include <ADuC7027.H>
15 #include "My_type.h"
16 #include "ADC.h"
17
18 ////////////////////////由软件启动一次转换,并将ADC结果返回//////////////////////////
19 uint16 ADC_software_conversion(void)
20 {
21 1 uint16 result;
22 1
23 1 ADCCON=0x00A3; //开始一次软件启动转换
24 1 while(!(ADCSTA & 0x01)); //等待转换完成
25 1 ADCCON=0x0020; //停止转换
26 1 result=ADCDAT>>16; //保存结果
27 1 return result; //返回结果
28 1 }
29 /////////////////////////////////////////////////////////////////////////////////////
30
31 /////////////////////////////ADC校准/////////////////////////////////////////////////
32 void ADC_calibration(void)
33 {
34 1 uint16 i;
35 1 uint16 result;
36 1
37 1 ADCCP=0x11; //将输入接内部地
38 1 for(i=0;i<0x03FF;i++) //零点偏移校准
39 1 {
40 2 ADCOF=i; //设置ADCOF的值
41 2 result=ADC_software_conversion(); //读回ADC的值
42 2 if(result==0x01)
43 2 { //校验到的结果为1时,往回调整一点,就是0了
44 3 ADCOF=i-3;
45 3 break;
46 3 }
47 2 }
48 1 ADCCP=0x12; //将输入连接到内部参考电压
49 1 for(i=0;i<0x03FF;i++) //增益校准
50 1 {
51 2 ADCGN=i; //设置ADCGN的值
52 2 result=ADC_software_conversion();
53 2 if(result==4094)
54 2 { //校验结果为4094
55 3 ADCGN=i+6; //再将ADCGN加的一点
56 3 result=ADC_software_conversion();
57 3 if(result==4095)
58 3 { //如果读回的值为4095,则说明往增大的方向调整一点就是满量程了
59 4 ADCGN=i+4;
ARM COMPILER V2.50a, ADC 16/05/06 14:55:46 PAGE 2
60 4 break;
61 4 }
62 3 else
63 3 { //否则,应该按相反的方向调整一点
64 4 ADCGN=i-4;
65 4 }
66 3 }
67 2 }
68 1 }
69 //////////////////////////////////////////////////////////////////////////////////
70
71 ////////////////////////////ADC初始化/////////////////////////////////////////////
72 void ADC_init(void)
73 {
74 1 ADCCON=0x0023; //ADC时钟1MHz,打开ADC电源,单端模式,并选择软件转换模式
75 1 ADCCP=0x00; //通道0
76 1 ADCCN=0x00; //通道0
77 1 REFCON=0x01; //使用内部2.5V参考电压
78 1 ADC_calibration(); //ADC校准
79 1 ADCCP=0x00; //选择通道0
80 1 }
81 //////////////////////////////////////////////////////////////////////////////////
82
83
84 //////////////////////////选择通道ch,启动转换,并将ADC结果返回///////////////////
85 uint16 read_ADC(uint8 ch)
86 {
87 1 ADCCP=ch & 0x1F; //设置通道
88 1 return ADC_software_conversion();
89 1 }
90 //////////////////////////////////////////////////////////////////////////////////
91
ARM COMPILER V2.50a, ADC 16/05/06 14:55:46 PAGE 3
ASSEMBLY LISTING OF GENERATED OBJECT CODE
*** PUBLICS:
PUBLIC ADC_init?T
PUBLIC read_ADC?T
PUBLIC ADC_software_conversion?T
PUBLIC ADC_calibration?T
*** CODE SEGMENT '?PR?ADC_software_conversion?T?ADC':
20: {
00000000 ; SCOPE-START
23: ADCCON=0x00A3; //开始一次软件启动转换
00000000 21A3 MOV R1,#0xA3
00000002 4800 LDR R0,=0xFFFF0500
00000004 6001 STR R1,[R0,#0x0]
24: while(!(ADCSTA & 0x01)); //等待转换完成
00000006 L_1:
00000006 4800 LDR R0,=0xFFFF050C
00000008 6800 LDR R0,[R0,#0x0]
0000000A 2101 MOV R1,#0x1
0000000C 4208 TST R0,R1
0000000E D0FA BEQ L_1 ; T=0x00000006
25: ADCCON=0x0020; //停止转换
00000010 2120 MOV R1,#0x20
00000012 4800 LDR R0,=0xFFFF0500
00000014 6001 STR R1,[R0,#0x0]
26: result=ADCDAT>>16; //保存结果
00000016 4800 LDR R0,=0xFFFF0510
00000018 6801 LDR R1,[R0,#0x0]
0000001A 0C09 LSR R1,R1,#0x10
0000001C 0409 LSL R1,R1,#0x10
0000001E 0C09 LSR R1,R1,#0x10
00000020 ---- Variable 'result' assigned to Register 'R1' ----
27: return result; //返回结果
00000020 1C08 MOV R0,R1 ; result
00000022 0400 LSL R0,R0,#0x10 ; result
00000024 0C00 LSR R0,R0,#0x10
00000026 ; SCOPE-END
28: }
00000026 4770 BX R14
00000028 ENDP ; 'ADC_software_conversion?T'
*** CODE SEGMENT '?PR?ADC_calibration?T?ADC':
32: void ADC_calibration(void)
00000000 B510 PUSH {R4,LR}
33: {
00000002 ; SCOPE-START
37: ADCCP=0x11; //将输入接内部地
00000002 2111 MOV R1,#0x11
00000004 4800 LDR R0,=0xFFFF0504
00000006 6001 STR R1,[R0,#0x0]
38: for(i=0;i<0x03FF;i++) //零点偏移校准
00000008 2400 MOV R4,#0x0
0000000A 1C23 MOV R3,R4 ; i
0000000C ---- Variable 'i' assigned to Register 'R3' ----
0000000C E016 B L_8 ; T=0x0000003C
0000000E L_9:
40: ADCOF=i; //设置ADCOF的值
0000000E 1C18 MOV R0,R3 ; i
00000010 0401 LSL R1,R0,#0x10 ; i
00000012 0C09 LSR R1,R1,#0x10
00000014 4800 LDR R0,=0xFFFF0534
00000016 6001 STR R1,[R0,#0x0]
41: result=ADC_software_conversion(); //读回ADC的值
00000018 F7FF BL ADC_software_conversion?T ; T=0x0001 (1)
0000001A FFF2 BL ADC_software_conversion?T ; T=0x0001 (2)
ARM COMPILER V2.50a, ADC 16/05/06 14:55:46 PAGE 4
0000001C 1C02 MOV R2,R0 ; result
0000001E ---- Variable 'result' assigned to Register 'R2' ----
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -