#include<reg52.h>
sbit IN1 = P0^7;
sbit IN2 = P0^6;
sbit IN3 = P0^5;
sbit IN4 = P0^4;
sbit IN5 = P1^7;
sbit IN6 = P1^6;
sbit IN7 = P1^5;
sbit IN8 = P1^4;
sbit Left_bizhang = P3^6;
sbit Right_bizhang = P3^7;
sbit Left_led=P2^0;
sbit Right_led=P2^1;
unsigned char pwm_val =0;
unsigned char push_val =0;
void delay(unsigned int k)
{
unsigned int x,y;
for(x=0;x<k;x++)
{
for(y=0;y<2000;y++);
}
}
void run(void) // 前进
{
push_val=3;
IN1=0;
IN2=1;
IN3=0;
IN4=1;
IN5=0;
IN6=1;
IN7=0;
IN8=1;
}
void backrun(void) // 后退
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
IN5=1;
IN6=0;
IN7=1;
IN8=0;
}
void leftrun(void) // 左转
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
IN5=0;
IN6=1;
IN7=0;
IN8=1;
}
void rightrun(void) // 右转
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
IN5=1;
IN6=0;
IN7=1;
IN8=0;
}
void stop(void)
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
IN5=0;
IN6=0;
IN7=0;
IN8=0;
}
void Che_init()
{
P1=0x00;
TMOD=0x01;
TH0=0xFC;
TH0=0x18;
TR0=1;
EA=1;
}
void UART_INIT()
{
SM0 = 0;
SM1 = 1;//串口工作方式1
REN = 1;//允许串口接收
EA = 1;//开总中断
ES = 1;//开串口中断
TMOD = 0x20;//8位自动重装模式
TH1 = 0xfd;
TL1 = 0xfd;//9600波特率
TR1 = 1;//启动定时器1
}
//寻迹
void xunji(){
while(1){
if(Left_led==1&&Right_led==1)
{
ET0=1;
run();
}
else
{
if(Left_led==0&&Right_led==1)
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
IN5=1;
IN6=0;
IN7=1;
IN8=0;
}
if(Right_led==0&&Left_led==1)
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
IN5=0;
IN6=1;
IN7=0;
IN8=1;
}
}
}
}
//避障
void bizhang(){
while(1)
{
run();
if(Left_bizhang==1&&Right_bizhang==1)
{
run();
}
else
{
if(Left_bizhang==1&&Right_bizhang==0)
{
backrun();
delay(50);
leftrun();
delay(100);
}
if(Left_bizhang==0&&Right_bizhang==1)
{
backrun();
delay(50);
rightrun();
delay(100);
}
}
}
}
void UART_SER() interrupt 4
{
if(RI)
{
RI = 0;//清除接收标志
switch(SBUF)
{
case 0x41: run();break;//前进
case 0x44: backrun();break;//后退
case 0x42: leftrun();break;//左转
case 0x43: rightrun();break;//右转
case 0x45: stop();break;//停止
case 0x47: bizhang();break; //避障
case 0x46: xunji();break; //寻迹
default:break;
}
}
}
void pwm_out_moto(void)
{
if(pwm_val<=push_val)
{
run();
}
else
{
stop();
}
if(pwm_val>=10)
pwm_val=0;
}
void timer0()interrupt 1 using 2
{
TH0=0xFC;
TL0=0x18;
pwm_val++;
pwm_out_moto();
}
void main(void)
{
delay(50);
Che_init();
UART_INIT();
while(1);
}
|