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

📄 all.c

📁 自动循迹小车
💻 C
字号:
#include <reg51.h>

#define uchar unsigned char
#define uint unsigned int

unsigned char AD();
void disp();
void disp3();
void straight();
void stop();
void left(uchar);
void right(uchar);

void init();
void delay1(uchar);


sbit we1=P2^0;
sbit we2=P2^1;
sbit we3=P2^2;
sbit we4=P2^3;
sbit enleft=P2^4;
sbit enright=P2^5;
sbit inleft=P2^6;
sbit inright=P2^7;
sbit g1=P1^0;
sbit g5=P1^4;

uchar num;
uchar flag=0;
uchar time_s=1;
uchar gdstadus;
uchar zero;
unsigned char i,temp;

uchar code tabledu[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92};

sbit clk=P1^5;
sbit cs=P1^6;
sbit ddata=P1^7;
//void delay()  { ;}
void delay2us()  { ; ;}
void delay4us()	{ delay2us(); }
void delay17us()   {delay4us();delay4us();delay4us();delay4us();}
void init()
{
	EA=1;
	ET0=1;
	TR0=1;
}



unsigned char AD()
{
	unsigned char angledata;
	cs=1;
	cs=0;
	cs=1;
	clk=0;
	delay4us();
	cs=0;
	delay4us();
	for(i=0;i<8;i++)
		{
			clk=1;
			delay4us();
			clk=0;
			delay4us();
		}
	cs=1;
	delay17us();
	cs=0;
	delay4us();
    temp=ddata;
	angledata=angledata|temp;
	angledata=angledata<<1;
	//clk=1;
	for(i=0;i<6;i++)
	 	{
			clk=1;
			delay4us();
			clk=0;
			delay4us();
			temp=ddata;
			angledata=angledata|temp;
			angledata=angledata<<1;
		}
		    clk=1;
			delay4us();
			clk=0;
			delay4us();
			temp=ddata;
			angledata=angledata|temp;
	//		angledata=angledata<<1;
			clk=1;
			delay4us();
			clk=0;
			delay4us();
	    cs=1;
//	 	disp();
	 return(angledata);
	}


void disp()
{
	TMOD=0x11;
	TH0=(65536-46000)/256;
	TL0=(65536-46000)%256;
	num=0;

	while(1)
	{
		
		if(num==20)
		{
				time_s++;
				num=0;

		}

					P0=tabledu[time_s];
					we1=0;
					delay1(1);
					we1=1;
					P0=tabledu[0];
					we2=0;
					delay1(1);
					we2=1;
					P0=tabledu[0];
					we3=0;
					delay1(1);
					we3=1;
		//			P0=tabledu[0];
		//			we4=0;
		//			delay1(1);
				
		if(time_s==6) 
		{
			time_s=1;
			break;
		 }
	}

}
void disp3()
{
	TMOD=0x11;
	TH0=(65536-46000)/256;
	TL0=(65536-46000)%256;
	num=0;

	while(1)
	{
		
		if(num==20)
		{
				time_s++;
				num=0;

		}

					P0=tabledu[time_s];
					we1=0;
					delay1(1);
					we1=1;
					P0=tabledu[0];
					we2=0;
					delay1(1);
					we2=1;
					P0=tabledu[0];
					we3=0;
					delay1(1);
					we3=1;
		//			P0=tabledu[0];
		//			we4=0;
		//			delay1(1);
				
		if(time_s==4) 
		{
			time_s=1;
			break;
		 }
	}

}
void stop()
{
		enleft=0;
		enright=0;	
}
void straight()
{
	
	enleft=1;
	enright=1;
		
}
void left(uchar fudu)
{
	enleft=0;
	enright=1;
	delay1(fudu);
}
void right(uchar fudu)
{
	enleft=1;
	enright=0;
	delay1(fudu);
}

void main()

	stop();
	init();
	disp3();
	zero=AD();
	delay1(50);
	straight();

	while(1)
	{	
	
		uchar angle=0;
//		delay1(100);
		angle=AD();
		delay1(50);
//		P2=angle;
		if(flag<5)
		{
			if((angle<=(zero+1))&&(flag==0))
			{  	
				delay1(10);
				if((angle<=(zero+1))&&(flag==0))
				{
				//	straight();
   					flag++;
					disp3();
					//disp();
				 }
			}	
			if((angle>=(zero+2))&&(flag==1))
			{	
				delay1(10);
				if((angle>=(zero+2))&&(flag==1))
				{
				//	straight();
					flag++;
					disp3();	
				 }
			}
			if((angle<=(zero+1))&&(flag==2))
			{
				delay1(10);
				if((angle<=(zero+1))&&(flag==2))
				{
				//	stop();
					disp();
				//	straight();
					flag++;
				 }
			}
			if((angle>=(zero+2))&&(flag==3))
			{
				delay1(10);
				if((angle>=(zero+2))&&(flag==3))
				{
			//	straight();
					flag++;	
				//	disp();
				}
			}
			if((angle<=(zero+1))&&(flag==4))
			{
				delay1(10);
				if((angle<=(zero+1))&&(flag==4))
				{
				//	stop();
					disp();
				//	straight();
					flag++;
				//	while(1);
				}
			}
		}
		else
		{
			straight();
			gdstadus=P1|0xe0;
			if(g1==1)
			 right(100);
			if(g5==1)
			 left(100);
			switch(gdstadus)
			{
				case 0xe4: straight();break;
				case 0xee: straight();break;
				case 0xe6: right(50);break;
				case 0xec: left(50);break;
				case 0xe2: right(75);break;
				case 0xe8: left(75);break;
				case 0xff: stop(); while(1);break;
				default: break;
		   }
		 }
	}
}
void delay1(uchar time)
{
	uchar i,j;
	for(i=time;i>0;i--)
		for(j=200;j>0;j--);
}
void time0() interrupt 1
{
	TH0=(65536-46080)/256;
	TL0=(65536-46080)%256;
	num++;
}

⌨️ 快捷键说明

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