5路 line sensor+HC06,tim2 as baudrate 9600 stc89c52

#include<reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;




sbit ENB = P1^7;   //左电机使能
sbit IN1 = P1^5;   //为0左轮反转
sbit IN2 = P1^6;   //为0左轮正转

sbit IN3 = P1^4;   //为0右轮反转
sbit IN4 = P1^3;   //为0右轮正转
sbit ENA = P1^2;   //右点机使能

sbit BEEP=P1^0;

sbit LED0=P1^0;
sbit LED1=P1^1;
//left1,left2,right1,right2
//P22		P23 P24		P25

sbit left1 = P2^0;
sbit left2 = P2^1;
sbit Mid=P2^2;
sbit right1 = P2^3;
sbit right2 = P2^4;

u8 PWMCnt1 = 0;
u8 PWMCnt2 = 0;
u8 cntPWM1 = 0;
u8 cntPWM2 = 0;

u8 timeflag=0;
u8 turn90Flag=0;
//定时器0产生PWM,并且测速,测位移,定时器2,产生波特率
void UART_init(void);
void Timer0Init();//定时器0产生PWM
void XunJi();
void TurnRight1()	;	   //右转,左轮速度快,速度差这里设置70-55
void TurnRight2()	;	   //右转
void TurnLeft1();				//左转
void TurnLeft2();				//左转
void Backward();				 //后退
void Stop();					  //停止
void Forward();
void delayms(unsigned int tms)
{
	unsigned int i,j;
	for(i=0;i<110;i++)
	{
		for(j=0;j<tms;j++);

		}
}

void main()
{
	unsigned char j;
	for(j=0;j<2;j++){
		BEEP=0;
		delayms(200);
		BEEP=1;
		delayms(200);
		}
	BEEP=0;
	UART_init();	
	delayms(200);

	Timer0Init();
	delayms(200);

	while(1)
	{
	//	XunJi();
//	SBUF='S';
//	while(TI == 0);
//	TI = 0;
//		delayms(2000);
	}	
}

#define FOSC 11059200L      //System frequency
#define BAUD 9600       //UART baudrate
//定时器2作为波特率发生器。调试的时候用。
void UART_init(void)
{		  
  TL2 = RCAP2L=(65536-(FOSC/32/BAUD));//9600波特率对应 FFD9,低位为D9(65536-26)%256
   TH2 = RCAP2H=(65536-(FOSC/32/BAUD)) >> 8;//高位为FF(65536-26)/256
   T2CON=0x34;//RCLK、TCLK、TR2置1
   SCON=0x50;//串口工作模式1,接收使能
   TI=1;
    ES  = 1;       //开中断
} 


void Uart0_Ist() interrupt 4 //中断函数
{
	  unsigned char temp=0;
    if(RI)
    {
        RI= 0;
        //Do whatever you want;
			  temp=SBUF;
				SBUF='S';
	      while(TI == 0);
	       TI = 0;
				if(temp=='s')
						BEEP=1;
				else if(temp=='p')
					BEEP=0;

    }

    if(TI)
    {
        TI = 0;
        //Do whatever you want;
    }

}




void Timer0Init()
{
	TH0 = 0xFF;
	TL0 = 0xA3;
	TMOD &= 0xF0;
	TMOD |= 0x01;
	EA = 1;
	ET0 = 1;
	TR0 = 1;
}

void TurnRight1()		   //右转,左轮速度快,速度差这里设置70-55
{
	IN1 = 0;	
	IN2 = 1;

	IN3 = 1;
	IN4 = 0;
	cntPWM2	= 80;
	cntPWM1 = 50;

}

void TurnRight2()		   //右转
{
	IN1 = 0;	//右轮反转
	IN2 = 1;

	IN3 = 1;	//左轮正转
	IN4 = 0;
	cntPWM2	= 180;
	cntPWM1 = 55;
	 timeflag=0;
			  while(timeflag==0);//转弯之后,小车暂停一段时间
	 timeflag=0;
			  while(timeflag==0);//转弯之后,小车暂停一段时间
	 timeflag=0;
			  while(timeflag==0);//转弯之后,小车暂停一段时间
		timeflag=0;//给下次定时用


}

void TurnLeft1()				//左转
{
	IN1 = 1;
	IN2 = 0;  

	IN3 = 0;
	IN4 = 1;   	
	cntPWM2	= 45;
	cntPWM1 = 80;
	
}			  	

void TurnLeft2()				//左转
{
	IN1 =1;
	IN2 = 0;   	

	IN3 = 0;
	IN4 = 1;  
	cntPWM2	= 55;
	cntPWM1 = 180;
	 timeflag=0;
			  while(timeflag==0);//转弯之后,小车暂停一段时间
	 timeflag=0;
			  while(timeflag==0);//转弯之后,小车暂停一段时间
	 timeflag=0;
			  while(timeflag==0);//转弯之后,小车暂停一段时间
						timeflag=0;//给下次定时用

}	
	
void Forward()				 //前进
{
	IN1 = 0;
	IN2 = 1;   	//右轮正转

	IN3 = 0;   	//左轮正转
	IN4 = 1;

	cntPWM1 = 75;
	cntPWM2	= 75;
}

void Backward()					 //后退
{
	IN1 =1;	//右轮反转
	IN2 =0;

	IN3 = 1;
	IN4 = 0;	//左轮反转
	cntPWM1 = 30;
	cntPWM2	= 30;
}

void Stop()					  //停止
{
	IN1 = 0;
	IN2 = 0;

	IN3 = 0;
	IN4 = 0;
}
void XunJi()
{
	unsigned char flag = 0;
	if((left1 == 0)&&(left2 == 0)&&(Mid == 0) &&(right1 == 0)&&(right2 == 0))   //0 00 0 0
		flag = 0;
	
	else if((left1 == 0)&&(left2 == 0)&&(Mid == 0) &&(right1 == 0)&&(right2 == 1))   //0 00 0 0
		flag = 1;
	
	else if((left1 == 0)&&(left2 == 0)&&(Mid == 0) &&(right1 == 1)&&(right2 == 0))   //0 00 0 0
		flag = 2;
	
	else if((left1 == 0)&&(left2 == 0)&&(Mid == 1) &&(right1 == 0)&&(right2 == 0))   //0 00 0 0
		flag = 0;
	
	else if((left1 == 0)&&(left2 == 1)&&(Mid == 0) &&(right1 == 0)&&(right2 == 0))   //0 10 0 0
		flag = 3;
	
	else if((left1 == 1)&&(left2 == 0)&&(Mid == 0) &&(right1 == 0)&&(right2 == 0))   //0 00 0 0
		flag = 4;

	//锐角7
	else if((left1 == 1)&&(left2 == 1)&&(Mid == 0) &&(right1 == 0)&&(right2 == 0))   //0 10 0 0
		flag =4;
		//锐角7
	else if((left1 == 1)&&(left2 == 0)&&(Mid == 1) &&(right1 == 0)&&(right2 == 0))   //0 00 0 0
		flag = 4;
			//锐角7
	else if((left1 == 0)&&(left2 == 1)&&(Mid == 1) &&(right1 == 0)&&(right2 == 0))   //0 00 0 0
		flag = 4;
		//锐角7
	else if((left1 == 1)&&(left2 == 0)&&(Mid == 1) &&(right1 == 0)&&(right2 == 0))   //0 00 0 0
		flag = 4;
		//锐角7
	else if((left1 == 1)&&(left2 == 1)&&(Mid == 1) &&(right1 == 0)&&(right2 == 0))   //0 00 0 0
		flag = 4;
	
		//锐角反7
	else if((left1 == 0)&&(left2 == 0)&&(Mid == 1) &&(right1 == 1)&&(right2 == 1))   //0 10 0 0
		flag =1;
		//锐角反7
	else if((left1 == 0)&&(left2 == 0)&&(Mid == 1) &&(right1 == 0)&&(right2 ==1))   //0 00 0 0
		flag = 1;
	
		//T  10001
	else if((left1 == 1)&&(left2 == 0)&&(Mid == 0) &&(right1 == 0)&&(right2 == 1))   //0 10 0 0
		flag =5;
		//T 10010
	else if((left1 == 1)&&(left2 == 0)&&(Mid == 0) &&(right1 == 1)&&(right2 == 0))   //0 00 0 0
		flag = 5;
		//T 10101
	else if((left1 == 1)&&(left2 == 0)&&(Mid == 1) &&(right1 ==0)&&(right2 == 1))   //0 10 0 0
		flag =5;
		//T 10110
	else if((left1 == 1)&&(left2 == 0)&&(Mid == 1) &&(right1 == 1)&&(right2 ==0))   //0 00 0 0
		flag = 5;
	//10111
	else if((left1 == 1)&&(left2 == 0)&&(Mid == 1) &&(right1 == 1)&&(right2 ==1))   //0 00 0 0
		flag = 5;
	//11111
	else if((left1 == 1)&&(left2 == 0)&&(Mid == 1) &&(right1 == 1)&&(right2 ==1))   //0 00 0 0
		flag = 5;
	
		//T 11001
	else  if((left1 == 1)&&(left2 == 1)&&(Mid == 0) &&(right1 == 0)&&(right2 == 1))   //0 00 0 0
		flag = 5;
		//T
	else if((left1 == 1)&&(left2 == 1)&&(Mid == 1) &&(right1 ==0)&&(right2 == 1))   //0 10 0 0
		flag =5;
	else if((left1 == 1)&&(left2 == 1)&&(Mid == 0) &&(right1 == 1)&&(right2 ==1))   //0 00 0 0
		flag = 5;
	else if((left1 == 1)&&(left2 == 0)&&(Mid == 1) &&(right1 == 1)&&(right2 ==1))   //0 00 0 0
		flag = 5;
	
	
	switch(flag)
	
{
		case 0:Forward();
		
					break;
		
		
		case 1:TurnRight2();break;
		
		
		case 2:TurnRight1();break;
		
		
		case 3:TurnLeft1();break;
		
		
		case 4:TurnLeft2();break;


		case 5:
			turn90Flag=1;
			while(turn90Flag)
				{
					IN1 = 0;	
					IN2 = 1;

					IN3 = 1;
					IN4 = 0;
					cntPWM2	= 80;
					cntPWM1 = 80;	
					timeflag=0;//给下次定时用
					while(timeflag==0);//右转一定时间
					timeflag=0;//给下次定时用

					if(left2==1)turn90Flag=0;//如果碰到了,就=0,跳出break循环
			}
		  	timeflag=0;
			  IN1 = 0;	
				IN2 = 0;

				IN3 = 0;
				IN4 = 0;
				while(timeflag==0);//转弯之后,小车暂停一段时间
			  timeflag=0;
			  while(timeflag==0);//转弯之后,小车暂停一段时间
			  timeflag=0;
			  while(timeflag==0);//转弯之后,小车暂停一段时间
			  timeflag=0;
		break;
			
		default:break;//Stop();
	}
}

void InterruptTime0() interrupt 1
{
	static unsigned int ttms;
	ttms++;
	if(ttms==60)
	{
		ttms=0;
	 timeflag=1;
	}
	PWMCnt1++;
	PWMCnt2++;
	
	if(PWMCnt1  >= 200)//50us*200=10 000us=10ms
	{
		PWMCnt1 = 0;
	}
	if(PWMCnt1 <= cntPWM1)
	{
		ENA = 1;
	}
	else
	{
		ENA = 0;
	}

	if(PWMCnt2 >= 200)
	{
		PWMCnt2 = 0;
	}
	if(PWMCnt2 <= cntPWM2)
	{
		ENB = 1;
	}
	else
	{
		ENB = 0;
	}

//	TH0 = (65536 - 50)/256;//50us
//	TL0 = (65536 - 50)%256;
	TH0 = 0xFF;//等价于上面的两行,减小计算量
	TL0 = 0xA3;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值