/*********控制小车行驶************/
#include "reg52.h"
#define UCHAR unsigned char
#define UP 'A'
#define DOWN 'B'
#define LEFT 'C'
#define RIGHT 'D'
#define STOP 'F'
sbit RB=P1^0; //右后轮
sbit rb=P1^1;
sbit RF=P1^2; //右前轮
sbit rf=P1^3;
sbit LB=P1^4; //左后轮
sbit lb=P1^5;
sbit LF=P1^6; //左前轮
sbit lf=P1^7;
UCHAR count=0,flag=0,len=0,h=0,r[3]=0,flag_con=0;
unsigned int a;
/***************小车运动细节*************************/
/***********小车前进部分*****************/
void L_forward(UCHAR num) // 小车左排轮前进,num可调整占空比
{
LF=1;lf=0;
LB=0;lb=1;
if(count<=num)
{
LF=1;
lb=1;
}
else
{
LF=0;
lb=0;
}
}
void R_forward(UCHAR num) //小车右排轮前进,num可调整占空比
{
RB=1;rb=0;
RF=0;rf=1;
if(count<=num)
{
RB=1;
rf=1;
}
else
{
RB=0;
rf=0;
}
}
/***************小车后退部分********************/
void L_drawback(UCHAR num) //小车左排轮后退,num可调整占空比
{
LF=0;lf=1;
LB=1;lb=0;
if(count<=num)
{
lf=1;
LB=1;
}
else
{
lf=0;
LB=0;
}
}
void R_drawback(UCHAR num) //小车右排轮后退,num可调整占空比
{
RB=0;rb=1;
RF=1;rf=0;
if(count<=num)
{
rb=1;
RF=1;
}
else
{
rb=0;
RF=0;
}
}
/*********小车的基本运动状态*************/
void stop() //小车停止
{
RB=0;rb=0;
RF=0;rf=0;
LF=0;lf=0;
LB=0;lb=0;
}
void forward(UCHAR num) //小车前进,num可调整占空比
{
L_forward(num);
R_forward(num);
}
void drawback(UCHAR num) //小车后退,num可调整占空比
{
L_drawback(num);
R_drawback(num);
}
void B_round(UCHAR L,UCHAR R) //小车后退转弯
{ //L控制左排轮速度
L_drawback(L); //R控制右排轮速度
R_drawback(R);
}
void F_round(UCHAR L,UCHAR R) //小车前进转弯
{ //L控制左排轮速度
L_forward(L); //R控制右排轮速度
R_forward(R);
}
void turn_right45() //前进右转45度
{
for(a=500;a>0;a--)
{
R_drawback(20);
L_forward(40);
}
}
void turn_right90() //前进右转90度
{
for(a=500;a>0;a--)
{
R_drawback(50);
L_forward(50);
}
}
void turn_left45() //前进左转45度
{
for(a=500;a>0;a--)
{
R_forward(40);
L_drawback(20);
}
}
void turn_left90() //前进左转90度
{
for(a=650;a>0;a--)
{
R_forward(50);
L_drawback(50);
}
}
void delay(UCHAR ms)
{
UCHAR i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
TMOD=0x21;
TH0=(65536-9)/256;
TL0=(65536-9)%256;
TH1=0xfd;
TL1=0xfd; //装初值
ET0=1;
TR0=1;
TR1=1; //定时器中断1打开
REN=1; //允许串行口接受数据
SM0=0;
SM1=1; //串行口工作方式位01,10位异步收发,波特率可变
EA=1; //打开总中断
ES=1; //打开串口中断
stop();
while(1)
{
if(flag_con==1)
{
flag_con=0;
if(r[0]=='O'&&r[1]=='N')
{
ES=0;
SBUF=r[2];
while(!
ti);
TI=0;
ES=1;
switch(r[2])
{
case UP: forward(80);break;
case DOWN: drawback(80);break;
case LEFT: turn_left45();break;
case RIGHT: turn_right45();break;
case STOP: stop();break;
default:break;
}
}
}
}
}
void timer()interrupt 1
{
TH0=(65536-9)/256;
TL0=(65536-9)%256;
count++;
if(count>=100)
{count=0;}
}
void inser() interrupt 4
{
if(RI)
{
RI=0;
h=SBUF;
if(h='O'&&(len=0))
{
flag=1;
r[len]=h;
flag=1;
}
else if(flag==1)
{
len++;
r[len]=h;
if(len>2)
{
len=0;flag=0;flag_con=1;
}
}
}
一周热门 更多>