📄 newcar.c
字号:
#include <at89x52.h>
data unsigned int i=0,j=0,k=0,dispStep=0; //循环变量
data unsigned long timeNum=0; //8位定时器累加计数
data bit how=0,what=0,set=0,flash=0,enable=0,goBack=0; //判断位
data char cm=0,m=5,step=0,runStep=0; //米/厘米存储
data char num1=0,num2=0,num3=0,num4=0,num5=0,num6=0,num7=0,num8=0,num=0; //拆字码
data char disp1=0xc0,disp2=0xc0,disp3=0xc0,disp4=0xc0,disp=0xc0;//字形码
data unsigned long howLong=0;//,howSpeed=0,run=0; //脉冲计数值/实时显示路程
data float run=0.0,howSpeed=0.0;
//拆字模块//
void setNum(void)
{
num1=m/10;
num2=m-num1*10;
num3=cm/10;
num4=cm-num3*10;
return;
}
//取字形码模块//
char setDisp(num)
{
switch(num)
{
case 0:disp=0xc0;
break;
case 1:disp=0xf9;
break;
case 2:disp=0xa4;
break;
case 3:disp=0xb0;
break;
case 4:disp=0x99;
break;
case 5:disp=0x92;
break;
case 6:disp=0x82;
break;
case 7:disp=0xf8;
break;
case 8:disp=0x80;
break;
case 9:disp=0x90;
break;
}
return disp;
}
void main(void)
{
EA=1;
TMOD=0x20;
ET0=1;
TH0=0xec;
TL0=0x78;
TR0=1;
ET1=1;
TH1=0x00;
TL1=0x00;
IT0=1;
firstRun:P2=0x0f;
P1_1=0;
P1_2=0;
P1_3=1;
P1_4=1;
enable=1;
timeNum=0;
how=0;
what=0;
goBack=0;
howLong=0;
howSpeed=0.0;
run=0.0;
k=0;
//独立式键盘检测//
while(P2_0!=0)
{
if(P2_3==0)
{
for(i=0;i<1000;i++){;}
if(P2_3==0)
{
while(P2_3==0){;}
if(how==0)
{
m++;
if(m>10){m=5;}
}
else
{
if(m!=10)
{
cm++;
if(cm>99){cm=0;}
}
}
continue;
}
}
if(P2_2==0)
{
for(i=0;i<1000;i++){;}
if(P2_2==0)
{
while(P2_2==0){;}
if(how==0)
{
m--;
if(m<5){m=10;}
}
else
{
if(m!=10)
{
cm--;
if(cm<0){cm=99;}
}
}
continue;
}
}
if(P2_1==0)
{
for(i=0;i<1000;i++){;}
if(P2_1==0)
{
while(P2_1==0){;}
if(how==0)
{
how=1;
}
else
{
how=0;
}
continue;
}
}
ET0=0;
set=0;
setNum();
disp1=setDisp(num1);
disp2=setDisp(num2);
disp3=setDisp(num3);
disp4=setDisp(num4);
ET0=1;
}
//确定键是否按下//
for(i=0;i<1000;i++){;}
if(P2_0==0)
{
while(P2_0==0){;}
goto runGo;
}
else
{
goto firstRun;
}
runGo: enable=0;
howLong=(m*100.0+cm)/1.55;
//等待声音信号//
while(P1_5==1){;}
//disp1=0xc0;disp2=0xc0;disp3=0xc0;disp4=0xc0;
disp1=0xbf;disp2=0xbf;disp3=0xbf;disp4=0xbf;
EX0=1;
TR1=1;
//寻迹黑线模块//
while(howLong>10)
{
//启动//
/*if(k<500)
{
P1_3=1;
P1_4=0;
k++;
goto fullSpeed;
}*/
//PWM调速//
//P1_3=1;
//P1_4=0;
//===================================
if(howLong<25)
{
P1_3=1;
P1_4=1;
}
else
{
if(runStep<1)
{
P1_3=1;
P1_4=1;
}
else if(runStep>=1)
{
P1_3=1;
P1_4=0;
}
}
if((P3_4==0)&&(P3_5==0))
{
P1_1=0;
P1_2=0;
goBack=0;
continue;
}
if((P3_4==1)&&(P3_5==1))
{
/*if(goBack==0)
{
P1_1=~P1_1;
goBack=1;
}*/
continue;
}
if(P3_4==1)
{
P1_1=0;
P1_2=1;
goBack=0;
}
else if(P3_5==1)
{
P1_1=1;
P1_2=1;
goBack=0;
}
}
P1_3=1;
P1_4=1;
P1_1=0;
P1_2=0;
//P1_0=0;
EX0=0;
TR1=0;
howSpeed=run/(timeNum*0.256/1000.0)*10.0;
EX0=1;
//急停/亮灯
for(i=0;i<20000;i++)
{
P1_3=0;
P1_4=1;
}
//EX0=0;
//==========================
//howLong=(m*100.0+cm)/1.55;
//m=howLong*1.55/100.0;
//cm=howLong*1.55-m*100.0;
//===============================================================================
//howSpeed=howLong/(timeNum*0.256/1000.0)*1.55*10;
//timeNum=0;
//交替闪烁显示路程/速度//
/*num1=run/1000;
num2=(run-num1*1000)/100;
num3=(run-num1*1000-num2*100)/10;
num4=run-num1*1000-num2*100-num3*10;*/
num5=howSpeed/1000;
num6=(howSpeed-num5*1000)/100;
num7=(howSpeed-num5*1000-num6*100)/10;
num8=howSpeed-num5*1000-num6*100-num7*10;
P1_3=1;
P1_4=1;
P1_0=0;
dispNum:while(P2_1!=0)
{
if(what==1)
{
what=0;
}
else
{
what=1;
}
if(what==0)
{
ET0=0;
set=0;
//setNum();
//==================================================================
set=0;
disp1=setDisp(num1);
disp2=setDisp(num2);
disp3=setDisp(num3);
disp4=setDisp(num4);
ET0=1;
}
else
{
ET0=0;
set=1;
disp1=setDisp(num5);
disp2=setDisp(num6);
disp3=setDisp(num7);
disp4=0xbf;
ET0=1;
}
for(i=0;i<32800;i++)
{
if(P2_1==0){break;}
}
//=================================================================
if(EX0!=0)
{
EX0=0;
run+=4.65;
num1=run/1000;
num2=(run-num1*1000)/100;
num3=(run-num1*1000-num2*100)/10;
num4=run-num1*1000-num2*100-num3*10;
}
}
//重新开始//
for(i=0;i<1000;i++){;}
if(P2_1==0)
{
while(P2_1==0){;}
m=5;cm=0;
P1_0=1;
goto firstRun;
}
else
{
goto dispNum;
}
return;
}
//显示程序//
void display(void) interrupt 1 using 1
{
ET0=0;
if(step<3)
{
step++;
}
else
{
step=0;
}
//闪烁定时//
if(dispStep<500)
{
dispStep++;
}
else
{
dispStep=0;
if(flash==0)
{
flash=1;
}
else
{
flash=0;
}
}
//扫描显示//
switch(step)
{
case 0: P2_7=0;
P2_6=1;
P2_5=1;
P2_4=1;
P0=disp1;
if(set==1){P0_7=0;}
break;
case 1:P2_7=1;
P2_6=0;
P2_5=1;
P2_4=1;
P0=disp2;
if(set==0){P0_7=0;}
break;
case 2:P2_7=1;
P2_6=1;
P2_5=0;
P2_4=1;
P0=disp3;
break;
case 3:P2_7=1;
P2_6=1;
P2_5=1;
P2_4=0;
P0=disp4;
break;
}
//闪烁判断//
if(enable==1)
{
if(flash==1)
{
if(how==0)
{
P2_7=1;
P2_6=1;
}
else
{
P2_5=1;
P2_4=1;
}
}
}
TH0=0xec;
TL0=0x78;
TR0=1;
ET0=1;
return;
}
//路程检测//
void goRun(void) interrupt 0 using 2
{
EX0=0;
if(howLong!=0){howLong--;}
set=0;
//run=all-howLong*1.55;
//============================================================
run+=1.55;
/*num1=run/1000;
num2=(run-num1*1000)/100;
num3=(run-num1*1000-num2*100)/10;
num4=run-num1*1000-num2*100-num3*10;
disp1=setDisp(num1);
disp2=setDisp(num2);
disp3=setDisp(num3);
disp4=setDisp(num4);*/
EX0=1;
return;
}
//行进时间累计//
void setSpeed(void) interrupt 3 using 3
{
ET1=0;
if(runStep<9)
{
runStep++;
}
else
{
runStep=0;
}
timeNum++;
ET1=1;
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -