G:\壁障小车\程序\cx.c#includereg52.h#defineucharunsignedchar#defineuintunsignedint/***********定义电机方向***********/#defineleft_qianIN1=0;IN2=1//左边电机前进方向#defineleft_houIN1=1;IN2=0//左边电机后退方向#defineright_qianIN3=1;IN4=0//右边电机前进方向#defineright_houIN4=1;IN3=0//右边电机后退方向/*********循迹传感器端口定义*******//*传感器位置*//*左2左1▇右1右2*//*P27P25▇P24P26*//**********************************/sbitleft_2=P2^7;//左大信号sbitleft_1=P2^5;//左小信号sbitrigh_1=P2^4;//右小信号sbitrigh_2=P2^6;//右大信号/********电机驱动模块端口定义********/sbitENA=P0^0;//左边电机使能sbitIN1=P0^1;//左边电机方向控制sbitIN2=P0^2;//左边电机方向控制sbitENB=P0^5;//右边电机使能sbitIN3=P0^7;//右边电机方向控制sbitIN4=P0^6;//右边电机方向控制ucharzkb_l=0;//左边电机的占空比ucharzkb_r=0;//右边电机的占空比uchart=0;//定时器中断计数器voidinit_time0(){TMOD=0x01;//方式116位计数器TH0=(65536-100)/256;TL0=(65536-100)%256;ET0=1;//定时器0中断允许位TR0=1;//定时器0运行控制位}/*************************中断函数+脉宽调制***************************//*PWM波形的周期为100次中断的时间,每次中断时间约100us,T约等10ms*//*因此PWM的波形是周期是固定的,调节的脉宽有变量zkb_r(zkb_l)决定*//*********************************************************************/voidtimer0()interrupt1{TH0=0xff;//定时器0高8位初值(65536-100)/256;TL0=0x9c;//定时器0低8位初值(65536-100)%256;if(tzkb_l)ENA=1;//当zkb_l大于t输出高电平,否者为低电平elseENA=0;//因此占空比就为zkb_l/100if(tzkb_r)ENB=1;//当zkb_r大于t输出高电平,否者为低电平elseENB=0;//因此占空比就为zkb_r/100t++;//t记录中断次数,每100次为一个周期if(t=100)t=0;}/********************************************************************//*循迹的四个传感器,检测到黑线则输出低电平到对应I/0口,否则输出高*//*四个传感器检测到黑线的可能性黑线位置转弯方向及幅度*//*左2左1右1右2*//*0111最左边左转弯幅度大*//*0011(左2)(左1)之间左转弯幅度中*//*1011(左1)下面左转弯幅度小*//*1111中间直行*//*1101(右1)下面右转弯幅度小*//*1100(右1)(右2)之间右转弯幅度中*//*1110最右边右转弯幅度大*//********************************************************************/voidxunji(){if((left_2==0)&&(left_1==1)&&(righ_1==1)&&(righ_2==1))//左转弯幅度大{zkb_l=100;//左边占空比100%zkb_r=100;//右边占空比100%left_hou;//左边电机后退right_qian;//右边电机前进}elseif((left_2==0)&&(left_1==0)&&(righ_1==1)&&(righ_2==1))//左转弯幅度中{zkb_l=40;//左边占空比40%zkb_r=100;//右边占空比100%left_hou;//左边电机后退right_qian;//右边电机前进}elseif((left_2==1)&&(left_1==0)&&(righ_1==1)&&(righ_2==1))//左转弯幅度小{zkb_l=20;//左边占空比20%zkb_r=100;//右边占空比100%left_qian;//左边电机前进right_qian;//右边电机前进}elseif((left_2==1)&&(left_1==1)&&(righ_1==1)&&(righ_2==1))//直行{zkb_l=80;//左边占空比80%zkb_r=80;//右边占空比80%left_qian;//左边电机前进right_qian;//右边电机前进}elseif((left_2==1)&&(left_1==1)&&(righ_1==0)&&(righ_2==1))//右转弯幅度小{zkb_l=100;//左边占空比100%zkb_r=20;//右边占空比20%left_qian;//左边电机前进right_qian;//右边电机前进}elseif((left_2==1)&&(left_1==1)&&(righ_1==0)&&(righ_2==0))//右转弯幅度中{zkb_l=100;//左边占空比100%zkb_r=40;//右边占空比40%left_qian;//左边电机前进right_hou;//右边电机后退}elseif((left_2==1)&&(left_1==1)&&(righ_1==1)&&(righ_2==0))//右转弯幅度大{zkb_l=100;//左边占空比100%zkb_r=100;//右边占空比100%left_qian;//左边电机前进right_hou;//右边电机后退}}voidmain(){init_time0();//定时器0初始化EA=1;//开总中断while(1){xunji();//循迹程序}}Page:1