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

📄 main.lst

📁 设计大赛寻迹小车题目程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    003A E5CF      LDI	R28,0x5F
    003B E0D8      LDI	R29,0x8
    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 940E0186  CALL	_main
_exit:
    005A CFFF      RJMP	_exit
FILE: D:\桌面\avr程序设计\循迹小车\motor.c
(0001) /****************************************************************
(0002) ** 文件名:motor.c   电机驱动函数
(0003) ****************************************************************/
(0004) #include "config.h"
(0005) 
(0006) /************************左电机动作*****************************/
(0007) //左电机前进
(0008) void motor_left_forward(uint8 speed)
(0009) {
(0010)  motol_uen1;
_motor_left_forward:
  speed                --> R16
    005B 98C4      CBI	0x18,4
(0011)  motol_en2;
    005C 9AC5      SBI	0x18,5
(0012)  if(speed!=0) //加入调速指令
    005D 2300      TST	R16
    005E F009      BEQ	0x0060
(0013)   {
(0014)    OCR0=speed;
    005F BF0C      OUT	0x3C,R16
(0015)   }
(0016)  T0_EN;
    0060 B789      IN	R24,0x39
    0061 6083      ORI	R24,3
    0062 BF89      OUT	0x39,R24
    0063 9508      RET
(0017) }
(0018) //左电机后退
(0019) void motor_left_backward(uint8 speed)
(0020) {
(0021)  motol_en1;
_motor_left_backward:
  speed                --> R16
    0064 9AC4      SBI	0x18,4
(0022)  motol_uen2;
    0065 98C5      CBI	0x18,5
(0023)  if(speed!=0) //加入调速指令
    0066 2300      TST	R16
    0067 F009      BEQ	0x0069
(0024)   {
(0025)    OCR0=speed;
    0068 BF0C      OUT	0x3C,R16
(0026)   }
(0027)  T0_EN;
    0069 B789      IN	R24,0x39
    006A 6083      ORI	R24,3
    006B BF89      OUT	0x39,R24
    006C 9508      RET
(0028) }
(0029) //左电机速度设定
(0030) void motor_left_speed_set(uint8 speed)
(0031) {
(0032)  if(speed!=0)
_motor_left_speed_set:
  speed                --> R16
    006D 2300      TST	R16
    006E F009      BEQ	0x0070
(0033)   {
(0034)    OCR0=speed;
    006F BF0C      OUT	0x3C,R16
(0035)   } 
    0070 9508      RET
(0036) }
(0037) //左电机滑行
(0038) void motor_left_stop(void)
(0039) {
(0040)  motol_uen1;
_motor_left_stop:
    0071 98C4      CBI	0x18,4
(0041)  motol_uen2;
    0072 98C5      CBI	0x18,5
(0042)  T0_UEN;
    0073 B789      IN	R24,0x39
    0074 7F8D      ANDI	R24,0xFD
    0075 BF89      OUT	0x39,R24
    0076 9508      RET
(0043) }
(0044) //左电机急停
(0045) void motor_left_quick_stop(void)
(0046) {
(0047)  motol_en1;
_motor_left_quick_stop:
    0077 9AC4      SBI	0x18,4
(0048)  motol_en2;
    0078 9AC5      SBI	0x18,5
(0049)  T0_UEN;
    0079 B789      IN	R24,0x39
    007A 7F8D      ANDI	R24,0xFD
    007B BF89      OUT	0x39,R24
    007C 9508      RET
(0050) }
(0051) 
(0052) /*************************右电机动作*****************************/
(0053) //右电机前进
(0054) void motor_right_forward(uint8 speed)
(0055) {
(0056)  motor_en1;
_motor_right_forward:
  speed                --> R16
    007D 9AC1      SBI	0x18,1
(0057)  motor_uen2;
    007E 98C2      CBI	0x18,2
(0058)   if(speed!=0) //加入调速指令
    007F 2300      TST	R16
    0080 F021      BEQ	0x0085
(0059)   {
(0060)    OCR2=speed;
    0081 BD03      OUT	0x23,R16
(0061)    while(ASSR&(1<<TCR2UB)==1) ; //异步操作需要等待 OCR2写入完毕
    0082 B422      IN	R2,0x22
    0083 FC20      SBRC	R2,0
    0084 CFFD      RJMP	0x0082
(0062)   }
(0063)  T2_EN;
    0085 B789      IN	R24,0x39
    0086 6C80      ORI	R24,0xC0
    0087 BF89      OUT	0x39,R24
    0088 9508      RET
(0064) }
(0065) //右电机后退
(0066) void motor_right_backward(uint8 speed)
(0067) {
(0068)  motor_uen1;
_motor_right_backward:
  speed                --> R16
    0089 98C1      CBI	0x18,1
(0069)  motor_en2;
    008A 9AC2      SBI	0x18,2
(0070)  if(speed!=0) //加入调速指令
    008B 2300      TST	R16
    008C F021      BEQ	0x0091
(0071)   {
(0072)    OCR2=speed;
    008D BD03      OUT	0x23,R16
(0073)    while(ASSR&(1<<TCR2UB)==1) ; //异步操作需要等待 OCR2写入完毕
    008E B422      IN	R2,0x22
    008F FC20      SBRC	R2,0
    0090 CFFD      RJMP	0x008E
(0074)   }
(0075)  T2_EN;
    0091 B789      IN	R24,0x39
    0092 6C80      ORI	R24,0xC0
    0093 BF89      OUT	0x39,R24
    0094 9508      RET
(0076) }
(0077) //右电机速度设定
(0078) void motor_right_speed_set(uint8 speed)
(0079) {
(0080)  if(speed!=0)
_motor_right_speed_set:
  speed                --> R16
    0095 2300      TST	R16
    0096 F021      BEQ	0x009B
(0081)   {
(0082)    OCR0=speed;
    0097 BF0C      OUT	0x3C,R16
(0083)    while(ASSR&(1<<TCR2UB)==1) ; //异步操作需要等待 OCR2写入完毕
    0098 B422      IN	R2,0x22
    0099 FC20      SBRC	R2,0
    009A CFFD      RJMP	0x0098
(0084)   } 
    009B 9508      RET
(0085) }
(0086) //右电机滑行
(0087) void motor_right_stop(void)
(0088) {
(0089)  motor_uen1;
_motor_right_stop:
    009C 98C1      CBI	0x18,1
(0090)  motor_uen2;
    009D 98C2      CBI	0x18,2
(0091)  T2_UEN;
    009E B789      IN	R24,0x39
    009F 778F      ANDI	R24,0x7F
    00A0 BF89      OUT	0x39,R24
    00A1 9508      RET
(0092) }
(0093) 
(0094) //右电机急停
(0095) void motor_right_quick_stop(void)
(0096) {
(0097)  motor_en1;
_motor_right_quick_stop:
    00A2 9AC1      SBI	0x18,1
(0098)  motor_en2;
    00A3 9AC2      SBI	0x18,2
(0099)  T2_UEN;
    00A4 B789      IN	R24,0x39
    00A5 778F      ANDI	R24,0x7F
    00A6 BF89      OUT	0x39,R24
    00A7 9508      RET
(0100) }
(0101) 
(0102) /**********************小车动作*****************************/
(0103) 
(0104) void straight(void) //直行
(0105) {
(0106)  motor_left_forward(0xfe);
_straight:
    00A8 EF0E      LDI	R16,0xFE
    00A9 DFB1      RCALL	_motor_left_forward
(0107)  motor_right_forward(0xfe);
    00AA EF0E      LDI	R16,0xFE
    00AB DFD1      RCALL	_motor_right_forward
    00AC 9508      RET
(0108) }
(0109) 
(0110) void turn_left(void) //左转
(0111) {
(0112)  motor_left_forward(0xfe);
_turn_left:
    00AD EF0E      LDI	R16,0xFE
    00AE DFAC      RCALL	_motor_left_forward
(0113)  motor_right_forward(0x50);
    00AF E500      LDI	R16,0x50
    00B0 DFCC      RCALL	_motor_right_forward
    00B1 9508      RET
(0114) }
(0115) 
(0116) void turn_right(void) //右转
(0117) {
(0118)  motor_left_forward(0x50);
_turn_right:
    00B2 E500      LDI	R16,0x50
    00B3 DFA7      RCALL	_motor_left_forward
(0119)  motor_right_forward(0xfe);
    00B4 EF0E      LDI	R16,0xFE
    00B5 DFC7      RCALL	_motor_right_forward
    00B6 9508      RET
(0120) }
(0121) 
(0122) void straight_back(void) //直回
(0123) {
(0124)  motor_left_backward(0xfe);
_straight_back:
    00B7 EF0E      LDI	R16,0xFE
    00B8 DFAB      RCALL	_motor_left_backward
(0125)  motor_right_backward(0xfe);
    00B9 EF0E      LDI	R16,0xFE
    00BA DFCE      RCALL	_motor_right_backward
    00BB 9508      RET
(0126) }
(0127) 
(0128) void stop(void)       //急停
(0129) {
(0130)  motor_left_quick_stop();
_stop:
    00BC DFBA      RCALL	_motor_left_quick_stop
(0131)  motor_right_quick_stop();
    00BD DFE4      RCALL	_motor_right_quick_stop
    00BE 9508      RET
(0132) }
(0133) 
(0134) void mic_turn_right(void) //向右微调
(0135) {
(0136)  motor_left_forward(0xa0);
_mic_turn_right:
    00BF EA00      LDI	R16,0xA0
    00C0 DF9A      RCALL	_motor_left_forward
(0137)  motor_right_forward(0xfe);
    00C1 EF0E      LDI	R16,0xFE
    00C2 DFBA      RCALL	_motor_right_forward
    00C3 9508      RET
(0138) }
(0139) 
(0140) void mic_turn_left(void) //向左微调
(0141) {
(0142)  motor_left_forward(0xFE);
_mic_turn_left:
    00C4 EF0E      LDI	R16,0xFE
    00C5 DF95      RCALL	_motor_left_forward
(0143)  motor_right_forward(0xa0);
    00C6 EA00      LDI	R16,0xA0
    00C7 DFB5      RCALL	_motor_right_forward
    00C8 9508      RET
_flag_test:
  temp                 --> R20
    00C9 940E01D3  CALL	push_gset1
(0144) }
(0145) 
(0146) void flag_test(void)  //测试小车状态
(0147) {
(0148)  uint8 temp;
(0149)  temp = PINA&0x0f; //PINA的低四位
    00CB B349      IN	R20,0x19
    00CC 704F      ANDI	R20,0xF
(0150)  switch(temp)
    00CD 2755      CLR	R21
    00CE 3040      CPI	R20,0
    00CF E0E0      LDI	R30,0
    00D0 075E      CPC	R21,R30
    00D1 F154      BLT	0x00FC
    00D2 E08F      LDI	R24,0xF
    00D3 E090      LDI	R25,0
    00D4 1784      CP	R24,R20
    00D5 0795      CPC	R25,R21
    00D6 F12C      BLT	0x00FC
    00D7 E002      LDI	R16,2
    00D8 E010      LDI	R17,0
    00D9 019A      MOVW	R18,R20
    00DA 940E01BB  CALL	empy16s
    00DC 01F8      MOVW	R30,R16
    00DD E584      LDI	R24,0x54
    00DE E090      LDI	R25,0
    00DF 0FE8      ADD	R30,R24
    00E0 1FF9      ADC	R31,R25
    00E1 9005      LPM	R0,Z+
    00E2 9014      LPM	R1,0(Z)
    00E3 01F0      MOVW	R30,R0
    00E4 9409      IJMP
(0151)   {
(0152)    case 0x0f:
(0153)        flag = 0;  //未偏
    00E5 2422      CLR	R2
    00E6 92200060  STS	flag,R2
(0154) 	   break;
    00E8 C013      RJMP	0x00FC
(0155)    case 0x01:
(0156)    case 0x06:
(0157)    case 0x07:
(0158)    case 0x08:
(0159)    case 0x0a:
(0160)    case 0x0e:
(0161)        flag = 1;  //左偏
    00E9 E081      LDI	R24,1
    00EA 93800060  STS	flag,R24
(0162) 	   break;
    00EC C00F      RJMP	0x00FC
(0163)    case 0x02:
(0164)    case 0x04:
(0165)    case 0x05:
(0166)    case 0x09:
(0167)    case 0x0b:
(0168)    case 0x0d:
(0169)        flag = 2;  //右偏
    00ED E082      LDI	R24,2
    00EE 93800060  STS	flag,R24
(0170) 	   break;
    00F0 C00B      RJMP	0x00FC
(0171)    case 0x0c:
(0172)        flag = 3;  //前两出线
    00F1 E083      LDI	R24,3
    00F2 93800060  STS	flag,R24
(0173) 	   break;
    00F4 C007      RJMP	0x00FC
(0174)    case 0x03:
(0175)        flag = 4; //后两出线
    00F5 E084      LDI	R24,4
    00F6 93800060  STS	flag,R24
(0176) 	   break;
    00F8 C003      RJMP	0x00FC
(0177)    case 0x00:
(0178)        flag = 5; //脱轨
    00F9 E085      LDI	R24,5
    00FA 93800060  STS	flag,R24
(0179) 	   break;
(0180)    default:
(0181)        break;
    00FC 940E01D6  CALL	pop_gset1
    00FE 9508      RET
_timer0_ovf_isr:
    00FF 938A      ST	R24,-Y
    0100 B78F      IN	R24,0x3F
    0101 938A      ST	R24,-Y
FILE: D:\桌面\avr程序设计\循迹小车\interupts.c
(0001) /*******************************************************************************

⌨️ 快捷键说明

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