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

📄 02.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 940E00A0  CALL	_main
_exit:
    005A CFFF      RJMP	_exit
_Delay100us:
  i                    --> R20
  n                    --> R16
    005B 940E01A6  CALL	push_gset1
FILE: C:\DOCUME~1\Administrator\桌面\小车寻迹\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 940E01A9  CALL	pop_gset1
    0069 9508      RET
_Delay1ms:
  n                    --> R20
    006A 940E01A6  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 940E01A9  CALL	pop_gset1
    0077 9508      RET
_Delay1s:
  n                    --> R20
    0078 940E01A6  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 940E018E  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 940E01A9  CALL	pop_gset1
    008B 9508      RET
_timer0_ovf_isr:
    008C 938A      ST	R24,-Y
    008D B78F      IN	R24,0x3F
    008E 938A      ST	R24,-Y
FILE: C:\DOCUME~1\Administrator\桌面\小车寻迹\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
    008F E081      LDI	R24,1
    0090 BF82      OUT	0x32,R24
    0091 9189      LD	R24,Y+
    0092 BF8F      OUT	0x3F,R24
    0093 9189      LD	R24,Y+
    0094 9518      RETI
(0010) }
(0011) 
(0012) #pragma interrupt_handler timer0_comp_isr:20
(0013) void timer0_comp_isr(void)
(0014) {
_timer0_comp_isr:
    0095 9518      RETI
_timer2_ovf_isr:
    0096 938A      ST	R24,-Y
    0097 B78F      IN	R24,0x3F
    0098 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
    0099 E081      LDI	R24,1
    009A BD84      OUT	0x24,R24
    009B 9189      LD	R24,Y+
    009C BF8F      OUT	0x3F,R24
    009D 9189      LD	R24,Y+
    009E 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:
    009F 9518      RETI
FILE: C:\DOCUME~1\Administrator\桌面\小车寻迹\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:
    00A0 940E0180  CALL	_init_devices
    00A2 C009      RJMP	0x00AC
(0047)   while(1)
(0048)    {
(0049) motor_left_forward(0xa0);
    00A3 EA00      LDI	R16,0xA0
    00A4 940E00AE  CALL	_motor_left_forward
(0050)   //Delay1ms(100);
(0051) //motor_right_forward(0xa0);
(0052) 
(0053) //straight();
(0054)  //Delay1ms(100);
(0055) //turn_left();
(0056) //Delay1ms(100);
(0057) //turn_right();
(0058)  //Delay1ms(100);
(0059)  
(0060)   //straight_back();
(0061)  //Delay1ms(500);
(0062)  //mic_turn_left();
(0063)  //Delay1ms(100);
(0064)   
(0065)  //mic_turn_right();
(0066) //Delay1ms(100);
(0067)  stop();
    00A6 940E0109  CALL	_stop
(0068)  Delay1ms(500);
    00A8 EF04      LDI	R16,0xF4
    00A9 E011      LDI	R17,1
    00AA 940E006A  CALL	_Delay1ms
    00AC CFF6      RJMP	0x00A3
    00AD 9508      RET
FILE: C:\DOCUME~1\Administrator\桌面\小车寻迹\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
(0010)  
(0011)  #define T2_EN TIMSK |= (1<<OCIE2)|(1<<TOIE2)
(0012)  #define T2_UEN TIMSK &=~ (1<<OCIE2)|(1<<TOIE2)
(0013)  #define T2_start TCCR2 = (1<<WGM20)|(1<<WGM21)|(1<<COM21)|0x06
(0014)  #define T2_stop TCCR2 = 0x00
(0015)  
(0016)  
(0017)  
(0018) /************************左电机动作*****************************/
(0019) //左电机前进
(0020) void motor_left_forward(uint8 speed)
(0021) {
(0022)  motol_uen1;
_motor_left_forward:
  speed                --> R16
    00AE 98C1      CBI	0x18,1
(0023)  motol_en2;
    00AF 9AC2      SBI	0x18,2
(0024)  if(speed!=0) //加入调速指令
    00B0 2300      TST	R16
    00B1 F009      BEQ	0x00B3
(0025)   {
(0026)    OCR0=speed;
    00B2 BF0C      OUT	0x3C,R16
(0027)   }
(0028)  T0_EN;
    00B3 B789      IN	R24,0x39
    00B4 6083      ORI	R24,3
    00B5 BF89      OUT	0x39,R24
    00B6 9508      RET
(0029) }
(0030) //左电机后退
(0031) void motor_left_backward(uint8 speed)
(0032) {
(0033)  motol_en1;
_motor_left_backward:
  speed                --> R16
    00B7 9AC1      SBI	0x18,1
(0034)  motol_uen2;
    00B8 98C2      CBI	0x18,2
(0035)  if(speed!=0) //加入调速指令
    00B9 2300      TST	R16
    00BA F009      BEQ	0x00BC
(0036)   {
(0037)    OCR0=speed;
    00BB BF0C      OUT	0x3C,R16
(0038)   }
(0039)  T0_EN;
    00BC B789      IN	R24,0x39
    00BD 6083      ORI	R24,3
    00BE BF89      OUT	0x39,R24
    00BF 9508      RET
(0040) }
(0041) //左电机速度设定
(0042) void motor_left_speed_set(uint8 speed)
(0043) {
(0044)  if(speed!=0)
_motor_left_speed_set:
  speed                --> R16
    00C0 2300      TST	R16
    00C1 F009      BEQ	0x00C3
(0045)   {
(0046)    OCR0=speed;
    00C2 BF0C      OUT	0x3C,R16
(0047)   } 
    00C3 9508      RET
(0048) }
(0049) //左电机滑行
(0050) void motor_left_stop(void)
(0051) {
(0052)  motol_uen1;
_motor_left_stop:
    00C4 98C1      CBI	0x18,1
(0053)  motol_uen2;
    00C5 98C2      CBI	0x18,2
(0054)  T0_UEN;
    00C6 B789      IN	R24,0x39
    00C7 7F8D      ANDI	R24,0xFD
    00C8 BF89      OUT	0x39,R24
    00C9 9508      RET
(0055) }
(0056) //左电机急停
(0057) void motor_left_quick_stop(void)
(0058) {
(0059)  motol_en1;
_motor_left_quick_stop:
    00CA 9AC1      SBI	0x18,1
(0060)  motol_en2;
    00CB 9AC2      SBI	0x18,2
(0061)  T0_UEN;
    00CC B789      IN	R24,0x39
    00CD 7F8D      ANDI	R24,0xFD
    00CE BF89      OUT	0x39,R24
    00CF 9508      RET
(0062) }
(0063) 
(0064) /*************************右电机动作*****************************/
(0065) //右电机前进
(0066) void motor_right_forward(uint8 speed)
(0067) {
(0068)  motor_en1;
_motor_right_forward:
  speed                --> R16
    00D0 9AC4      SBI	0x18,4
(0069)  motor_uen2;
    00D1 98C5      CBI	0x18,5
(0070)   if(speed!=0) //加入调速指令
    00D2 2300      TST	R16
    00D3 F021      BEQ	0x00D8
(0071)   {
(0072)    OCR2=speed;
    00D4 BD03      OUT	0x23,R16
(0073)    while(ASSR&(1<<TCR2UB)==1) ; //异步操作需要等待 OCR2写入完毕
    00D5 B422      IN	R2,0x22
    00D6 FC20      SBRC	R2,0
    00D7 CFFD      RJMP	0x00D5
(0074)   }
    00D8 9508      RET
(0075) //T2_EN;
(0076) }
(0077) //右电机后退
(0078) void motor_right_backward(uint8 speed)
(0079) {
(0080)  motor_uen1;
_motor_right_backward:
  speed                --> R16
    00D9 98C4      CBI	0x18,4
(0081)  motor_en2;
    00DA 9AC5      SBI	0x18,5
(0082)  if(speed!=0) //加入调速指令
    00DB 2300      TST	R16
    00DC F021      BEQ	0x00E1
(0083)   {
(0084)    OCR2=speed;
    00DD BD03      OUT	0x23,R16
(0085)    while(ASSR&(1<<TCR2UB)==1) ; //异步操作需要等待 OCR2写入完毕
    00DE B422      IN	R2,0x22
    00DF FC20      SBRC	R2,0
    00E0 CFFD      RJMP	0x00DE
(0086)   }
    00E1 9508      RET
(0087) //T2_EN;
(0088) }
(0089) //右电机速度设定
(0090) void motor_right_speed_set(uint8 speed)
(0091) {
(0092)  if(speed!=0)
_motor_right_speed_set:
  speed                --> R16
    00E2 2300      TST	R16
    00E3 F021      BEQ	0x00E8
(0093)   {
(0094)    OCR0=speed;
    00E4 BF0C      OUT	0x3C,R16

⌨️ 快捷键说明

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