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

📄 motormain.c

📁 一个玩具小车。实现寻迹线以及清除迹线上面的四个障碍物
💻 C
字号:
#include <at89x51.h>
#define uchar unsigned char
#define uint  unsigned int

bit flag=0;
int last1=0;
int zhang=0;
 sbit P10=P1^0;//后轮一,脉冲输入端
 sbit P11=P1^1;
 sbit P12=P1^2;//后轮二,脉冲输入端
 sbit P13=P1^3;
 
 sbit P14=P1^4;//前电机正转脉冲输入
 sbit P15=P1^5;//前电机反转脉冲输入


 sbit P30=P3^0;	//控制外部中断二极管开关,主函数中打开,中断中关闭
 sbit P35=P3^5;
 sbit P36=P3^6;	//左边寻迹传感器
 sbit P37=P3^7;	//右边寻迹传感器
		
/*******函数定义*************/

void delay();
void stop();
void last();

void main()
{uchar a=1000;
 while(a--);  //开机延时
  
 TMOD=0X10;//开一个定时器1
	  ET1=1; 
	  EX0=1;EX1=1;
	  IT0=0;IT1=0;
	  TR1=1;	 
	  P10=1;P11=1;P12=1;P13=1;//初值为0(硬件板相反,所以程序置1,硬件为0)
	  P14=0;P15=0;
	  TH1=0XB1;TL1=0XE0;//20ms	  
	  EA=1;
  //if(last1==1){EX0=0;EX1=0;EA=0;
               //last();
			  //P10=1;P11=1;P12=1;P13=1;P14=0;P15=0;}//停车
			
  P30=1;//开二极管	 
  
  while(last1!=1);
  
  EX0=0;EX1=0;EA=0;	//????????
  last();
                   //stop();
  P10=1;P11=1;P12=1;P13=1;P14=0;P15=0;//停车
  while(1);
  //EA=0;				    //出线后			
  //last();		 
  //stop();
  //while(1);
 }
 
void timer2() interrupt 3  //定时器中断0 (后轮1 PWM输出),外部中断后前轮输出正转
	{ if(flag==0)  { P10=0; P12=0;TH1=0X15;TL1=0Xa0;} //60ms后轮92%占空比		             
	  if(flag==1)  { P10=1; P12=1;TH1=0Xec;TL1=0X78;} //5ms
	  flag=~flag;	  
	 }
															    
void inter0() interrupt 0 //外部中断0,遇到障碍用
	{uchar i,j,h;
	 
	 P30=0;//关二极管
	  P10=1;P11=1;P12=1;P13=1;//停车
	  
	  for(i=0;i<44;i++)	
 	  for(j=0;j<25;j++)
 	  for(h=0;h<250;h++)
	     {P14=1;P15=0;
		 }//正转,1.4s
		 	  	
	  for(i=0;i<16;i++)
 	  for(j=0;j<25;j++)
 	  for(h=0;h<250;h++)
	     {P14=0;P15=0;
		  }  // 暂停,0.5s
	 if(zhang!=5) 			//已经是第五个障碍时,不放机械臂。
      {for(i=0;i<44;i++)
 	   for(j=0;j<25;j++)
 	   for(h=0;h<250;h++)
	     {P14=0;P15=1;
		  }//反转 1.4s
		  zhang++;
	   }
	  if(zhang==5)	 //测试,可能不要!??????已经是第五个,直接拐出迹线,去车库
	   { TR1=0;ET1=0; //关定时器
	     last1=1;
		 for(i=0;i<3;i++)
         for(j=0;j<25;j++)
		 for(h=0;h<250;h++)
           {P10=1;P11=0;P12=1;P13=0;}//退车,0.2s
		}
	  for(i=0;i<8;i++)
 	  for(j=0;j<25;j++)
 	  for(h=0;h<250;h++){P30=1;}//开二极管,0.25s
		  }

void inter1() interrupt 2 //外部中断1 ,寻迹用
	{ uchar q,n,p;
	 P36=1;P37=1;//读口准备	         
	 if(P36==0&&P37==1){P10=0;P11=1;P12=1;P13=1;}//左边一个传感器走出了迹线,右转,左电机运转
	 if(P36==1&&P37==0){P10=1;P11=1;P12=0;P13=1;}//右边传感器出线,左转,右电机运转
	 if(P36==0&&P37==0){ TR1=0;ET1=0; //关定时器
	                     last1=1;
						 for(n=0;n<8;n++)
             			 for(p=0;p<25;p++)
						 for(q=0;q<250;q++)
        					{P10=1;P11=0;P12=1;P13=0;}//退车,0.3s
						 //for(n=0;n<40;n++)//收起机械臂?????????
             			 //for(p=0;p<25;p++)
						 //for(q=0;q<250;q++)
						 //    {P14=1;P15=0;}
						 P10=1;P11=1;P12=1;P13=1;P14=0;P15=0;	//停车,回主函数????????
                        }
	   
	 }
/****
void delay()
 {uchar k=10000,m=5;
  while(k--);
  while(m--); 
 }

void stop()
{ uchar u,v;
 for(u=800;u--;u>0)	 
 for(v=1000;v--;v>0)
     {delay();P14=0;P15=1;}	//前电机反转,收起机械臂

 P10=1;P11=1;P12=1;P13=1;
 P14=0;P15=0;
 TR0=0;
 EX0=0;
 EX1=0;
 EA=0;
}
****/
void last()	//迹线走完后手动完成路程程序
{uchar x,z,y;

 for(z=0;z<40;z++)//收起机械臂,1.2s
 for(y=0;y<25;y++)
 for(x=0;x<250;x++)
	   {P14=1;P15=0;}
 for(z=0;z<55;z++)
 for(y=0;y<25;y++)
 for(x=0;x<250;x++)
       {P10=1;P11=1;P12=0;P13=1;} //左转,1.8s

 for(z=0;z<49;z++)
 for(y=0;y<25;y++)
 for(x=0;x<250;x++)
     {P10=0;P11=1;P12=1;P13=1;} //右转,1.65s

 for(z=0;z<128;z++)
 for(y=0;y<25;y++)
 for(x=0;x<250;x++)
      {P10=0;P11=1;P12=0;P13=1;} //直行,4s
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -