📄 reda.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=0x08;//避障延时
sbit kk=P1^6;//键盘口
sbit tr1=P3^4;//避障一号管发射
sbit tr2=P3^6;//避障二号管发射
sbit aa=P3^4;
sbit bb=P3^5;
sbit cc=P3^6;
sbit dd=P3^7;
int key;//存放键值
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);//---停止
void bi_zhang(void);
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;
while(1)
{
Start();
key=1;
while(key)
{
TR0=1;
Run(); //探测&&处理
// Start();
}
}
}
//-----------------------------判断键盘程序----------------------------------------
void Start(void)
{
if(kk==0)
{
delay(200);
if(kk==0)
{
while(kk==0);
key++;
}
if(key==3)
{key=0;}
}
}
//---------------------------探测&&处理程序--------------------------------------
void Run(void)
{
char sensors;
while(key==1)
{
sensors = (P3&=0x3f); //P3^3~P3^0接四个对管
if((sensors&0x01)==0) { //P3^0为右边对管(当收不到返回光时,P3.0收到L)
Turnright();
flag = 1; }
else if((sensors & 0x08)==0) { //P3^3为左边对管(当收不到返回光时,P3.3收到L)
Turnleft();
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))
Forward(l);
//Start();
}
while(key==2) //进入避障模式
{
bi_zhang();
Start();
}
}
//--------------------------------前进程序---------------------------------
void Forward(char speed)
{
P1=0x64;
speedright = speed+5;
speedleft = speed;
delay(50);
}
//--------------------------------右转程序---------------------------------
void Turnleft(void)
{
P1=0x68;
speedright = l+5;
speedleft = l+10;
delay(50);
}
//--------------------------------左转程序----------------------------------
void Turnright(void)
{
P1=0x54;
speedright = l+10;
speedleft = l-30;
delay(50);
}
//--------------------------------后退程序---------------(未用)------------
void Reverse(char speed,int dely,bit r)
{
int x,y;
if(r)
{
P1=0x17;
speedright = speed+5;
speedleft = speed;//-15;
}
else
{
P1=0x2b;
speedright= speed-25;
speedleft= speed+5;
}
delay(dely);
x=y=j;
while(j--);
while(y--);P3|=0x30;
}
//---------------------------------停止---------------------------------------
void stop(void)
{
P1&=0xfc;
P1&=0xfc;
}
void bi_zhang(void)
{
int o=10;
aa=0;
bb=1;
P1=0x00;
while(o--)
{
bb=1;dd=1;
aa=!aa;cc=!cc;
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();_nop_();
if(bb==0)
{Reverse(80,10,0); }
if(dd==0)
{Reverse(80,10,1);}
}
Forward(5);
}
//--------------------------------延时程序----------------------------------
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; }
tr1=!tr1;
tr2=!tr2;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -