📄 robot1.c
字号:
#include <intrins.h>//这个头文件中有_nop_();
#include <reg52.h>
#include<stdio.h>
unsigned char speedleft,speedright;//右左转速度
unsigned char h,l,flag,time; //高速 低速 小车运行标志 延时时间
int tim=0;//------调脉宽
int j;
//void Start(void);//键盘
void Run(void);//探测
void Forward(char speed);//前进
void Reverse(char speed,int dely,bit r);//speed--速度,dely--时间,r--左(右)
void TurnRight(void);//右拐
void TurnLeft(void);//左拐
void delay(unsigned int time);//--延时
void stop(void);//---停止
sbit zz=P3^4;
void main(void)
{
P1=0x40;//------------
P3=0xff;
h=20;
l=40;
flag=0;
time=50;
EA=1; ET0=1;//-----开中断-----------
TMOD=0x02;
TH0=0x30;
TL0=0x30;
TR0=0;
// Start();
while(1) {
TR0=1;
P3= 0x0f; //向四个发射管送高电平
Run(); //探测&&处理
//Forward(60);
}
}
//-----------------------------判断键盘程序----------------------------------------
/*void Start(void)
{
char exit,key;
exit =1;
while(exit)
{
key = P1;
if((key & 0x40)==0) //-------------P1.2接键盘
exit=0; //按下了键盘 向下进行
}
} */
//---------------------------探测&&处理程序--------------------------------------
void Run(void)
{ int dey=5000;
char sensors;
sensors = (P3&=0x3f); //P3^3~P3^0接四个对管
if((sensors&0x01)==0) { //P3^0为右边对管(当收不到返回光时,P3.0收到L)
TurnLeft();
flag = 1; }
else if((sensors & 0x08)==0) { //P3^3为左边对管(当收不到返回光时,P3.3收到L)
TurnRight();
flag = 2; }
else if(sensors&0x09) { // P3^1 P3^2为黑线上方对管(当两个管都收到 L 并
Forward(h); // 且左右两边对管收到 H 时高速行驶)
flag = 0; }
else if(((sensors==0x0b==0)||(sensors==0x0d))&&(flag==0))
Forward(l);// 如果前面的对管下没有黑线 ( P3^2 )
// 或后面的对管下没有黑线 ( P3^1 )
// 并且在高速时-------减速!!
else if((sensors==0x0f|sensors==0x00)&j)
Forward(l);
if(sensors&0x10)
{ Reverse(90,50,0); j=0xffffffff; }
}
//--------------------------------前进程序---------------------------------
void Forward(char speed)
{
P1=0x64;
speedright = speed+5;
speedleft = speed;
delay(50);
}
//--------------------------------右转程序---------------------------------
void TurnRight(void)
{
P1=0x68;
speedright = l+5;
speedleft = l+10;
delay(50);
}
//--------------------------------左转程序----------------------------------
void TurnLeft(void)
{
P1=0x54;
speedright = l+10;
speedleft = l-30;
delay(50);
}
//--------------------------------后退程序---------------(未用)------------
void Reverse(char speed,int dely,bit r)
{
int x,y;
P1=0x1b;
if(r)
{
speedright = speed;
speedleft = speed+5;
}
else
{
speedright= speed-5;//5;
speedleft= speed;
}
delay(dely);
x=y=j;
while(j--);
while(x--);
while(y--);
}
//---------------------------------停止---------------------------------------
void stop(void)
{
P1&=0xfe;
P1&=0xfd;
}
//--------------------------------延时程序----------------------------------
void delay(unsigned int time)
{
while(time--)
{_nop_();_nop_();}
}
//--------------------------------中断处理----------------------------------
void time0(void) interrupt 1 using 2
{
if(tim<speedright)
{ P1&=0xfd; }
else
{ P1|=0x01; }
if(tim<speedleft)
{ P1&=0xfe; }
else
{ P1|=0x02; }
tim++;
if(tim>=100)
{ tim=0; }
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -