📄 adc.s
字号:
.module ADC.C
.area vector(rom, abs)
.org 22
rjmp _USART_receive
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\ADC\ADC.C
.dbfunc e initial_ADC _initial_ADC fV
.even
_initial_ADC::
.dbline -1
.dbline 15
; /******************************
; NAME: ADC.C
; DATA:2007/5/8
; AUTHOR: DIP STIDIO
; CPU: ATMEGA8
; 8.000MHz
; ******************************/
; #include <iom8v.h>
; #include <macros.h>
; #pragma interrupt_handler USART_receive: 12
; //------------------------------------------------------------------
; // ADC初始化函数
; //------------------------------------------------------------------
; void initial_ADC(void)
; {
.dbline 16
; ADMUX=0XE0; //使用片内2.56基准电压,左对齐模式。
ldi R24,224
out 0x7,R24
.dbline 20
;
; // ADMUX=0XC0; //使用片内2.56基准电压,右对齐模式。
;
; ADCSRA=0X86; //开启ADC功能,关中断,时钟为系统时钟的64分频(BIT2-BIT0确定分频数)
ldi R24,134
out 0x6,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ADC_run8bit _ADC_run8bit fc
; result -> R20
; channel -> R16
.even
_ADC_run8bit::
rcall push_gset1
.dbline -1
.dbline 27
;
; }
; //-------------------------------------------------------------------
; // ADC转换函数(8位精度,左对齐,单次采样)
; //-------------------------------------------------------------------
; unsigned char ADC_run8bit(unsigned char channel)//通道号为0X00--0X07
; {
.dbline 28
; unsigned char result=0; //转换结果
clr R20
.dbline 30
;
; ADMUX|=channel; //确定通道号
in R2,0x7
or R2,R16
out 0x7,R2
.dbline 32
;
; ADCSRA|=0X40; //启动AD转换(通过写ADSC位实现)
sbi 0x6,6
.dbline 34
;
; result=ADCH; //储存采样结果
in R20,0x5
.dbline 36
;
; return(result); //返回结果
mov R16,R20
.dbline -2
L2:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r result 20 c
.dbsym r channel 16 c
.dbend
.dbfunc e initial_USART _initial_USART fV
.even
_initial_USART::
.dbline -1
.dbline 63
; }
; /*
; //-------------------------------------------------------------------
; // ADC转换函数(10位精度,左对齐,单次采样)
; //-------------------------------------------------------------------
; int ADC_run16bit(unsigned char channel)//通道号为0X00--0X07
; {
; int result=0; //转换结果
; int RESH=0,RESL=0; //存储高低位结果
;
; ADCMUX|=channel; //确定通道号
;
; ADCSRA|=0X40; //启动AD转换(通过写ADSC位实现)
;
; RESH=ADCH; //储存高位结果
; RESL=ADCL; //储存低位结果
;
; result=(RESH<<8)|RESL;
;
; return(result); //返回结果
; }
; */
; //------------------------------------------------------------------
; // USART初始化函数
; //------------------------------------------------------------------
; void initial_USART(void)
; {
.dbline 65
; //-----端口设置--------
; PORTB = 0x00;
clr R2
out 0x18,R2
.dbline 66
; DDRB = 0x00;
out 0x17,R2
.dbline 67
; PORTC = 0x00;
out 0x15,R2
.dbline 68
; DDRC = 0x00;
out 0x14,R2
.dbline 69
; PORTD = 0x00;
out 0x12,R2
.dbline 70
; DDRD = 0xFF;
ldi R24,255
out 0x11,R24
.dbline 72
; //------USART设置-------
; UCSRA=0X00; //波特率不加倍,同时清空一些标志位
out 0xb,R2
.dbline 73
; UCSRB=0X98; //使能接收和发送,数据位为8位,开接收中断
ldi R24,152
out 0xa,R24
.dbline 74
; UCSRC=0X86; //异步方式,禁止奇偶校验,数据位为8位
ldi R24,134
out 0x20,R24
.dbline 76
; //时钟频率8M,波特率9600
; UBRRH=0X00;
out 0x20,R2
.dbline 77
; UBRRL=0X33;
ldi R24,51
out 0x9,R24
.dbline 82
; //时钟频率8M,波特率57600
; // UBRRH=0X00;
; // UBRRL=0X08;
;
; SEI(); //全局开中断
sei
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbend
.dbfunc e send _send fV
; DAT -> R16
.even
_send::
.dbline -1
.dbline 88
; }
; //--------------------------------------------------------------
; // 发送函数
; //--------------------------------------------------------------
; void send(unsigned char DAT)
; {
.dbline 89
; UDR=DAT; //发送数据
out 0xc,R16
L5:
.dbline 90
L6:
.dbline 90
; while ( !( UCSRA & (1<<TXC)) ); //检验TXC位,当TXC=1时可以表示发送完成
sbis 0xb,6
rjmp L5
.dbline -2
L4:
.dbline 0 ; func end
ret
.dbsym r DAT 16 c
.dbend
.dbfunc e USART_receive _USART_receive fV
; RECdata -> R22
; ADCdata -> R20
.even
_USART_receive::
rcall push_lset
rcall push_gset2
.dbline -1
.dbline 96
; } //发送移位缓冲器中的数据被送出,且当发送缓冲器 (UDR) 为空时TXC 置位
; //--------------------------------------------------------------
; // 接收中断服务函数
; //--------------------------------------------------------------
; void USART_receive(void)
; { unsigned char ADCdata=0X04;
.dbline 96
ldi R20,4
.dbline 98
; unsigned char RECdata;
; RECdata=UDR;
in R22,0xc
.dbline 99
; ADCdata=ADC_run8bit(RECdata);//AD转换
mov R16,R22
rcall _ADC_run8bit
mov R20,R16
.dbline 100
; send( ADCdata);
rcall _send
.dbline -2
L8:
rcall pop_gset2
rcall pop_lset
.dbline 0 ; func end
reti
.dbsym r RECdata 22 c
.dbsym r ADCdata 20 c
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 107
;
; }
; //------------------------------------------------------------------
; // 主函数
; //------------------------------------------------------------------
; void main(void)
; {
.dbline 108
; initial_USART();
rcall _initial_USART
.dbline 109
; initial_ADC();
rcall _initial_ADC
L10:
.dbline 111
L11:
.dbline 111
rjmp L10
X0:
.dbline -2
L9:
.dbline 0 ; func end
ret
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -