1、uchar flag_tran=1,flag_Metal=1; /超声波跳出标志/寻线跳出标志/金属检测引脚sbit Metal_DTC= P33;uchar MetalNum=0;/寻光引脚 定义I2C 总线的数据端口和命令端口/*/sbit SDA=P07;/数据总线sbit SCL=P06;/控制总线uint light_numL=0,light_numM=0,light_numR=0,light_up=0;/定义san个变量bit ack;/应答位/红外蔽障/uchar flag_red;unsigned char PWM1=0 ; /*左前电机的占空比*/unsigned char
2、PWM2=0 ; /*左后电机的占空比*/unsigned char PWM3=0 ; /*右前电机的占空比*/unsigned char PWM4=0 ; /*右后电机的占空比*/unsigned char t=0; /*定时器中断计数器*/*初始化定时器,中断*/void motor_init() TMOD=0x01; /定时器T0工作方式一 TH0=0xFF; /定时0.25Ms TL0=0x06; PT0=0; /T0为低优先级中断 EA=1; /总中断 ET0=1; /允许定时器中断 TR0=1; /定时器T0开始定时 ENA_L=1; ENB_L=1; ENA_R=1; ENB_R
3、=1; PWM1=15; PWM2=15; PWM3=15; PWM4=15; PW0=1; /*给左前电机加电启动*/ 向前转 PW1=0; PW4=1; /*给右前电机加电启动*/ PW5=0; PW2=1; /*给左后电机加电启动*/ PW3=0; PW6=1; /*给右后电机加电启动*/ PW7=0; /*中断函数+脉宽调制*/void timer0() interrupt 1 ET0=0; if(t0;b-) for(a=2;aa-);void delay1ms() /误差 0us unsigned char a,b,c; for(c=1;cc-) for(b=142;void de
4、lay100us() /误差 0us for(b=1; for(a=47; */void delay10ms() /误差 0us for(b=38; for(a=130;void delay5ms() /误差 0us for(b=19;/寻线函数:Follow()void delay_nms(uint n) /超声波 uchar i; while(n-) for(i=123;ii-);void Follow() uchar temp=0; /Metal_init(); /金属传感器初始化 while(1) temp = (temp1)|Follow_R2; temp = (temp1)|Fol
5、low_R1;1)|Follow_L1;1)|Follow_L2; /*while(temp&0x0F)=0x00|(temp&0x0F)=0x0F) / 00 000 000 temp = (temp temp = (temp straight1(); while(temp&0x0F)=0x02) /一级左转 0000 00 10 left_turn1(); 0x0F)=0x01|(temp&0x0F)=0x03) / 二级左转 0000 00 01 left_turn2();0x0F)=0x04) /一级右转 0000 01 00 right_turn1();0x0F)=0x08|(tem
6、p&0x0F)=0x0C) / 二级右转 0000 10 00 right_turn2(); */ switch(temp&0x0F) case 0x00: case 0x0F: straight1();break; / 00 000 000 case 0x02: left_turn1();delay5ms(); /一级左转 0000 00 10 case 0x01: case 0x03: left_turn2();delay10ms(); / 二级左转 0000 00 01 case 0x04: right_turn1(); /一级右转 0000 01 00 case 0x08: case
7、0x0C: right_turn2(); delay10ms(); / 二级右转 0000 10 00 if(!flag_Metal) PX1=0; /低优先级中断 EX1=0; /关闭外部中断 break; /红外蔽障/*/ /*/void Infra_red() while(1) while(!Infra_redL)&Infra_redR) right_turn2(); while(Infra_redL&(!Infra_redR) left_turn2(); /flag_red=1; if(flag_red) break;/*函数名称:超声波测量函数入口参数:无返回值: 无*/void u
8、ltrasonic_init() /超声波初始化 TMOD=0x11;/定时器方式用于计时 与电机初始化加在一起 TH1=0; TL1=0; /* 设定T0的工作模式为*/ PT1=1; /T1为高优先级中断 /EA=1; /电机初始化已开 IT0=0; /下降沿有效,左传感器 PX0=1; /外部中断零为高优先级中断void ultrasonic() /超声波函数 float temp;/清定时 TR1=1;/开定时 for(i=8;i-) Trig=!Trig; _nop_(); _nop_(); Trig=1; delay_nms(1); EX0=1; /开中断 if(flag=1) /
9、中断标志位置,说明有回波 /以下为路程计算 temp=high_time*256+low_time; temp=(temp/1000)/2; temp*=340; temp=temp/10; dis=temp; flag=0; if(dis50) /20为小车到障碍物的距离 dis0)&(tmp60000)/判断是否超出范围,此设置的范围为到米,实际不能达到米 high_time=TH1;/把计时值放入缓冲 low_time=TL1; else /超出范围则重新测量 high_time=0; low_time=0; /*/void Metal_init() IT1=0; /外部中断*触发外部中
10、断*下降沿触发 EX1=1; /打开外部中断 / EA=1; /打开总中断 已开 bell=0; / 蜂鸣器初始化void delay1s() /误差 0us for(c=167; for(b=171; for(a=16; /if Keil,require use intrins.hINT1_() interrupt 2 / 外部中断1 bell=1; MetalNum+; delay1s(); if(MetalNum=4) swift_stop(); flag_Metal=0;void delay5s() /5秒暂停/ for(c=165; for(b=100; for(a=150;/*I2
11、C 总线通信协议*寻光开始*void start_i2c()/启动i2c 总线 SDA=1; /发送起始条件的数据信号 SCL=1; /起始条件建立时间大于4.7us,延时 SDA=0; /发送起始信号 /起始条件锁定时间大于4 SCL=0; /钳住I2C 总线,准备发送或接收数据void stop_i2c()/结束总线 /发送结束条件的数据信号 /发送结束条件的时钟信号 /结束条件建立时间大于4 /发送I2C 总线结束信号void sendbyte(uchar c)/发送数据传递函数,注意这里发送的是一个字节的数据8bit unsigned char BitCnt; for(BitCnt=0
12、;BitCnt8;BitCnt+) /要传送的数据长度为8 位 if(cBitCnt)&0x80) SDA=1; /判断发送位 else SDA=0; SCL=1; /置时钟线为高,通知被控器开始接收数据位 /保证时钟高电平周期大于4 SCL=0; /8 位发送完后释放数据线,准备接收应答位 if(SDA=1) ack=0; else ack=1; /判断是否接收到应答信号uchar rcvbyte()/接受数据传递函数,注意这里发送的是一个字节的数据8bit uchar retc; uchar BitCnt; retc=0; /置数据线为输入方式BitCnt+) /置时钟线为低,准备接收数据位 /时钟低电平周期大于4.7us /置时钟线为高使数据线上数据有效 retc=retc1; if(SDA=1)retc=retc+1; /读数据位,接收的数据位放入retc 中 return(retc);void noack_i2c(void)/非应答子函数 /
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2