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

📄 adc.s

📁 用ATMEGA16实现AD转换并通过串口将数据传回PC机
💻 S
字号:
	.module adc.c
	.area text(rom, con, rel)
	.dbfile E:\projects\AVR\ADC\adc.c
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 45
; //ICC-AVR application builder : 2009-2-5 19:27:04
; // Target : M16
; // Crystal: 4.0000Mhz INTERNAL
; 
; #include <iom16v.h>
; #include <macros.h>
; 
; #define PIN_RXD    0   //PD0    RXD
; #define PIN_TXD    1   //PD1    TXD
; 
; #define AD_SE_ADC0 0x00 //ADC0 
; #define AD_SE_ADC1 0x01 //ADC1 
; #define AD_SE_ADC2 0x02 //ADC2 
; #define AD_SE_ADC3 0x03 //ADC3 
; #define AD_SE_ADC4 0x04 //ADC4 
; #define AD_SE_ADC5 0x05 //ADC5 
; #define AD_SE_ADC6 0x06 //ADC6 
; 
; #define Vref 2650 //mV,参考电压,内部提供
; #define Vref_type 0x60  //RIGHT对齐
; 
; /* 
; ADMUX (ADC Multiplexer Select Register) 
;                    bit7  bit6  
;                    REFS1 REFS0  参考电压选择  
;                     0     0     AREF,内部Vref关闭  
;                     0     1     AVCC,AREF引脚外加滤波电容  
;                     1     0     保留  
;                     1     1     2.56V的片内基准电压源,AREF引脚外加滤波电容  
;                    bit5         ADC结果左对齐选择 1=左对齐  0=右对齐 
;                    bit4~0       选择32通道   
; */ 
; 
; /*   
;                      ADCSRA (ADC Control and Status Register A) 
;                       bit7   ADEN ADC使能=1 
;                       bit6   ADSC 启动ADC开始转换=1 
;                       bit5   ADATE 自己触发使能 
;                       bit4   ADIF ADC中断标志 
;                       bit3   ADIE ADC中断使能 
;                       bit2:0 ADC 预分频选择位 111=128时钟分频 
; */  
; 
; void port_init(void)
; {
	.dbline 46
;  PORTA = 0x00;
	clr R2
	out 0x1b,R2
	.dbline 47
;  DDRA  = 0x00;
	out 0x1a,R2
	.dbline 48
;  PORTB = 0x00;
	out 0x18,R2
	.dbline 49
;  DDRB  = 0x00;
	out 0x17,R2
	.dbline 50
;  PORTC = 0x00; //m103 output only
	out 0x15,R2
	.dbline 51
;  DDRC  = 0x00;
	out 0x14,R2
	.dbline 52
;  PORTD = 0x00;
	out 0x12,R2
	.dbline 53
;  DDRD  = 0x00;
	out 0x11,R2
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e uart0_init _uart0_init fV
	.even
_uart0_init::
	.dbline -1
	.dbline 62
; }
; 
; //UART0 initialize
; // desired baud rate: 9600
; // actual: baud rate:4808 (0.2%)
; // char size: 8 bit
; // parity: Disabled
; void uart0_init(void)
; {
	.dbline 63
;  UCSRB = 0x00; //disable while setting baud rate
	clr R2
	out 0xa,R2
	.dbline 64
;  UCSRA = 0x00;
	out 0xb,R2
	.dbline 66
;  //设置帧格式: 8 个数据位, 1 个停止位
;  UCSRC = (1<<URSEL)|(3<<UCSZ0);
	ldi R24,134
	out 0x20,R24
	.dbline 68
;  //设置波特率
;  UBRRL = 0x19; //set baud rate lo
	ldi R24,25
	out 0x9,R24
	.dbline 69
;  UBRRH = 0x00; //set baud rate hi
	out 0x20,R2
	.dbline 71
;  // 接收器与发送器使能
;  UCSRB = (1<<TXEN);
	ldi R24,8
	out 0xa,R24
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e adc_init _adc_init fV
	.even
_adc_init::
	.dbline -1
	.dbline 90
; }
; 
; /*
; void USART_Init( unsigned int baud )
; {
; //设置波特率
; UBRRH = (unsigned char)(baud>>8);
; UBRRL = (unsigned char)baud;
; // 接收器与发送器使能
; UCSRB = (1<<RXEN)|(1<<TXEN);
; //设置帧格式: 8 个数据位, 2 个停止位
; UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
; }
; */
; 
; //ADC initialize
; // Conversion time: 13uS
; void adc_init(void)
; {
	.dbline 91
;  ADCSR = 0x00; //disable adc
	clr R2
	out 0x6,R2
	.dbline 92
;  ADMUX = 0x00; //select adc input 0
	out 0x7,R2
	.dbline 93
;  ACSR  = 0x80;
	ldi R24,128
	out 0x8,R24
	.dbline 94
;  ADCSRA=(1<<ADEN)|(0<<ADSC)|(0<<ADIE)|(1<<ADPS2)|(0<<ADPS1)|(0<<ADPS0); 
	ldi R24,132
	out 0x6,R24
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e init_devices _init_devices fV
	.even
_init_devices::
	.dbline -1
	.dbline 100
;  //ADCSR = 0x84;
; }
; 
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
	.dbline 102
;  //stop errant interrupts until set up
;  CLI(); //disable all interrupts
	cli
	.dbline 103
;  port_init();
	xcall _port_init
	.dbline 104
;  adc_init();
	xcall _adc_init
	.dbline 105
;  uart0_init();
	xcall _uart0_init
	.dbline 107
; 
;  MCUCR = 0x00;
	clr R2
	out 0x35,R2
	.dbline 108
;  GICR  = 0x00;
	out 0x3b,R2
	.dbline 109
;  TIMSK = 0x00; //timer interrupt sources
	out 0x39,R2
	.dbline 110
;  SEI(); //re-enable interrupts
	sei
	.dbline -2
L4:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e read_adc _read_adc fc
;       adc_data -> R20,R21
;       adc_port -> R16
	.even
_read_adc::
	xcall push_gset1
	.dbline -1
	.dbline 115
;  //all peripherals are now initialized
; }
; 
; unsigned char read_adc(unsigned char adc_port)
; { unsigned int adc_data;
	.dbline 116
;   ADMUX = Vref_type | adc_port;  //设置AD端口
	mov R24,R16
	ori R24,96
	out 0x7,R24
	.dbline 117
;   ADCSRA |= ADCSRA |(1<<ADSC); //开始转换
	in R24,0x6
	ori R24,64
	in R2,0x6
	or R2,R24
	out 0x6,R2
L6:
	.dbline 118
L7:
	.dbline 118
;   while ((ADCSRA&0x10)==0);  //等待转换完成
	sbis 0x6,4
	rjmp L6
	.dbline 119
;   ADCSRA |= (1<<ADIF);    //清除标志位
	sbi 0x6,4
	.dbline 120
;   adc_data = ADC;
	in R20,0x4
	in R21,0x5
	.dbline 121
;   return ADCH;
	in R16,0x5
	.dbline -2
L5:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r adc_data 20 i
	.dbsym r adc_port 16 c
	.dbend
	.dbfunc e uart_transmit _uart_transmit fV
;           data -> R16
	.even
_uart_transmit::
	.dbline -1
	.dbline 125
; }
; 
; void uart_transmit( unsigned char data )
; {
L10:
	.dbline 127
L11:
	.dbline 127
; /* 等待发送缓冲器为空 */
; while ( !( UCSRA & (1<<UDRE)) );
	sbis 0xb,5
	rjmp L10
	.dbline 129
; /* 将数据放入缓冲器,发送数据 */
; UDR = data;
	out 0xc,R16
	.dbline -2
L9:
	.dbline 0 ; func end
	ret
	.dbsym r data 16 c
	.dbend
	.dbfunc e delay _delay fV
;              j -> y+4
;              i -> y+0
;              a -> y+12
	.even
_delay::
	xcall push_arg4
	xcall push_gset2
	sbiw R28,8
	.dbline -1
	.dbline 133
; }
; 
; void delay(unsigned long a)
; {
	.dbline 135
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	xjmp L17
L14:
	.dbline 135
L15:
	.dbline 135
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	movw R30,R28
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
L17:
	.dbline 135
;     unsigned long i,j;
;     for(i = 0; i < a; i ++);
	movw R30,R28
	ldd R2,z+12
	ldd R3,z+13
	ldd R4,z+14
	ldd R5,z+15
	movw R30,R28
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brlo L14
	.dbline 136
; 	  {for (j = 0; j < a; j ++)
	.dbline 136
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+4,R20
	std z+5,R21
	std z+6,R22
	std z+7,R23
	xjmp L21
L18:
	.dbline 137
	.dbline 137
L19:
	.dbline 136
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	movw R30,R28
	std z+4,R2
	std z+5,R3
	std z+6,R4
	std z+7,R5
L21:
	.dbline 136
	movw R30,R28
	ldd R2,z+12
	ldd R3,z+13
	ldd R4,z+14
	ldd R5,z+15
	movw R30,R28
	ldd R6,z+4
	ldd R7,z+5
	ldd R8,z+6
	ldd R9,z+7
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brlo L18
	.dbline 138
; 	     {}
; 	  }
	.dbline -2
L13:
	adiw R28,8
	xcall pop_gset2
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym l j 4 l
	.dbsym l i 0 l
	.dbsym l a 12 l
	.dbend
	.dbfunc e main _main fV
;           volt -> y+0
;        adc_tmp -> R10
	.even
_main::
	sbiw R28,4
	.dbline -1
	.dbline 142
; }
; 
; void main(void)
; { unsigned long volt;
	.dbline 144
;   unsigned char adc_tmp;
;   init_devices();
	xcall _init_devices
	.dbline 146
;   
;   DDRA = 0x00;   //设置A口为不带上拉输入;
	clr R2
	out 0x1a,R2
	.dbline 147
;   PORTA= 0x00;
	out 0x1b,R2
	.dbline 148
;   DDRD = 0xff;   //设置C口为输出口;
	ldi R24,255
	out 0x11,R24
	.dbline 149
;   PORTD= 0xff;
	out 0x12,R24
	.dbline 151
;   //DDRD = 0xff;
;   DDRD = (1<<PIN_TXD);         //TXD为输出
	ldi R24,2
	out 0x11,R24
	.dbline 152
;   PORTD =0xFF;
	ldi R24,255
	out 0x12,R24
	.dbline 155
; 
;   
;   ADMUX = Vref_type;   //选择第一通道ADC0;
	ldi R24,96
	out 0x7,R24
	.dbline 156
;   ADCSRA = 0x84;   //自由转换模式;启动A/D转换;
	ldi R24,132
	out 0x6,R24
	.dbline 157
;   delay(10000);   //延时待系统稳定;
	ldi R16,16
	ldi R17,39
	ldi R18,0
	ldi R19,0
	xcall _delay
	xjmp L24
L23:
	.dbline 159
	.dbline 162
	ldi R16,1
	xcall _read_adc
	mov R10,R16
	.dbline 164
	xcall _uart_transmit
	.dbline 165
	ldi R16,80
	ldi R17,195
	ldi R18,0
	ldi R19,0
	xcall _delay
	.dbline 168
L24:
	.dbline 158
	xjmp L23
X0:
	.dbline -2
L22:
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym l volt 0 l
	.dbsym r adc_tmp 10 c
	.dbend

⌨️ 快捷键说明

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