📄 adc.lst
字号:
__text_start:
__start:
0013 E5CF LDI R28,0x5F
0014 E0D4 LDI R29,4
0015 BFCD OUT 0x3D,R28
0016 BFDE OUT 0x3E,R29
0017 51C0 SUBI R28,0x10
0018 40D0 SBCI R29,0
0019 EA0A LDI R16,0xAA
001A 8308 STD Y+0,R16
001B 2400 CLR R0
001C E6E0 LDI R30,0x60
001D E0F0 LDI R31,0
001E E010 LDI R17,0
001F 36E0 CPI R30,0x60
0020 07F1 CPC R31,R17
0021 F011 BEQ 0x0024
0022 9201 ST R0,Z+
0023 CFFB RJMP 0x001F
0024 8300 STD Z+0,R16
0025 E2E6 LDI R30,0x26
0026 E0F0 LDI R31,0
0027 E6A0 LDI R26,0x60
0028 E0B0 LDI R27,0
0029 E010 LDI R17,0
002A 32E6 CPI R30,0x26
002B 07F1 CPC R31,R17
002C F021 BEQ 0x0031
002D 95C8 LPM
002E 9631 ADIW R30,1
002F 920D ST R0,X+
0030 CFF9 RJMP 0x002A
0031 D031 RCALL _main
_exit:
0032 CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\ADC\ADC.C
(0001) /******************************
(0002) NAME: ADC.C
(0003) DATA:2007/5/8
(0004) AUTHOR: DIP STIDIO
(0005) CPU: ATMEGA8
(0006) 8.000MHz
(0007) ******************************/
(0008) #include <iom8v.h>
(0009) #include <macros.h>
(0010) #pragma interrupt_handler USART_receive: 12
(0011) //------------------------------------------------------------------
(0012) // ADC初始化函数
(0013) //------------------------------------------------------------------
(0014) void initial_ADC(void)
(0015) {
(0016) ADMUX=0XE0; //使用片内2.56基准电压,左对齐模式。
_initial_ADC:
0033 EE80 LDI R24,0xE0
0034 B987 OUT 0x07,R24
(0017)
(0018) // ADMUX=0XC0; //使用片内2.56基准电压,右对齐模式。
(0019)
(0020) ADCSRA=0X86; //开启ADC功能,关中断,时钟为系统时钟的64分频(BIT2-BIT0确定分频数)
0035 E886 LDI R24,0x86
0036 B986 OUT 0x06,R24
0037 9508 RET
_ADC_run8bit:
result --> R20
channel --> R16
0038 D038 RCALL push_gset1
(0021)
(0022) }
(0023) //-------------------------------------------------------------------
(0024) // ADC转换函数(8位精度,左对齐,单次采样)
(0025) //-------------------------------------------------------------------
(0026) unsigned char ADC_run8bit(unsigned char channel)//通道号为0X00--0X07
(0027) {
(0028) unsigned char result=0; //转换结果
0039 2744 CLR R20
(0029)
(0030) ADMUX|=channel; //确定通道号
003A B027 IN R2,0x07
003B 2A20 OR R2,R16
003C B827 OUT 0x07,R2
(0031)
(0032) ADCSRA|=0X40; //启动AD转换(通过写ADSC位实现)
003D 9A36 SBI 0x06,6
(0033)
(0034) result=ADCH; //储存采样结果
003E B145 IN R20,0x05
(0035)
(0036) return(result); //返回结果
003F 2F04 MOV R16,R20
0040 D033 RCALL pop_gset1
0041 9508 RET
(0037) }
(0038) /*
(0039) //-------------------------------------------------------------------
(0040) // ADC转换函数(10位精度,左对齐,单次采样)
(0041) //-------------------------------------------------------------------
(0042) int ADC_run16bit(unsigned char channel)//通道号为0X00--0X07
(0043) {
(0044) int result=0; //转换结果
(0045) int RESH=0,RESL=0; //存储高低位结果
(0046)
(0047) ADCMUX|=channel; //确定通道号
(0048)
(0049) ADCSRA|=0X40; //启动AD转换(通过写ADSC位实现)
(0050)
(0051) RESH=ADCH; //储存高位结果
(0052) RESL=ADCL; //储存低位结果
(0053)
(0054) result=(RESH<<8)|RESL;
(0055)
(0056) return(result); //返回结果
(0057) }
(0058) */
(0059) //------------------------------------------------------------------
(0060) // USART初始化函数
(0061) //------------------------------------------------------------------
(0062) void initial_USART(void)
(0063) {
(0064) //-----端口设置--------
(0065) PORTB = 0x00;
_initial_USART:
0042 2422 CLR R2
0043 BA28 OUT 0x18,R2
(0066) DDRB = 0x00;
0044 BA27 OUT 0x17,R2
(0067) PORTC = 0x00;
0045 BA25 OUT 0x15,R2
(0068) DDRC = 0x00;
0046 BA24 OUT 0x14,R2
(0069) PORTD = 0x00;
0047 BA22 OUT 0x12,R2
(0070) DDRD = 0xFF;
0048 EF8F LDI R24,0xFF
0049 BB81 OUT 0x11,R24
(0071) //------USART设置-------
(0072) UCSRA=0X00; //波特率不加倍,同时清空一些标志位
004A B82B OUT 0x0B,R2
(0073) UCSRB=0X98; //使能接收和发送,数据位为8位,开接收中断
004B E988 LDI R24,0x98
004C B98A OUT 0x0A,R24
(0074) UCSRC=0X86; //异步方式,禁止奇偶校验,数据位为8位
004D E886 LDI R24,0x86
004E BD80 OUT 0x20,R24
(0075) //时钟频率8M,波特率9600
(0076) UBRRH=0X00;
004F BC20 OUT 0x20,R2
(0077) UBRRL=0X33;
0050 E383 LDI R24,0x33
0051 B989 OUT 0x09,R24
(0078) //时钟频率8M,波特率57600
(0079) // UBRRH=0X00;
(0080) // UBRRL=0X08;
(0081)
(0082) SEI(); //全局开中断
0052 9478 BSET 7
0053 9508 RET
(0083) }
(0084) //--------------------------------------------------------------
(0085) // 发送函数
(0086) //--------------------------------------------------------------
(0087) void send(unsigned char DAT)
(0088) {
(0089) UDR=DAT; //发送数据
_send:
DAT --> R16
0054 B90C OUT 0x0C,R16
(0090) while ( !( UCSRA & (1<<TXC)) ); //检验TXC位,当TXC=1时可以表示发送完成
0055 9B5E SBIS 0x0B,6
0056 CFFE RJMP 0x0055
0057 9508 RET
_USART_receive:
RECdata --> R22
ADCdata --> R20
0058 D02F RCALL push_lset
0059 D015 RCALL push_gset2
(0091) } //发送移位缓冲器中的数据被送出,且当发送缓冲器 (UDR) 为空时TXC 置位
(0092) //--------------------------------------------------------------
(0093) // 接收中断服务函数
(0094) //--------------------------------------------------------------
(0095) void USART_receive(void)
(0096) { unsigned char ADCdata=0X04;
005A E044 LDI R20,4
(0097) unsigned char RECdata;
(0098) RECdata=UDR;
005B B16C IN R22,0x0C
(0099) ADCdata=ADC_run8bit(RECdata);//AD转换
005C 2F06 MOV R16,R22
005D DFDA RCALL _ADC_run8bit
005E 2F40 MOV R20,R16
(0100) send( ADCdata);
005F DFF4 RCALL _send
0060 D006 RCALL pop_gset2
0061 D03D RCALL pop_lset
0062 9518 RETI
(0101)
(0102) }
(0103) //------------------------------------------------------------------
(0104) // 主函数
(0105) //------------------------------------------------------------------
(0106) void main(void)
(0107) {
(0108) initial_USART();
_main:
0063 DFDE RCALL _initial_USART
(0109) initial_ADC();
0064 DFCE RCALL _initial_ADC
(0110)
(0111) while(1);
FILE: <library>
0065 CFFF RJMP 0x0065
0066 9508 RET
pop_gset2:
0067 E0E2 LDI R30,2
0068 C00C RJMP pop
push_gset5:
0069 92FA ST R15,-Y
006A 92EA ST R14,-Y
push_gset4:
006B 92DA ST R13,-Y
006C 92CA ST R12,-Y
push_gset3:
006D 92BA ST R11,-Y
006E 92AA ST R10,-Y
push_gset2:
006F 937A ST R23,-Y
0070 936A ST R22,-Y
push_gset1:
0071 935A ST R21,-Y
0072 934A ST R20,-Y
0073 9508 RET
pop_gset1:
0074 E0E1 LDI R30,1
pop:
0075 9149 LD R20,Y+
0076 9159 LD R21,Y+
0077 FDE0 SBRC R30,0
0078 9508 RET
0079 9169 LD R22,Y+
007A 9179 LD R23,Y+
007B FDE1 SBRC R30,1
007C 9508 RET
007D 90A9 LD R10,Y+
007E 90B9 LD R11,Y+
007F FDE2 SBRC R30,2
0080 9508 RET
0081 90C9 LD R12,Y+
0082 90D9 LD R13,Y+
0083 FDE3 SBRC R30,3
0084 9508 RET
0085 90E9 LD R14,Y+
0086 90F9 LD R15,Y+
0087 9508 RET
push_lset:
0088 93FA ST R31,-Y
0089 93EA ST R30,-Y
008A 93BA ST R27,-Y
008B 93AA ST R26,-Y
008C 939A ST R25,-Y
008D 938A ST R24,-Y
008E 933A ST R19,-Y
008F 932A ST R18,-Y
0090 931A ST R17,-Y
0091 930A ST R16,-Y
0092 929A ST R9,-Y
0093 928A ST R8,-Y
0094 927A ST R7,-Y
0095 926A ST R6,-Y
0096 925A ST R5,-Y
0097 924A ST R4,-Y
0098 923A ST R3,-Y
0099 922A ST R2,-Y
009A 921A ST R1,-Y
009B 920A ST R0,-Y
009C B60F IN R0,0x3F
009D 920A ST R0,-Y
009E 9508 RET
pop_lset:
009F 9009 LD R0,Y+
00A0 BE0F OUT 0x3F,R0
00A1 9009 LD R0,Y+
00A2 9019 LD R1,Y+
00A3 9029 LD R2,Y+
00A4 9039 LD R3,Y+
00A5 9049 LD R4,Y+
00A6 9059 LD R5,Y+
00A7 9069 LD R6,Y+
00A8 9079 LD R7,Y+
00A9 9089 LD R8,Y+
00AA 9099 LD R9,Y+
00AB 9109 LD R16,Y+
00AC 9119 LD R17,Y+
00AD 9129 LD R18,Y+
00AE 9139 LD R19,Y+
00AF 9189 LD R24,Y+
00B0 9199 LD R25,Y+
00B1 91A9 LD R26,Y+
00B2 91B9 LD R27,Y+
00B3 91E9 LD R30,Y+
00B4 91F9 LD R31,Y+
00B5 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -