⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc.lst

📁 看看ARM菜鸟在ARM7上写的操作系统——ARM圈圈操作系统 最近在ADuC7027上写了一个ARM_00_OS
💻 LST
📖 第 1 页 / 共 2 页
字号:
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 + -