基于51单片机的避障小车程序程序中有我写的注释,看不懂程序的话,可以参考。#includereg52.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedintsbitIN1=P2^1;//左电机输入端1sbitIN2=P2^2;//左电机输入端2sbitIN3=P2^3;//右电机输入端1sbitIN4=P2^4;//右电机输入端2sbitENA=P2^0;//右电机使能控制端sbitENB=P2^5;//左电机使能控制端sbitTX=P1^0;//超声波发送控制端sbitRX=P1^1;//超声波接收控制端uinttime=0,ERROR;//用于存放定时器时间值uintPWM1,PWM2,num1=0,num2=0;uints=0;//用于存放距离的值uchartt=0;voidDelay20us()//@11.0592MHz延时20us{unsignedchari;_nop_();_nop_();_nop_();i=52;while(--i);}voidforwardg()//前进函数{IN1=1;IN2=0;IN3=1;IN4=0;PWM1=15;PWM2=18;}voidstopg()//停止函数{IN1=1;IN2=1;IN3=1;IN4=1;PWM1=0;PWM2=0;}voidcount()//测距函数{tt=200;if(tt==200)//20ms超声波发送一次{tt=0;TX=1;//超声波发送端Delay20us();//延时20usTX=0;//超声波发送端ERROR=50000;//while(RX==0&&ERROR0)//判断是否有接收&&等待时常{ERROR--;//等待时长}if(RX==1)//超声波有接收RX=1{TR0=1;//开始计时while(RX&&!TF0);//接收完毕(RX=0)或者超出量程结束语句TR0=0;//停止计时if(TF0==1)//如果溢出(超出量程){TF0=0;//置溢出标志位为0s=999;//直行控制}else{time=TH0*256+TL0;TH0=0;TL0=0;s=(time*1.7)/100;//距离计算公式}}else{s=999;}}}voidtime0init()//定时器0初始化{TMOD|=0x01;//设置定时器0为工作方式1TH0=0;TL0=0;//定时器赋初值}voidtime1init()//定时器1初始化{ET1=1;//开定时器中断TR1=1;//开定时器1中断TH1=0xFF;//定时器赋初值TL1=0xA3;TMOD|=0x10;//设置定时器1为工作方式1}voidtime1()interrupt3//定时计数器1中断{TH1=0xFF;TL1=0xA3;//赋初值tt++;num1++;num2++;if(num1=100)//PWM的周期为100*0.1=10msnum1=0;if(num2=100)num2=0;if(num1PWM1)ENA=1;//打开右电机使能控制端if(num2PWM2)ENB=1;if(num1=PWM1)ENA=0;//关闭右电机使能控制端if(num2=PWM2)ENB=0;}voidmain(){time0init();time1init();EA=1;//开总中断while(1){count();//调用距离计算函数if(s=6)//大于等于6厘米前进{forwardg();}else{stopg();}}}