📄 car.c
字号:
}
if(light==1) //若车则面的感光器检测到灯光,则
{
for(i=0;i<250;i++) //遇到光后再向前走一会,确保车尾已离开障碍物
{
display();
}
stop(0); //右转,同时检测正对光源
start(1,spset,1);
while(light_ok==0) //右转直到light_ok,正对光源
{
display();
}
start(0,spset+sp_c,1); //正对光源后直行
start(1,spset+sp_c,1);
}
if(light_ok)
runmode=light_track; //将运行模式转成光跟踪光跟踪入库
}
////////光跟踪入库函数///////////////////////////////////////
void FLight_track()
{
switch(P2&60)
{
case 0x40: //调整使车偏向右
start(0,spset+sp_c,1);
start(1,spset-sp_c,1);
while(light_ok==0)
{
}
case 0x20: //调整使车偏向右
start(0,spset-sp_c,1);
start(1,spset+sp_c,1);
while(light_ok==0)
{
}
default:
start(0,spset+sp_c,1);
start(1,spset+sp_c,1);
}
if(have_ai==0||light==1||(pian_L&&pian_R)) //若检测到前有障碍物或则光检测到灯光
{ //或两个黑色线检测器都检测到黑色线(边线)
stop(0); //则停车
stop(1);
runmode=finish; //将运行模式转成完成方式
}
}
//////////完成模式函数//////////////////////////////////////////////
void Ffinish()
{
TR0=0;
TR1=0;
EX1=0;
key_en=1;
disp[0]=0;
disp[1]=0;
disp[2]=0;
disp[3]=0;
disp[4]=0;
while(1)
{
switch(key())
{
case 1: break;
case 2: if(++disp[0]>9) //菜单加
disp[0]=0;
finishcacu();
break;
case 3: if(--disp[0]<0) //菜单减
disp[0]=9;
finishcacu();
break;
}
display();
}
}
////////////运行后的各种参数计算//////////////////////////////////
void finishcacu()
{ uint temp;
switch(disp[0]) //根据disp[0]中的内容显示
{
case 1:disp[1]=26; //显示铁片数
disp[2]=26;
disp[3]=26;
disp[4]=tie_num;
case 2:HexToDec(T1_count/20);break; //显示总时间
case 3: led_no=2;
HexToDec(s0/200*24);break; //显示总路程
case 4: led_no=0; //显示第一片铁片的中心距离
temp=(array[0]+array[1])/2;
HexToDec((temp*24)/100);
case 5: led_no=0; //显示第二片铁片的中心距离
temp=(array[2]+array[3])/2;
HexToDec((temp*24)/100);
case 6:led_no=0; //显示第三片铁片的中心距离
temp=(array[4]+array[5])/2;
HexToDec((temp*24)/100);
default:break;
}
}
////////////////5位数码管显示;//////////////////////////
void display()
{ uchar ii;
if(dis_count++==ON_TIME)
{
dis_count=0;
on_off=!on_off;
}
for(ii=0;ii<5;ii++)
{
if(workmode==1&&on_off==0&&ii==whichset) //位消隐方式;
send(ledk[26],ii);
else if (ii==led_no)
send(ledk[disp[ii]]|0x80,ii);
else
send(ledk[disp[ii]],ii);
}
}
void send(uchar sdata,uchar wei)
{
fon_off(1,wei);
send_one(sdata);
fon_off(0,wei);
delay(20);
fon_off(1,wei);
}
void fon_off(bit b,uchar wei)
{
switch(wei)
{
case 0:cd=b;break;
case 1:qw=b;break;
case 2:bw=b;break;
case 3:sw=b;break;
case 4:gw=b;break;
}
}
void send_one(uchar cdata)
{
uchar j;
for(j=0x08;j>0x00;j--)
{
DsClk=0;
DsDat=bittest(cdata,j-1);
DsClk=1;
}
}
bit bittest(uchar cdata,uchar nbit)
{ if(cdata>>nbit&0x01)
return 1;
else
return 0;
}
void delay(uchar time)
{ uchar i;
for(i=0;i<time;i++)
{;}
}
///////////////////////////////////////十进制转变为十六进制;
uchar DecToHex()
{
return(disp[2]*100+disp[3]*10+disp[4]);
}
///////////////////////////////////////十六进制转变为十进制;
void HexToDec(uint xx)
{
uint temp;
temp=xx/10000;
temp=xx%10000;
disp[1]=temp/1000;
temp=temp%1000;
disp[2]=temp/100;
temp=temp%100;
disp[3]=temp/10;
temp=temp%10;
disp[4]=temp;
}
///////////////////////////////////////外中断0记录车轮脉冲;
void INT1() interrupt 2
{
s0++;
HexToDec(s0);
}
///////////////////////////////定时器T1计录总时间;
void T1_time() interrupt 3
{
TH1=hi1;
TL1=lo1;
T1_count++;
}
///////////////定时器产生两路脉冲;255级速度调节
void PWM_gen() interrupt 1
{
if(T0_count==speed1) //若高电平持续时间已到,则脉冲置成低电平
m1p=0;
if(T0_count==speed2)
m2p=0;
if(++T0_count==255) //若T0_count加1后为255,则清零,同时两电机的脉冲置高电平
{
T0_count=0;
m1p=1;
m2p=1;
}
}
//////////////////////////////////电机停止
void stop(uchar r)
{
switch(r)
{
case 0:
m11=0;
m12=0;break;
case 1:
m21=0;
m22=0;break;
}
}
/////////////////////////////////电机正转
void zc(uchar r)
{
switch(r)
{
case 0:
m11=1;
m12=0;break;
case 1:
m21=1;
m22=0;break;
}
}
////////////////////////////////电机反转
void fc(uchar r)
{
switch(r)
{
case 0:
m11=0;
m12=1;break;
case 1:
m21=0;
m22=1;break;
}
}
/////////////////////////////////电机正常运行
void start(uchar r,char spset,bit zf)
{
switch(r)
{
case 0:
speed1=spset;
break;
case 1:
speed2=spset;
break;
}
if(zf)
zc(r);
else
fc(r);
}
////////////////////////////////调用KEY();
uchar key()
{
uchar formkey;
formkey=P3&0x1c;
if(formkey!=0x1c)
{
delay(20);
formkey=P3&0x1c;
while((P3&0x1c)!=0x1c)
{
display();
}
switch(formkey)
{
case 0x1c:return 0;break; //无按键;
case 0x18:return 1;break; //按SW1键;
case 0x14:return 2;break; //按SW2键;
case 0x0c:return 3;break; //按SW3键;
default: return 0 ; break; //无按键;
}
}
else
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -