📄 01.lst
字号:
(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
0111 98C4 CBI 0x18,4
(0023) motol_en2;
0112 9AC5 SBI 0x18,5
(0024) if(speed!=0) //加入调速指令
0113 2300 TST R16
0114 F009 BEQ 0x0116
(0025) {
(0026) OCR0=speed;
0115 BF0C OUT 0x3C,R16
(0027) }
(0028) T0_EN;
0116 B789 IN R24,0x39
0117 6083 ORI R24,3
0118 BF89 OUT 0x39,R24
0119 9508 RET
(0029) }
(0030) //左电机后退
(0031) void motor_left_backward(uint8 speed)
(0032) {
(0033) motol_en1;
_motor_left_backward:
speed --> R16
011A 9AC4 SBI 0x18,4
(0034) motol_uen2;
011B 98C5 CBI 0x18,5
(0035) if(speed!=0) //加入调速指令
011C 2300 TST R16
011D F009 BEQ 0x011F
(0036) {
(0037) OCR0=speed;
011E BF0C OUT 0x3C,R16
(0038) }
(0039) T0_EN;
011F B789 IN R24,0x39
0120 6083 ORI R24,3
0121 BF89 OUT 0x39,R24
0122 9508 RET
(0040) }
(0041) //左电机速度设定
(0042) void motor_left_speed_set(uint8 speed)
(0043) {
(0044) if(speed!=0)
_motor_left_speed_set:
speed --> R16
0123 2300 TST R16
0124 F009 BEQ 0x0126
(0045) {
(0046) OCR0=speed;
0125 BF0C OUT 0x3C,R16
(0047) }
0126 9508 RET
(0048) }
(0049) //左电机滑行
(0050) void motor_left_stop(void)
(0051) {
(0052) motol_uen1;
_motor_left_stop:
0127 98C4 CBI 0x18,4
(0053) motol_uen2;
0128 98C5 CBI 0x18,5
(0054) T0_UEN;
0129 B789 IN R24,0x39
012A 7F8D ANDI R24,0xFD
012B BF89 OUT 0x39,R24
012C 9508 RET
(0055) }
(0056) //左电机急停
(0057) void motor_left_quick_stop(void)
(0058) {
(0059) motol_en1;
_motor_left_quick_stop:
012D 9AC4 SBI 0x18,4
(0060) motol_en2;
012E 9AC5 SBI 0x18,5
(0061) T0_UEN;
012F B789 IN R24,0x39
0130 7F8D ANDI R24,0xFD
0131 BF89 OUT 0x39,R24
0132 9508 RET
(0062) }
(0063)
(0064) /*************************右电机动作*****************************/
(0065) //右电机前进
(0066) void motor_right_forward(uint8 speed)
(0067) {
(0068) motor_en1;
_motor_right_forward:
speed --> R16
0133 9AC1 SBI 0x18,1
(0069) motor_uen2;
0134 98C2 CBI 0x18,2
(0070) if(speed!=0) //加入调速指令
0135 2300 TST R16
0136 F021 BEQ 0x013B
(0071) {
(0072) OCR2=speed;
0137 BD03 OUT 0x23,R16
(0073) while(ASSR&(1<<TCR2UB)==1) ; //异步操作需要等待 OCR2写入完毕
0138 B422 IN R2,0x22
0139 FC20 SBRC R2,0
013A CFFD RJMP 0x0138
(0074) }
013B 9508 RET
(0075) //T2_EN;
(0076) }
(0077) //右电机后退
(0078) void motor_right_backward(uint8 speed)
(0079) {
(0080) motor_uen1;
_motor_right_backward:
speed --> R16
013C 98C1 CBI 0x18,1
(0081) motor_en2;
013D 9AC2 SBI 0x18,2
(0082) if(speed!=0) //加入调速指令
013E 2300 TST R16
013F F021 BEQ 0x0144
(0083) {
(0084) OCR2=speed;
0140 BD03 OUT 0x23,R16
(0085) while(ASSR&(1<<TCR2UB)==1) ; //异步操作需要等待 OCR2写入完毕
0141 B422 IN R2,0x22
0142 FC20 SBRC R2,0
0143 CFFD RJMP 0x0141
(0086) }
0144 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
0145 2300 TST R16
0146 F021 BEQ 0x014B
(0093) {
(0094) OCR0=speed;
0147 BF0C OUT 0x3C,R16
(0095) while(ASSR&(1<<TCR2UB)==1) ; //异步操作需要等待 OCR2写入完毕
0148 B422 IN R2,0x22
0149 FC20 SBRC R2,0
014A CFFD RJMP 0x0148
(0096) }
014B 9508 RET
(0097) }
(0098) //右电机滑行
(0099) void motor_right_stop(void)
(0100) {
(0101) motor_uen1;
_motor_right_stop:
014C 98C1 CBI 0x18,1
(0102) motor_uen2;
014D 98C2 CBI 0x18,2
(0103) T2_UEN;
014E B789 IN R24,0x39
014F 778F ANDI R24,0x7F
0150 BF89 OUT 0x39,R24
0151 9508 RET
(0104) }
(0105)
(0106) //右电机急停
(0107) void motor_right_quick_stop(void)
(0108) {
(0109) motor_en1;
_motor_right_quick_stop:
0152 9AC1 SBI 0x18,1
(0110) motor_en2;
0153 9AC2 SBI 0x18,2
(0111) T2_UEN;
0154 B789 IN R24,0x39
0155 778F ANDI R24,0x7F
0156 BF89 OUT 0x39,R24
0157 9508 RET
(0112) }
(0113)
(0114) /**********************小车动作*****************************/
(0115)
(0116) void straight(void) //直行
(0117) {//motor_right_quick_stop();
(0118) motor_left_forward(0xfe);
_straight:
0158 EF0E LDI R16,0xFE
0159 DFB7 RCALL _motor_left_forward
(0119) motor_right_forward(0xfe);
015A EF0E LDI R16,0xFE
015B DFD7 RCALL _motor_right_forward
015C 9508 RET
(0120)
(0121) }
(0122)
(0123) void turn_left(void) //左转
(0124) {
(0125) motor_left_forward(0xfe);
_turn_left:
015D EF0E LDI R16,0xFE
015E DFB2 RCALL _motor_left_forward
(0126) motor_right_forward(0x50);
015F E500 LDI R16,0x50
0160 DFD2 RCALL _motor_right_forward
0161 9508 RET
(0127) }
(0128)
(0129) void turn_right(void) //右转
(0130) {
(0131) motor_left_forward(0xfe);
_turn_right:
0162 EF0E LDI R16,0xFE
0163 DFAD RCALL _motor_left_forward
(0132) motor_right_backward(0x50);
0164 E500 LDI R16,0x50
0165 DFD6 RCALL _motor_right_backward
0166 9508 RET
(0133) }
(0134)
(0135) void straight_back(void) //直回
(0136) {//motor_right_quick_stop();
(0137) motor_left_backward(0xfe);
_straight_back:
0167 EF0E LDI R16,0xFE
0168 DFB1 RCALL _motor_left_backward
(0138) motor_right_backward(0xfe);
0169 EF0E LDI R16,0xFE
016A DFD1 RCALL _motor_right_backward
016B 9508 RET
(0139) }
(0140)
(0141) void stop(void) //急停
(0142) {
(0143) motor_left_quick_stop();
_stop:
016C DFC0 RCALL _motor_left_quick_stop
(0144) motor_right_quick_stop();
016D DFE4 RCALL _motor_right_quick_stop
016E 9508 RET
(0145) }
(0146)
(0147) void mic_turn_right(void) //向右微调
(0148) {
(0149) motor_left_forward(0xa0);
_mic_turn_right:
016F EA00 LDI R16,0xA0
0170 DFA0 RCALL _motor_left_forward
(0150) motor_right_backward(0x30);
0171 E300 LDI R16,0x30
0172 DFC9 RCALL _motor_right_backward
0173 9508 RET
(0151) }
(0152)
(0153) void mic_turn_left(void) //向左微调
(0154) {
(0155) motor_left_forward(0xa0);
_mic_turn_left:
0174 EA00 LDI R16,0xA0
0175 DF9B RCALL _motor_left_forward
(0156) motor_right_forward(0x30);
0176 E300 LDI R16,0x30
0177 DFBB RCALL _motor_right_forward
0178 9508 RET
_flag_test:
temp --> R20
0179 940E01C7 CALL push_gset1
(0157) }
(0158)
(0159) void flag_test(void) //测试小车状态
(0160) {
(0161) uint8 temp;
(0162) temp = PINA&0x0f; //PINA的低四位
017B B349 IN R20,0x19
017C 704F ANDI R20,0xF
(0163) switch(temp)
017D 2755 CLR R21
017E 3040 CPI R20,0
017F E0E0 LDI R30,0
0180 075E CPC R21,R30
0181 F154 BLT 0x01AC
0182 E08F LDI R24,0xF
0183 E090 LDI R25,0
0184 1784 CP R24,R20
0185 0795 CPC R25,R21
0186 F12C BLT 0x01AC
0187 E002 LDI R16,2
0188 E010 LDI R17,0
0189 019A MOVW R18,R20
018A 940E01AF CALL empy16s
018C 01F8 MOVW R30,R16
018D E584 LDI R24,0x54
018E E090 LDI R25,0
018F 0FE8 ADD R30,R24
0190 1FF9 ADC R31,R25
0191 9005 LPM R0,Z+
0192 9014 LPM R1,0(Z)
0193 01F0 MOVW R30,R0
0194 9409 IJMP
(0164) {
(0165) case 0x0f:
(0166) flag = 0; //未偏
0195 2422 CLR R2
0196 92200060 STS flag,R2
(0167) break;
0198 C013 RJMP 0x01AC
(0168) case 0x01:
(0169) case 0x06:
(0170) case 0x07:
(0171) case 0x08:
(0172) case 0x0a:
(0173) case 0x0e:
(0174) flag = 1; //左偏
0199 E081 LDI R24,1
019A 93800060 STS flag,R24
(0175) break;
019C C00F RJMP 0x01AC
(0176) case 0x02:
(0177) case 0x04:
(0178) case 0x05:
(0179) case 0x09:
(0180) case 0x0b:
(0181) case 0x0d:
(0182) flag = 2; //右偏
019D E082 LDI R24,2
019E 93800060 STS flag,R24
(0183) break;
01A0 C00B RJMP 0x01AC
(0184) case 0x0c:
(0185) flag = 3; //前两出线
01A1 E083 LDI R24,3
01A2 93800060 STS flag,R24
(0186) break;
01A4 C007 RJMP 0x01AC
(0187) case 0x03:
(0188) flag = 4; //后两出线
01A5 E084 LDI R24,4
01A6 93800060 STS flag,R24
(0189) break;
01A8 C003 RJMP 0x01AC
(0190) case 0x00:
(0191) flag = 5; //脱轨
01A9 E085 LDI R24,5
01AA 93800060 STS flag,R24
(0192) break;
(0193) default:
(0194) break;
FILE: <library>
01AC 940E01CA CALL pop_gset1
01AE 9508 RET
empy16s:
01AF 920A ST R0,-Y
01B0 921A ST R1,-Y
01B1 938A ST R24,-Y
01B2 939A ST R25,-Y
01B3 9F02 MUL R16,R18
01B4 01C0 MOVW R24,R0
01B5 9F12 MUL R17,R18
01B6 0D90 ADD R25,R0
01B7 9F03 MUL R16,R19
01B8 0D90 ADD R25,R0
01B9 018C MOVW R16,R24
01BA 9199 LD R25,Y+
01BB 9189 LD R24,Y+
01BC 9019 LD R1,Y+
01BD 9009 LD R0,Y+
01BE 9508 RET
push_gset5:
01BF 92FA ST R15,-Y
01C0 92EA ST R14,-Y
push_gset4:
01C1 92DA ST R13,-Y
01C2 92CA ST R12,-Y
push_gset3:
01C3 92BA ST R11,-Y
01C4 92AA ST R10,-Y
push_gset2:
01C5 937A ST R23,-Y
01C6 936A ST R22,-Y
push_gset1:
01C7 935A ST R21,-Y
01C8 934A ST R20,-Y
01C9 9508 RET
pop_gset1:
01CA E0E1 LDI R30,1
pop:
01CB 9149 LD R20,Y+
01CC 9159 LD R21,Y+
01CD FDE0 SBRC R30,0
01CE 9508 RET
01CF 9169 LD R22,Y+
01D0 9179 LD R23,Y+
01D1 FDE1 SBRC R30,1
01D2 9508 RET
01D3 90A9 LD R10,Y+
01D4 90B9 LD R11,Y+
01D5 FDE2 SBRC R30,2
01D6 9508 RET
01D7 90C9 LD R12,Y+
01D8 90D9 LD R13,Y+
01D9 FDE3 SBRC R30,3
01DA 9508 RET
01DB 90E9 LD R14,Y+
01DC 90F9 LD R15,Y+
01DD 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -