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

📄 adc.lis

📁 用ATMEGA16实现AD转换并通过串口将数据传回PC机
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module adc.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\projects\AVR\ADC\adc.c
 0000                   .dbfunc e port_init _port_init fV
                        .even
 0000           _port_init::
 0000                   .dbline -1
 0000                   .dbline 45
 0000           ; //ICC-AVR application builder : 2009-2-5 19:27:04
 0000           ; // Target : M16
 0000           ; // Crystal: 4.0000Mhz INTERNAL
 0000           ; 
 0000           ; #include <iom16v.h>
 0000           ; #include <macros.h>
 0000           ; 
 0000           ; #define PIN_RXD    0   //PD0    RXD
 0000           ; #define PIN_TXD    1   //PD1    TXD
 0000           ; 
 0000           ; #define AD_SE_ADC0 0x00 //ADC0 
 0000           ; #define AD_SE_ADC1 0x01 //ADC1 
 0000           ; #define AD_SE_ADC2 0x02 //ADC2 
 0000           ; #define AD_SE_ADC3 0x03 //ADC3 
 0000           ; #define AD_SE_ADC4 0x04 //ADC4 
 0000           ; #define AD_SE_ADC5 0x05 //ADC5 
 0000           ; #define AD_SE_ADC6 0x06 //ADC6 
 0000           ; 
 0000           ; #define Vref 2650 //mV,参考电压,内部提供
 0000           ; #define Vref_type 0x60  //RIGHT对齐
 0000           ; 
 0000           ; /* 
 0000           ; ADMUX (ADC Multiplexer Select Register) 
 0000           ;                    bit7  bit6  
 0000           ;                    REFS1 REFS0  参考电压选择  
 0000           ;                     0     0     AREF,内部Vref关闭  
 0000           ;                     0     1     AVCC,AREF引脚外加滤波电容  
 0000           ;                     1     0     保留  
 0000           ;                     1     1     2.56V的片内基准电压源,AREF引脚外加滤波电容  
 0000           ;                    bit5         ADC结果左对齐选择 1=左对齐  0=右对齐 
 0000           ;                    bit4~0       选择32通道   
 0000           ; */ 
 0000           ; 
 0000           ; /*   
 0000           ;                      ADCSRA (ADC Control and Status Register A) 
 0000           ;                       bit7   ADEN ADC使能=1 
 0000           ;                       bit6   ADSC 启动ADC开始转换=1 
 0000           ;                       bit5   ADATE 自己触发使能 
 0000           ;                       bit4   ADIF ADC中断标志 
 0000           ;                       bit3   ADIE ADC中断使能 
 0000           ;                       bit2:0 ADC 预分频选择位 111=128时钟分频 
 0000           ; */  
 0000           ; 
 0000           ; void port_init(void)
 0000           ; {
 0000                   .dbline 46
 0000           ;  PORTA = 0x00;
 0000 2224              clr R2
 0002 2BBA              out 0x1b,R2
 0004                   .dbline 47
 0004           ;  DDRA  = 0x00;
 0004 2ABA              out 0x1a,R2
 0006                   .dbline 48
 0006           ;  PORTB = 0x00;
 0006 28BA              out 0x18,R2
 0008                   .dbline 49
 0008           ;  DDRB  = 0x00;
 0008 27BA              out 0x17,R2
 000A                   .dbline 50
 000A           ;  PORTC = 0x00; //m103 output only
 000A 25BA              out 0x15,R2
 000C                   .dbline 51
 000C           ;  DDRC  = 0x00;
 000C 24BA              out 0x14,R2
 000E                   .dbline 52
 000E           ;  PORTD = 0x00;
 000E 22BA              out 0x12,R2
 0010                   .dbline 53
 0010           ;  DDRD  = 0x00;
 0010 21BA              out 0x11,R2
 0012                   .dbline -2
 0012           L1:
 0012                   .dbline 0 ; func end
 0012 0895              ret
 0014                   .dbend
 0014                   .dbfunc e uart0_init _uart0_init fV
                        .even
 0014           _uart0_init::
 0014                   .dbline -1
 0014                   .dbline 62
 0014           ; }
 0014           ; 
 0014           ; //UART0 initialize
 0014           ; // desired baud rate: 9600
 0014           ; // actual: baud rate:4808 (0.2%)
 0014           ; // char size: 8 bit
 0014           ; // parity: Disabled
 0014           ; void uart0_init(void)
 0014           ; {
 0014                   .dbline 63
 0014           ;  UCSRB = 0x00; //disable while setting baud rate
 0014 2224              clr R2
 0016 2AB8              out 0xa,R2
 0018                   .dbline 64
 0018           ;  UCSRA = 0x00;
 0018 2BB8              out 0xb,R2
 001A                   .dbline 66
 001A           ;  //设置帧格式: 8 个数据位, 1 个停止位
 001A           ;  UCSRC = (1<<URSEL)|(3<<UCSZ0);
 001A 86E8              ldi R24,134
 001C 80BD              out 0x20,R24
 001E                   .dbline 68
 001E           ;  //设置波特率
 001E           ;  UBRRL = 0x19; //set baud rate lo
 001E 89E1              ldi R24,25
 0020 89B9              out 0x9,R24
 0022                   .dbline 69
 0022           ;  UBRRH = 0x00; //set baud rate hi
 0022 20BC              out 0x20,R2
 0024                   .dbline 71
 0024           ;  // 接收器与发送器使能
 0024           ;  UCSRB = (1<<TXEN);
 0024 88E0              ldi R24,8
 0026 8AB9              out 0xa,R24
 0028                   .dbline -2
 0028           L2:
 0028                   .dbline 0 ; func end
 0028 0895              ret
 002A                   .dbend
 002A                   .dbfunc e adc_init _adc_init fV
                        .even
 002A           _adc_init::
 002A                   .dbline -1
 002A                   .dbline 90
 002A           ; }
 002A           ; 
 002A           ; /*
 002A           ; void USART_Init( unsigned int baud )
 002A           ; {
 002A           ; //设置波特率
 002A           ; UBRRH = (unsigned char)(baud>>8);
 002A           ; UBRRL = (unsigned char)baud;
 002A           ; // 接收器与发送器使能
 002A           ; UCSRB = (1<<RXEN)|(1<<TXEN);
 002A           ; //设置帧格式: 8 个数据位, 2 个停止位
 002A           ; UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
 002A           ; }
 002A           ; */
 002A           ; 
 002A           ; //ADC initialize
 002A           ; // Conversion time: 13uS
 002A           ; void adc_init(void)
 002A           ; {
 002A                   .dbline 91
 002A           ;  ADCSR = 0x00; //disable adc
 002A 2224              clr R2
 002C 26B8              out 0x6,R2
 002E                   .dbline 92
 002E           ;  ADMUX = 0x00; //select adc input 0
 002E 27B8              out 0x7,R2
 0030                   .dbline 93
 0030           ;  ACSR  = 0x80;
 0030 80E8              ldi R24,128
 0032 88B9              out 0x8,R24
 0034                   .dbline 94
 0034           ;  ADCSRA=(1<<ADEN)|(0<<ADSC)|(0<<ADIE)|(1<<ADPS2)|(0<<ADPS1)|(0<<ADPS0); 
 0034 84E8              ldi R24,132
 0036 86B9              out 0x6,R24
 0038                   .dbline -2
 0038           L3:
 0038                   .dbline 0 ; func end
 0038 0895              ret
 003A                   .dbend
 003A                   .dbfunc e init_devices _init_devices fV
                        .even
 003A           _init_devices::
 003A                   .dbline -1
 003A                   .dbline 100
 003A           ;  //ADCSR = 0x84;
 003A           ; }
 003A           ; 
 003A           ; //call this routine to initialize all peripherals
 003A           ; void init_devices(void)
 003A           ; {
 003A                   .dbline 102
 003A           ;  //stop errant interrupts until set up
 003A           ;  CLI(); //disable all interrupts
 003A F894              cli
 003C                   .dbline 103
 003C           ;  port_init();
 003C E1DF              xcall _port_init
 003E                   .dbline 104
 003E           ;  adc_init();
 003E F5DF              xcall _adc_init
 0040                   .dbline 105
 0040           ;  uart0_init();
 0040 E9DF              xcall _uart0_init
 0042                   .dbline 107
 0042           ; 
 0042           ;  MCUCR = 0x00;
 0042 2224              clr R2
 0044 25BE              out 0x35,R2
 0046                   .dbline 108
 0046           ;  GICR  = 0x00;
 0046 2BBE              out 0x3b,R2
 0048                   .dbline 109
 0048           ;  TIMSK = 0x00; //timer interrupt sources
 0048 29BE              out 0x39,R2
 004A                   .dbline 110
 004A           ;  SEI(); //re-enable interrupts
 004A 7894              sei
 004C                   .dbline -2
 004C           L4:
 004C                   .dbline 0 ; func end
 004C 0895              ret
 004E                   .dbend
 004E                   .dbfunc e read_adc _read_adc fc
 004E           ;       adc_data -> R20,R21
 004E           ;       adc_port -> R16
                        .even
 004E           _read_adc::
 004E 0E940000          xcall push_gset1
 0052                   .dbline -1
 0052                   .dbline 115
 0052           ;  //all peripherals are now initialized
 0052           ; }
 0052           ; 
 0052           ; unsigned char read_adc(unsigned char adc_port)
 0052           ; { unsigned int adc_data;
 0052                   .dbline 116
 0052           ;   ADMUX = Vref_type | adc_port;  //设置AD端口
 0052 802F              mov R24,R16
 0054 8066              ori R24,96
 0056 87B9              out 0x7,R24
 0058                   .dbline 117
 0058           ;   ADCSRA |= ADCSRA |(1<<ADSC); //开始转换
 0058 86B1              in R24,0x6
 005A 8064              ori R24,64
 005C 26B0              in R2,0x6
 005E 282A              or R2,R24
 0060 26B8              out 0x6,R2
 0062           L6:
 0062                   .dbline 118
 0062           L7:
 0062                   .dbline 118
 0062           ;   while ((ADCSRA&0x10)==0);  //等待转换完成
 0062 349B              sbis 0x6,4
 0064 FECF              rjmp L6
 0066                   .dbline 119
 0066           ;   ADCSRA |= (1<<ADIF);    //清除标志位
 0066 349A              sbi 0x6,4
 0068                   .dbline 120
 0068           ;   adc_data = ADC;
 0068 44B1              in R20,0x4
 006A 55B1              in R21,0x5
 006C                   .dbline 121
 006C           ;   return ADCH;
 006C 05B1              in R16,0x5

⌨️ 快捷键说明

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