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

📄 1.lst

📁 在车头有4个光敏电阻做的寻找光源的小车程序 具有笔战功能 ICC-AVR ATmega16L 做的控制器 找到光源后停车
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0068)  TCNT1L = 0x2F; //重装值低位
     2A6 E28F      LDI	R24,0x2F
     2A7 BD8C      OUT	0x2C,R24
(0069) 
(0070)  TCCR1A = 0x00;
     2A8 BC2F      OUT	0x2F,R2
(0071)  TCCR1B = 0x05;//启动定时器
     2A9 E085      LDI	R24,5
     2AA BD8E      OUT	0x2E,R24
     2AB 9508      RET
_timer1_ovf_isr:
     2AC 920A      ST	R0,-Y
     2AD 921A      ST	R1,-Y
     2AE 922A      ST	R2,-Y
     2AF 923A      ST	R3,-Y
     2B0 924A      ST	R4,-Y
     2B1 925A      ST	R5,-Y
     2B2 926A      ST	R6,-Y
     2B3 927A      ST	R7,-Y
     2B4 928A      ST	R8,-Y
     2B5 929A      ST	R9,-Y
     2B6 930A      ST	R16,-Y
     2B7 931A      ST	R17,-Y
     2B8 932A      ST	R18,-Y
     2B9 933A      ST	R19,-Y
     2BA 938A      ST	R24,-Y
     2BB 939A      ST	R25,-Y
     2BC 93AA      ST	R26,-Y
     2BD 93BA      ST	R27,-Y
     2BE 93EA      ST	R30,-Y
     2BF 93FA      ST	R31,-Y
     2C0 B60F      IN	R0,0x3F
     2C1 920A      ST	R0,-Y
(0072) }
(0073) 
(0074) 
(0075) //定时器T1溢出中断服务程序
(0076) #pragma interrupt_handler timer1_ovf_isr:9
(0077) void timer1_ovf_isr(void)
(0078) {
(0079) TCNT1H = 0xFC; //重装值高位
     2C2 EF8C      LDI	R24,0xFC
     2C3 BD8D      OUT	0x2D,R24
(0080)  TCNT1L = 0x2F; //重装值低位
     2C4 E28F      LDI	R24,0x2F
     2C5 BD8C      OUT	0x2C,R24
(0081)  CLI();
     2C6 94F8      BCLR	7
(0082) 		 adc_rel=0;
     2C7 2422      CLR	R2
     2C8 2433      CLR	R3
     2C9 9230 00B6 STS	adc_rel+1,R3
     2CB 9220 00B5 STS	adc_rel,R2
(0083) 		 adc_old=0;
     2CD 9230 00B1 STS	adc_old+1,R3
     2CF 9220 00B0 STS	adc_old,R2
(0084) 		  if(adc_mux<3)
     2D1 9180 00B4 LDS	R24,adc_mux
     2D3 3083      CPI	R24,3
     2D4 F420      BCC	0x02D9
(0085) 			    adc_mux++;//递增
     2D5 5F8F      SUBI	R24,0xFF
     2D6 9380 00B4 STS	adc_mux,R24
     2D8 C003      RJMP	0x02DC
(0086) 		     else
(0087) 			    adc_mux=0;	
     2D9 2422      CLR	R2
     2DA 9220 00B4 STS	adc_mux,R2
(0088) 		SEI();			
     2DC 9478      BSET	7
(0089) miao++;
     2DD 9180 006A LDS	R24,miao
     2DF 5F8F      SUBI	R24,0xFF
     2E0 9380 006A STS	miao,R24
(0090) if(miao==350)
     2E2 358E      CPI	R24,0x5E
     2E3 F419      BNE	0x02E7
(0091)  
(0092)     //LCD_write_string(9,1,Format(miao,"00")); 
(0093) 	{stop();
     2E4 D0D0      RCALL	_stop
(0094) 	   TCCR1B = 0x00;//停止定时器
     2E5 2422      CLR	R2
     2E6 BC2E      OUT	0x2E,R2
(0095) } 
     2E7 9009      LD	R0,Y+
     2E8 BE0F      OUT	0x3F,R0
     2E9 91F9      LD	R31,Y+
     2EA 91E9      LD	R30,Y+
     2EB 91B9      LD	R27,Y+
     2EC 91A9      LD	R26,Y+
     2ED 9199      LD	R25,Y+
     2EE 9189      LD	R24,Y+
     2EF 9139      LD	R19,Y+
     2F0 9129      LD	R18,Y+
     2F1 9119      LD	R17,Y+
     2F2 9109      LD	R16,Y+
     2F3 9099      LD	R9,Y+
     2F4 9089      LD	R8,Y+
     2F5 9079      LD	R7,Y+
     2F6 9069      LD	R6,Y+
     2F7 9059      LD	R5,Y+
     2F8 9049      LD	R4,Y+
     2F9 9039      LD	R3,Y+
     2FA 9029      LD	R2,Y+
     2FB 9019      LD	R1,Y+
     2FC 9009      LD	R0,Y+
     2FD 9518      RETI
(0096) }
(0097) 
(0098) 
(0099) 
(0100) void adc_init(void)
(0101) {
(0102)  //adc转换初始化
(0103)  ADCSRA	= 0x00;	//禁止AD转换
_adc_init:
     2FE 2422      CLR	R2
     2FF B826      OUT	0x06,R2
(0104)  //ADMUX	= 0xC1; //通道1    1100 0001
(0105)  ADMUX =(1<<REFS1)|(1<<REFS0)|(adc_mux&0x1f);//选择内部AVCC为基准
     300 9180 00B4 LDS	R24,adc_mux
     302 718F      ANDI	R24,0x1F
     303 6C80      ORI	R24,0xC0
     304 B987      OUT	0x07,R24
(0106)  SFIOR |= 0x00;
     305 B620      IN	R2,0x30
     306 BE20      OUT	0x30,R2
(0107)  ACSR	= 0x80; //禁止模拟比较器
     307 E880      LDI	R24,0x80
     308 B988      OUT	0x08,R24
(0108)  ADCSRA	|= 0xEE;  //1110 1110
     309 B186      IN	R24,0x06
     30A 6E8E      ORI	R24,0xEE
     30B B986      OUT	0x06,R24
(0109)   ADCSRA|=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//64分频
     30C B186      IN	R24,0x06
     30D 6E8E      ORI	R24,0xEE
     30E B986      OUT	0x06,R24
     30F 9508      RET
_ADCtoBCD:
  i                    --> Y,+3
  temp                 --> R10
     310 940E 066A CALL	push_xgsetF03C
     312 0158      MOVW	R10,R16
     313 9722      SBIW	R28,2
(0110) }
(0111) 
(0112) 
(0113) //ADC结果转换成电压值
(0114) void ADCtoBCD(unsigned int temp)
(0115)  {
(0116)   unsigned char i;
(0117)    
(0118)   temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/0x3ff);
     314 0115      MOVW	R2,R10
     315 2444      CLR	R4
     316 2455      CLR	R5
     317 E040      LDI	R20,0
     318 E05A      LDI	R21,0xA
     319 E060      LDI	R22,0
     31A E070      LDI	R23,0
     31B 925A      ST	R5,-Y
     31C 924A      ST	R4,-Y
     31D 923A      ST	R3,-Y
     31E 922A      ST	R2,-Y
     31F 018A      MOVW	R16,R20
     320 019B      MOVW	R18,R22
     321 940E 05FA CALL	empy32u
     323 EF4F      LDI	R20,0xFF
     324 E053      LDI	R21,3
     325 E060      LDI	R22,0
     326 E070      LDI	R23,0
     327 937A      ST	R23,-Y
     328 936A      ST	R22,-Y
     329 935A      ST	R21,-Y
     32A 934A      ST	R20,-Y
     32B 940E 0580 CALL	div32u
     32D 0158      MOVW	R10,R16
(0119)   voltage=temp;
     32E 92B0 00B3 STS	voltage+1,R11
     330 92A0 00B2 STS	voltage,R10
(0120) switch(adc_mux)
     332 90C0 00B4 LDS	R12,adc_mux
     334 24DD      CLR	R13
     335 20CC      TST	R12
     336 F411      BNE	0x0339
     337 20DD      TST	R13
     338 F071      BEQ	0x0347
     339 01C6      MOVW	R24,R12
     33A 3081      CPI	R24,1
     33B E0E0      LDI	R30,0
     33C 079E      CPC	R25,R30
     33D F071      BEQ	0x034C
     33E 3082      CPI	R24,2
     33F E0E0      LDI	R30,0
     340 079E      CPC	R25,R30
     341 F079      BEQ	0x0351
     342 3083      CPI	R24,3
     343 E0E0      LDI	R30,0
     344 079E      CPC	R25,R30
     345 F081      BEQ	0x0356
     346 C013      RJMP	0x035A
(0121)       {
(0122) 		case 0:V0=temp;break;
     347 92B0 00AF STS	V0+1,R11
     349 92A0 00AE STS	V0,R10
     34B C00E      RJMP	0x035A
(0123) 		case 1:V1=temp;break;
     34C 92B0 00AD STS	V1+1,R11
     34E 92A0 00AC STS	V1,R10
     350 C009      RJMP	0x035A
(0124) 		case 2:V2=temp;break;
     351 92B0 00AB STS	V2+1,R11
     353 92A0 00AA STS	V2,R10
     355 C004      RJMP	0x035A
(0125) 	    case 3:V3=temp;break;
     356 92B0 00A9 STS	V3+1,R11
     358 92A0 00A8 STS	V3,R10
(0126) 	 } 
(0127)   LCD_write_shu(0,0,temp);
     35A 82B9      STD	Y+1,R11
     35B 82A8      STD	Y+0,R10
     35C 2722      CLR	R18
     35D 2733      CLR	R19
     35E 2700      CLR	R16
     35F 2711      CLR	R17
     360 DE5E      RCALL	_LCD_write_shu
     361 9622      ADIW	R28,2
     362 940C 0673 JMP	pop_xgsetF03C
_adc_isr:
     364 938A      ST	R24,-Y
     365 939A      ST	R25,-Y
     366 B78F      IN	R24,0x3F
     367 938A      ST	R24,-Y
(0128) 
(0129)  }
(0130) 
(0131) 
(0132) #pragma interrupt_handler adc_isr:15
(0133) void adc_isr(void)
(0134) {
(0135)  //转换完成后中断处理
(0136)    adc_rel=ADC&0x3ff;  //
     368 B184      IN	R24,0x04
     369 B195      IN	R25,0x05
     36A 7093      ANDI	R25,3
     36B 9390 00B6 STS	adc_rel+1,R25
     36D 9380 00B5 STS	adc_rel,R24
(0137)   ADMUX =(1<<REFS1)|(1<<REFS0)|(adc_mux&0x1f);
     36F 9180 00B4 LDS	R24,adc_mux
     371 718F      ANDI	R24,0x1F
     372 6C80      ORI	R24,0xC0
     373 B987      OUT	0x07,R24
(0138)     ADCSRA|=(1<<ADSC);//启动AD转换//启动AD转换
     374 9A36      SBI	0x06,6
     375 9189      LD	R24,Y+
     376 BF8F      OUT	0x3F,R24
     377 9199      LD	R25,Y+
     378 9189      LD	R24,Y+
     379 9518      RETI
(0139) 
(0140) }
(0141) 
(0142) 
(0143) 
(0144) void init_devices(void)
(0145) {
(0146)  CLI(); //禁止所有中断
_init_devices:
     37A 94F8      BCLR	7
(0147)  MCUCR  = 0x00;
     37B 2422      CLR	R2
     37C BE25      OUT	0x35,R2
(0148)  MCUCSR = 0x80;//禁止JTAG
     37D E880      LDI	R24,0x80
     37E BF84      OUT	0x34,R24
(0149)  GICR   = 0x00;
     37F BE2B      OUT	0x3B,R2
(0150)  port_init();
     380 DF12      RCALL	_port_init
(0151)  timer1_init();
     381 DF1D      RCALL	_timer1_init
(0152)  adc_init();
     382 DF7B      RCALL	_adc_init
(0153)  SEI();//开全局中断
     383 9478      BSET	7
     384 9508      RET
_qianjin:
     385 9722      SBIW	R28,2
(0154) }
(0155) 
(0156) void qianjin()
(0157)  {
(0158)  //PORTC|=0x80;
(0159)  PORTC=0x8A;     //1010前进
     386 E88A      LDI	R24,0x8A
     387 BB85      OUT	0x15,R24
(0160)  LCD_write_string(0,1,"qianjin  ");
     388 E98A      LDI	R24,0x9A
     389 E090      LDI	R25,0
     38A 8399      STD	Y+1,R25
     38B 8388      STD	Y+0,R24
     38C E021      LDI	R18,1
     38D 2700      CLR	R16
     38E DDC0      RCALL	_LCD_write_string
     38F 9622      ADIW	R28,2
     390 9508      RET
_houtui:
     391 9722      SBIW	R28,2
(0161) }
(0162) void houtui()
(0163) {
(0164) PORTC=0x85;     //0101后退
     392 E885      LDI	R24,0x85
     393 BB85      OUT	0x15,R24
(0165) LCD_write_string(0,1,"houtui   ");
     394 E980      LDI	R24,0x90
     395 E090      LDI	R25,0
     396 8399      STD	Y+1,R25
     397 8388      STD	Y+0,R24
     398 E021      LDI	R18,1
     399 2700      CLR	R16
     39A DDB4      RCALL	_LCD_write_string
     39B 9622      ADIW	R28,2
     39C 9508      RET
_zuozhuan:
     39D 9722      SBIW	R28,2
(0166) }
(0167) 
(0168) void zuozhuan()
(0169) {
(0170)  PORTC=0x82;     //0010  左传
     39E E882      LDI	R24,0x82
     39F BB85      OUT	0x15,R24
(0171)  LCD_write_string(0,1,"zuozhuan");
     3A0 E887      LDI	R24,0x87
     3A1 E090      LDI	R25,0
     3A2 8399      STD	Y+1,R25
     3A3 8388      STD	Y+0,R24
     3A4 E021      LDI	R18,1
     3A5 2700      CLR	R16
     3A6 DDA8      RCALL	_LCD_write_string
     3A7 9622      ADIW	R28,2
     3A8 9508      RET
_youzhuan:
     3A9 9722      SBIW	R28,2
(0172) } 
(0173) void youzhuan()
(0174) {
(0175)  PORTC=0x88;      //1000右转
     3AA E888      LDI	R24,0x88
     3AB BB85      OUT	0x15,R24
(0176)  LCD_write_string(0,1,"youzhuan");
     3AC E78E      LDI	R24,0x7E
     3AD E090      LDI	R25,0
     3AE 8399      STD	Y+1,R25
     3AF 8388      STD	Y+0,R24
     3B0 E021      LDI	R18,1
     3B1 2700      CLR	R16
     3B2 DD9C      RCALL	_LCD_write_string
     3B3 9622      ADIW	R28,2
     3B4 9508      RET
_stop:
     3B5 9722      SBIW	R28,2
(0177) }
(0178) void stop()
(0179) {
(0180)  PORTC=0x80;
     3B6 E880      LDI	R24,0x80
     3B7 BB85      OUT	0x15,R24
(0181)   LCD_write_string(0,1,"stop   ");
     3B8 E786      LDI	R24,0x76
     3B9 E090      LDI	R25,0
     3BA 8399      STD	Y+1,R25
     3BB 8388      STD	Y+0,R24
     3BC E021      LDI	R18,1
     3BD 2700      CLR	R16
     3BE DD90      RCALL	_LCD_write_string
     3BF 9622      ADIW	R28,2
     3C0 9508      RET
_get_adc:
     3C1 9722      SBIW	R28,2
(0182) }
(0183) 
(0184) void get_adc()
(0185) {
(0186) if(adc_old!=adc_rel)
     3C2 9020 00B5 LDS	R2,adc_rel
     3C4 9030 00B6 LDS	R3,adc_rel+1
     3C6 9040 00B0 LDS	R4,adc_old
     3C8 9050 00B1 LDS	R5,adc_old+1
     3CA 1442      CP	R4,R2
     3CB 0453      CPC	R5,R3
     3CC F049      BEQ	0x03D6
(0187)         {
(0188) 	     adc_old=adc_rel;
     3CD 9230 00B1 STS	adc_old+1,R3
     3CF 9220 00B0 STS	adc_old,R2
(0189) 	    ADCtoBCD(adc_old);
     3D1 9100 00B0 LDS	R16,adc_old
     3D3 9110 00B1 LDS	R17,adc_old+1
     3D5 DF3A      RCALL	_ADCtoBCD
(0190) 	 }
(0191) 	  LCD_write_shu(0,1,voltage);
     3D6 9020 00B2 LDS	R2,voltage
     3D8 9030 00B3 LDS	R3,voltage+1
     3DA 8239      STD	Y+1,R3
     3DB 8228      STD	Y+0,R2
     3DC E021      LDI	R18,1
     3DD E030      LDI	R19,0
     3DE 2700      CLR	R16
     3DF 2711      CLR	R17
     3E0 DDDE      RCALL	_LCD_write_shu
     3E1 9622      ADIW	R28,2
     3E2 9508      RET
_shaomiao:
  i                    --> R20
     3E3 934A      ST	R20,-Y
     3E4 935A      ST	R21,-Y
     3E5 9722      SBIW	R28,2
(0192) }
(0193) void shaomiao()
(0194) {unsigned int i;
(0195)    PORTC=0x89;
     3E6 E889      LDI	R24,0x89
     3E7 BB85      OUT	0x15,R24

⌨️ 快捷键说明

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