//__________________________________________________________________________________ //版权:温州电子开发实验室 夏德仙 www.rf315.net //用途:本程序仅限学习与交流之用 //创建日期:2006 //最后修改日期: //编译环境: Keil uVision3 V8.08a //___________________________________________________________________________________ #include sbit l_whell_h=P0^7; //左轮前进 sbit l_whell_b=P0^6; //左轮后退 sbit r_whell_b=P0^5; //右轮前进 sbit r_whell_h=P0^4; //右轮后退 sbit speed_switch=P0^3; //速度切换 sbit roller_rise=P2^2; //滚筒上升 sbit roller_down=P2^3; //滚筒下降 sbit rollerf=P2^4; //滚轴反转 sbit rollerz=P2^5; //滚轴正转 sbit body_rise=P2^6; //球箱上升 sbit body_down=P2^7; //球箱下降 sbit b_r_confine=P3^0; //球箱上限位 sbit b_d_confine=P3^1; //球箱下限位 sbit rh_sensor=P1^0; //巡线传感器前面的右边 sbit mh_sensor=P1^1; //巡线传感器前面的中间 sbit lh_sensor=P1^2; //巡线传感器前面的左边 sbit rb_sensor=P1^4; //巡线传感器后面的右边 sbit mb_sensor=P1^5; //巡线传感器后面的中间 sbit lb_sensor=P1^6; //巡线传感器后面的左边 sbit lcoun_sensor=P1^7; //巡线传感器计数器的左 sbit rcoun_sensor=P1^3; //巡线传感器计数器的右 bit h_flag,b_flag,stop; bit midst,left,right; bit intersection; unsigned char crossing,roller_position,t,time; /********************************************************************************************************/ //定时器0中断 /************************************/ //定时50ms /***********************************/ time0(void) interrupt 1 using 1 { TH0=0x3c; TL0=0xa8; if(++t==20) { t=0; time++; } } /********************************************************************************************************/ //延时子程序 void delay(i,j,k) unsigned char i,j,k; { for(;i>0;i--) { for(;j>0;j--) { for(;k>0;k--); } } } /*******************************************************************************************************/ //巡线 void cruise(void) { intersection=rh_sensor|mh_sensor|lh_sensor; if(intersection) { if(!lcoun_sensor&&!rcoun_sensor&&!h_flag) { crossing++; h_flag=1; } if(lcoun_sensor&&rcoun_sensor) { h_flag=0; } while(mh_sensor) { while(intersection&&!rh_sensor) { r_whell_h=1; intersection=rh_sensor|mh_sensor|lh_sensor; } r_whell_h=0; /*while(mh_sensor) { l_whell_h=1; } l_whell_h=0;*/ while(intersection&&!lh_sensor) { l_whell_h=1; intersection=rh_sensor|mh_sensor|lh_sensor; } l_whell_h=0; /*while(mh_sensor) { r_whell_h=1; } r_whell_h=0;*/ } } else { while(mb_sensor) { while(!intersection&&!rb_sensor) { r_whell_h=1; intersection=rh_sensor|mh_sensor|lh_sensor; } r_whell_h=0; while(mb_sensor) { l_whell_h=1; } l_whell_h=0; while(!intersection&&!lb_sensor) { l_whell_h=1; intersection=rh_sensor|mh_sensor|lh_sensor; } l_whell_h=0; while(mb_sensor) { r_whell_h=1; } r_whell_h=0; if(!mh_sensor) break; } } } /**************************************************************************************************/ //放球 void pitch(void) { if(crossing==3) { stop=1; r_whell_h=1; l_whell_h=1; while(b_r_confine) { body_rise=0; } body_rise=1; rollerz=0; delay(4,255,255); roller_position=P0&0x07; while(roller_position!=0x05) { roller_down=0; roller_position=P0&0x07; } roller_down=1; while(roller_position!=0x06) { roller_rise=0; roller_position=P0&07; } roller_rise=1; delay(4,255,255); rollerz=1; crossing=0; } } /***************************************************************************************************/ //复位 void reposition(void) { while(b_d_confine) { body_down=0; } body_down=1; roller_position=P0&0x07; while(roller_position!=0x06) { roller_rise=0; roller_position=P0&0x07; delay(1,1,255); } roller_rise=1; } /*************************************************************************************************/ main(void) { TMOD=0x01; TH0=0x3c; TL0=0xa8; EA=1; ET0=1; reposition(); l_whell_h=0; r_whell_h=0; TR0=1; time=0; while(1) { if(0) { speed_switch=1; TR0=0; } else { speed_switch=0; } if(stop) { l_whell_h=1; r_whell_h=1; } else { cruise(); } //pitch(); } }