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

📄 adc.lst

📁 用ATMEGA16实现AD转换并通过串口将数据传回PC机
💻 LST
字号:
__start:
__text_start:
    002A E5CF      LDI	R28,0x5F
    002B E0D4      LDI	R29,4
    002C BFCD      OUT	0x3D,R28
    002D BFDE      OUT	0x3E,R29
    002E 51C0      SUBI	R28,0x10
    002F 40D0      SBCI	R29,0
    0030 EA0A      LDI	R16,0xAA
    0031 8308      STD	Y+0,R16
    0032 2400      CLR	R0
    0033 E6E0      LDI	R30,0x60
    0034 E0F0      LDI	R31,0
    0035 E010      LDI	R17,0
    0036 36E0      CPI	R30,0x60
    0037 07F1      CPC	R31,R17
    0038 F011      BEQ	0x003B
    0039 9201      ST	R0,Z+
    003A CFFB      RJMP	0x0036
    003B 8300      STD	Z+0,R16
    003C E5E4      LDI	R30,0x54
    003D E0F0      LDI	R31,0
    003E E6A0      LDI	R26,0x60
    003F E0B0      LDI	R27,0
    0040 E010      LDI	R17,0
    0041 35E4      CPI	R30,0x54
    0042 07F1      CPC	R31,R17
    0043 F021      BEQ	0x0048
    0044 95C8      LPM
    0045 9631      ADIW	R30,1
    0046 920D      ST	R0,X+
    0047 CFF9      RJMP	0x0041
    0048 940E00E9  CALL	_main
_exit:
    004A CFFF      RJMP	_exit
FILE: E:\projects\AVR\ADC\adc.c
(0001) //ICC-AVR application builder : 2009-2-5 19:27:04
(0002) // Target : M16
(0003) // Crystal: 4.0000Mhz INTERNAL
(0004) 
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) 
(0008) #define PIN_RXD    0   //PD0    RXD
(0009) #define PIN_TXD    1   //PD1    TXD
(0010) 
(0011) #define AD_SE_ADC0 0x00 //ADC0 
(0012) #define AD_SE_ADC1 0x01 //ADC1 
(0013) #define AD_SE_ADC2 0x02 //ADC2 
(0014) #define AD_SE_ADC3 0x03 //ADC3 
(0015) #define AD_SE_ADC4 0x04 //ADC4 
(0016) #define AD_SE_ADC5 0x05 //ADC5 
(0017) #define AD_SE_ADC6 0x06 //ADC6 
(0018) 
(0019) #define Vref 2650 //mV,参考电压,内部提供
(0020) #define Vref_type 0x60  //RIGHT对齐
(0021) 
(0022) /* 
(0023) ADMUX (ADC Multiplexer Select Register) 
(0024)                    bit7  bit6  
(0025)                    REFS1 REFS0  参考电压选择  
(0026)                     0     0     AREF,内部Vref关闭  
(0027)                     0     1     AVCC,AREF引脚外加滤波电容  
(0028)                     1     0     保留  
(0029)                     1     1     2.56V的片内基准电压源,AREF引脚外加滤波电容  
(0030)                    bit5         ADC结果左对齐选择 1=左对齐  0=右对齐 
(0031)                    bit4~0       选择32通道   
(0032) */ 
(0033) 
(0034) /*   
(0035)                      ADCSRA (ADC Control and Status Register A) 
(0036)                       bit7   ADEN ADC使能=1 
(0037)                       bit6   ADSC 启动ADC开始转换=1 
(0038)                       bit5   ADATE 自己触发使能 
(0039)                       bit4   ADIF ADC中断标志 
(0040)                       bit3   ADIE ADC中断使能 
(0041)                       bit2:0 ADC 预分频选择位 111=128时钟分频 
(0042) */  
(0043) 
(0044) void port_init(void)
(0045) {
(0046)  PORTA = 0x00;
_port_init:
    004B 2422      CLR	R2
    004C BA2B      OUT	0x1B,R2
(0047)  DDRA  = 0x00;
    004D BA2A      OUT	0x1A,R2
(0048)  PORTB = 0x00;
    004E BA28      OUT	0x18,R2
(0049)  DDRB  = 0x00;
    004F BA27      OUT	0x17,R2
(0050)  PORTC = 0x00; //m103 output only
    0050 BA25      OUT	0x15,R2
(0051)  DDRC  = 0x00;
    0051 BA24      OUT	0x14,R2
(0052)  PORTD = 0x00;
    0052 BA22      OUT	0x12,R2
(0053)  DDRD  = 0x00;
    0053 BA21      OUT	0x11,R2
    0054 9508      RET
(0054) }
(0055) 
(0056) //UART0 initialize
(0057) // desired baud rate: 9600
(0058) // actual: baud rate:4808 (0.2%)
(0059) // char size: 8 bit
(0060) // parity: Disabled
(0061) void uart0_init(void)
(0062) {
(0063)  UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
    0055 2422      CLR	R2
    0056 B82A      OUT	0x0A,R2
(0064)  UCSRA = 0x00;
    0057 B82B      OUT	0x0B,R2
(0065)  //设置帧格式: 8 个数据位, 1 个停止位
(0066)  UCSRC = (1<<URSEL)|(3<<UCSZ0);
    0058 E886      LDI	R24,0x86
    0059 BD80      OUT	0x20,R24
(0067)  //设置波特率
(0068)  UBRRL = 0x19; //set baud rate lo
    005A E189      LDI	R24,0x19
    005B B989      OUT	0x09,R24
(0069)  UBRRH = 0x00; //set baud rate hi
    005C BC20      OUT	0x20,R2
(0070)  // 接收器与发送器使能
(0071)  UCSRB = (1<<TXEN);
    005D E088      LDI	R24,0x8
    005E B98A      OUT	0x0A,R24
    005F 9508      RET
(0072) }
(0073) 
(0074) /*
(0075) void USART_Init( unsigned int baud )
(0076) {
(0077) //设置波特率
(0078) UBRRH = (unsigned char)(baud>>8);
(0079) UBRRL = (unsigned char)baud;
(0080) // 接收器与发送器使能
(0081) UCSRB = (1<<RXEN)|(1<<TXEN);
(0082) //设置帧格式: 8 个数据位, 2 个停止位
(0083) UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
(0084) }
(0085) */
(0086) 
(0087) //ADC initialize
(0088) // Conversion time: 13uS
(0089) void adc_init(void)
(0090) {
(0091)  ADCSR = 0x00; //disable adc
_adc_init:
    0060 2422      CLR	R2
    0061 B826      OUT	0x06,R2
(0092)  ADMUX = 0x00; //select adc input 0
    0062 B827      OUT	0x07,R2
(0093)  ACSR  = 0x80;
    0063 E880      LDI	R24,0x80
    0064 B988      OUT	0x08,R24
(0094)  ADCSRA=(1<<ADEN)|(0<<ADSC)|(0<<ADIE)|(1<<ADPS2)|(0<<ADPS1)|(0<<ADPS0); 
    0065 E884      LDI	R24,0x84
    0066 B986      OUT	0x06,R24
    0067 9508      RET
(0095)  //ADCSR = 0x84;
(0096) }
(0097) 
(0098) //call this routine to initialize all peripherals
(0099) void init_devices(void)
(0100) {
(0101)  //stop errant interrupts until set up
(0102)  CLI(); //disable all interrupts
_init_devices:
    0068 94F8      BCLR	7
(0103)  port_init();
    0069 DFE1      RCALL	_port_init
(0104)  adc_init();
    006A DFF5      RCALL	_adc_init
(0105)  uart0_init();
    006B DFE9      RCALL	_uart0_init
(0106) 
(0107)  MCUCR = 0x00;
    006C 2422      CLR	R2
    006D BE25      OUT	0x35,R2
(0108)  GICR  = 0x00;
    006E BE2B      OUT	0x3B,R2
(0109)  TIMSK = 0x00; //timer interrupt sources
    006F BE29      OUT	0x39,R2
(0110)  SEI(); //re-enable interrupts
    0070 9478      BSET	7
    0071 9508      RET
_read_adc:
  adc_data             --> R20
  adc_port             --> R16
    0072 940E011B  CALL	push_gset1
(0111)  //all peripherals are now initialized
(0112) }
(0113) 
(0114) unsigned char read_adc(unsigned char adc_port)
(0115) { unsigned int adc_data;
(0116)   ADMUX = Vref_type | adc_port;  //设置AD端口
    0074 2F80      MOV	R24,R16
    0075 6680      ORI	R24,0x60
    0076 B987      OUT	0x07,R24
(0117)   ADCSRA |= ADCSRA |(1<<ADSC); //开始转换
    0077 B186      IN	R24,0x06
    0078 6480      ORI	R24,0x40
    0079 B026      IN	R2,0x06
    007A 2A28      OR	R2,R24
    007B B826      OUT	0x06,R2
(0118)   while ((ADCSRA&0x10)==0);  //等待转换完成
    007C 9B34      SBIS	0x06,4
    007D CFFE      RJMP	0x007C
(0119)   ADCSRA |= (1<<ADIF);    //清除标志位
    007E 9A34      SBI	0x06,4
(0120)   adc_data = ADC;
    007F B144      IN	R20,0x04
    0080 B155      IN	R21,0x05
(0121)   return ADCH;
    0081 B105      IN	R16,0x05
    0082 940E011E  CALL	pop_gset1
    0084 9508      RET
(0122) }
(0123) 
(0124) void uart_transmit( unsigned char data )
(0125) {
(0126) /* 等待发送缓冲器为空 */
(0127) while ( !( UCSRA & (1<<UDRE)) );
_uart_transmit:
  data                 --> R16
    0085 9B5D      SBIS	0x0B,5
    0086 CFFE      RJMP	_uart_transmit
(0128) /* 将数据放入缓冲器,发送数据 */
(0129) UDR = data;
    0087 B90C      OUT	0x0C,R16
    0088 9508      RET
_delay:
  j                    --> Y+4
  i                    --> Y+0
  a                    --> Y+12
    0089 940E010B  CALL	push_arg4
    008B 940E0119  CALL	push_gset2
    008D 9728      SBIW	R28,0x8
(0130) }
(0131) 
(0132) void delay(unsigned long a)
(0133) {
(0134)     unsigned long i,j;
(0135)     for(i = 0; i < a; i ++);
    008E E040      LDI	R20,0
    008F E050      LDI	R21,0
    0090 E060      LDI	R22,0
    0091 E070      LDI	R23,0
    0092 01FE      MOVW	R30,R28
    0093 8340      STD	Z+0,R20
    0094 8351      STD	Z+1,R21
    0095 8362      STD	Z+2,R22
    0096 8373      STD	Z+3,R23
    0097 C012      RJMP	0x00AA
    0098 E041      LDI	R20,1
    0099 E050      LDI	R21,0
    009A E060      LDI	R22,0
    009B E070      LDI	R23,0
    009C 01FE      MOVW	R30,R28
    009D 8020      LDD	R2,Z+0
    009E 8031      LDD	R3,Z+1
    009F 8042      LDD	R4,Z+2
    00A0 8053      LDD	R5,Z+3
    00A1 0E24      ADD	R2,R20
    00A2 1E35      ADC	R3,R21
    00A3 1E46      ADC	R4,R22
    00A4 1E57      ADC	R5,R23
    00A5 01FE      MOVW	R30,R28
    00A6 8220      STD	Z+0,R2
    00A7 8231      STD	Z+1,R3
    00A8 8242      STD	Z+2,R4
    00A9 8253      STD	Z+3,R5
    00AA 01FE      MOVW	R30,R28
    00AB 8424      LDD	R2,Z+12
    00AC 8435      LDD	R3,Z+13
    00AD 8446      LDD	R4,Z+14
    00AE 8457      LDD	R5,Z+15
    00AF 01FE      MOVW	R30,R28
    00B0 8060      LDD	R6,Z+0
    00B1 8071      LDD	R7,Z+1
    00B2 8082      LDD	R8,Z+2
    00B3 8093      LDD	R9,Z+3
    00B4 1462      CP	R6,R2
    00B5 0473      CPC	R7,R3
    00B6 0484      CPC	R8,R4
    00B7 0495      CPC	R9,R5
    00B8 F2F8      BCS	0x0098
(0136) 	  {for (j = 0; j < a; j ++)
    00B9 E040      LDI	R20,0
    00BA E050      LDI	R21,0
    00BB E060      LDI	R22,0
    00BC E070      LDI	R23,0
    00BD 01FE      MOVW	R30,R28
    00BE 8344      STD	Z+4,R20
    00BF 8355      STD	Z+5,R21
    00C0 8366      STD	Z+6,R22
    00C1 8377      STD	Z+7,R23
    00C2 C012      RJMP	0x00D5
    00C3 E041      LDI	R20,1
    00C4 E050      LDI	R21,0
    00C5 E060      LDI	R22,0
    00C6 E070      LDI	R23,0
    00C7 01FE      MOVW	R30,R28
    00C8 8024      LDD	R2,Z+4
    00C9 8035      LDD	R3,Z+5
    00CA 8046      LDD	R4,Z+6
    00CB 8057      LDD	R5,Z+7
    00CC 0E24      ADD	R2,R20
    00CD 1E35      ADC	R3,R21
    00CE 1E46      ADC	R4,R22
    00CF 1E57      ADC	R5,R23
    00D0 01FE      MOVW	R30,R28
    00D1 8224      STD	Z+4,R2
    00D2 8235      STD	Z+5,R3
    00D3 8246      STD	Z+6,R4
    00D4 8257      STD	Z+7,R5
    00D5 01FE      MOVW	R30,R28
    00D6 8424      LDD	R2,Z+12
    00D7 8435      LDD	R3,Z+13
    00D8 8446      LDD	R4,Z+14
    00D9 8457      LDD	R5,Z+15
    00DA 01FE      MOVW	R30,R28
    00DB 8064      LDD	R6,Z+4
    00DC 8075      LDD	R7,Z+5
    00DD 8086      LDD	R8,Z+6
    00DE 8097      LDD	R9,Z+7
    00DF 1462      CP	R6,R2
    00E0 0473      CPC	R7,R3
    00E1 0484      CPC	R8,R4
    00E2 0495      CPC	R9,R5
    00E3 F2F8      BCS	0x00C3
(0137) 	     {}
(0138) 	  }
    00E4 9628      ADIW	R28,0x8
    00E5 940E0110  CALL	pop_gset2
    00E7 9624      ADIW	R28,4
    00E8 9508      RET
_main:
  volt                 --> Y+0
  adc_tmp              --> R10
    00E9 9724      SBIW	R28,4
(0139) }
(0140) 
(0141) void main(void)
(0142) { unsigned long volt;
(0143)   unsigned char adc_tmp;
(0144)   init_devices();
    00EA DF7D      RCALL	_init_devices
(0145)   
(0146)   DDRA = 0x00;   //设置A口为不带上拉输入;
    00EB 2422      CLR	R2
    00EC BA2A      OUT	0x1A,R2
(0147)   PORTA= 0x00;
    00ED BA2B      OUT	0x1B,R2
(0148)   DDRD = 0xff;   //设置C口为输出口;
    00EE EF8F      LDI	R24,0xFF
    00EF BB81      OUT	0x11,R24
(0149)   PORTD= 0xff;
    00F0 BB82      OUT	0x12,R24
(0150)   //DDRD = 0xff;
(0151)   DDRD = (1<<PIN_TXD);         //TXD为输出
    00F1 E082      LDI	R24,2
    00F2 BB81      OUT	0x11,R24
(0152)   PORTD =0xFF;
    00F3 EF8F      LDI	R24,0xFF
    00F4 BB82      OUT	0x12,R24
(0153) 
(0154)   
(0155)   ADMUX = Vref_type;   //选择第一通道ADC0;
    00F5 E680      LDI	R24,0x60
    00F6 B987      OUT	0x07,R24
(0156)   ADCSRA = 0x84;   //自由转换模式;启动A/D转换;
    00F7 E884      LDI	R24,0x84
    00F8 B986      OUT	0x06,R24
(0157)   delay(10000);   //延时待系统稳定;
    00F9 E100      LDI	R16,0x10
    00FA E217      LDI	R17,0x27
    00FB E020      LDI	R18,0
    00FC E030      LDI	R19,0
    00FD DF8B      RCALL	_delay
    00FE C009      RJMP	0x0108
(0158)   while(1)
(0159)     {
(0160)         //volt = read_adc(AD_SE_ADC0);   //获取A/D转换数据
(0161)         //volt = (volt * Vref)/1024;
(0162) 		adc_tmp = read_adc(AD_SE_ADC1);
    00FF E001      LDI	R16,1
    0100 DF71      RCALL	_read_adc
    0101 2EA0      MOV	R10,R16
(0163) 		//PORTD = adc_tmp;
(0164) 		uart_transmit(adc_tmp);
    0102 DF82      RCALL	_uart_transmit
(0165)         delay(50000);
FILE: <library>
    0103 E500      LDI	R16,0x50
    0104 EC13      LDI	R17,0xC3
    0105 E020      LDI	R18,0
    0106 E030      LDI	R19,0
    0107 DF81      RCALL	_delay
    0108 CFF6      RJMP	0x00FF
    0109 9624      ADIW	R28,4
    010A 9508      RET
push_arg4:
    010B 933A      ST	R19,-Y
    010C 932A      ST	R18,-Y
push_arg2:
    010D 931A      ST	R17,-Y
    010E 930A      ST	R16,-Y
    010F 9508      RET
pop_gset2:
    0110 E0E2      LDI	R30,2
    0111 940C011F  JMP	pop
push_gset5:
    0113 92FA      ST	R15,-Y
    0114 92EA      ST	R14,-Y
push_gset4:
    0115 92DA      ST	R13,-Y
    0116 92CA      ST	R12,-Y
push_gset3:
    0117 92BA      ST	R11,-Y
    0118 92AA      ST	R10,-Y
push_gset2:
    0119 937A      ST	R23,-Y
    011A 936A      ST	R22,-Y
push_gset1:
    011B 935A      ST	R21,-Y
    011C 934A      ST	R20,-Y
    011D 9508      RET
pop_gset1:
    011E E0E1      LDI	R30,1
pop:
    011F 9149      LD	R20,Y+
    0120 9159      LD	R21,Y+
    0121 FDE0      SBRC	R30,0
    0122 9508      RET
    0123 9169      LD	R22,Y+
    0124 9179      LD	R23,Y+
    0125 FDE1      SBRC	R30,1
    0126 9508      RET
    0127 90A9      LD	R10,Y+
    0128 90B9      LD	R11,Y+
    0129 FDE2      SBRC	R30,2
    012A 9508      RET
    012B 90C9      LD	R12,Y+
    012C 90D9      LD	R13,Y+
    012D FDE3      SBRC	R30,3
    012E 9508      RET
    012F 90E9      LD	R14,Y+
    0130 90F9      LD	R15,Y+
    0131 9508      RET

⌨️ 快捷键说明

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