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

📄 kunagjia.c

📁 本人学习单片机一年多时间厚参加全国电子设计大赛的程序以及赛前练习的程序。
💻 C
字号:
#include<reg51.h>

//管脚定义
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P2_0=P2^0;
sbit P2_1=P2^1;

//全局变量声明
unsigned char th,tl,deng,saomiao,now=1,qian;                                                            //直接给TH0,TL0赋值
unsigned int i,j,k,l,m,x,y,z,yichu0,zhouqi0=1,yichu1,gao=63536,di=57536,fangxiang=2;//i,j,k,l,m控制循环次数,,zhouqi0调节小车抖动频率

//函数声明
void Init(void);      //初始化函数
void xunji(void);     //循迹函数
void wending(void);   //稳定小车函数
void houtui(void);
void delay(void);

//定时中断0,可任意调节后轮电机的工作状态
void timer0(void) interrupt 1 //gao和di调节占空比,zhouqi0调节小车抖动频率,fangxiang调节后电机转动方向
{yichu0++;
 if(yichu0==zhouqi0)
 {yichu0=0;
  x++;
  if(fangxiang==2)
  {P1_3=0;
   if(P1_2==0)
    P1_2=1;
   else
    P1_2=0;
	 }
  else if(fangxiang==1)
  {P1_2=0;
   if(P1_3==0)
    P1_3=1;
	else
	 P1_3=0;
	}
  if(x%2==1)
  {th=gao/256;    //1ms
   tl=gao%256;
	}
  else
  {th=di/256;    //9ms
   tl=di%256;
   }
  }
 TH0=th;
 TL0=tl;
}

main()
{
 Init();        //初始化函数

// A -----> C
 for(;;)           //000 000 00任意传感器检测到黑线就跳出
 {saomiao=P2&0x1C;
  if(saomiao<0x1C)
   break;
  if(P2_0==0)
   {P1_0=1;
    P1_1=0;
	 delay();
    break;
    }
  else if(P2_1==0)
  {P1_0=0;
   P1_1=1;
	delay();
   break;
   }
  }

 for(;;)       //中间三组传感器中任意一个检测到黑线就跳出
 {saomiao=P2&0x1C;
  if(saomiao<0x1C)
  {break;
	}
  if(saomiao==0x1C)
  {if(z==0)
   {delay();
	 y++;
	 if(y==5)                     //调节小角度转弯灵敏度
	 {P1_0=!P1_0;
	  P1_1=!P1_1;
	  z=1;
	  }
	 }
   continue;
	}
  }

 gao=?
 di=?            //调节占空比,使小车刚好能以稳定速度爬坡
 for(;;)
 {xunji();
  if(P0_0==1)  //P0_0外接跷跷板前端检测电路,一旦检测到板平衡则跳出循迹程序,开始稳定小汽车
   break;
  }

// C
 for(;;)
 {wending();
  if(P0_1==1)  //P0_1外接2051显示时间模块,当稳定时间达到5s则跳出稳定程序,继续循迹
  break;
  }

// C -----> B
 fangxiang=1;
 gao=?
 di=?
 delay();          //小车向前行驶一段可调时间,使板向B端倾斜
 fangxiang=2;      //使电机提供向后的力
 gao=?;
 di=? ;            //调节占空比,使小车刚好能以稳定速度下滑
 for(;;)
 {deng=P2&0x1c;
  if(deng==0x00)
   break;
  xunji();
  }

// B
 gao=?;
 di=?;        //调节占空比,使小车刚好能停在一个确定的位置,此时电机仍然提供向后的力
 for(;;)
 {if(P0_1==1)   //P0_1外接2051显示时间模块,当稳定时间达到5s则跳出稳定程序,开始后退    注:此处可另选方案
  break;
  }

// B -----> A
 for(;;)
 {houtui();
  if(P2_0==0&&P2_1==0)    //后退循迹,直到提前检测的两灯检测到黑线           注:此处方案待定
  break;
  }

//程序完                 若要将小车稳定在A点,可另行设计
 for(;;);
}

void Init(void)          //
{P1_0=0;
 P1_1=0;
 P1_2=0;
 P1_3=0;

 EA=1;
 ET0=1;
 ET1=1;
 TMOD=0x11;
 TH0=gao/256;
 TL0=gao%256;
 TR0=1;
}

void xunji(void)
{
//记录当前状态,和先前状态
 if(deng==0x1C)     // 000 111 00
  {qian=now;
   now=1;
   }
 else if(deng==0x14)// 000 101 00
 {qian=now;
  now=2;
  }
  else if(deng==0x04)// 000 001 00
  {qian=now;
   now=3;
   }
  else if(deng==0x0C)// 000 011 00
  {qian=now;
   now=4;
   }
  else if(deng==0x10)// 000 100 00
  {qian=now;
   now=5;
   }
  else if(deng==0x18)// 000 110 00
  {qian=now;
   now=6;
   }
  else if(deng==0x00)// 000 000 00
  {qian=now;
   now=7;
   }
  else if(deng==0x08)// 000 010 00
  {qian=now;
   now=8;
   }

//  判断
  if(now==1)
  {if(qian==3||qian==4)
   {P1_0=1;
    P1_1=0;
    delay();
	 }
	else if(qian==5||qian==6)
	{P1_0=0;
    P1_1=1;
    delay();
	 }
	else
	{delay();
	 }
	}
  else if(now==2)
  {P1_0=0;
   P1_1=0;
	delay();
   }
  else if(now==3)
  {if(qian==1)
   {P1_0=0;
    P1_1=1;
    delay();
    }
   else if(qian==2)
   {P1_0=1;
    P1_1=0;
    delay();
    }
	else if(qian==5||qian==6)
	{P1_0=1;
	 P1_1=0;
	 delay();
	 }
   else
   {delay();
	 }
   }
  else if(now==4)
  {P1_0=1;
	P1_1=0;
	delay();
   }
  else if(now==5)
  {if(qian==1)
   {P1_0=1;
    P1_1=0;
    delay();
    }
   else if(qian==2)
   {P1_0=0;
    P1_1=1;
    delay();
    }
   else if(qian==3||qian==4)
   {P1_0=0;
    P1_1=1;
    delay();
    }
   else
   {;
	 }
   }
 else if(now==6)
  {P1_0=0;
   P1_1=1;
   delay();
   }
 else if(now==7)
  {;
   }
 else if(now==8)
  {;
   }
}

void wending(void)
{if()

}

void houtui(void)
{

}

⌨️ 快捷键说明

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