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

📄 02.lst

📁 小车自动寻迹代码,可以进行电子设计,设计电动小车
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0095)    while(ASSR&(1<<TCR2UB)==1) ; //异步操作需要等待 OCR2写入完毕
    00E5 B422      IN	R2,0x22
    00E6 FC20      SBRC	R2,0
    00E7 CFFD      RJMP	0x00E5
(0096)   } 
    00E8 9508      RET
(0097) }
(0098) //右电机滑行
(0099) void motor_right_stop(void)
(0100) {
(0101)  motor_uen1;
_motor_right_stop:
    00E9 98C4      CBI	0x18,4
(0102)  motor_uen2;
    00EA 98C5      CBI	0x18,5
(0103)  T2_UEN;
    00EB B789      IN	R24,0x39
    00EC 778F      ANDI	R24,0x7F
    00ED BF89      OUT	0x39,R24
    00EE 9508      RET
(0104) }
(0105) 
(0106) //右电机急停
(0107) void motor_right_quick_stop(void)
(0108) {
(0109)  motor_en1;
_motor_right_quick_stop:
    00EF 9AC4      SBI	0x18,4
(0110)  motor_en2;
    00F0 9AC5      SBI	0x18,5
(0111)  T2_UEN;
    00F1 B789      IN	R24,0x39
    00F2 778F      ANDI	R24,0x7F
    00F3 BF89      OUT	0x39,R24
    00F4 9508      RET
(0112) }
(0113) 
(0114) /**********************小车动作*****************************/
(0115) 
(0116) void straight(void) //直行
(0117) {//motor_right_quick_stop();
(0118)  motor_left_forward(0xfe);
_straight:
    00F5 EF0E      LDI	R16,0xFE
    00F6 DFB7      RCALL	_motor_left_forward
(0119)  motor_right_forward(0xfe);
    00F7 EF0E      LDI	R16,0xFE
    00F8 DFD7      RCALL	_motor_right_forward
    00F9 9508      RET
(0120) 
(0121) }
(0122) 
(0123) void turn_left(void) //左转
(0124) {
(0125) motor_left_forward(0xfe);
_turn_left:
    00FA EF0E      LDI	R16,0xFE
    00FB DFB2      RCALL	_motor_left_forward
(0126)  motor_right_forward(0x50);
    00FC E500      LDI	R16,0x50
    00FD DFD2      RCALL	_motor_right_forward
    00FE 9508      RET
(0127) }
(0128) 
(0129) void turn_right(void) //右转
(0130) {
(0131)  motor_left_forward(0xfe);
_turn_right:
    00FF EF0E      LDI	R16,0xFE
    0100 DFAD      RCALL	_motor_left_forward
(0132)  motor_right_backward(0x50);
    0101 E500      LDI	R16,0x50
    0102 DFD6      RCALL	_motor_right_backward
    0103 9508      RET
(0133) }
(0134) 
(0135) void straight_back(void) //直回
(0136) {//motor_right_quick_stop();
(0137)  motor_left_backward(0xfe);
_straight_back:
    0104 EF0E      LDI	R16,0xFE
    0105 DFB1      RCALL	_motor_left_backward
(0138) motor_right_backward(0xfe);
    0106 EF0E      LDI	R16,0xFE
    0107 DFD1      RCALL	_motor_right_backward
    0108 9508      RET
(0139) }
(0140) 
(0141) void stop(void)       //急停
(0142) {
(0143)  motor_left_quick_stop();
_stop:
    0109 DFC0      RCALL	_motor_left_quick_stop
(0144)  motor_right_quick_stop();
    010A DFE4      RCALL	_motor_right_quick_stop
    010B 9508      RET
(0145) }
(0146) 
(0147) void mic_turn_right(void) //向右微调
(0148) {
(0149)  motor_left_forward(0xa0);
_mic_turn_right:
    010C EA00      LDI	R16,0xA0
    010D DFA0      RCALL	_motor_left_forward
(0150)  motor_right_backward(0x30);
    010E E300      LDI	R16,0x30
    010F DFC9      RCALL	_motor_right_backward
    0110 9508      RET
(0151) }
(0152) 
(0153) void mic_turn_left(void) //向左微调
(0154) {
(0155) motor_left_forward(0xa0);
_mic_turn_left:
    0111 EA00      LDI	R16,0xA0
    0112 DF9B      RCALL	_motor_left_forward
(0156)  motor_right_forward(0x30);
    0113 E300      LDI	R16,0x30
    0114 DFBB      RCALL	_motor_right_forward
    0115 9508      RET
_flag_test:
  temp                 --> R20
    0116 940E01A6  CALL	push_gset1
(0157) }
(0158) 
(0159) void flag_test(void)  //测试小车状态
(0160) {
(0161)  uint8 temp;
(0162)  temp = PINA&0x0f; //PINA的低四位
    0118 B349      IN	R20,0x19
    0119 704F      ANDI	R20,0xF
(0163)  switch(temp)
    011A 2755      CLR	R21
    011B 3040      CPI	R20,0
    011C E0E0      LDI	R30,0
    011D 075E      CPC	R21,R30
    011E F154      BLT	0x0149
    011F E08F      LDI	R24,0xF
    0120 E090      LDI	R25,0
    0121 1784      CP	R24,R20
    0122 0795      CPC	R25,R21
    0123 F12C      BLT	0x0149
    0124 E002      LDI	R16,2
    0125 E010      LDI	R17,0
    0126 019A      MOVW	R18,R20
    0127 940E018E  CALL	empy16s
    0129 01F8      MOVW	R30,R16
    012A E584      LDI	R24,0x54
    012B E090      LDI	R25,0
    012C 0FE8      ADD	R30,R24
    012D 1FF9      ADC	R31,R25
    012E 9005      LPM	R0,Z+
    012F 9014      LPM	R1,0(Z)
    0130 01F0      MOVW	R30,R0
    0131 9409      IJMP
(0164)   {
(0165)    case 0x0f:
(0166)        flag = 0;  //未偏
    0132 2422      CLR	R2
    0133 92200060  STS	flag,R2
(0167) 	   break;
    0135 C013      RJMP	0x0149
(0168)    case 0x01:
(0169)    case 0x06:
(0170)    case 0x07:
(0171)    case 0x08:
(0172)    case 0x0a:
(0173)    case 0x0e:
(0174)        flag = 1;  //左偏
    0136 E081      LDI	R24,1
    0137 93800060  STS	flag,R24
(0175) 	   break;
    0139 C00F      RJMP	0x0149
(0176)    case 0x02:
(0177)    case 0x04:
(0178)    case 0x05:
(0179)    case 0x09:
(0180)    case 0x0b:
(0181)    case 0x0d:
(0182)        flag = 2;  //右偏
    013A E082      LDI	R24,2
    013B 93800060  STS	flag,R24
(0183) 	   break;
    013D C00B      RJMP	0x0149
(0184)    case 0x0c:
(0185)        flag = 3;  //前两出线
    013E E083      LDI	R24,3
    013F 93800060  STS	flag,R24
(0186) 	   break;
    0141 C007      RJMP	0x0149
(0187)    case 0x03:
(0188)        flag = 4; //后两出线
    0142 E084      LDI	R24,4
    0143 93800060  STS	flag,R24
(0189) 	   break;
    0145 C003      RJMP	0x0149
(0190)    case 0x00:
(0191)        flag = 5; //脱轨
    0146 E085      LDI	R24,5
    0147 93800060  STS	flag,R24
(0192) 	   break;
(0193)    default:
(0194)        break;
    0149 940E01A9  CALL	pop_gset1
    014B 9508      RET
FILE: C:\DOCUME~1\Administrator\桌面\小车寻迹\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:
    014C 2422      CLR	R2
    014D BA2B      OUT	0x1B,R2
(0009)  DDRA  = 0x00;
    014E BA2A      OUT	0x1A,R2
(0010)  PORTB = 0x00;
    014F BA28      OUT	0x18,R2
(0011)  DDRB  = 0xFF;
    0150 EF8F      LDI	R24,0xFF
    0151 BB87      OUT	0x17,R24
(0012)  PORTC = 0x00;
    0152 BA25      OUT	0x15,R2
(0013)  DDRC  = 0x00;
    0153 BA24      OUT	0x14,R2
(0014)  PORTD = 0x00;
    0154 BA22      OUT	0x12,R2
(0015)  DDRD  = 0x80;
    0155 E880      LDI	R24,0x80
    0156 BB81      OUT	0x11,R24
    0157 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:
    0158 2422      CLR	R2
    0159 BE23      OUT	0x33,R2
(0025)  TCNT0= 0x01;  //set count
    015A E081      LDI	R24,1
    015B BF82      OUT	0x32,R24
(0026)  OCR0 = 0x66;  //set compare
    015C E686      LDI	R24,0x66
    015D BF8C      OUT	0x3C,R24
(0027)  TCCR0 = (1<<WGM00)|(1<<WGM01)|(1<<COM01)|0x04;//0x04 0100B 代表256预分频
    015E E68C      LDI	R24,0x6C
    015F BF83      OUT	0x33,R24
    0160 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:
    0161 2422      CLR	R2
    0162 BC2E      OUT	0x2E,R2
(0036)  TCNT1H = 0x4C; //setup
    0163 E48C      LDI	R24,0x4C
    0164 BD8D      OUT	0x2D,R24
(0037)  TCNT1L = 0x01;
    0165 E081      LDI	R24,1
    0166 BD8C      OUT	0x2C,R24
(0038)  OCR1AH = 0xB3;
    0167 EB83      LDI	R24,0xB3
    0168 BD8B      OUT	0x2B,R24
(0039)  OCR1AL = 0xFF;
    0169 EF8F      LDI	R24,0xFF
    016A BD8A      OUT	0x2A,R24
(0040)  OCR1BH = 0xB3;
    016B EB83      LDI	R24,0xB3
    016C BD89      OUT	0x29,R24
(0041)  OCR1BL = 0xFF;
    016D EF8F      LDI	R24,0xFF
    016E BD88      OUT	0x28,R24
(0042)  ICR1H  = 0xB3;
    016F EB83      LDI	R24,0xB3
    0170 BD87      OUT	0x27,R24
(0043)  ICR1L  = 0xFF;
    0171 EF8F      LDI	R24,0xFF
    0172 BD86      OUT	0x26,R24
(0044)  TCCR1A = 0x00;
    0173 BC2F      OUT	0x2F,R2
(0045)  TCCR1B = 0x02; //start Timer
    0174 E082      LDI	R24,2
    0175 BD8E      OUT	0x2E,R24
    0176 9508      RET
(0046) }
(0047) /**************************timer2 PWM输出***********************/
(0048) // PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值)) 
(0049) void timer2_init(void)
(0050) {
(0051)  TCCR2 = 0x00;  //stop
_timer2_init:
    0177 2422      CLR	R2
    0178 BC25      OUT	0x25,R2
(0052)  TCNT2= 0x01;  //set count
    0179 E081      LDI	R24,1
    017A BD84      OUT	0x24,R24
(0053)  OCR2 = 0x66;  //set compare
    017B E686      LDI	R24,0x66
    017C BD83      OUT	0x23,R24
(0054)  TCCR2 = (1<<WGM20)|(1<<WGM21)|(1<<COM21)|0x06; //  start timer 快速pwm模式,匹配清零,溢出置位 256分频
    017D E68E      LDI	R24,0x6E
    017E BD85      OUT	0x25,R24
    017F 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:
    0180 94F8      BCLR	7
(0064)  port_init();
    0181 DFCA      RCALL	_port_init
(0065)  timer2_init();
    0182 DFF4      RCALL	_timer2_init
(0066) // timer1_init();
(0067)  timer0_init();
    0183 DFD4      RCALL	_timer0_init
(0068)  MCUCR |= (1<<ISC01);    // INT0,INT1 下降沿产生中断请求
    0184 B785      IN	R24,0x35
    0185 6082      ORI	R24,2
    0186 BF85      OUT	0x35,R24
(0069)  //MCUCSR |= (1<<ISC2);             //INT2上升沿产生中断请求
(0070)  GICR |= (1<<INT0)|(1<<INT1);
    0187 B78B      IN	R24,0x3B
    0188 6C80      ORI	R24,0xC0
    0189 BF8B      OUT	0x3B,R24
(0071)  TIMSK = (1<<TOIE0)|(1<<TOIE2)|(1<<OCIE0)|(0<<OCIE2); //timer interrupt sources
    018A E483      LDI	R24,0x43
    018B BF89      OUT	0x39,R24
(0072)  SEI(); //re-enable interrupts
FILE: <library>
    018C 9478      BSET	7
    018D 9508      RET
empy16s:
    018E 920A      ST	R0,-Y
    018F 921A      ST	R1,-Y
    0190 938A      ST	R24,-Y
    0191 939A      ST	R25,-Y
    0192 9F02      MUL	R16,R18
    0193 01C0      MOVW	R24,R0
    0194 9F12      MUL	R17,R18
    0195 0D90      ADD	R25,R0
    0196 9F03      MUL	R16,R19
    0197 0D90      ADD	R25,R0
    0198 018C      MOVW	R16,R24
    0199 9199      LD	R25,Y+
    019A 9189      LD	R24,Y+
    019B 9019      LD	R1,Y+
    019C 9009      LD	R0,Y+
    019D 9508      RET
push_gset5:
    019E 92FA      ST	R15,-Y
    019F 92EA      ST	R14,-Y
push_gset4:
    01A0 92DA      ST	R13,-Y
    01A1 92CA      ST	R12,-Y
push_gset3:
    01A2 92BA      ST	R11,-Y
    01A3 92AA      ST	R10,-Y
push_gset2:
    01A4 937A      ST	R23,-Y
    01A5 936A      ST	R22,-Y
push_gset1:
    01A6 935A      ST	R21,-Y
    01A7 934A      ST	R20,-Y
    01A8 9508      RET
pop_gset1:
    01A9 E0E1      LDI	R30,1
pop:
    01AA 9149      LD	R20,Y+
    01AB 9159      LD	R21,Y+
    01AC FDE0      SBRC	R30,0
    01AD 9508      RET
    01AE 9169      LD	R22,Y+
    01AF 9179      LD	R23,Y+
    01B0 FDE1      SBRC	R30,1
    01B1 9508      RET
    01B2 90A9      LD	R10,Y+
    01B3 90B9      LD	R11,Y+
    01B4 FDE2      SBRC	R30,2
    01B5 9508      RET
    01B6 90C9      LD	R12,Y+
    01B7 90D9      LD	R13,Y+
    01B8 FDE3      SBRC	R30,3
    01B9 9508      RET
    01BA 90E9      LD	R14,Y+
    01BB 90F9      LD	R15,Y+
    01BC 9508      RET

⌨️ 快捷键说明

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