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

📄 diy0206_4.lst

📁 双龙的积木式智能机器人C源程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
__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输入
(0090) }
    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 + -