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

📄 adc.lis

📁 ATMEG8单片机的自带10位AD转换器程序
💻 LIS
字号:
                        .module ADC.C
                        .area vector(rom, abs)
                        .org 22
 0016 25C0              rjmp _USART_receive
                        .area text(rom, con, rel)
 0000                   .dbfile C:\DOCUME~1\Administrator\桌面\ADC\ADC.C
 0000                   .dbfunc e initial_ADC _initial_ADC fV
                        .even
 0000           _initial_ADC::
 0000                   .dbline -1
 0000                   .dbline 15
 0000           ; /******************************
 0000           ;        NAME: ADC.C
 0000           ;          DATA:2007/5/8
 0000           ;          AUTHOR: DIP STIDIO
 0000           ;          CPU: ATMEGA8
 0000           ;           8.000MHz
 0000           ; ******************************/
 0000           ; #include <iom8v.h>
 0000           ; #include <macros.h>
 0000           ; #pragma interrupt_handler USART_receive: 12  
 0000           ; //------------------------------------------------------------------
 0000           ; //                      ADC初始化函数
 0000           ; //------------------------------------------------------------------
 0000           ; void initial_ADC(void)
 0000           ; {
 0000                   .dbline 16
 0000           ;          ADMUX=0XE0;  //使用片内2.56基准电压,左对齐模式。
 0000 80EE              ldi R24,224
 0002 87B9              out 0x7,R24
 0004                   .dbline 20
 0004           ;                
 0004           ; //     ADMUX=0XC0;  //使用片内2.56基准电压,右对齐模式。
 0004           ; 
 0004           ;                ADCSRA=0X86; //开启ADC功能,关中断,时钟为系统时钟的64分频(BIT2-BIT0确定分频数)
 0004 86E8              ldi R24,134
 0006 86B9              out 0x6,R24
 0008                   .dbline -2
 0008           L1:
 0008                   .dbline 0 ; func end
 0008 0895              ret
 000A                   .dbend
 000A                   .dbfunc e ADC_run8bit _ADC_run8bit fc
 000A           ;         result -> R20
 000A           ;        channel -> R16
                        .even
 000A           _ADC_run8bit::
 000A 00D0              rcall push_gset1
 000C                   .dbline -1
 000C                   .dbline 27
 000C           ;                 
 000C           ; }
 000C           ; //-------------------------------------------------------------------
 000C           ; //                            ADC转换函数(8位精度,左对齐,单次采样)
 000C           ; //-------------------------------------------------------------------
 000C           ; unsigned char ADC_run8bit(unsigned char channel)//通道号为0X00--0X07
 000C           ; {
 000C                   .dbline 28
 000C           ;     unsigned char result=0;   //转换结果
 000C 4427              clr R20
 000E                   .dbline 30
 000E           ;       
 000E           ;                        ADMUX|=channel;  //确定通道号
 000E 27B0              in R2,0x7
 0010 202A              or R2,R16
 0012 27B8              out 0x7,R2
 0014                   .dbline 32
 0014           ;                        
 0014           ;                        ADCSRA|=0X40;     //启动AD转换(通过写ADSC位实现)
 0014 369A              sbi 0x6,6
 0016                   .dbline 34
 0016           ;                         
 0016           ;                        result=ADCH;      //储存采样结果
 0016 45B1              in R20,0x5
 0018                   .dbline 36
 0018           ;                        
 0018           ;          return(result);  //返回结果
 0018 042F              mov R16,R20
 001A                   .dbline -2
 001A           L2:
 001A 00D0              rcall pop_gset1
 001C                   .dbline 0 ; func end
 001C 0895              ret
 001E                   .dbsym r result 20 c
 001E                   .dbsym r channel 16 c
 001E                   .dbend
 001E                   .dbfunc e initial_USART _initial_USART fV
                        .even
 001E           _initial_USART::
 001E                   .dbline -1
 001E                   .dbline 63
 001E           ; }
 001E           ; /*
 001E           ; //-------------------------------------------------------------------
 001E           ; //                            ADC转换函数(10位精度,左对齐,单次采样)
 001E           ; //-------------------------------------------------------------------
 001E           ; int ADC_run16bit(unsigned char channel)//通道号为0X00--0X07
 001E           ; {
 001E           ;     int result=0;   //转换结果
 001E           ;     int        RESH=0,RESL=0;   //存储高低位结果
 001E           ;       
 001E           ;                        ADCMUX|=channel;  //确定通道号
 001E           ;                        
 001E           ;                        ADCSRA|=0X40;     //启动AD转换(通过写ADSC位实现)
 001E           ;                         
 001E           ;                        RESH=ADCH;      //储存高位结果
 001E           ;                        RESL=ADCL;      //储存低位结果
 001E           ;                        
 001E           ;                        result=(RESH<<8)|RESL;
 001E           ;                        
 001E           ;          return(result);  //返回结果
 001E           ; }
 001E           ; */
 001E           ; //------------------------------------------------------------------
 001E           ; //                                               USART初始化函数
 001E           ; //------------------------------------------------------------------
 001E           ; void initial_USART(void)
 001E           ; {
 001E                   .dbline 65
 001E           ; //-----端口设置--------
 001E           ;               PORTB = 0x00;
 001E 2224              clr R2
 0020 28BA              out 0x18,R2
 0022                   .dbline 66
 0022           ;               DDRB  = 0x00;
 0022 27BA              out 0x17,R2
 0024                   .dbline 67
 0024           ;               PORTC = 0x00; 
 0024 25BA              out 0x15,R2
 0026                   .dbline 68
 0026           ;               DDRC  = 0x00;
 0026 24BA              out 0x14,R2
 0028                   .dbline 69
 0028           ;               PORTD = 0x00;
 0028 22BA              out 0x12,R2
 002A                   .dbline 70
 002A           ;               DDRD  = 0xFF;
 002A 8FEF              ldi R24,255
 002C 81BB              out 0x11,R24
 002E                   .dbline 72
 002E           ; //------USART设置-------
 002E           ;                       UCSRA=0X00;   //波特率不加倍,同时清空一些标志位
 002E 2BB8              out 0xb,R2
 0030                   .dbline 73
 0030           ;                       UCSRB=0X98;   //使能接收和发送,数据位为8位,开接收中断
 0030 88E9              ldi R24,152
 0032 8AB9              out 0xa,R24
 0034                   .dbline 74
 0034           ;                       UCSRC=0X86;   //异步方式,禁止奇偶校验,数据位为8位
 0034 86E8              ldi R24,134
 0036 80BD              out 0x20,R24
 0038                   .dbline 76
 0038           ;       //时钟频率8M,波特率9600
 0038           ;                       UBRRH=0X00;
 0038 20BC              out 0x20,R2
 003A                   .dbline 77
 003A           ;                       UBRRL=0X33;
 003A 83E3              ldi R24,51
 003C 89B9              out 0x9,R24
 003E                   .dbline 82
 003E           ;       //时钟频率8M,波特率57600
 003E           ;       //         UBRRH=0X00;
 003E           ;       //                 UBRRL=0X08;
 003E           ;       
 003E           ;                       SEI();     //全局开中断
 003E 7894              sei
 0040                   .dbline -2
 0040           L3:
 0040                   .dbline 0 ; func end
 0040 0895              ret
 0042                   .dbend
 0042                   .dbfunc e send _send fV
 0042           ;            DAT -> R16
                        .even
 0042           _send::
 0042                   .dbline -1
 0042                   .dbline 88
 0042           ; }            
 0042           ; //--------------------------------------------------------------
 0042           ; //                                               发送函数
 0042           ; //--------------------------------------------------------------
 0042           ; void send(unsigned char DAT)
 0042           ; {
 0042                   .dbline 89
 0042           ;                                  UDR=DAT;  //发送数据
 0042 0CB9              out 0xc,R16
 0044           L5:
 0044                   .dbline 90
 0044           L6:
 0044                   .dbline 90
 0044           ;                                    while ( !( UCSRA & (1<<TXC)) );   //检验TXC位,当TXC=1时可以表示发送完成
 0044 5E9B              sbis 0xb,6
 0046 FECF              rjmp L5
 0048                   .dbline -2
 0048           L4:
 0048                   .dbline 0 ; func end
 0048 0895              ret
 004A                   .dbsym r DAT 16 c
 004A                   .dbend
 004A                   .dbfunc e USART_receive _USART_receive fV
 004A           ;        RECdata -> R22
 004A           ;        ADCdata -> R20
                        .even
 004A           _USART_receive::
 004A 00D0              rcall push_lset
 004C 00D0              rcall push_gset2
 004E                   .dbline -1
 004E                   .dbline 96
 004E           ; }                                                                                                        //发送移位缓冲器中的数据被送出,且当发送缓冲器 (UDR) 为空时TXC 置位
 004E           ; //--------------------------------------------------------------
 004E           ; //                                            接收中断服务函数
 004E           ; //--------------------------------------------------------------
 004E           ; void USART_receive(void)
 004E           ; {    unsigned char ADCdata=0X04;
 004E                   .dbline 96
 004E 44E0              ldi R20,4
 0050                   .dbline 98
 0050           ;        unsigned char RECdata;  
 0050           ;                 RECdata=UDR;
 0050 6CB1              in R22,0xc
 0052                   .dbline 99
 0052           ;                             ADCdata=ADC_run8bit(RECdata);//AD转换
 0052 062F              mov R16,R22
 0054 DADF              rcall _ADC_run8bit
 0056 402F              mov R20,R16
 0058                   .dbline 100
 0058           ;                                           send( ADCdata);
 0058 F4DF              rcall _send
 005A                   .dbline -2
 005A           L8:
 005A 00D0              rcall pop_gset2
 005C 00D0              rcall pop_lset
 005E                   .dbline 0 ; func end
 005E 1895              reti
 0060                   .dbsym r RECdata 22 c
 0060                   .dbsym r ADCdata 20 c
 0060                   .dbend
 0060                   .dbfunc e main _main fV
                        .even
 0060           _main::
 0060                   .dbline -1
 0060                   .dbline 107
 0060           ;       
 0060           ; }
 0060           ; //------------------------------------------------------------------
 0060           ; //                       主函数
 0060           ; //------------------------------------------------------------------  
 0060           ; void main(void)
 0060           ; {
 0060                   .dbline 108
 0060           ;         initial_USART();                               
 0060 DEDF              rcall _initial_USART
 0062                   .dbline 109
 0062           ;          initial_ADC();
 0062 CEDF              rcall _initial_ADC
 0064           L10:
 0064                   .dbline 111
 0064           L11:
 0064                   .dbline 111
 0064 FFCF              rjmp L10
 0066           X0:
 0066                   .dbline -2
 0066           L9:
 0066                   .dbline 0 ; func end
 0066 0895              ret
 0068                   .dbend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -