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

📄 01.lst

📁 小车自动寻迹代码,可以进行电子设计,设计电动小车
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    003A E5CF      LDI	R28,0x5F
    003B E0D4      LDI	R29,4
    003C BFCD      OUT	0x3D,R28
    003D BFDE      OUT	0x3E,R29
    003E 51C0      SUBI	R28,0x10
    003F 40D0      SBCI	R29,0
    0040 EA0A      LDI	R16,0xAA
    0041 8308      STD	Y+0,R16
    0042 2400      CLR	R0
    0043 E6E0      LDI	R30,0x60
    0044 E0F0      LDI	R31,0
    0045 E010      LDI	R17,0
    0046 36E1      CPI	R30,0x61
    0047 07F1      CPC	R31,R17
    0048 F011      BEQ	0x004B
    0049 9201      ST	R0,Z+
    004A CFFB      RJMP	0x0046
    004B 8300      STD	Z+0,R16
    004C E7E4      LDI	R30,0x74
    004D E0F0      LDI	R31,0
    004E E6A0      LDI	R26,0x60
    004F E0B0      LDI	R27,0
    0050 E010      LDI	R17,0
    0051 37E4      CPI	R30,0x74
    0052 07F1      CPC	R31,R17
    0053 F021      BEQ	0x0058
    0054 95C8      LPM
    0055 9631      ADIW	R30,1
    0056 920D      ST	R0,X+
    0057 CFF9      RJMP	0x0051
    0058 940E00E2  CALL	_main
_exit:
    005A CFFF      RJMP	_exit
_Delay100us:
  i                    --> R20
  n                    --> R16
    005B 940E01C7  CALL	push_gset1
FILE: C:\DOCUME~1\Administrator.1B4135EF7FF9405\桌面\小车寻迹\unit.c
(0001) #include "config.h"
(0002) /***************************************************************************
(0003) 延时公式
(0004) 
(0005) */
(0006) void Delay100us(uint8 n)
(0007) {
(0008) 	uint8 i;          //4clock                   
(0009) 	for(i=147;n!=0;n--)	
    005D E943      LDI	R20,0x93
    005E C006      RJMP	0x0065
(0010) 	while(--i);      //5 * i clock
    005F 2F84      MOV	R24,R20
    0060 5081      SUBI	R24,1
    0061 2F48      MOV	R20,R24
    0062 2388      TST	R24
    0063 F7D9      BNE	0x005F
    0064 950A      DEC	R16
    0065 2300      TST	R16
    0066 F7C1      BNE	0x005F
    0067 940E01CA  CALL	pop_gset1
    0069 9508      RET
_Delay1ms:
  n                    --> R20
    006A 940E01C7  CALL	push_gset1
    006C 01A8      MOVW	R20,R16
(0011) }
(0012) void Delay1ms(uint16 n)
(0013) {        
(0014) 	for (;n!=0;n--){
    006D C004      RJMP	0x0072
(0015) 		Delay100us(10);
    006E E00A      LDI	R16,0xA
    006F DFEB      RCALL	_Delay100us
    0070 5041      SUBI	R20,1
    0071 4050      SBCI	R21,0
    0072 3040      CPI	R20,0
    0073 0745      CPC	R20,R21
    0074 F7C9      BNE	0x006E
    0075 940E01CA  CALL	pop_gset1
    0077 9508      RET
_Delay1s:
  n                    --> R20
    0078 940E01C7  CALL	push_gset1
    007A 01A8      MOVW	R20,R16
(0016) 	}
(0017) }
(0018) void Delay1s(uint16 n)
(0019) {
(0020) 	n=n*40;                
    007B E208      LDI	R16,0x28
    007C E010      LDI	R17,0
    007D 019A      MOVW	R18,R20
    007E 940E01AF  CALL	empy16s
    0080 01A8      MOVW	R20,R16
(0021) 	for (;n!=0;n--){
    0081 C004      RJMP	0x0086
(0022) 		Delay100us(250);
    0082 EF0A      LDI	R16,0xFA
    0083 DFD7      RCALL	_Delay100us
    0084 5041      SUBI	R20,1
    0085 4050      SBCI	R21,0
    0086 3040      CPI	R20,0
    0087 0745      CPC	R20,R21
    0088 F7C9      BNE	0x0082
    0089 940E01CA  CALL	pop_gset1
    008B 9508      RET
FILE: C:\DOCUME~1\Administrator.1B4135EF7FF9405\桌面\小车寻迹\init_device.c
(0001) //ICC-AVR application builder : 2006-9-7 0:27:10
(0002) // Target : M32
(0003) // Crystal: 7.3728Mhz
(0004) #include "config.h"
(0005) 
(0006) void port_init(void)
(0007) {
(0008)  PORTA = 0x00;
_port_init:
    008C 2422      CLR	R2
    008D BA2B      OUT	0x1B,R2
(0009)  DDRA  = 0x00;
    008E BA2A      OUT	0x1A,R2
(0010)  PORTB = 0x00;
    008F BA28      OUT	0x18,R2
(0011)  DDRB  = 0xFF;
    0090 EF8F      LDI	R24,0xFF
    0091 BB87      OUT	0x17,R24
(0012)  PORTC = 0x00;
    0092 BA25      OUT	0x15,R2
(0013)  DDRC  = 0x00;
    0093 BA24      OUT	0x14,R2
(0014)  PORTD = 0x00;
    0094 BA22      OUT	0x12,R2
(0015)  DDRD  = 0x80;
    0095 E880      LDI	R24,0x80
    0096 BB81      OUT	0x11,R24
    0097 9508      RET
(0016) }
(0017) 
(0018) //============timer1 PWM输出==================//
(0019) //TIMER0 initialize - prescale:1024
(0020) // desired value: 25mSec
(0021) // actual value: 25.000mSec (0.0%)
(0022) void timer0_init(void)
(0023) {
(0024)  TCCR0 = 0x00;  //stop
_timer0_init:
    0098 2422      CLR	R2
    0099 BE23      OUT	0x33,R2
(0025)  TCNT0= 0x01;  //set count
    009A E081      LDI	R24,1
    009B BF82      OUT	0x32,R24
(0026)  OCR0 = 0x66;  //set compare
    009C E686      LDI	R24,0x66
    009D BF8C      OUT	0x3C,R24
(0027)  TCCR0 = (1<<WGM00)|(1<<WGM01)|(1<<COM01)|0x04;//0x04 0100B 代表256预分频
    009E E68C      LDI	R24,0x6C
    009F BF83      OUT	0x33,R24
    00A0 9508      RET
(0028) }
(0029) 
(0030) //TIMER1 initialize - prescale:8
(0031) // desired value: 50mSec
(0032) // actual value:  50mSec (0.0%)
(0033) void timer1_init(void) 
(0034) {
(0035)  TCCR1B = 0x00; //stop
_timer1_init:
    00A1 2422      CLR	R2
    00A2 BC2E      OUT	0x2E,R2
(0036)  TCNT1H = 0x4C; //setup
    00A3 E48C      LDI	R24,0x4C
    00A4 BD8D      OUT	0x2D,R24
(0037)  TCNT1L = 0x01;
    00A5 E081      LDI	R24,1
    00A6 BD8C      OUT	0x2C,R24
(0038)  OCR1AH = 0xB3;
    00A7 EB83      LDI	R24,0xB3
    00A8 BD8B      OUT	0x2B,R24
(0039)  OCR1AL = 0xFF;
    00A9 EF8F      LDI	R24,0xFF
    00AA BD8A      OUT	0x2A,R24
(0040)  OCR1BH = 0xB3;
    00AB EB83      LDI	R24,0xB3
    00AC BD89      OUT	0x29,R24
(0041)  OCR1BL = 0xFF;
    00AD EF8F      LDI	R24,0xFF
    00AE BD88      OUT	0x28,R24
(0042)  ICR1H  = 0xB3;
    00AF EB83      LDI	R24,0xB3
    00B0 BD87      OUT	0x27,R24
(0043)  ICR1L  = 0xFF;
    00B1 EF8F      LDI	R24,0xFF
    00B2 BD86      OUT	0x26,R24
(0044)  TCCR1A = 0x00;
    00B3 BC2F      OUT	0x2F,R2
(0045)  TCCR1B = 0x02; //start Timer
    00B4 E082      LDI	R24,2
    00B5 BD8E      OUT	0x2E,R24
    00B6 9508      RET
(0046) }
(0047) /**************************timer2 PWM输出***********************/
(0048) // PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值)) 
(0049) void timer2_init(void)
(0050) {
(0051)  TCCR2 = 0x00;  //stop
_timer2_init:
    00B7 2422      CLR	R2
    00B8 BC25      OUT	0x25,R2
(0052)  TCNT2= 0x01;  //set count
    00B9 E081      LDI	R24,1
    00BA BD84      OUT	0x24,R24
(0053)  OCR2 = 0x66;  //set compare
    00BB E686      LDI	R24,0x66
    00BC BD83      OUT	0x23,R24
(0054)  TCCR2 = (1<<WGM20)|(1<<WGM21)|(1<<COM21)|0x06; //  start timer 快速pwm模式,匹配清零,溢出置位 256分频
    00BD E68E      LDI	R24,0x6E
    00BE BD85      OUT	0x25,R24
    00BF 9508      RET
(0055) //高比低为:(OCR2-0X55)/(0XFF-OCR2)    OX55++++++(0X77)__________OXFF
(0056) //即OCR2越大,输出越大
(0057) }
(0058) 
(0059) //call this routine to initialize all peripherals
(0060) void init_devices(void)
(0061) {
(0062)  //stop errant interrupts until set up
(0063)  CLI(); //disable all interrupts
_init_devices:
    00C0 94F8      BCLR	7
(0064)  port_init();
    00C1 DFCA      RCALL	_port_init
(0065)  timer2_init();
    00C2 DFF4      RCALL	_timer2_init
(0066) // timer1_init();
(0067)  timer0_init();
    00C3 DFD4      RCALL	_timer0_init
(0068)  MCUCR |= (1<<ISC01);    // INT0,INT1 下降沿产生中断请求
    00C4 B785      IN	R24,0x35
    00C5 6082      ORI	R24,2
    00C6 BF85      OUT	0x35,R24
(0069)  //MCUCSR |= (1<<ISC2);             //INT2上升沿产生中断请求
(0070)  GICR |= (1<<INT0)|(1<<INT1);
    00C7 B78B      IN	R24,0x3B
    00C8 6C80      ORI	R24,0xC0
    00C9 BF8B      OUT	0x3B,R24
(0071)  TIMSK = (1<<TOIE0)|(1<<TOIE2)|(1<<OCIE0)|(0<<OCIE2); //timer interrupt sources
    00CA E483      LDI	R24,0x43
    00CB BF89      OUT	0x39,R24
(0072)  SEI(); //re-enable interrupts
    00CC 9478      BSET	7
    00CD 9508      RET
_timer0_ovf_isr:
    00CE 938A      ST	R24,-Y
    00CF B78F      IN	R24,0x3F
    00D0 938A      ST	R24,-Y
FILE: C:\DOCUME~1\Administrator.1B4135EF7FF9405\桌面\小车寻迹\interupts.c
(0001) /*******************************************************************************
(0002) ** 文件名:interupts.c   中断处理函数
(0003) *******************************************************************************/
(0004) #include "config.h"
(0005) 
(0006) #pragma interrupt_handler timer0_ovf_isr:10
(0007) void timer0_ovf_isr(void)
(0008) {
(0009)  TCNT0 = 0x01; //reload counter value
    00D1 E081      LDI	R24,1
    00D2 BF82      OUT	0x32,R24
    00D3 9189      LD	R24,Y+
    00D4 BF8F      OUT	0x3F,R24
    00D5 9189      LD	R24,Y+
    00D6 9518      RETI
(0010) }
(0011) 
(0012) #pragma interrupt_handler timer0_comp_isr:20
(0013) void timer0_comp_isr(void)
(0014) {
_timer0_comp_isr:
    00D7 9518      RETI
_timer2_ovf_isr:
    00D8 938A      ST	R24,-Y
    00D9 B78F      IN	R24,0x3F
    00DA 938A      ST	R24,-Y
(0015)    //compare occured TCNT0=OCR0
(0016) }
(0017) 
(0018) #pragma interrupt_handler timer2_ovf_isr:6
(0019) void timer2_ovf_isr(void)
(0020) {
(0021)  TCNT2 = 0x01; //reload counter value
    00DB E081      LDI	R24,1
    00DC BD84      OUT	0x24,R24
    00DD 9189      LD	R24,Y+
    00DE BF8F      OUT	0x3F,R24
    00DF 9189      LD	R24,Y+
    00E0 9518      RETI
(0022) }
(0023) 
(0024) /******************************************************************************/
(0025) // T2 控制PWM输出
(0026) // timer2_comp_isr不需要用,但是必须允许中断,在中断时有信号输出变化
(0027) /******************************************************************************/
(0028) 
(0029) #pragma interrupt_handler timer2_comp_isr:8
(0030) void timer2_comp_isr(void)
(0031) {
_timer2_comp_isr:
    00E1 9518      RETI
FILE: C:\DOCUME~1\Administrator.1B4135EF7FF9405\桌面\小车寻迹\main.c
(0001) /*******************************************************************************
(0002) ** 文件名:main.c   工程主文件
(0003) *******************************************************************************/
(0004) #include "config.h"
(0005) 
(0006) volatile uint8 flag; //小车状态
(0007) //0未偏 1左偏 2右偏 3前出线 4后出线 5脱轨
(0008) /*void main(void)
(0009) {
(0010)  init_devices();
(0011)  straight();
(0012)  
(0013)  flag_test();  //测试小车状态
(0014)  while(1) //没有脱轨
(0015)  {
(0016)   flag_test();
(0017)   switch(flag)
(0018)   {
(0019)   case 0:      //正常情况将速度设成相等
(0020)     motor_right_speed_set(0xFE);
(0021)     motor_left_speed_set(0xFE);
(0022)     break;
(0023)   case 1:
(0024)    mic_turn_right();
(0025)    break;
(0026)   case 2:
(0027)    mic_turn_left();
(0028)    break;
(0029)   case 3:
(0030)    break;
(0031)   case 4:
(0032)    break;
(0033)   case 5:
(0034)    stop();
(0035)    break;
(0036)   default:
(0037)    break;
(0038)   }
(0039)  }
(0040) }/end main*/
(0041) 
(0042) // moto test  *****************************************************************
(0043) 
(0044) void main(void)
(0045) {
(0046)  init_devices();
_main:
    00E2 940E00C0  CALL	_init_devices
    00E4 C02A      RJMP	0x010F
(0047)   while(1)
(0048)    {
(0049)  
(0050) straight();
    00E5 940E0158  CALL	_straight
(0051)  Delay1ms(1000);
    00E7 EE08      LDI	R16,0xE8
    00E8 E013      LDI	R17,3
    00E9 940E006A  CALL	_Delay1ms
(0052) turn_left();
    00EB 940E015D  CALL	_turn_left
(0053) Delay1ms(100);
    00ED E604      LDI	R16,0x64
    00EE E010      LDI	R17,0
    00EF 940E006A  CALL	_Delay1ms
(0054) turn_right();
    00F1 940E0162  CALL	_turn_right
(0055)  Delay1ms(100);
    00F3 E604      LDI	R16,0x64
    00F4 E010      LDI	R17,0
    00F5 940E006A  CALL	_Delay1ms
(0056)  
(0057)   straight_back();
    00F7 940E0167  CALL	_straight_back
(0058)  Delay1ms(500);
    00F9 EF04      LDI	R16,0xF4
    00FA E011      LDI	R17,1
    00FB 940E006A  CALL	_Delay1ms
(0059)  mic_turn_left();
    00FD 940E0174  CALL	_mic_turn_left
(0060)  Delay1ms(100);
    00FF E604      LDI	R16,0x64
    0100 E010      LDI	R17,0
    0101 940E006A  CALL	_Delay1ms
(0061)   
(0062)  mic_turn_right();
    0103 940E016F  CALL	_mic_turn_right
(0063) Delay1ms(100);
    0105 E604      LDI	R16,0x64
    0106 E010      LDI	R17,0
    0107 940E006A  CALL	_Delay1ms
(0064)  stop();
    0109 940E016C  CALL	_stop
(0065)  Delay1ms(500);
    010B EF04      LDI	R16,0xF4
    010C E011      LDI	R17,1
    010D 940E006A  CALL	_Delay1ms
    010F CFD5      RJMP	0x00E5
    0110 9508      RET
FILE: C:\DOCUME~1\Administrator.1B4135EF7FF9405\桌面\小车寻迹\motor.c
(0001) /****************************************************************
(0002) ** 文件名:motor.c   电机驱动函数
(0003) ****************************************************************/
(0004)  #include "config.h"
(0005)  /*#define T0_EN TIMSK |= (1<<OCIE0)|(1<<TOIE0)
(0006)  #define T0_UEN TIMSK &=~ (1<<OCIE0)|(1<<TOIE0)
(0007)  #define T0_start TCCR0 |= (1<<WGM00)|(1<<WGM01)|(1<<COM01)|0x04;
(0008)  //0x04 0100B 代表256预分频
(0009)  #define T0_stop TCCR0 = 0x00

⌨️ 快捷键说明

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