📄 car.lst
字号:
__text_start:
__start:
2E E5CF LDI R28,0x5F
2F E0D8 LDI R29,0x8
30 BFCD OUT 0x3D,R28
31 BFDE OUT 0x3E,R29
32 51CE SUBI R28,0x1E
33 40D0 SBCI R29,0
34 EA0A LDI R16,0xAA
35 8308 STD Y+0,R16
36 2400 CLR R0
37 E6E8 LDI R30,0x68
38 E0F0 LDI R31,0
39 E010 LDI R17,0
3A 36EA CPI R30,0x6A
3B 07F1 CPC R31,R17
3C F011 BEQ 0x003F
3D 9201 ST R0,Z+
3E CFFB RJMP 0x003A
3F 8300 STD Z+0,R16
40 E5E4 LDI R30,0x54
41 E0F0 LDI R31,0
42 E6A0 LDI R26,0x60
43 E0B0 LDI R27,0
44 E010 LDI R17,0
45 E000 LDI R16,0
46 BF0B OUT 0x3B,R16
47 35EC CPI R30,0x5C
48 07F1 CPC R31,R17
49 F021 BEQ 0x004E
4A 95C8 LPM
4B 9631 ADIW R30,1
4C 920D ST R0,X+
4D CFF9 RJMP 0x0047
4E 940E 0228 CALL _main
_exit:
50 CFFF RJMP _exit
FILE: F:\car\linecheck.h
(0001) /*******************************
(0002) *程序名称:智能小车设计
(0003) *作 者:吴聪
(0004) *日 期:2008-5-20
(0005) ********************************/
(0006) #include <iom32v.h>
(0007)
(0008) unsigned int T=1000;
(0009) unsigned int i=0;
(0010) unsigned int k=1;
(0011) unsigned int flag=1;
(0012) unsigned int temp;
(0013) void port_init(void)
(0014) {
(0015) PORTA = 0XFF;
_port_init:
51 EF8F LDI R24,0xFF
52 BB8B OUT 0x1B,R24
(0016) DDRA = 0x00;//PA 为输入口
53 2422 CLR R2
54 BA2A OUT 0x1A,R2
(0017) PORTB = 0x00;
55 BA28 OUT 0x18,R2
(0018) DDRB = 0xff;//PB 为输出口
56 BB87 OUT 0x17,R24
(0019) PORTC = 0X00;
57 BA25 OUT 0x15,R2
(0020) DDRC = 0xFF;//PC 为输出口
58 BB84 OUT 0x14,R24
(0021) DDRD=0XF7;
59 EF87 LDI R24,0xF7
5A BB81 OUT 0x11,R24
(0022) PORTD=0X08;
5B E088 LDI R24,0x8
5C BB82 OUT 0x12,R24
5D 9508 RET
(0023) }
(0024) /*中断初始化*/
(0025) void INT1_init()
(0026) {
(0027) SREG=0x80; /*使能全局中断*/
_INT1_init:
5E E880 LDI R24,0x80
5F BF8F OUT 0x3F,R24
(0028) //MCUCR&=~((1<<ISC01)|(1<<ISC00)); /*低电平触发中断*/
(0029) MCUCR=0x0C;
60 E08C LDI R24,0xC
61 BF85 OUT 0x35,R24
(0030) GICR=(1<<INT1); /*使能外部中断1请求*/
62 E880 LDI R24,0x80
63 BF8B OUT 0x3B,R24
64 9508 RET
(0031) }
(0032) //TIMER0 initialize - prescale:64
(0033) // WGM: Normal
(0034) // desired value: Hz
(0035) // actual value: Out of range
(0036) void timer0_init(void)
(0037) {
(0038) TCCR0 = 0x00; //stop
_timer0_init:
65 2422 CLR R2
66 BE23 OUT 0x33,R2
(0039) TCNT0 = 0x00 /*INVALID SETTING*/; //set count
67 BE22 OUT 0x32,R2
(0040) OCR0 = 0x00 /*INVALID SETTING*/; //set compare
68 BE2C OUT 0x3C,R2
(0041) TCCR0 = 0x02; //start timer
69 E082 LDI R24,2
6A BF83 OUT 0x33,R24
6B 9508 RET
(0042) }
(0043) //TIMER1 initialize - prescale:1
(0044) // WGM: 0) Normal, TOP=0xFFFF
(0045) // desired value: 25Hz
(0046) // actual value: 25.000Hz (0.0%)
(0047) void timer1_init(void)
(0048) {
(0049) TCCR1B = 0x00; //stop
_timer1_init:
6C 2422 CLR R2
6D BC2E OUT 0x2E,R2
(0050) TCNT1H = 0x63; //setup
6E E683 LDI R24,0x63
6F BD8D OUT 0x2D,R24
(0051) TCNT1L = 0xC0;
70 EC80 LDI R24,0xC0
71 BD8C OUT 0x2C,R24
(0052) OCR1AH = 0x9C;
72 E98C LDI R24,0x9C
73 BD8B OUT 0x2B,R24
(0053) OCR1AL = 0x40;
74 E480 LDI R24,0x40
75 BD8A OUT 0x2A,R24
(0054) OCR1BH = 0x9C;
76 E98C LDI R24,0x9C
77 BD89 OUT 0x29,R24
(0055) OCR1BL = 0x40;
78 E480 LDI R24,0x40
79 BD88 OUT 0x28,R24
(0056) ICR1H = 0x9C;
7A E98C LDI R24,0x9C
7B BD87 OUT 0x27,R24
(0057) ICR1L = 0x40;
7C E480 LDI R24,0x40
7D BD86 OUT 0x26,R24
(0058) TCCR1A = 0x00;
7E BC2F OUT 0x2F,R2
(0059) TCCR1B = 0x01; //start Timer
7F E081 LDI R24,1
80 BD8E OUT 0x2E,R24
81 9508 RET
(0060) }
(0061) ##pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
(0062) void timer1_ovf_isr(void)
(0063) {
(0064) //TIMER1 has overflowed
(0065) TCNT1H = 0x63; //reload counter high value
_timer1_ovf_isr:
82 E683 LDI R24,0x63
83 BD8D OUT 0x2D,R24
(0066) TCNT1L = 0xC0; //reload counter low value
84 EC80 LDI R24,0xC0
85 BD8C OUT 0x2C,R24
(0067) GICR=(1<<INT1);
86 E880 LDI R24,0x80
87 BF8B OUT 0x3B,R24
88 9508 RET
(0068) }
(0069)
(0070) //call this routine to initialize all peripherals
(0071) void init_devices(void)
(0072) {
(0073) //stop errant interrupts until set up
(0074) timer1_init();
_init_devices:
89 DFE2 RCALL _timer1_init
(0075) TIMSK = 0x04; //timer interrupt sources
8A E084 LDI R24,4
8B BF89 OUT 0x39,R24
8C 9508 RET
_delay:
i --> R20
hh --> R16
8D 934A ST R20,-Y
8E 935A ST R21,-Y
(0076)
(0077) //all peripherals are now initialized
(0078) }
(0079) //============================================================================================
(0080) //函数: void delay(int hh)
(0081) //语法:void delay(int hh)
(0082) //描述:延时子程序
(0083) //参数:
(0084) //返回:无
(0085) //============================================================================================
(0086) void delay(unsigned int hh )
(0087) {
(0088) int i;
(0089) for(i=0;i<hh;i++)
8F 2744 CLR R20
90 2755 CLR R21
91 C002 RJMP 0x0094
92 5F4F SUBI R20,0xFF
93 4F5F SBCI R21,0xFF
94 1740 CP R20,R16
95 0751 CPC R21,R17
96 F3D8 BCS 0x0092
97 9159 LD R21,Y+
98 9149 LD R20,Y+
99 9508 RET
_int1:
9A 920A ST R0,-Y
9B 921A ST R1,-Y
9C 922A ST R2,-Y
9D 923A ST R3,-Y
9E 924A ST R4,-Y
9F 925A ST R5,-Y
A0 926A ST R6,-Y
A1 927A ST R7,-Y
A2 928A ST R8,-Y
A3 929A ST R9,-Y
A4 930A ST R16,-Y
A5 931A ST R17,-Y
A6 932A ST R18,-Y
A7 933A ST R19,-Y
A8 938A ST R24,-Y
A9 939A ST R25,-Y
AA 93AA ST R26,-Y
AB 93BA ST R27,-Y
AC 93EA ST R30,-Y
AD 93FA ST R31,-Y
AE B60F IN R0,0x3F
AF 920A ST R0,-Y
(0090) {
(0091) ;
(0092) }
(0093) }
(0094)
(0095) //============================================================================================
(0096) //函数: void pwma(int hh)
(0097) //语法:void pwma(int hh)
(0098) //描述: 用于控制右轮
(0099) //参数:占空比
(0100) //返回:无
(0101) //============================================================================================
(0102) /*void pwma( unsigned int hh)
(0103) {
(0104) unsigned int s=0;
(0105) unsigned int T0=10000;
(0106) unsigned int H;
(0107) s=PORTA;
(0108) switch(hh) //占空比
(0109) {
(0110) case 0: s=s&0xfc; delay(T0);break; //关占空比
(0111) case 1: delay(1000);s=s&0xfc; delay(9000);break;
(0112) case 2: delay(2000);s=s&0xfc; delay(8000);break;
(0113) case 3: delay(3000);s=s&0xfc; delay(7000);break;
(0114) case 4: delay(4000);s=s&0xfC; delay(6000);break;
(0115) case 5: delay(5000);s=s&0xfc; delay(5000);break;
(0116) case 6: delay(6000);s=s&0xfc; delay(4000);break;
(0117) case 7: delay(7000);s=s&0xfc; delay(3000);break;
(0118) case 8: delay(8000);s=s&0xfc; delay(2000);break;
(0119) case 9: delay(9000);s=s&0xfc; delay(1000);break;
(0120) case 10: delay(10000);s=s&0xfc;break;
(0121) }
(0122) }
(0123) //============================================================================================
(0124) //函数: void pwmb(int hh)
(0125) //语法:void pwmb(int hh)
(0126) //描述: 用于控制左轮
(0127) //参数:占空比
(0128) //返回:无
(0129) //============================================================================================
(0130) void pwmb( unsigned int hh) //设定TA_TIMEOUT/16=(time_cl)/0x1e00)/16=100Hz
(0131) {
(0132) unsigned int k=0;
(0133) int T=10000;
(0134) int H;
(0135) k=PORTA;
(0136) switch(hh) //占空比
(0137) {
(0138) case 0: k=k&0xf3; break; //关占空比
(0139) case 1: delay(1000);k=k&0xf3; delay(9000);break;
(0140) case 2: delay(2000);k=k&0xf3; delay(8000);break;
(0141) case 3: delay(3000);k=k&0xf3; delay(7000);break;
(0142) case 4: delay(4000);k=k&0xf3; delay(6000);break;
(0143) case 5: delay(5000);k=k&0xf3; delay(5000);break;
(0144) case 6: delay(6000);k=k&0xf3; delay(4000);break;
(0145) case 7: delay(7000);k=k&0xf3; delay(3000);break;
(0146) case 8: delay(8000);k=k&0xf3; delay(2000);break;
(0147) case 9: delay(9000);k=k&0xf3; delay(1000);break;
(0148) case 10: delay(10000);k=k&0xf3;break;
(0149) }
(0150) }*/
(0151) /*中断服务程序*/
(0152) #pragma interrupt_handler int1:4
(0153) void int1()
(0154) {
(0155)
(0156) /*unsigned char i;
(0157) for(i=0;i<8;i--) //去
(0158) {
(0159) //PORTB=~(1<<i);
(0160) PORTB=0x00;
(0161) delay_ms(5);
(0162) }*/
(0163) if(flag)
B0 9020 0066 LDS R2,flag
B2 9030 0067 LDS R3,flag+1
B4 2022 TST R2
B5 F411 BNE 0x00B8
B6 2033 TST R3
B7 F079 BEQ 0x00C7
(0164) {
(0165) timer0_init();
B8 DFAC RCALL _timer0_init
(0166) temp=TCNT0;
B9 B622 IN R2,0x32
BA 2433 CLR R3
BB 9230 0069 STS temp+1,R3
BD 9220 0068 STS temp,R2
(0167) //delay(10000);
(0168) MCUCR=0x08;
BF E088 LDI R24,0x8
C0 BF85 OUT 0x35,R24
(0169) flag=0;
C1 2422 CLR R2
C2 9230 0067 STS flag+1,R3
C4 9220 0066 STS flag,R2
(0170) //delay_ms(80);
(0171) }
C6 C018 RJMP 0x00DF
(0172) else
(0173) {
(0174) TCCR0 = 0x00;
C7 2422 CLR R2
C8 BE23 OUT 0x33,R2
(0175) temp=TCNT0-temp;
C9 9020 0068 LDS R2,temp
CB 9030 0069 LDS R3,temp+1
CD B642 IN R4,0x32
CE 2455 CLR R5
CF 1842 SUB R4,R2
D0 0853 SBC R5,R3
D1 9250 0069 STS temp+1,R5
D3 9240 0068 STS temp,R4
(0176) MCUCR=0x0c;
D5 E08C LDI R24,0xC
D6 BF85 OUT 0x35,R24
(0177) flag=1;
D7 E081 LDI R24,1
D8 E090 LDI R25,0
D9 9390 0067 STS flag+1,R25
DB 9380 0066 STS flag,R24
(0178) // delay_ms(80);
(0179) // INT1_init();
(0180) // SREG=0x00;
(0181) GICR=0x00;
DD 2422 CLR R2
DE BE2B OUT 0x3B,R2
(0182) }
DF 9009 LD R0,Y+
E0 BE0F OUT 0x3F,R0
E1 91F9 LD R31,Y+
E2 91E9 LD R30,Y+
E3 91B9 LD R27,Y+
E4 91A9 LD R26,Y+
E5 9199 LD R25,Y+
E6 9189 LD R24,Y+
E7 9139 LD R19,Y+
E8 9129 LD R18,Y+
E9 9119 LD R17,Y+
EA 9109 LD R16,Y+
EB 9099 LD R9,Y+
EC 9089 LD R8,Y+
ED 9079 LD R7,Y+
EE 9069 LD R6,Y+
EF 9059 LD R5,Y+
F0 9049 LD R4,Y+
F1 9039 LD R3,Y+
F2 9029 LD R2,Y+
F3 9019 LD R1,Y+
F4 9009 LD R0,Y+
F5 9518 RETI
(0183) }
(0184) //============================================================================================
(0185) //描述:车子方向控制子程序
(0186) //参数 无
(0187) //返回:无
(0188) //============================================================================================
(0189) void STOP() //停止
(0190) {
(0191) PORTB=0X00;
_STOP:
F6 2422 CLR R2
F7 BA28 OUT 0x18,R2
(0192) delay(10000);
F8 E100 LDI R16,0x10
F9 E217 LDI R17,0x27
FA DF92 RCALL _delay
FB 9508 RET
_GO:
aa --> R10
FC 92AA ST R10,-Y
FD 92BA ST R11,-Y
FE 0158 MOVW R10,R16
(0193) }
(0194)
(0195)
(0196) void GO(unsigned int aa) //直线前进
(0197) {
(0198)
(0199) PORTB=0X06|0X30;
FF E386 LDI R24,0x36
100 BB88 OUT 0x18,R24
(0200) delay(aa);
101 0185 MOVW R16,R10
102 DF8A RCALL _delay
103 90B9 LD R11,Y+
104 90A9 LD R10,Y+
105 9508 RET
_BACK:
bb --> R10
106 92AA ST R10,-Y
107 92BA ST R11,-Y
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -