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

📄 adc.lst

📁 AVR之ATMega16
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -