📄 perfect111.c
字号:
_nop_();
}
/*------------------------------------- 中断初始化 -------------------------------------*/
void INTInit(void)
{
EA=1; //开总中断
IT0=1; //INTO边沿触发
EX1=1; //开INT1中断
IT1=1; //INT1边沿触发
Clock0_Init(); //初始化时钟中断0
TMOD=0x11; //T0/T1定时方式1
ET0=0x01; //开T0中断
ET1=0x01; //开T1中断
PT1=1; //T1中断最高级
PT0=0;
PX0=0;
PX1=0;
}
/*******************************************************************************************\
** 中断处理程序 **
\*******************************************************************************************/
/*----------------------------------- 外部中断0 ----------------------------------------*\
外部中断0有两个功能
(1)作为菜单选择的Next键
(2)作为测速的计数器
\*-----------------------------------------------------------------------------------------*/
void SpeedINT(void) interrupt 0 //中断INT0
{
if (StartSelectModeAndSpeed==True) //如果模式和速度还没有选择完毕,则此中断作为Next键
Next=True;
if (Running==True) //如果模式和速度已经选择完毕,则此中断作为测速中断
SpeedCount++;
if (ChoosingDisplay==True) //如果是在选择要显示的内容
Next=True;
}
/*----------------------------------- 外部中断1 ----------------------------------------*\
外部中断1有两个功能
(1)作为菜单选择的确定键/返回键
(2)控速
\*-----------------------------------------------------------------------------------------*/
void CtrSpeedINT(void) interrupt 2 //控速中断INT1
{
if (StartSelectModeAndSpeed==True) //如果模式和速度还没有选择完毕,则此中断作为确定键
{
if (IsSelectingMode==True) //模式选择标志
ModeSelected=True;
if (IsSelectingSpeed==True) //速度选择标志
SpeedSelected=True;
}
if (Running==True) //如果模式和速度选择已经完毕,则此中断作为控速中断
{
if (Area0==0) //经过第一条铁线(即起跑线),开始计时,开始测速
{
EX0=1;
Clock1_Init();
P31=0; //过起跑线,背光灭
}
if (Area0==1)
LowSpeedArea1StartTime=(char)PassTime; //读取进入第一个低速区的时刻
if (Area0==2)
LowSpeedArea1EndTime=(char)PassTime; //读取离开第一个低速区的时刻,也就是进入高速区的时刻
if (Area0==3)
HighSpeedAreaEndTime=(char)PassTime; //读取离开高速区的时刻,也就是进入第二个低速区的时刻
if (Area0==4)
LowSpeedArea2EndTime=(char)PassTime; //读取离开第二个低速去的时刻
if(AutoMode==1) //自动型
{
PassLine++;
switch(PassLine)
{case 5 :PassLineID=1;break;
case 10 :PassLineID=2;break;
default :PassLineID=PassLineID;break;
}
}
else
{ if(AutoMode==2)
{ Area0++;
if (Area0==4)
T024Change=61536;
if (Area0==6)
EX1=0;
}
else
{
if (SelectedMode==Line) //直线型
{
Thx0=Thx[Area0++];
Tlx0=Tlx[Area1++];
if (Area0==6)
EX1=0;
}
else //S型
{ Nocurve++;
Round++;
if(Roundid==1&&Round==2)
{Round++;Roundid=0;}
Back=0;
Back0=0;
EX1=0;
}
}
}
IE1=0;
}
if (AutoDisplay==True)
{
GoToChoosingDisplay=True;
}
if (ChoosingDisplay==True)
{
SelectedShow=True;
SelectedReturn=True;
Selected=True;
}
}
/*-------------------------------------- T0中断 ----------------------------------------*\
T0中断用来输出方波以控制速度
\*-----------------------------------------------------------------------------------------*/
void Time0INT(void) interrupt 1 //T0中断 输出方波20H
{
if(AutoMode==1)
{
IsT0INT*=-1;
switch(PassLine)
{
case 2 :PrepareDistance=Distance;break;
case 3 :FirstAreaRate=(Distance-PrepareDistance)/12;break;
case 4 :SecondAreaRate=(Distance-PrepareDistance-FirstDistance)/2;break;
case 5 :ThirdAreaRate=(Distance-PrepareDistance-FirstDistance-SecondDistance)/12;break;
default :break;
}
switch(PassLineID)
{
case 0 :{ if(IsT0INT==1)
{TR0=0x01;TH0=0xe8;TL0=0x78;} //5ms
else
{TR0=0x01;TH0=0xb1;TL0=0xe0;} //20ms
}break;
case 1 :break;
case 2 :{AutoMode=2;SelectedMode=Line;Area0=Area1=0;PassTime=0;Distance=0;flag=0;
TR0=0x01;TH0=0xf4;TL0=0x48;
}break;
default :break;
}
}
else
{
if (SelectedMode==Line)
{
IsT0INT*=-1;
if (Area0<5)
{
if(IsT0INT==1)
{
if(AutoMode==2)
{switch(Area0)
{
case 0 :{TR0=0x01;TH0=0xd8;TL0=0xf0; //10ms
}break;
case 1 :{TR0=0x01;TH0=0xd8;TL0=0xf0; //10ms
}break;
case 2 :{if(RateID==1)
{T024Change-=100;
TR0=0x01;TH0=(char)((T024Change & 0xff00)>>8);
TL0=(char)(T024Change & 0x00ff);
}
else
{ T024Change+=100;
TR0=0x01;TH0=(char)((T024Change & 0xff00)>>8);
TL0=(char)(T024Change & 0x00ff);
}
}break;
case 3 :{if(RateID==1)
{ T03Change-=100;
TR0=0x01;TH0=(char)((T03Change & 0xff00)>>8);
TL0=(char)(T03Change & 0x00ff);
}
else
{ T03Change+=100;
TR0=0x01;TH0=(char)((T03Change & 0xff00)>>8);
TL0=(char)(T03Change & 0x00ff);
}
}break;
case 4 :{if(RateID==1)
{T024Change-=100;
TR0=0x01;TH0=(char)((T024Change & 0xff00)>>8);
TL0=(char)(T024Change & 0x00ff);}
else
{T024Change+=100;
TR0=0x01;TH0=(char)((T024Change & 0xff00)>>8);
TL0=(char)(T024Change & 0x00ff);}
}break;
default :break;
}
}
else
Clock0_Init();
}
else
{
TR0=0x01; //启动T0
TH0=Thx1; //定时初值
TL0=Tlx1;
}
}
else
if(Area0==5)
{ if(IsT0INT==1)
Clock0_Init();
else
{TR0=0x01;TH0=Thx1;TL0=Tlx1;} //20ms
}
else
IsT0INT=-1;
}
else
{
IsT0INT2*=-1;
if(IsT0INT2==1)
{TR0=0x01;TH0=0xd8;TL0=0xf0;} //10ms
else
{TR0=0x01;TH0=0xb1;TL0=0xe0;} //20ms
Back++;
if(Back>=90)
Back0=126;
if((Nocurve<2)&&(Back0>0)&&Back!=0)
{
if(Back0<=120)
Roundid=1;
Back0--;
}
if(Back0==1&&Backid==1)
flag=6;
if((Nocurve>=2)&&Back>=350)
{Stop=1;IsT0INT2=-1;}
if(Stop==1)
flag=6;
}
}
TF0=0;
}
/*----------------------------------- T1中断 ----------------------------------------*\
T1中断用来定时
\*-----------------------------------------------------------------------------------------*/
void Time1INT(void) interrupt 3 //T1中断 实时显示时间
{
Clock1_Init();
Time1INTCount++;
if (Time1INTCount == 10) //500ms扫描一次
{
PassTime+=0.5; //计算时间
Speed=SpeedCount/4*CircleLength; //计算瞬时速度
Distance+=Speed; //计算距离
SpeedCount=0;
IsT1INT=1;
if (Area0>6)
P03=0;
Time1INTCount=0;
}
TF1=0;
}
void Clock0_Init(void)
{
TR0=0x01; //启动T0
TH0=Thx0; //定时初值
TL0=Tlx0;
}
void Clock1_Init(void)
{
TR1=0x01; //启动T1
TH1=0x3C; //定时初值-50ms中断一次
TL1=0x0B0;
}
/*******************************************************************************************\
** LCD显示模块 **
\*******************************************************************************************/
/*------------------------------------- 显示时间 ----------------------------------------*/
void DisplayTime(void)
{
char PassTime1=0x30;
char PassTime2=0x30;
char PassTime3=0x30;
char PassTime4=0x30;
if ((int)(PassTime*100)<100) //时间未够1s
{
PassTime1+=0;
PassTime2+=(int)(PassTime*100)/10;
PassTime3+=(int)(PassTime*100)%10;
}
else if ((int)(PassTime*100) > 100 && (int)(PassTime*100) < 1000) //够1s而未够10s
{
PassTime1+=(int)(PassTime*100)/100;
PassTime2+=(int)(PassTime*100)/10%10;
PassTime3+=(int)(PassTime*100)%10;
}
else
{
PassTime1+=(int)(PassTime*100)/1000;
PassTime2+=(int)(PassTime*100)/100%10;
PassTime3+=(int)(PassTime*100)/10%10;
PassTime4+=(int)(PassTime*100)%10;
}
if ((int)(PassTime*100) < 1000)
{
DisplaySingleChar(0x05,1,PassTime1);
DisplaySingleChar(0x06,1,'.');
DisplaySingleChar(0x07,1,PassTime2);
DisplaySingleChar(0x08,1,PassTime3);
}
else
{
DisplaySingleChar(0x04,1,PassTime1);
DisplaySingleChar(0x05,1,PassTime2);
DisplaySingleChar(0x06,1,'.');
DisplaySingleChar(0x07,1,PassTime3);
DisplaySingleChar(0x08,1,PassTime4);
}
}
/*------------------------------------ 显示平均速度 ----------------------------------------*/
void DisplayAVGSpeed(void)
{
int Speed1=0x30; //初始化为0的ASCII码
int Speed2=0x30;
int Speed3=0x30;
if ((int)(Distance/PassTime*100)< 100)
{
Speed1+=0;
Speed2+=(int)(Distance/PassTime*100)/10;
Speed3+=(int)(Distance/PassTime*100)%10;
}
else
{
Speed1+=(int)(Distance/PassTime*100)/100;
Speed2+=(int)(Distance/PassTime*100)/10%10;
Speed3+=(int)(Distance/PassTime*100)%10;
}
DisplaySingleChar(0x05,1,Speed1);
DisplaySingleChar(0x06,1,'.');
DisplaySingleChar(0x07,1,Speed2);
DisplaySingleChar(0x08,1,Speed3);
}
/*------------------------------------- 显示路程 ----------------------------------------*/
void DisplayDistance(void)
{
int Distance1=0x30;
int Distance2=0x30;
int Distance3=0x30;
int Distance4=0x30;
if ((int)(Distance*100) < 100)
{
Distance1+=0;
Distance2+=(int)(Distance*100)/10;
Distance3+=(int)(Distance*100)%10;
}
else if ((int)(Distance*100) > 100 && (int)(Distance*100) < 1000)
{
Distance1+=(int)(Distance*100)/100;
Distance2+=(int)(Distance*100)/10%10;
Distance3+=(int)(Distance*100)%10;
}
else
{
Distance1+=(int)(Distance*100)/1000;
Distance2+=(int)(Distance*100)/100%10;
Distance3+=(int)(Distance*100)/10%10;
Distance4+=(int)(Distance*100)%10;
}
if ((int)(Distance*100) < 1000)
{
DisplaySingleChar(0x05,1,Distance1);
DisplaySingleChar(0x06,1,'.');
DisplaySingleChar(0x07,1,Distance2);
DisplaySingleChar(0x08,1,Distance3);
}
else
{
DisplaySingleChar(0x04,1,Distance1);
DisplaySingleChar(0x05,1,Distance2);
DisplaySingleChar(0x06,1,'.');
DisplaySingleChar(0x07,1,Distance3);
DisplaySingleChar(0x08,1,Distance4);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -