📄 adc.lst
字号:
__text_start:
__start:
0034 E5CF LDI R28,0x5F
0035 E0D4 LDI R29,4
0036 BFCD OUT 0x3D,R28
0037 BFDE OUT 0x3E,R29
0038 51C0 SUBI R28,0x10
0039 40D0 SBCI R29,0
003A EA0A LDI R16,0xAA
003B 8308 STD Y+0,R16
003C 2400 CLR R0
003D E7E4 LDI R30,0x74
003E E0F0 LDI R31,0
003F E010 LDI R17,0
0040 37E6 CPI R30,0x76
0041 07F1 CPC R31,R17
0042 F011 BEQ 0x0045
0043 9201 ST R0,Z+
0044 CFFB RJMP 0x0040
0045 8300 STD Z+0,R16
0046 E5E4 LDI R30,0x54
0047 E0F0 LDI R31,0
0048 E6A0 LDI R26,0x60
0049 E0B0 LDI R27,0
004A E010 LDI R17,0
004B 36E8 CPI R30,0x68
004C 07F1 CPC R31,R17
004D F021 BEQ 0x0052
004E 95C8 LPM
004F 9631 ADIW R30,1
0050 920D ST R0,X+
0051 CFF9 RJMP 0x004B
0052 940E0114 CALL _main
_exit:
0054 CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\ADC\delay.h
(0001) #define xtal 8 //8MS
(0002) /************************************************************
(0003) * 函数名称:void DelayUS(unsigned int time)
(0004) * 功 能:软件延时1.1Us
(0005) * 入口参数:time 延时时间
(0006) * 出口参数:无
(0007) ************************************************************/
(0008) void DelayUS(unsigned int time)
(0009) {
_DelayUS:
time --> R16
0055 C002 RJMP 0x0058
(0010) while(time>1)
(0011) time--;
0056 5001 SUBI R16,1
0057 4010 SBCI R17,0
0058 E081 LDI R24,1
0059 E090 LDI R25,0
005A 1780 CP R24,R16
005B 0791 CPC R25,R17
005C F3C8 BCS 0x0056
005D 9508 RET
_DelayMS:
i --> R20
time --> R16
005E 940E01EC CALL push_gset1
(0012) }
(0013) /************************************************************
(0014) * 函数名称:void DelayMS(unsigned int time)
(0015) * 功 能:软件延时 1/1000s
(0016) * 入口参数:time 延时时间 MS
(0017) * 出口参数:无
(0018) ************************************************************/
(0019) void DelayMS (unsigned int time)
(0020) {
0060 C009 RJMP 0x006A
(0021) unsigned int i;
(0022) while(time--)
(0023) {
(0024) for(i=1;i<(unsigned int)(xtal*143-2);i++)
0061 E041 LDI R20,1
0062 E050 LDI R21,0
0063 C002 RJMP 0x0066
0064 5F4F SUBI R20,0xFF
0065 4F5F SBCI R21,0xFF
0066 3746 CPI R20,0x76
0067 E0E4 LDI R30,4
0068 075E CPC R21,R30
0069 F3D0 BCS 0x0064
006A 0118 MOVW R2,R16
006B 5001 SUBI R16,1
006C 4010 SBCI R17,0
006D 2022 TST R2
006E F791 BNE 0x0061
006F 2033 TST R3
0070 F781 BNE 0x0061
0071 940E01EF CALL pop_gset1
0073 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\ADC\ADC.c
(0001) //内部晶振 8M
(0002) #include <ioM16v.h>
(0003) #include <macros.h>
(0004) #include"delay.h"
(0005)
(0006)
(0007)
(0008)
(0009) /*------宏定义------*/
(0010) #define uchar unsigned char
(0011) #define uint unsigned int
(0012) uchar led_date[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管段位
(0013) uchar led_seg[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管片选
(0014) uchar vol,vol1=0,vol2=0,i;
(0015)
(0016) //端口初始化
(0017) void port_init(void)
(0018) {
(0019) PORTA = 0x00;//设置端口数据和方向
_port_init:
0074 2422 CLR R2
0075 BA2B OUT 0x1B,R2
(0020) DDRA = 0x00;
0076 BA2A OUT 0x1A,R2
(0021) PORTB = 0x00;
0077 BA28 OUT 0x18,R2
(0022) DDRB = 0xFF;
0078 EF8F LDI R24,0xFF
0079 BB87 OUT 0x17,R24
(0023) PORTC = 0x00;
007A BA25 OUT 0x15,R2
(0024) DDRC = 0x00;
007B BA24 OUT 0x14,R2
(0025) PORTD = 0x00;
007C BA22 OUT 0x12,R2
(0026) DDRD = 0xFF;
007D BB81 OUT 0x11,R24
007E 9508 RET
(0027) }
(0028)
(0029)
(0030) void adc_init(void)
(0031) {
(0032) //adc转换初始化
(0033) ADCSRA = 0x00; //禁止AD转换
_adc_init:
007F 2422 CLR R2
0080 B826 OUT 0x06,R2
(0034) ADMUX = 0xe0;//ADC0单端输入,2.56V片内基准电源,转换结果左对齐
0081 EE80 LDI R24,0xE0
0082 B987 OUT 0x07,R24
(0035) SFIOR |= 0x00;//自动触发源禁止
0083 B620 IN R2,0x30
0084 BE20 OUT 0x30,R2
(0036) ACSR = 0x80; //禁止模拟比较器
0085 E880 LDI R24,0x80
0086 B988 OUT 0x08,R24
(0037) ADCSRA = 0x8F;//ADC使能,中断使能,128分频
0087 E88F LDI R24,0x8F
0088 B986 OUT 0x06,R24
0089 9508 RET
_adc_calc:
voltage --> R10
value --> Y+0
008A 940E01E8 CALL push_gset3
008C 9724 SBIW R28,4
(0038) }
(0039)
(0040)
(0041) unsigned int adc_calc(void)
(0042) {
(0043) //计算实际电压
(0044) unsigned long value=0;
008D E040 LDI R20,0
008E E050 LDI R21,0
008F E060 LDI R22,0
0090 E070 LDI R23,0
0091 01FE MOVW R30,R28
0092 8340 STD Z+0,R20
0093 8351 STD Z+1,R21
0094 8362 STD Z+2,R22
0095 8373 STD Z+3,R23
(0045) unsigned int voltage=0; //电压单位为(mV)
0096 24AA CLR R10
0097 24BB CLR R11
(0046) value=ADCL>>6; //首先读低位
0098 E026 LDI R18,6
0099 E030 LDI R19,0
009A B104 IN R16,0x04
009B 2711 CLR R17
009C 940E0170 CALL asr16
009E 0118 MOVW R2,R16
009F 2444 CLR R4
00A0 FC37 SBRC R3,7
00A1 9440 COM R4
00A2 2455 CLR R5
00A3 FC47 SBRC R4,7
00A4 9450 COM R5
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
(0047) value|=(int)ADCH << 2; //然后读高位
00AA B025 IN R2,0x05
00AB 2433 CLR R3
00AC 0C22 LSL R2
00AD 1C33 ROL R3
00AE 0C22 LSL R2
00AF 1C33 ROL R3
00B0 2444 CLR R4
00B1 FC37 SBRC R3,7
00B2 9440 COM R4
00B3 2455 CLR R5
00B4 FC47 SBRC R4,7
00B5 9450 COM R5
00B6 01FE MOVW R30,R28
00B7 8060 LDD R6,Z+0
00B8 8071 LDD R7,Z+1
00B9 8082 LDD R8,Z+2
00BA 8093 LDD R9,Z+3
00BB 2862 OR R6,R2
00BC 2873 OR R7,R3
00BD 2884 OR R8,R4
00BE 2895 OR R9,R5
00BF 01FE MOVW R30,R28
00C0 8260 STD Z+0,R6
00C1 8271 STD Z+1,R7
00C2 8282 STD Z+2,R8
00C3 8293 STD Z+3,R9
(0048) voltage=(value*2560)>>10;
00C4 01FE MOVW R30,R28
00C5 8020 LDD R2,Z+0
00C6 8031 LDD R3,Z+1
00C7 8042 LDD R4,Z+2
00C8 8053 LDD R5,Z+3
00C9 E040 LDI R20,0
00CA E05A LDI R21,0xA
00CB E060 LDI R22,0
00CC E070 LDI R23,0
00CD 925A ST R5,-Y
00CE 924A ST R4,-Y
00CF 923A ST R3,-Y
00D0 922A ST R2,-Y
00D1 018A MOVW R16,R20
00D2 019B MOVW R18,R22
00D3 940E01B1 CALL empy32s
00D5 E08A LDI R24,0xA
00D6 E090 LDI R25,0
00D7 938A ST R24,-Y
00D8 940E0256 CALL lsr32
00DA 0158 MOVW R10,R16
(0049) return voltage;
00DB 9624 ADIW R28,4
00DC 940E01E1 CALL pop_gset3
00DE 9508 RET
_adc_isr:
00DF 940E0228 CALL push_lset
(0050) }
(0051)
(0052)
(0053) #pragma interrupt_handler adc_isr:15
(0054) void adc_isr(void)
(0055) {
(0056) if(i==5)
00E1 91800074 LDS R24,i
00E3 3085 CPI R24,5
00E4 F419 BNE 0x00E8
(0057) vol1=adc_calc();
00E5 DFA4 RCALL _adc_calc
00E6 93000072 STS vol1,R16
(0058) if(i==10)
00E8 91800074 LDS R24,i
00EA 308A CPI R24,0xA
00EB F419 BNE 0x00EF
(0059) vol2=adc_calc();
00EC DF9D RCALL _adc_calc
00ED 93000073 STS vol2,R16
(0060) if(vol1==vol2)
00EF 90200073 LDS R2,vol2
00F1 90300072 LDS R3,vol1
00F3 1432 CP R3,R2
00F4 F419 BNE 0x00F8
(0061) vol=vol1;
00F5 2C23 MOV R2,R3
00F6 92200075 STS vol,R2
(0062) i++;
00F8 91800074 LDS R24,i
00FA 5F8F SUBI R24,0xFF
00FB 93800074 STS i,R24
(0063) if(i>10)
00FD E08A LDI R24,0xA
00FE 90200074 LDS R2,i
0100 1582 CP R24,R2
0101 F418 BCC 0x0105
(0064) i=0;
0102 2422 CLR R2
0103 92200074 STS i,R2
(0065) ADCSRA|=BIT(ADSC);//ADC开始转换
0105 9A36 SBI 0x06,6
0106 940E023F CALL pop_lset
0108 9518 RETI
(0066)
(0067) }
(0068)
(0069)
(0070) void init_devices(void)
(0071) {
(0072) CLI(); //禁止所有中断
_init_devices:
0109 94F8 BCLR 7
(0073) MCUCR = 0x00;//外部中断触发方式
010A 2422 CLR R2
010B BE25 OUT 0x35,R2
(0074) MCUCSR = 0x80;//禁止JTAG
010C E880 LDI R24,0x80
010D BF84 OUT 0x34,R24
(0075) GICR = 0x00;//外部中断使能
010E BE2B OUT 0x3B,R2
(0076) port_init();
010F DF64 RCALL _port_init
(0077) adc_init();
0110 DF6E RCALL _adc_init
(0078) SEI();//开全局中断
0111 9478 BSET 7
(0079) ADCSRA|=BIT(ADSC);//ADC开始转换
0112 9A36 SBI 0x06,6
0113 9508 RET
(0080) }
(0081) //主函数
(0082) void main(void)
(0083) {
(0084) init_devices();
_main:
0114 DFF4 RCALL _init_devices
0115 C058 RJMP 0x016E
(0085) //在这继续添加你的代码
(0086) while(1)
(0087) {
(0088) PORTB=led_date[vol%10];
0116 E02A LDI R18,0xA
0117 E030 LDI R19,0
0118 91000075 LDS R16,vol
011A 2711 CLR R17
011B 940E0177 CALL mod16s
011D 01F8 MOVW R30,R16
011E E680 LDI R24,0x60
011F E090 LDI R25,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -