?? diy0206_4.lst
字號:
__text_start:
__start:
01AC E5CF LDI R28,0x5F
01AD E0D2 LDI R29,2
01AE BFCD OUT P3D,R28
01AF BFDE OUT P3E,R29
01B0 51C0 SUBI R28,0x10
01B1 40D0 SBCI R29,0
01B2 EA0A LDI R16,0xAA
01B3 8308 STD R16,0+Y
01B4 2400 CLR R0
01B5 E6E4 LDI R30,0x64
01B6 E0F0 LDI R31,0
01B7 E010 LDI R17,0
01B8 37EE CPI R30,0x7E
01B9 07F1 CPC R31,R17
01BA F011 BEQ 0x01BD
01BB 9201 ST R0,Z+
01BC CFFB RJMP 0x01B8
01BD 8300 STD R16,0+Z
01BE E5E4 LDI R30,0x54
01BF E0F3 LDI R31,3
01C0 E6A0 LDI R26,0x60
01C1 E0B0 LDI R27,0
01C2 E013 LDI R17,3
01C3 35E8 CPI R30,0x58
01C4 07F1 CPC R31,R17
01C5 F021 BEQ 0x01CA
01C6 95C8 LPM
01C7 9631 ADIW R30,1
01C8 920D ST R0,X+
01C9 CFF9 RJMP 0x01C3
01CA D599 RCALL _main
_exit:
01CB CFFF RJMP _exit
FILE: E:\icc\include\diy0206.c
(0001) //diy0206.c sldiy02-06機器人常用函數庫
(0002) //#include <io8515v.h>
(0003) //#include <io8535v.h>
(0004)
(0005) // 更新日期: 2003.03.27
(0006)
(0007) /*
(0008) void port_init(); //PA,PB,PC,PD 初始化
(0009) void delay_us(int time); //微妙級延時
(0010) void delay_ms(unsigned int time);//毫秒級延時
(0011) void sw_touch(); //檢測輕觸開關
(0012) void mic_startup(); //等待聲控啟動
(0013) void remote_auto_time(); //遙控器控制直行和轉彎時間
(0014) void turn_right(); //右轉
(0015) void turn_left(); //左轉
(0016) void turn_right_s(); //慢速右轉
(0017) void turn_left_s(); //慢速左轉
(0018) void backward(); //后退
(0019) void forward(); //前行
(0020) void stop(); //停止運動
(0021) */
(0022) /*
(0023) sl-3010 運行不同的程序其對應的工作狀態由 work_status 變量指示
(0024) 對應數據表如下:
(0025) 程序名 程序功能簡介 work_status 值
(0026) cny_car 程序 白底黑線,探黑線行走 0x10
(0027) xuanya_car 走懸崖,避障礙 0x20
(0028) music_car 音樂車 0x30
(0029) led_car 霓虹燈 0x40
(0030) auto_car1 自走車 0x51
(0031) auto_car8 走<8>字 0x50
(0032) remote_car 智能遙控機器人 0x60
(0033) trace_light 追光行進機器人 0x70
(0034) remote_light 遙控和追光 0x67
(0035) ……
(0036) */
(0037) // 電機驅動信號 led燈指示電機狀態
(0038) //PORTD = 0xA0;//前行 //1010 0000//PORTA = 0xC3;//1100,0011
(0039) //PORTD = 0x60;//快速左轉//0110 0000//PORTA = 0x33;//0011,0011
(0040) //PORTD = 0x20;//慢速左轉//0010 0000//PORTA = 0xF3;//1111,0011
(0041) //PORTD = 0x90;//快速右轉//1001 0000//PORTA = 0xCC;//1100,1100
(0042) //PORTD = 0x80;//慢速右轉//1000 0000//PORTA = 0xCF;//1100,1111
(0043) //PORTD = 0x50;//后退 //0101 0000//PORTA = 0x3C;//0011,1100
(0044)
(0045) //#define A 0x20 //0b0010,0000
(0046) //#define B 0x40 //0b0100,0000
(0047) //#define C 0x10 //0b0001,0000
(0048) //#define D 0x80 //0b1000,0000
(0049)
(0050)
(0051) /* 音階常數=65536-8000000/8/2/f */
(0052) #define DO 64580 //523
(0053) #define RE 64684 //587
(0054) #define MI 64777 //659
(0055) #define FA 64820 //698
(0056) #define SO 64898 //784
(0057) #define LA 64968 //880
(0058) #define TI 65030 //988
(0059) #define DO_H 65058 //1046
(0060) #define RE_H 65110 //1174
(0061) #define MI_H 65157 //1318
(0062) #define FA_H 65178 //1397
(0063) #define SO_H 65217 //1568
(0064) #define LA_H 65252 //1760
(0065) #define TI_H 65283 //1976
(0066) #define DO_HH 65297 //2093
(0067) /* 位操作宏 */
(0068) #define set_bit(x,y) (x|=(1<<y))
(0069) #define clr_bit(x,y) (x&=~(1<<y))
(0070) #define get_bit(x,y) (x&(1<<y))
(0071)
(0072) #define fosc 8000000
(0073) #define baud 19200
(0074) #define device 0x38
(0075)
(0076) #define touch_time 250
(0077)
(0078) unsigned char work_status;
(0079)
(0080) void port_init(void)
(0081) {//PA,PB,PC,PD 初始化
(0082) DDRA = 0xFF;PORTA = 0xFF;
_port_init:
01CC EF8F LDI R24,0xFF
01CD BB8A OUT P1A,R24
01CE BB8B OUT P1B,R24
(0083) //PA口輸出,接8路LED指示燈
(0084) DDRB = 0x00;PORTB = 0xFF;
01CF 2422 CLR R2
01D0 BA27 OUT P17,R2
01D1 BB88 OUT P18,R24
(0085) //PB2聲控開關信號輸入口,PB0、PB1、PB3輸入(左、尾、右輕觸開關)PB7~PB4輸入(遙控器)
(0086) DDRC = 0x01;PORTC = 0xFF;
01D2 E081 LDI R24,1
01D3 BB84 OUT P14,R24
01D4 EF8F LDI R24,0xFF
01D5 BB85 OUT P15,R24
(0087) //PC0蜂鳴器輸出,PC7~PC5 CNY70探測信號輸入端,PC4首部輕觸開關,PC1、PC2光敏感光信號輸入
(0088) DDRD = 0xF0;PORTD = 0xFF;
01D6 EF80 LDI R24,0xF0
01D7 BB81 OUT P11,R24
01D8 EF8F LDI R24,0xFF
01D9 BB82 OUT P12,R24
(0089) //PD7~PD4輸出驅動電機,PD3~PD0輸入
01DA 9508 RET
(0091)
(0092) void delay_us(int time)
(0093) {//微秒級延時程序
(0094) do
(0095) {
(0096) time--;
_delay_us:
time --> R16
01DB 5001 SUBI R16,1
01DC 4010 SBCI R17,0
(0097) }
(0098) while (time>1);
01DD E081 LDI R24,1
01DE E090 LDI R25,0
01DF 1780 CP R24,R16
01E0 0791 CPC R25,R17
01E1 F3CC BLT 0x01DB
(0099) }
01E2 9508 RET
_delay_ms:
time --> R20
01E3 D6C7 RCALL push_gset1
01E4 2F40 MOV R20,R16
01E5 2F51 MOV R21,R17
(0100)
(0101) void delay_ms(unsigned int time)
(0102) {//毫秒級延時程序
01E6 C005 RJMP 0x01EC
(0103) while(time!=0)
(0104) {
(0105) delay_us(1000);
01E7 EE08 LDI R16,0xE8
01E8 E013 LDI R17,3
01E9 DFF1 RCALL _delay_us
(0106) time--;
01EA 5041 SUBI R20,1
01EB 4050 SBCI R21,0
01EC 3040 CPI R20,0
01ED 0745 CPC R20,R21
01EE F7C1 BNE 0x01E7
(0107) }
(0108) }
01EF D6BE RCALL pop_gset1
01F0 9508 RET
(0109)
(0110) void turn_right()//右轉
(0111) {
(0112) PORTD = 0x90; //右轉//0110 0000
_turn_right:
01F1 E980 LDI R24,0x90
01F2 BB82 OUT P12,R24
(0113) PORTA = 0xCC; //1100,1100 指示燈
01F3 EC8C LDI R24,0xCC
01F4 BB8B OUT P1B,R24
(0114) }
01F5 9508 RET
(0115)
(0116) void turn_left()//左轉
(0117) {
(0118) PORTD = 0x60; //左轉//1001 0000
_turn_left:
01F6 E680 LDI R24,0x60
01F7 BB82 OUT P12,R24
(0119) PORTA = 0x33; //0011,0011 指示燈
01F8 E383 LDI R24,0x33
01F9 BB8B OUT P1B,R24
(0120) }
01FA 9508 RET
(0121) void turn_right_s() //慢速右轉
(0122) {
(0123) PORTD = 0x80; //慢速右轉//0010 0000
_turn_right_s:
01FB E880 LDI R24,0x80
01FC BB82 OUT P12,R24
(0124) PORTA = 0xCF; //1100,1111
01FD EC8F LDI R24,0xCF
01FE BB8B OUT P1B,R24
(0125) }
01FF 9508 RET
(0126)
(0127) void turn_left_s() //慢速左轉
(0128) {
(0129) PORTD = 0x20; //慢速左轉//1000 0000
_turn_left_s:
0200 E280 LDI R24,0x20
0201 BB82 OUT P12,R24
(0130) PORTA = 0xF3; //1111,0011
0202 EF83 LDI R24,0xF3
0203 BB8B OUT P1B,R24
(0131) }
0204 9508 RET
(0132)
(0133) void backward()//后退
(0134) {
(0135) PORTD = 0x50; //后退//0101 0000
_backward:
0205 E580 LDI R24,0x50
0206 BB82 OUT P12,R24
(0136) PORTA = 0x3C; //0011,1100 指示燈
0207 E38C LDI R24,0x3C
0208 BB8B OUT P1B,R24
(0137) }
0209 9508 RET
(0138)
(0139) void forward()//前行
(0140) {
(0141) PORTD = 0xA0; //前行//1010 0000
_forward:
020A EA80 LDI R24,0xA0
020B BB82 OUT P12,R24
(0142) PORTA = 0xC3; //1100,0011
020C EC83 LDI R24,0xC3
020D BB8B OUT P1B,R24
(0143) }
020E 9508 RET
(0144)
(0145) void stop()//停止運動
(0146) {
(0147) PORTD = 0xff; //停止
_stop:
020F EF8F LDI R24,0xFF
0210 BB82 OUT P12,R24
(0148) PORTA = 0xff; //
0211 BB8B OUT P1B,R24
(0149) }
0212 9508 RET
_sw_touch:
sw_in --> R20
remote_in --> R22
0213 D6AE RCALL push_gset2
(0150)
(0151) //左邊 X PC4 X 右邊
(0152) // X X X X X X X
(0153) // 8 7 6 5 4 3 2 1
(0154) // PB0 X X X X X PB3
(0155) // | X X X |
(0156) // | X X X |
(0157) // | X X X |
(0158) // |$||- X X X -||$|
(0159) // |$|| XXXXXXXXX ||$|
(0160) // #|$||XXXXXXXXXXX||$|#
(0161) // |$||XXX XXX||$|
(0162) // |$||___ PB1 ___||$|
(0163)
(0164) void sw_touch()
(0165) {
(0166) unsigned char sw_in,remote_in;
(0167) sw_in = PINC & 0x10;
0214 B343 IN R20,P13
0215 7140 ANDI R20,0x10
(0168) if(sw_in == 0x00)
0216 F4C9 BNE 0x0230
(0169) {//后退,左轉 首部開關接觸
(0170) backward(); //后退
0217 DFED RCALL _backward
(0171) delay_ms(touch_time);
0218 EF0A LDI R16,0xFA
0219 E010 LDI R17,0
021A DFC8 RCALL _delay_ms
(0172)
(0173) if(work_status == 0x70)
021B 9180007D LDS R24,_work_status
021D 3780 CPI R24,0x70
021E F469 BNE 0x022C
(0174) {//追光機器人,首部開關接觸,停止運動,PA 口led 流動閃爍
(0175) stop();
021F DFEF RCALL _stop
0220 C00A RJMP 0x022B
(0176) while(1)
(0177) {
(0178) PORTA = 0x55;
0221 E585 LDI R24,0x55
0222 BB8B OUT P1B,R24
(0179) delay_ms(250);
0223 EF0A LDI R16,0xFA
0224 E010 LDI R17,0
0225 DFBD RCALL _delay_ms
(0180) PORTA = 0xAA;
0226 EA8A LDI R24,0xAA
0227 BB8B OUT P1B,R24
(0181) delay_ms(250);
0228 EF0A LDI R16,0xFA
0229 E010 LDI R17,0
022A DFB8 RCALL _delay_ms
022B CFF5 RJMP 0x0221
(0182) }
(0183) }
(0184)
(0185) turn_left(); //左轉
022C DFC9 RCALL _turn_left
(0186) delay_ms(touch_time);
022D EF0A LDI R16,0xFA
022E E010 LDI R17,0
022F DFB3 RCALL _delay_ms
(0187) }
(0188)
(0189) sw_in = PINB & 0x0b;//0b0000,1011 pb3,pb1,pb0
0230 B346 IN R20,P16
0231 704B ANDI R20,0xB
(0190) if(sw_in == 0x09)// 0b 0000,1001 尾部開關接觸
0232 3049 CPI R20,0x9
0233 F441 BNE 0x023C
(0191) {//前行,左轉
(0192) forward(); //前行
0234 DFD5 RCALL _forward
(0193) delay_ms(touch_time);
0235 EF0A LDI R16,0xFA
0236 E010 LDI R17,0
0237 DFAB RCALL _delay_ms
(0194)
(0195) turn_left(); //左轉
0238 DFBD RCALL _turn_left
(0196) delay_ms(touch_time);
0239 EF0A LDI R16,0xFA
023A E010 LDI R17,0
023B DFA7 RCALL _delay_ms
(0197) }
(0198) if(sw_in == 0x0a)// 0b 0000,1010 右側開關接觸
023C 304A CPI R20,0xA
023D F441 BNE 0x0246
(0199) {//后退,左轉
(0200) backward(); //后退
023E DFC6 RCALL _backward
(0201) delay_ms(touch_time);
023F EF0A LDI R16,0xFA
0240 E010 LDI R17,0
0241 DFA1 RCALL _delay_ms
(0202)
(0203) turn_left(); //左轉
0242 DFB3 RCALL _turn_left
(0204) delay_ms(touch_time);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -