📄 kunagjia.c
字号:
#include<reg51.h>
//管脚定义
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
//全局变量声明
unsigned char th,tl,deng,saomiao,now=1,qian; //直接给TH0,TL0赋值
unsigned int i,j,k,l,m,x,y,z,yichu0,zhouqi0=1,yichu1,gao=63536,di=57536,fangxiang=2;//i,j,k,l,m控制循环次数,,zhouqi0调节小车抖动频率
//函数声明
void Init(void); //初始化函数
void xunji(void); //循迹函数
void wending(void); //稳定小车函数
void houtui(void);
void delay(void);
//定时中断0,可任意调节后轮电机的工作状态
void timer0(void) interrupt 1 //gao和di调节占空比,zhouqi0调节小车抖动频率,fangxiang调节后电机转动方向
{yichu0++;
if(yichu0==zhouqi0)
{yichu0=0;
x++;
if(fangxiang==2)
{P1_3=0;
if(P1_2==0)
P1_2=1;
else
P1_2=0;
}
else if(fangxiang==1)
{P1_2=0;
if(P1_3==0)
P1_3=1;
else
P1_3=0;
}
if(x%2==1)
{th=gao/256; //1ms
tl=gao%256;
}
else
{th=di/256; //9ms
tl=di%256;
}
}
TH0=th;
TL0=tl;
}
main()
{
Init(); //初始化函数
// A -----> C
for(;;) //000 000 00任意传感器检测到黑线就跳出
{saomiao=P2&0x1C;
if(saomiao<0x1C)
break;
if(P2_0==0)
{P1_0=1;
P1_1=0;
delay();
break;
}
else if(P2_1==0)
{P1_0=0;
P1_1=1;
delay();
break;
}
}
for(;;) //中间三组传感器中任意一个检测到黑线就跳出
{saomiao=P2&0x1C;
if(saomiao<0x1C)
{break;
}
if(saomiao==0x1C)
{if(z==0)
{delay();
y++;
if(y==5) //调节小角度转弯灵敏度
{P1_0=!P1_0;
P1_1=!P1_1;
z=1;
}
}
continue;
}
}
gao=?
di=? //调节占空比,使小车刚好能以稳定速度爬坡
for(;;)
{xunji();
if(P0_0==1) //P0_0外接跷跷板前端检测电路,一旦检测到板平衡则跳出循迹程序,开始稳定小汽车
break;
}
// C
for(;;)
{wending();
if(P0_1==1) //P0_1外接2051显示时间模块,当稳定时间达到5s则跳出稳定程序,继续循迹
break;
}
// C -----> B
fangxiang=1;
gao=?
di=?
delay(); //小车向前行驶一段可调时间,使板向B端倾斜
fangxiang=2; //使电机提供向后的力
gao=?;
di=? ; //调节占空比,使小车刚好能以稳定速度下滑
for(;;)
{deng=P2&0x1c;
if(deng==0x00)
break;
xunji();
}
// B
gao=?;
di=?; //调节占空比,使小车刚好能停在一个确定的位置,此时电机仍然提供向后的力
for(;;)
{if(P0_1==1) //P0_1外接2051显示时间模块,当稳定时间达到5s则跳出稳定程序,开始后退 注:此处可另选方案
break;
}
// B -----> A
for(;;)
{houtui();
if(P2_0==0&&P2_1==0) //后退循迹,直到提前检测的两灯检测到黑线 注:此处方案待定
break;
}
//程序完 若要将小车稳定在A点,可另行设计
for(;;);
}
void Init(void) //
{P1_0=0;
P1_1=0;
P1_2=0;
P1_3=0;
EA=1;
ET0=1;
ET1=1;
TMOD=0x11;
TH0=gao/256;
TL0=gao%256;
TR0=1;
}
void xunji(void)
{
//记录当前状态,和先前状态
if(deng==0x1C) // 000 111 00
{qian=now;
now=1;
}
else if(deng==0x14)// 000 101 00
{qian=now;
now=2;
}
else if(deng==0x04)// 000 001 00
{qian=now;
now=3;
}
else if(deng==0x0C)// 000 011 00
{qian=now;
now=4;
}
else if(deng==0x10)// 000 100 00
{qian=now;
now=5;
}
else if(deng==0x18)// 000 110 00
{qian=now;
now=6;
}
else if(deng==0x00)// 000 000 00
{qian=now;
now=7;
}
else if(deng==0x08)// 000 010 00
{qian=now;
now=8;
}
// 判断
if(now==1)
{if(qian==3||qian==4)
{P1_0=1;
P1_1=0;
delay();
}
else if(qian==5||qian==6)
{P1_0=0;
P1_1=1;
delay();
}
else
{delay();
}
}
else if(now==2)
{P1_0=0;
P1_1=0;
delay();
}
else if(now==3)
{if(qian==1)
{P1_0=0;
P1_1=1;
delay();
}
else if(qian==2)
{P1_0=1;
P1_1=0;
delay();
}
else if(qian==5||qian==6)
{P1_0=1;
P1_1=0;
delay();
}
else
{delay();
}
}
else if(now==4)
{P1_0=1;
P1_1=0;
delay();
}
else if(now==5)
{if(qian==1)
{P1_0=1;
P1_1=0;
delay();
}
else if(qian==2)
{P1_0=0;
P1_1=1;
delay();
}
else if(qian==3||qian==4)
{P1_0=0;
P1_1=1;
delay();
}
else
{;
}
}
else if(now==6)
{P1_0=0;
P1_1=1;
delay();
}
else if(now==7)
{;
}
else if(now==8)
{;
}
}
void wending(void)
{if()
}
void houtui(void)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -