?? diy0206_4.lst
字號:
__text_start:
__start:
01A8 E5CF LDI R28,0x5F
01A9 E0D2 LDI R29,2
01AA BFCD OUT P3D,R28
01AB BFDE OUT P3E,R29
01AC 51C0 SUBI R28,0x10
01AD 40D0 SBCI R29,0
01AE EA0A LDI R16,0xAA
01AF 8308 STD R16,0+Y
01B0 2400 CLR R0
01B1 E6E4 LDI R30,0x64
01B2 E0F0 LDI R31,0
01B3 E010 LDI R17,0
01B4 37EE CPI R30,0x7E
01B5 07F1 CPC R31,R17
01B6 F011 BEQ 0x01B9
01B7 9201 ST R0,Z+
01B8 CFFB RJMP 0x01B4
01B9 8300 STD R16,0+Z
01BA E4EC LDI R30,0x4C
01BB E0F3 LDI R31,3
01BC E6A0 LDI R26,0x60
01BD E0B0 LDI R27,0
01BE E013 LDI R17,3
01BF 35E0 CPI R30,0x50
01C0 07F1 CPC R31,R17
01C1 F021 BEQ 0x01C6
01C2 95C8 LPM
01C3 9631 ADIW R30,1
01C4 920D ST R0,X+
01C5 CFF9 RJMP 0x01BF
01C6 D599 RCALL _main
_exit:
01C7 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:
01C8 EF8F LDI R24,0xFF
01C9 BB8A OUT P1A,R24
01CA BB8B OUT P1B,R24
(0083) //PA口輸出,接8路LED指示燈
(0084) DDRB = 0x00;PORTB = 0xFF;
01CB 2422 CLR R2
01CC BA27 OUT P17,R2
01CD BB88 OUT P18,R24
(0085) //PB2聲控開關信號輸入口,PB0、PB1、PB3輸入(左、尾、右輕觸開關)PB7~PB4輸入(遙控器)
(0086) DDRC = 0x01;PORTC = 0xFF;
01CE E081 LDI R24,1
01CF BB84 OUT P14,R24
01D0 EF8F LDI R24,0xFF
01D1 BB85 OUT P15,R24
(0087) //PC0蜂鳴器輸出,PC7~PC5 CNY70探測信號輸入端,PC4首部輕觸開關,PC1、PC2光敏感光信號輸入
(0088) DDRD = 0xF0;PORTD = 0xFF;
01D2 EF80 LDI R24,0xF0
01D3 BB81 OUT P11,R24
01D4 EF8F LDI R24,0xFF
01D5 BB82 OUT P12,R24
(0089) //PD7~PD4輸出驅動電機,PD3~PD0輸入
(0090) }
01D6 9508 RET
(0091)
(0092) void delay_us(int time)
(0093) {//微秒級延時程序
(0094) do
(0095) {
(0096) time--;
_delay_us:
time --> R16
01D7 5001 SUBI R16,1
01D8 4010 SBCI R17,0
(0097) }
(0098) while (time>1);
01D9 E081 LDI R24,1
01DA E090 LDI R25,0
01DB 1780 CP R24,R16
01DC 0791 CPC R25,R17
01DD F3CC BLT 0x01D7
(0099) }
01DE 9508 RET
_delay_ms:
time --> R20
01DF D6C7 RCALL push_gset1
01E0 2F40 MOV R20,R16
01E1 2F51 MOV R21,R17
(0100)
(0101) void delay_ms(unsigned int time)
(0102) {//毫秒級延時程序
01E2 C005 RJMP 0x01E8
(0103) while(time!=0)
(0104) {
(0105) delay_us(1000);
01E3 EE08 LDI R16,0xE8
01E4 E013 LDI R17,3
01E5 DFF1 RCALL _delay_us
(0106) time--;
01E6 5041 SUBI R20,1
01E7 4050 SBCI R21,0
01E8 3040 CPI R20,0
01E9 0745 CPC R20,R21
01EA F7C1 BNE 0x01E3
(0107) }
(0108) }
01EB D6BE RCALL pop_gset1
01EC 9508 RET
(0109)
(0110) void turn_right()//右轉
(0111) {
(0112) PORTD = 0x90; //右轉//0110 0000
_turn_right:
01ED E980 LDI R24,0x90
01EE BB82 OUT P12,R24
(0113) PORTA = 0xCC; //1100,1100 指示燈
01EF EC8C LDI R24,0xCC
01F0 BB8B OUT P1B,R24
(0114) }
01F1 9508 RET
(0115)
(0116) void turn_left()//左轉
(0117) {
(0118) PORTD = 0x60; //左轉//1001 0000
_turn_left:
01F2 E680 LDI R24,0x60
01F3 BB82 OUT P12,R24
(0119) PORTA = 0x33; //0011,0011 指示燈
01F4 E383 LDI R24,0x33
01F5 BB8B OUT P1B,R24
(0120) }
01F6 9508 RET
(0121) void turn_right_s() //慢速右轉
(0122) {
(0123) PORTD = 0x80; //慢速右轉//0010 0000
_turn_right_s:
01F7 E880 LDI R24,0x80
01F8 BB82 OUT P12,R24
(0124) PORTA = 0xCF; //1100,1111
01F9 EC8F LDI R24,0xCF
01FA BB8B OUT P1B,R24
(0125) }
01FB 9508 RET
(0126)
(0127) void turn_left_s() //慢速左轉
(0128) {
(0129) PORTD = 0x20; //慢速左轉//1000 0000
_turn_left_s:
01FC E280 LDI R24,0x20
01FD BB82 OUT P12,R24
(0130) PORTA = 0xF3; //1111,0011
01FE EF83 LDI R24,0xF3
01FF BB8B OUT P1B,R24
(0131) }
0200 9508 RET
(0132)
(0133) void backward()//后退
(0134) {
(0135) PORTD = 0x50; //后退//0101 0000
_backward:
0201 E580 LDI R24,0x50
0202 BB82 OUT P12,R24
(0136) PORTA = 0x3C; //0011,1100 指示燈
0203 E38C LDI R24,0x3C
0204 BB8B OUT P1B,R24
(0137) }
0205 9508 RET
(0138)
(0139) void forward()//前行
(0140) {
(0141) PORTD = 0xA0; //前行//1010 0000
_forward:
0206 EA80 LDI R24,0xA0
0207 BB82 OUT P12,R24
(0142) PORTA = 0xC3; //1100,0011
0208 EC83 LDI R24,0xC3
0209 BB8B OUT P1B,R24
(0143) }
020A 9508 RET
(0144)
(0145) void stop()//停止運動
(0146) {
(0147) PORTD = 0xff; //停止
_stop:
020B EF8F LDI R24,0xFF
020C BB82 OUT P12,R24
(0148) PORTA = 0xff; //
020D BB8B OUT P1B,R24
(0149) }
020E 9508 RET
_sw_touch:
sw_in --> R20
remote_in --> R22
020F 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;
0210 B343 IN R20,P13
0211 7140 ANDI R20,0x10
(0168) if(sw_in == 0x00)
0212 F4C9 BNE 0x022C
(0169) {//后退,左轉 首部開關接觸
(0170) backward(); //后退
0213 DFED RCALL _backward
(0171) delay_ms(touch_time);
0214 EF0A LDI R16,0xFA
0215 E010 LDI R17,0
0216 DFC8 RCALL _delay_ms
(0172)
(0173) if(work_status == 0x70)
0217 9180007D LDS R24,_work_status
0219 3780 CPI R24,0x70
021A F469 BNE 0x0228
(0174) {//追光機器人,首部開關接觸,停止運動,PA 口led 流動閃爍
(0175) stop();
021B DFEF RCALL _stop
021C C00A RJMP 0x0227
(0176) while(1)
(0177) {
(0178) PORTA = 0x55;
021D E585 LDI R24,0x55
021E BB8B OUT P1B,R24
(0179) delay_ms(250);
021F EF0A LDI R16,0xFA
0220 E010 LDI R17,0
0221 DFBD RCALL _delay_ms
(0180) PORTA = 0xAA;
0222 EA8A LDI R24,0xAA
0223 BB8B OUT P1B,R24
(0181) delay_ms(250);
0224 EF0A LDI R16,0xFA
0225 E010 LDI R17,0
0226 DFB8 RCALL _delay_ms
0227 CFF5 RJMP 0x021D
(0182) }
(0183) }
(0184)
(0185) turn_left(); //左轉
0228 DFC9 RCALL _turn_left
(0186) delay_ms(touch_time);
0229 EF0A LDI R16,0xFA
022A E010 LDI R17,0
022B DFB3 RCALL _delay_ms
(0187) }
(0188)
(0189) sw_in = PINB & 0x0b;//0b0000,1011 pb3,pb1,pb0
022C B346 IN R20,P16
022D 704B ANDI R20,0xB
(0190) if(sw_in == 0x09)// 0b 0000,1001 尾部開關接觸
022E 3049 CPI R20,0x9
022F F441 BNE 0x0238
(0191) {//前行,左轉
(0192) forward(); //前行
0230 DFD5 RCALL _forward
(0193) delay_ms(touch_time);
0231 EF0A LDI R16,0xFA
0232 E010 LDI R17,0
0233 DFAB RCALL _delay_ms
(0194)
(0195) turn_left(); //左轉
0234 DFBD RCALL _turn_left
(0196) delay_ms(touch_time);
0235 EF0A LDI R16,0xFA
0236 E010 LDI R17,0
0237 DFA7 RCALL _delay_ms
(0197) }
(0198) if(sw_in == 0x0a)// 0b 0000,1010 右側開關接觸
0238 304A CPI R20,0xA
0239 F441 BNE 0x0242
(0199) {//后退,左轉
(0200) backward(); //后退
023A DFC6 RCALL _backward
(0201) delay_ms(touch_time);
023B EF0A LDI R16,0xFA
023C E010 LDI R17,0
023D DFA1 RCALL _delay_ms
(0202)
(0203) turn_left(); //左轉
023E DFB3 RCALL _turn_left
(0204) delay_ms(touch_time);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -