#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;
}
5路 line sensor+HC06,tim2 as baudrate 9600 stc89c52
最新推荐文章于 2024-07-24 22:27:20 发布