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

📄 main.lst

📁 设计大赛寻迹小车题目程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0002) ** 文件名:interupts.c   中断处理函数
(0003) *******************************************************************************/
(0004) #include "config.h"
(0005) 
(0006) #pragma interrupt_handler timer0_ovf_isr:12
(0007) void timer0_ovf_isr(void)
(0008) {
(0009)  TCNT0 = 0x01; //reload counter value
    0102 E081      LDI	R24,1
    0103 BF82      OUT	0x32,R24
    0104 9189      LD	R24,Y+
    0105 BF8F      OUT	0x3F,R24
    0106 9189      LD	R24,Y+
    0107 9518      RETI
(0010) }
(0011) 
(0012) #pragma interrupt_handler timer0_comp_isr:11
(0013) void timer0_comp_isr(void)
(0014) {
_timer0_comp_isr:
    0108 9518      RETI
_timer2_ovf_isr:
    0109 938A      ST	R24,-Y
    010A B78F      IN	R24,0x3F
    010B 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
    010C E081      LDI	R24,1
    010D BD84      OUT	0x24,R24
    010E 9189      LD	R24,Y+
    010F BF8F      OUT	0x3F,R24
    0110 9189      LD	R24,Y+
    0111 9518      RETI
(0022) }
(0023) 
(0024) /******************************************************************************/
(0025) // T2 控制PWM输出
(0026) // timer2_comp_isr不需要用,但是必须允许中断,在中断时有信号输出变化
(0027) /******************************************************************************/
(0028) 
(0029) #pragma interrupt_handler timer2_comp_isr:5
(0030) void timer2_comp_isr(void)
(0031) {
_timer2_comp_isr:
    0112 9518      RETI
FILE: D:\桌面\avr程序设计\循迹小车\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:
    0113 2422      CLR	R2
    0114 BA2B      OUT	0x1B,R2
(0009)  DDRA  = 0x00;
    0115 BA2A      OUT	0x1A,R2
(0010)  PORTB = 0x00;
    0116 BA28      OUT	0x18,R2
(0011)  DDRB  = 0xFF;
    0117 EF8F      LDI	R24,0xFF
    0118 BB87      OUT	0x17,R24
(0012)  PORTC = 0x00;
    0119 BA25      OUT	0x15,R2
(0013)  DDRC  = 0x00;
    011A BA24      OUT	0x14,R2
(0014)  PORTD = 0x00;
    011B BA22      OUT	0x12,R2
(0015)  DDRD  = 0x80;
    011C E880      LDI	R24,0x80
    011D BB81      OUT	0x11,R24
    011E 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:
    011F 2422      CLR	R2
    0120 BE23      OUT	0x33,R2
(0025)  TCNT0= 0x01;  //set count
    0121 E081      LDI	R24,1
    0122 BF82      OUT	0x32,R24
(0026)  OCR0 = 0x66;  //set compare
    0123 E686      LDI	R24,0x66
    0124 BF8C      OUT	0x3C,R24
(0027)  TCCR0 = (1<<WGM00)|(1<<WGM01)|(1<<COM01)|0x04;//0x04 0100B 代表256预分频
    0125 E68C      LDI	R24,0x6C
    0126 BF83      OUT	0x33,R24
    0127 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:
    0128 2422      CLR	R2
    0129 BC2E      OUT	0x2E,R2
(0036)  TCNT1H = 0x4C; //setup
    012A E48C      LDI	R24,0x4C
    012B BD8D      OUT	0x2D,R24
(0037)  TCNT1L = 0x01;
    012C E081      LDI	R24,1
    012D BD8C      OUT	0x2C,R24
(0038)  OCR1AH = 0xB3;
    012E EB83      LDI	R24,0xB3
    012F BD8B      OUT	0x2B,R24
(0039)  OCR1AL = 0xFF;
    0130 EF8F      LDI	R24,0xFF
    0131 BD8A      OUT	0x2A,R24
(0040)  OCR1BH = 0xB3;
    0132 EB83      LDI	R24,0xB3
    0133 BD89      OUT	0x29,R24
(0041)  OCR1BL = 0xFF;
    0134 EF8F      LDI	R24,0xFF
    0135 BD88      OUT	0x28,R24
(0042)  ICR1H  = 0xB3;
    0136 EB83      LDI	R24,0xB3
    0137 BD87      OUT	0x27,R24
(0043)  ICR1L  = 0xFF;
    0138 EF8F      LDI	R24,0xFF
    0139 BD86      OUT	0x26,R24
(0044)  TCCR1A = 0x00;
    013A BC2F      OUT	0x2F,R2
(0045)  TCCR1B = 0x02; //start Timer
    013B E082      LDI	R24,2
    013C BD8E      OUT	0x2E,R24
    013D 9508      RET
(0046) }
(0047) /**************************timer2 PWM输出***********************/
(0048) // PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值)) 
(0049) void timer2_init(void)
(0050) {
(0051)  TCCR2 = 0x00;  //stop
_timer2_init:
    013E 2422      CLR	R2
    013F BC25      OUT	0x25,R2
(0052)  TCNT2= 0x01;  //set count
    0140 E081      LDI	R24,1
    0141 BD84      OUT	0x24,R24
(0053)  OCR2 = 0x66;  //set compare
    0142 E686      LDI	R24,0x66
    0143 BD83      OUT	0x23,R24
(0054)  TCCR2 = (1<<WGM20)|(1<<WGM21)|(1<<COM21)|0x06; //  start timer 快速pwm模式,匹配清零,溢出置位 256分频
    0144 E68E      LDI	R24,0x6E
    0145 BD85      OUT	0x25,R24
    0146 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:
    0147 94F8      BCLR	7
(0064)  port_init();
    0148 DFCA      RCALL	_port_init
(0065)  timer2_init();
    0149 DFF4      RCALL	_timer2_init
(0066) // timer1_init();
(0067)  timer0_init();
    014A DFD4      RCALL	_timer0_init
(0068)  MCUCR |= (1<<ISC01);    // INT0,INT1 下降沿产生中断请求
    014B B785      IN	R24,0x35
    014C 6082      ORI	R24,2
    014D BF85      OUT	0x35,R24
(0069)  //MCUCSR |= (1<<ISC2);             //INT2上升沿产生中断请求
(0070)  GICR |= (1<<INT0)|(1<<INT1);
    014E B78B      IN	R24,0x3B
    014F 6C80      ORI	R24,0xC0
    0150 BF8B      OUT	0x3B,R24
(0071)  TIMSK = (1<<TOIE0)|(1<<TOIE2)|(1<<OCIE0)|(1<<OCIE2); //timer interrupt sources
    0151 EC83      LDI	R24,0xC3
    0152 BF89      OUT	0x39,R24
(0072)  SEI(); //re-enable interrupts
    0153 9478      BSET	7
    0154 9508      RET
_Delay100us:
  i                    --> R20
  n                    --> R16
    0155 940E01D3  CALL	push_gset1
FILE: D:\桌面\avr程序设计\循迹小车\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--)	
    0157 E943      LDI	R20,0x93
    0158 C006      RJMP	0x015F
(0010) 	while(--i);      //5 * i clock
    0159 2F84      MOV	R24,R20
    015A 5081      SUBI	R24,1
    015B 2F48      MOV	R20,R24
    015C 2388      TST	R24
    015D F7D9      BNE	0x0159
    015E 950A      DEC	R16
    015F 2300      TST	R16
    0160 F7C1      BNE	0x0159
    0161 940E01D6  CALL	pop_gset1
    0163 9508      RET
_Delay1ms:
  n                    --> R20
    0164 940E01D3  CALL	push_gset1
    0166 01A8      MOVW	R20,R16
(0011) }
(0012) void Delay1ms(uint16 n)
(0013) {        
(0014) 	for (;n!=0;n--){
    0167 C004      RJMP	0x016C
(0015) 		Delay100us(10);
    0168 E00A      LDI	R16,0xA
    0169 DFEB      RCALL	_Delay100us
    016A 5041      SUBI	R20,1
    016B 4050      SBCI	R21,0
    016C 3040      CPI	R20,0
    016D 0745      CPC	R20,R21
    016E F7C9      BNE	0x0168
    016F 940E01D6  CALL	pop_gset1
    0171 9508      RET
_Delay1s:
  n                    --> R20
    0172 940E01D3  CALL	push_gset1
    0174 01A8      MOVW	R20,R16
(0016) 	}
(0017) }
(0018) void Delay1s(uint16 n)
(0019) {
(0020) 	n=n*40;                
    0175 E208      LDI	R16,0x28
    0176 E010      LDI	R17,0
    0177 019A      MOVW	R18,R20
    0178 940E01BB  CALL	empy16s
    017A 01A8      MOVW	R20,R16
(0021) 	for (;n!=0;n--){
    017B C004      RJMP	0x0180
(0022) 		Delay100us(250);
    017C EF0A      LDI	R16,0xFA
    017D DFD7      RCALL	_Delay100us
    017E 5041      SUBI	R20,1
    017F 4050      SBCI	R21,0
    0180 3040      CPI	R20,0
    0181 0745      CPC	R20,R21
    0182 F7C9      BNE	0x017C
    0183 940E01D6  CALL	pop_gset1
    0185 9508      RET
FILE: D:\桌面\avr程序设计\循迹小车\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();
_main:
    0186 940E0147  CALL	_init_devices
(0011)  straight();
    0188 940E00A8  CALL	_straight
(0012)  
(0013)  flag_test();  //测试小车状态
    018A 940E00C9  CALL	_flag_test
    018C C02C      RJMP	0x01B9
(0014)  while(1) //没有脱轨
(0015)  {
(0016)   flag_test();
    018D 940E00C9  CALL	_flag_test
(0017)   switch(flag)
    018F 91400060  LDS	R20,flag
    0191 2755      CLR	R21
    0192 3040      CPI	R20,0
    0193 0745      CPC	R20,R21
    0194 F0A9      BEQ	0x01AA
    0195 3041      CPI	R20,1
    0196 E0E0      LDI	R30,0
    0197 075E      CPC	R21,R30
    0198 F0C1      BEQ	0x01B1
    0199 3042      CPI	R20,2
    019A E0E0      LDI	R30,0
    019B 075E      CPC	R21,R30
    019C F0B9      BEQ	0x01B4
    019D 3043      CPI	R20,3
    019E E0E0      LDI	R30,0
    019F 075E      CPC	R21,R30
    01A0 F0C1      BEQ	0x01B9
    01A1 3044      CPI	R20,4
    01A2 E0E0      LDI	R30,0
    01A3 075E      CPC	R21,R30
    01A4 F0A1      BEQ	0x01B9
    01A5 3045      CPI	R20,5
    01A6 E0E0      LDI	R30,0
    01A7 075E      CPC	R21,R30
    01A8 F071      BEQ	0x01B7
    01A9 C00F      RJMP	0x01B9
(0018)   {
(0019)   case 0:      //正常情况将速度设成相等
(0020)     motor_right_speed_set(0xFE);
    01AA EF0E      LDI	R16,0xFE
    01AB 940E0095  CALL	_motor_right_speed_set
(0021)     motor_left_speed_set(0xFE);
    01AD EF0E      LDI	R16,0xFE
    01AE 940E006D  CALL	_motor_left_speed_set
(0022)     break;
    01B0 C008      RJMP	0x01B9
(0023)   case 1:
(0024)    mic_turn_right();
    01B1 940E00BF  CALL	_mic_turn_right
(0025)    break;
    01B3 C005      RJMP	0x01B9
(0026)   case 2:
(0027)    mic_turn_left();
    01B4 940E00C4  CALL	_mic_turn_left
(0028)    break;
    01B6 C002      RJMP	0x01B9
(0029)   case 3:
(0030)    break;
(0031)   case 4:
(0032)    break;
(0033)   case 5:
(0034)    stop();
FILE: <library>
    01B7 940E00BC  CALL	_stop
    01B9 CFD3      RJMP	0x018D
    01BA 9508      RET
empy16s:
    01BB 920A      ST	R0,-Y
    01BC 921A      ST	R1,-Y
    01BD 938A      ST	R24,-Y
    01BE 939A      ST	R25,-Y
    01BF 9F02      MUL	R16,R18
    01C0 01C0      MOVW	R24,R0
    01C1 9F12      MUL	R17,R18
    01C2 0D90      ADD	R25,R0
    01C3 9F03      MUL	R16,R19
    01C4 0D90      ADD	R25,R0
    01C5 018C      MOVW	R16,R24
    01C6 9199      LD	R25,Y+
    01C7 9189      LD	R24,Y+
    01C8 9019      LD	R1,Y+
    01C9 9009      LD	R0,Y+
    01CA 9508      RET
push_gset5:
    01CB 92FA      ST	R15,-Y
    01CC 92EA      ST	R14,-Y
push_gset4:
    01CD 92DA      ST	R13,-Y
    01CE 92CA      ST	R12,-Y
push_gset3:
    01CF 92BA      ST	R11,-Y
    01D0 92AA      ST	R10,-Y
push_gset2:
    01D1 937A      ST	R23,-Y
    01D2 936A      ST	R22,-Y
push_gset1:
    01D3 935A      ST	R21,-Y
    01D4 934A      ST	R20,-Y
    01D5 9508      RET
pop_gset1:
    01D6 E0E1      LDI	R30,1
pop:
    01D7 9149      LD	R20,Y+
    01D8 9159      LD	R21,Y+
    01D9 FDE0      SBRC	R30,0
    01DA 9508      RET
    01DB 9169      LD	R22,Y+
    01DC 9179      LD	R23,Y+
    01DD FDE1      SBRC	R30,1
    01DE 9508      RET
    01DF 90A9      LD	R10,Y+
    01E0 90B9      LD	R11,Y+
    01E1 FDE2      SBRC	R30,2
    01E2 9508      RET
    01E3 90C9      LD	R12,Y+
    01E4 90D9      LD	R13,Y+
    01E5 FDE3      SBRC	R30,3
    01E6 9508      RET
    01E7 90E9      LD	R14,Y+
    01E8 90F9      LD	R15,Y+
    01E9 9508      RET

⌨️ 快捷键说明

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