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

📄 adc.lst

📁 AVR MEGA8 ADC 应用 程序源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0024 EFCF      LDI	R28,0xFF
    0025 E0D2      LDI	R29,2
    0026 BFCD      OUT	0x3D,R28
    0027 BFDE      OUT	0x3E,R29
    0028 51C0      SUBI	R28,0x10
    0029 40D0      SBCI	R29,0
    002A EA0A      LDI	R16,0xAA
    002B 8308      STD	Y+0,R16
    002C 2400      CLR	R0
    002D E0E4      LDI	R30,4
    002E E0F1      LDI	R31,1
    002F E011      LDI	R17,1
    0030 30E7      CPI	R30,7
    0031 07F1      CPC	R31,R17
    0032 F011      BEQ	0x0035
    0033 9201      ST	R0,Z+
    0034 CFFB      RJMP	0x0030
    0035 8300      STD	Z+0,R16
    0036 E4E4      LDI	R30,0x44
    0037 E0F0      LDI	R31,0
    0038 E0A0      LDI	R26,0
    0039 E0B1      LDI	R27,1
    003A E010      LDI	R17,0
    003B 34E8      CPI	R30,0x48
    003C 07F1      CPC	R31,R17
    003D F021      BEQ	0x0042
    003E 95C8      LPM
    003F 9631      ADIW	R30,1
    0040 920D      ST	R0,X+
    0041 CFF9      RJMP	0x003B
    0042 D06C      RCALL	_main
_exit:
    0043 CFFF      RJMP	_exit
FILE: C:\调试程序\mega48\ADC\ADC.c
(0001) //使用内部RC振荡,PB6-G,PB7-DP短路块连接
(0002) //使用INT0/INT1按键切换ADC通道
(0003) #include <iom48v.h>
(0004) #include <macros.h>
(0005) #define osccal 0x9A//内部RC校正常数
(0006) #define Vref   500//参考电压值
(0007) extern const unsigned char seg_table[16];
(0008) extern unsigned char led_buff[4];
(0009) extern void delay_ms(unsigned int time);
(0010) extern void display(void);
(0011) unsigned int adc_rel;//AD转换结果
(0012) unsigned char adc_mux;//AD通道
(0013) //ADC初始化
(0014) void adc_init(void)
(0015) {
(0016)  DDRC=0x00;
_adc_init:
    0044 2422      CLR	R2
    0045 B827      OUT	0x07,R2
(0017)  PORTC=0x00;
    0046 B828      OUT	0x08,R2
(0018)  ADCSRA = 0x00; //设置前,先关闭ADC
    0047 9220007A  STS	0x7A,R2
(0019)  ADMUX =(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准,单端输入口为ADC0
    0049 91800104  LDS	R24,adc_mux
    004B 708F      ANDI	R24,0xF
    004C 6480      ORI	R24,0x40
    004D 9380007C  STS	0x7C,R24
(0020)  ACSR  =(1<<ACD);//关闭模拟比较器,禁止位P148
    004F E880      LDI	R24,0x80
    0050 BF80      OUT	0x30,R24
(0021)  ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//ADC时钟64分频
    0051 EC8E      LDI	R24,0xCE
    0052 9380007A  STS	0x7A,R24
    0054 9508      RET
_adc_isr:
    0055 938A      ST	R24,-Y
    0056 939A      ST	R25,-Y
    0057 B78F      IN	R24,0x3F
    0058 938A      ST	R24,-Y
(0022) }
(0023) //ADC完成中断
(0024) #pragma interrupt_handler adc_isr:22     
(0025) void adc_isr(void)
(0026) {
(0027)  adc_rel=ADC&0x3ff;
    0059 91800078  LDS	R24,0x78
    005B 91900079  LDS	R25,0x79
    005D 7093      ANDI	R25,3
    005E 93900106  STS	adc_rel+1,R25
    0060 93800105  STS	adc_rel,R24
(0028)  ADMUX=(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准
    0062 91800104  LDS	R24,adc_mux
    0064 708F      ANDI	R24,0xF
    0065 6480      ORI	R24,0x40
    0066 9380007C  STS	0x7C,R24
(0029)  ADCSRA|=(1<<ADSC);//启动AD转换
    0068 9180007A  LDS	R24,0x7A
    006A 6480      ORI	R24,0x40
    006B 9380007A  STS	0x7A,R24
    006D 9189      LD	R24,Y+
    006E BF8F      OUT	0x3F,R24
    006F 9199      LD	R25,Y+
    0070 9189      LD	R24,Y+
    0071 9518      RETI
_ADCtoBCD:
  i                    --> R10
  temp                 --> R12
    0072 D1BC      RCALL	push_gset4
    0073 0168      MOVW	R12,R16
(0030) }
(0031) //ADC结果转换成电压值
(0032) void ADCtoBCD(unsigned int temp)
(0033)  {
(0034)   unsigned char i;
(0035)   temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/0x3ff);
    0074 0116      MOVW	R2,R12
    0075 2444      CLR	R4
    0076 2455      CLR	R5
    0077 EF44      LDI	R20,0xF4
    0078 E051      LDI	R21,1
    0079 E060      LDI	R22,0
    007A E070      LDI	R23,0
    007B 925A      ST	R5,-Y
    007C 924A      ST	R4,-Y
    007D 923A      ST	R3,-Y
    007E 922A      ST	R2,-Y
    007F 018A      MOVW	R16,R20
    0080 019B      MOVW	R18,R22
    0081 D17D      RCALL	empy32s
    0082 EF4F      LDI	R20,0xFF
    0083 E053      LDI	R21,3
    0084 E060      LDI	R22,0
    0085 E070      LDI	R23,0
    0086 937A      ST	R23,-Y
    0087 936A      ST	R22,-Y
    0088 935A      ST	R21,-Y
    0089 934A      ST	R20,-Y
    008A D103      RCALL	div32u
    008B 0168      MOVW	R12,R16
(0036)   for(i=0;i<4;i++)
    008C 24AA      CLR	R10
    008D C017      RJMP	0x00A5
(0037)   {
(0038)    led_buff[i]=seg_table[temp%10];
    008E E02A      LDI	R18,0xA
    008F E030      LDI	R19,0
    0090 0186      MOVW	R16,R12
    0091 D0E0      RCALL	mod16u
    0092 01F8      MOVW	R30,R16
    0093 E384      LDI	R24,0x34
    0094 E090      LDI	R25,0
    0095 0FE8      ADD	R30,R24
    0096 1FF9      ADC	R31,R25
    0097 91E4      LPM	R30,0(Z)
    0098 E080      LDI	R24,0
    0099 E091      LDI	R25,1
    009A 2DAA      MOV	R26,R10
    009B 27BB      CLR	R27
    009C 0FA8      ADD	R26,R24
    009D 1FB9      ADC	R27,R25
    009E 93EC      ST	R30,0(X)
(0039)    temp=temp/10;
    009F E02A      LDI	R18,0xA
    00A0 E030      LDI	R19,0
    00A1 0186      MOVW	R16,R12
    00A2 D0D1      RCALL	div16u
    00A3 0168      MOVW	R12,R16
    00A4 94A3      INC	R10
    00A5 2D8A      MOV	R24,R10
    00A6 3084      CPI	R24,4
    00A7 F330      BCS	0x008E
(0040)    }
(0041)   led_buff[2]&=0x7f; 
    00A8 91800102  LDS	R24,led_buff+2
    00AA 778F      ANDI	R24,0x7F
    00AB 93800102  STS	led_buff+2,R24
    00AD D17D      RCALL	pop_gset4
    00AE 9508      RET
(0042)  }
(0043) //MAIN程序
(0044) void main(void)
(0045) {
(0046)  unsigned char i;
(0047)  unsigned int adc_old;
(0048)  DDRD=0xf0;
_main:
  adc_old              --> R22
  i                    --> R20
    00AF EF80      LDI	R24,0xF0
    00B0 B98A      OUT	0x0A,R24
(0049)  PORTD=0xff;
    00B1 EF8F      LDI	R24,0xFF
    00B2 B98B      OUT	0x0B,R24
(0050)  OSCCAL=osccal;//校正振荡频率
    00B3 E98A      LDI	R24,0x9A
    00B4 93800066  STS	0x66,R24
(0051)  adc_mux=0;
    00B6 2422      CLR	R2
    00B7 92200104  STS	adc_mux,R2
(0052)  adc_init();
    00B9 DF8A      RCALL	_adc_init
(0053)  SEI();//使能全局中断
    00BA 9478      BSET	7
(0054)  
(0055)  for(i=0;i<4;i++)
    00BB 2744      CLR	R20
    00BC C010      RJMP	0x00CD
(0056)   { 
(0057)    led_buff[i]=seg_table[8];
    00BD E080      LDI	R24,0
    00BE E091      LDI	R25,1
    00BF 2FE4      MOV	R30,R20
    00C0 27FF      CLR	R31
    00C1 0FE8      ADD	R30,R24
    00C2 1FF9      ADC	R31,R25
    00C3 E3AC      LDI	R26,0x3C
    00C4 E0B0      LDI	R27,0
    00C5 93FA      ST	R31,-Y
    00C6 93EA      ST	R30,-Y
    00C7 01FD      MOVW	R30,R26
    00C8 91A4      LPM	R26,0(Z)
    00C9 91E9      LD	R30,Y+
    00CA 91F9      LD	R31,Y+
    00CB 83A0      STD	Z+0,R26
    00CC 9543      INC	R20
    00CD 3044      CPI	R20,4
    00CE F370      BCS	0x00BD
(0058)   }
(0059)  for(i=0;i<100;i++)
    00CF 2744      CLR	R20
    00D0 C002      RJMP	0x00D3
(0060)    display();
    00D1 D078      RCALL	_display
    00D2 9543      INC	R20
    00D3 3644      CPI	R20,0x64
    00D4 F3E0      BCS	0x00D1
(0061) 
(0062)  adc_old=0;
    00D5 2766      CLR	R22
    00D6 2777      CLR	R23
(0063)  adc_rel=0; 
    00D7 2422      CLR	R2
    00D8 2433      CLR	R3
    00D9 92300106  STS	adc_rel+1,R3
    00DB 92200105  STS	adc_rel,R2
    00DD C055      RJMP	0x0133
(0064)  while(1)
(0065)   {   
(0066)    if(adc_old!=adc_rel)
    00DE 90200105  LDS	R2,adc_rel
    00E0 90300106  LDS	R3,adc_rel+1
    00E2 1562      CP	R22,R2
    00E3 0573      CPC	R23,R3
    00E4 F019      BEQ	0x00E8
(0067)      {
(0068) 	  adc_old=adc_rel;
    00E5 01B1      MOVW	R22,R2
(0069) 	  ADCtoBCD(adc_old);
    00E6 0181      MOVW	R16,R2
    00E7 DF8A      RCALL	_ADCtoBCD
(0070) 	 }
(0071)    display();
    00E8 D061      RCALL	_display
(0072) 
(0073)    i=PIND&0x0c;//判断按键
    00E9 B149      IN	R20,0x09
    00EA 704C      ANDI	R20,0xC
(0074)    if(i!=0x0c)
    00EB 304C      CPI	R20,0xC
    00EC F409      BNE	0x00EE
    00ED C045      RJMP	0x0133
(0075)      {
(0076) 	  display();//按键消抖
    00EE D05B      RCALL	_display
(0077) 	  if(i==(PIND&0x0c))
    00EF B189      IN	R24,0x09
    00F0 708C      ANDI	R24,0xC
    00F1 1748      CP	R20,R24
    00F2 F009      BEQ	0x00F4
    00F3 C03F      RJMP	0x0133
(0078) 	    {
(0079) 		 CLI();
    00F4 94F8      BCLR	7
(0080) 		 adc_rel=0;
    00F5 2422      CLR	R2
    00F6 2433      CLR	R3
    00F7 92300106  STS	adc_rel+1,R3
    00F9 92200105  STS	adc_rel,R2
(0081) 		 adc_old=0;
    00FB 2766      CLR	R22
    00FC 2777      CLR	R23
(0082) 		 if (i==0x08)//INT0键按下
    00FD 3048      CPI	R20,0x8
    00FE F459      BNE	0x010A
(0083) 		    {
(0084) 			 if(adc_mux<3)
    00FF 91800104  LDS	R24,adc_mux
    0101 3083      CPI	R24,3
    0102 F420      BCC	0x0107
(0085) 			    adc_mux++;//递增
    0103 5F8F      SUBI	R24,0xFF
    0104 93800104  STS	adc_mux,R24
    0106 C003      RJMP	0x010A
(0086) 		     else
(0087) 			    adc_mux=0;		
    0107 2422      CLR	R2
    0108 92200104  STS	adc_mux,R2
(0088) 			}
(0089) 		 if (i==0x04)//INT1键按下
    010A 3044      CPI	R20,4
    010B F469      BNE	0x0119
(0090) 		    {
(0091) 			 if(adc_mux>0)
    010C 2422      CLR	R2
    010D 90300104  LDS	R3,adc_mux
    010F 1423      CP	R2,R3
    0110 F428      BCC	0x0116
(0092) 			    adc_mux--;//递减
    0111 2D83      MOV	R24,R3
    0112 5081      SUBI	R24,1
    0113 93800104  STS	adc_mux,R24
    0115 C003      RJMP	0x0119
(0093) 			 else
(0094) 			    adc_mux=3;	
    0116 E083      LDI	R24,3
    0117 93800104  STS	adc_mux,R24
(0095) 			}
(0096) 	     led_buff[0]=seg_table[adc_mux];
    0119 E384      LDI	R24,0x34
    011A E090      LDI	R25,0
    011B 91E00104  LDS	R30,adc_mux
    011D 27FF      CLR	R31
    011E 0FE8      ADD	R30,R24
    011F 1FF9      ADC	R31,R25
    0120 91E4      LPM	R30,0(Z)
    0121 93E00100  STS	led_buff,R30
(0097) 		 led_buff[1]=0xbf;//-
    0123 EB8F      LDI	R24,0xBF
    0124 93800101  STS	led_buff+1,R24
(0098) 		 led_buff[2]=0b10001001;//h
    0126 E889      LDI	R24,0x89
    0127 93800102  STS	led_buff+2,R24
(0099) 		 led_buff[3]=0b11000110;//C		
    0129 EC86      LDI	R24,0xC6
    012A 93800103  STS	led_buff+3,R24
    012C C001      RJMP	0x012E
(0100) 	     while((PIND&0x0c)!=0x0c)//检查按键释放
(0101) 		    display(); 		
    012D D01C      RCALL	_display
    012E B189      IN	R24,0x09
    012F 708C      ANDI	R24,0xC
    0130 308C      CPI	R24,0xC
    0131 F7D9      BNE	0x012D
(0102) 	     SEI();		 
    0132 9478      BSET	7
    0133 CFAA      RJMP	0x00DE
    0134 9508      RET
FILE: C:\调试程序\mega48\ADC\numled.c
(0001) #include<iom48v.h>
(0002) const unsigned char seg_table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
(0003) 0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
(0004) unsigned char led_buff[4]={0,0,0,0};
(0005) /*				微秒级延时程序	  		*/
(0006) void delay_us(int time)
(0007) 	 {     
(0008)   	  do
(0009) 	  	{
(0010) 		 time--;
_delay_us:
  time                 --> R16
    0135 5001      SUBI	R16,1
    0136 4010      SBCI	R17,0
(0011) 		}	
(0012)   	  while (time>1);
    0137 E081      LDI	R24,1
    0138 E090      LDI	R25,0
    0139 1780      CP	R24,R16

⌨️ 快捷键说明

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