⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c51.c

📁 一段C的小程序
💻 C
📖 第 1 页 / 共 5 页
字号:
abc=minuts0A;             DispSegmentNumber(5,abc/10,0); DispSegmentNumber(6,abc%10,0);
abc=second0A;             DispSegmentNumber(7,abc/10,0); DispSegmentNumber(8,abc%10,0);
}

Disp_SegMentLcd(27,0x0F);
Disp_SegMentLcd(26,1);
if(   isNullICCar==1){Disp_SegMentLcd(26,0x09);}
Disp_SegMentLcd(24,0x00);
}

void RunState_TimeDisp()//在运行状态下的时钟显示
{
uchar abc;
abc=hour0;               DispSegmentNumber(5,abc/10,0); DispSegmentNumber(6,abc%10,0);
abc=minuts0;             DispSegmentNumber(7,abc/10,0);DispSegmentNumber(8,abc%10,0);
 //--day0  Nowday
}

void DispICNo(uchar mode);
void BeforeRunStateDis() //进行运行状态的预显示
{
CLSSegMentLcd();


if(IsRunState==1) {
 if(isHaveCar==1) {Disp_SegMentLcd(25,0x08); } //IC卡,代码无 [0c --08 ]
 }

else
 {
 if(isHaveCar==0)  {DispICNo(0);}
 else              {DispICNo(1);}
   }


//速度:***公里/时
Disp_SegMentLcd(24,0x0d);
//时间 H:M
Disp_SegMentLcd(27,0x0d);

DispSegmentNumber(1,0,0);  DispSegmentNumber(2,0,0);   DispSegmentNumber(3,0,0);


DispSegmentNumber(5,0,0);  DispSegmentNumber(6,0,0);
DispSegmentNumber(7,0,0);  DispSegmentNumber(8,0,0);
RunState_TimeDisp();
SeekMenu1Mode=0;
}

/*
void DispRoundTime()
{
uchar addH,addL;
//----------------------------------------------------------
//-------------时间显示-------------------------------------
//----------------------------------------------------------
IsChangeNextDay=0;
if(IsRunState==0)  //车辆处于停止状态    时钟显示 **:**:**
  {//000
  //LCDProtectTime=20;
  StopState_TimeDisp();
   ES=1;
  addH=second0;  addL=Nowsecond  ;
  if(BeiGuang==0)
    {//111
    if((LCDProtectTime!=0)&&(addH!=addL))
     {//222
    LCDProtectAdd++;
    addH=LCDProtectTime;
    if((LCDProtectAdd>addH))              //到达了屏抱的时间
      { LCD_Control=0;BeiGuang=1;	  }   //关闭背光
      }//222
   }//111
 }//000
else// if(addH==1)  //车辆处于行驶状态:  时钟显示 **:**
  {  RunState_TimeDisp(); BeiGuang=0; LCD_Control=1;LCDProtectAdd=0;
     addH=second0;  addL=Nowsecond  ;   ES=0;
    if(addH==addL)         { Disp_SegMentLcd(27,0x0d);}
    else                   { Disp_SegMentLcd(27,0x0c);}
   addH=day0; addL=Nowday ;
     if(addH=!addL)         {  addL=  day0;       Nowday  =addL;
                             //  goto InitNewRoom;
                             IsChangeNextDay=1;
                              }           //日期切换了,如果车辆处于行驶状态,这时就要重新分配空间
  //   if(isChangeIC==1)      {  goto InitNewRoom;}         //车在行驶状态下,表示换了驾驶员代码
}

    addL=  second0;    Nowsecond  =addL;   //秒
    addL=  day0;       Nowday  =addL;      //日期
}
*/


//在需要进行新的地址分配空间时调用,结果运行后将年月日时分秒--->[0X7F45] 开始的地址处!
//查询我上一段开车的时间,如果上一段的停车时间同现在的时间差小于20分钟,
//则将上一段的"疲劳开始存贮区"写入到当前段的疲劳驾驶区,再清除疲劳驾驶区的标记!
void SeekMeBeforeDriverInfo()
{
uchar  addH,addL;
uint otherInt;

//车开时候的当前时间!
NowIC_StartAddress= XRAM1*36;
 NowIC_StartAddress= NowIC_StartAddress*10;
 NowIC_StartAddress= NowIC_StartAddress*10;
 otherInt=XRAM2*60+XRAM3;
 NowIC_StartAddress+=  otherInt;

StartSeek:
//if(Now_StartAdd==0x150){goto ExitMe;}

if(Now_BlankAdd<0x150) {goto ExitMe;}


//a.读取上一段的停车时间
otherInt=Now_BlankAdd+5; //直接得到
addH= otherInt/256;addL= otherInt%256;
IIC_READ_ONEBYTE(addH,addL,4); //日-->时分秒

if(ICC_DATA!=day0)  //如果这段时间同当前时间不在同一天就直接退了!
{
goto ExitMe;
}
else               //是同一天,如果同当前时间大于20分钟的话,也要直接退出!
{
 NowIC_BlankAddress = ICC_DATA1*36;
 NowIC_BlankAddress = NowIC_BlankAddress *10;
 NowIC_BlankAddress = NowIC_BlankAddress *10;
 otherInt=ICC_DATA2*60+ICC_DATA3;
 NowIC_BlankAddress+=  otherInt;

 otherInt=SleepTime*60;
 NowIC_BlankAddress+=otherInt; //加上20分钟
 if( NowIC_StartAddress>NowIC_BlankAddress )  //是超过了20分钟的!退出
   {goto ExitMe;  }
}

//b.读取卡号-->如果当前组的卡号同当前组的卡号不同,就要找下一组
otherInt=Now_StartAdd+14; //直接得到
addH= otherInt/256;addL= otherInt%256;
IIC_READ_ONEBYTE(addH,addL,3); //日-->时分秒

//如果是同一个驾驶员的话,就要在此处得到疲劳驾驶区的记录!
if((ICC_DATA== KaHao0)&&(ICC_DATA1== KaHao1)&&(ICC_DATA2== KaHao2))
  {
  otherInt=Now_StartAdd+28; //直接得到
  addH= otherInt/256;addL= otherInt%256;
  IIC_READ_ONEBYTE(addH,addL,3); //日-->时分秒
  XBYTE[0X7F45]=ICC_DATA;  XBYTE[0X7F46]=ICC_DATA1;  XBYTE[0X7F47]=ICC_DATA2;

 //清除此段的超时记录标记
  otherInt=Now_StartAdd+10; //直接得到
  addH= otherInt/256;addL= otherInt%256;
  IIC_READ_ONEBYTE(addH,addL,2);

 if((ICC_DATA==0X0F)&&(ICC_DATA==0X0F)){
  TooLongBeepTime=0;
     isTooLongBeep=1;}

  ICC_DATA=0;   ICC_DATA1=0;
  IIC_WRITE_ONEBYTE(addH,addL,2); //日-->时分秒

  goto ExitMe;
  }

if(Now_StartAdd<=0x150) {goto ExitMe;}
Now_BlankAdd=Now_StartAdd;
otherInt=Now_StartAdd-14;
 addH=otherInt/256;addL=otherInt%256; IIC_READ_ONEBYTE(addH,addL,15);
//b.读取上一组的起始地址
Now_StartAdd=ICC_DATA*256+ICC_DATA1;
//c.读取上一组的空白地址
Now_BlankAdd=Now_BlankAdd-15;
goto StartSeek;

ExitMe:

// NowIC_BlankAddress = XBYTE[0X7F45]*3600+XBYTE[0X7F46]*60+XBYTE[0X7F47];
//XRAM1= XBYTE[0X7F45];
//XRAM2= XBYTE[0X7F46];
//XRAM3= XBYTE[0X7F47];//时分秒


 addH=0;
}

void DispNowTimeVi()//显示出当前的时间及速度
{
uchar  NowVi;
uchar otherA,otherB;
uchar  addH,addL;
uint   IIC_SAVEADD,otherInt,SmallViIndexAddress;
//unsigned long  LONGADDRESS;
 float onlyfloat;
 //DispRoundTime();  //display----time
 

//----------------------------------------------------------
//-------------时间显示-------------------------------------
//----------------------------------------------------------
 
if(IsRunState==0)  //车辆处于停止状态    时钟显示 **:**:**
  {//000
  //LCDProtectTime=20;
  StopState_TimeDisp();
   ES=1;
  addH=second0;  addL=Nowsecond  ;
  if(BeiGuang==0)
    {//111
    if((LCDProtectTime!=0)&&(addH!=addL))
     {//222
    LCDProtectAdd++;
    addH=LCDProtectTime;
    if((LCDProtectAdd>addH))              //到达了屏抱的时间
      { LCD_Control=0;BeiGuang=1;	  }   //关闭背光
      }//222
   }//111
 }//000
else                //车辆处于行驶状态:  时钟显示 "252 12:12"
  {  RunState_TimeDisp(); BeiGuang=0; LCD_Control=1;LCDProtectAdd=0;
     addH=second0;  addL=Nowsecond  ;   ES=0;
    if(addH==addL)         { Disp_SegMentLcd(27,0x0d);}
    else                   { Nowsecond  =second0;   Disp_SegMentLcd(27,0x0c);}//秒
 


   if(day0!=Nowday)         {
//--------------------------------------------------------------------------------
//------------------------------本段停车------------------------------------------
//--------------------------------------------------------------------------------
     SoftStop=1;
 	 goto DoWithStopSegment;        
                }           //日期切换了,如果车辆处于行驶状态,这时就要重新分配空间
               }
//----------------------------------------------------------
//----------------------------------------------------------
 otherInt=(uint)(SAVE_TH0*256+SAVE_TL0);            //结束时候的计数器值
  IIC_SAVEADD=  (uint)(SAVEBe_TH0*256+SAVEBe_TL0);  //开始时的计数器值
     ThisCountGD=0;
  if(otherInt<IIC_SAVEADD)  //0x0001-0xfff0=>[0xffff+0x0001-0xfff0]
     { onlyfloat=TZ_K*8;
       onlyfloat= onlyfloat+otherInt;
       ThisCountGD=onlyfloat-IIC_SAVEADD ;}// 得到这次处理过程中,又来了好多个光电脉冲
  else if(otherInt>IIC_SAVEADD)
     {ThisCountGD=otherInt-IIC_SAVEADD;}    // 得到这次处理过程中,又来了好多个光电脉冲

//if(ThisCountGD<10)           {HowTimes=12;}
//if (ThisCountGD>30)          {HowTimes=6;}
HowTimes=6;

//-----------------------------------------------------------------------------------------
//-------1.下面是对车是否处于驾驶状态的判断,如果脉冲每次大于2并持续5S以上即为行驶状态-----
//-----------------------------------------------------------------------------------------
 if(ThisCountGD>0)
   {Count25For5s++;  BeforeCount0+=ThisCountGD;
   if((Count25For5s>2)&&( IsRunState==0))//表明车已启动 该处代码只执行一次  startwxf
    {
    MoveAllSpecial();   //移动所有的特殊事故的数据
    CaoShu_Add =0;   CaoShu_AddTimes =0;  //超速其间的累计速度值及累计次数
     StopWait       =0;
     Nowday  =day0;      //记录下开车的日期

       TooViBeepTimes =0;    TooLongBeepTime=0;
   // Smallindex=0;  SmallAddVi=0;   //更新显示的时间次数及累计总和
    BigAddVi=0;BigIndex=0;         //一分钟的平均速度所累计次数及累计速度值总和
    beep(); 
  //在1分钟一共出现了多少个瞬时值;
  //出现多少个瞬时值更新一次显示
  //得到当前的分钟数
    IsSpecialSmallVi=0;  OldSmallVi=250;   //是否是特殊疑点事故数据
    Nowminuts=minuts0;   OldGDCount  =250;   //上一次的光电脉冲计数
    isViTooBig=0;    IsRunTooLong=0;       isTooLongBeep=0; isRecordLongStartTime=0;
    XRAM1 =hour0; XRAM2 =minuts0;  XRAM3 =second0; //存贮当前的时间
	Xother1=year0; Xother2=month0; Xother3=day0;    //存贮当前的日期

    IsRunState=1;          	           	//处于驾驶状态了
    BeforeRunStateDis();
   NullCartBeepTime=0;
 if (WhichIC!=10)  //表明没有插入卡,要提示出报警
    {
	if( SoftStop==0)
	   {NullCarDriverBeep=1;}
	}
 else 
   {NullCarDriverBeep=0;}
   SoftStop=0;
//--------------------------------------------------------------------
//-----------得到当前的空白地址指针,及起始地址-----------------------
//--------------------------------------------------------------------
 ReadBlankAddress();

 if(Now_BlankAdd>0x6a00) {Now_BlankAdd=0x150;}

if(Now_BlankAdd<=0x150) //当前没有行驶数据
 {
 //总的累计时间及累计行驶里程
  ICC_DATA=0;  ICC_DATA1=0;   ICC_DATA2=0;
   ImportInfoEnable  =0xaa;IIC_WRITE_ONEBYTE(0,0x70,3); //清除总的累计行驶时间
   ImportInfoEnable  =0xaa;IIC_WRITE_ONEBYTE(0,0x73,3); //清除总的累计行驶里程
   Now_BlankAdd=0x150;
  goto InitNewRoom;}
//-----------------------------------------------------------------------
//------如果已经有上一次的数据的话,就要进行判断看是不是换的驾驶员-------
//-----------------------------------------------------------------------
if(Now_BlankAdd!=0x150)
 {
 IIC_SAVEADD=Now_BlankAdd+9;//读取卡号
 addH=IIC_SAVEADD/256;  addL=IIC_SAVEADD%256;
 IIC_READ_ONEBYTE(addH,addL,4);
 if((ICC_DATA==KaHao0)&&(ICC_DATA1==KaHao1)&&(ICC_DATA2==KaHao2)) //表明是同一驾驶员
  {
 //读上一次的停车的时间,如果距现在的时间超过20分钟则为新的一组数据,
 //如果小于20分钟,下面的超时判断时间的处理上继续住上加
 //如果大于20分钟,下面的超时判断时间的处理上累计清除为零
  IIC_SAVEADD=Now_BlankAdd+5;
  addH=IIC_SAVEADD/256;  addL=IIC_SAVEADD%256;
  IIC_READ_ONEBYTE(addH,addL,3);  //日---->时--分
  addH= ICC_DATA;   addL=day0;

  if(addH!=addL) {  goto InitNewRoom;}


  IIC_SAVEADD=ICC_DATA1*60+ICC_DATA2; //Before(时*60+分)
  startRunTime=IIC_SAVEADD;
  IIC_SAVEADD=hour0*60+minuts0;        //Now =(时*60+分)

  if(IIC_SAVEADD<startRunTime)  //异常处理 : 第二天了如旧的为(23:35)-(01:32)----->(24*60+0)-(23*60+35)+(1*60+32)=117
    {
   goto  InitNewRoom;}
  else
    {IIC_SAVEADD=IIC_SAVEADD-startRunTime;}
// if(addH=!addL)    {IIC_SAVEADD=40;}    //不是同一天的话,下面的运行就要直接分配空间!

if(IIC_SAVEADD<SleepTime)
  {
    otherB=  IIC_SAVEADD;       //临时保存,在没有到达步骤3时不可用该变量
 //1.读取平均速度的个数
 IIC_SAVEADD=Now_BlankAdd+13;
 addH=IIC_SAVEADD/256;  addL=IIC_SAVEADD%256;
 IIC_READ_ONEBYTE(addH,addL,2);
 SaveRunDevViIndex =ICC_DATA*256+ICC_DATA1;
 //2a.得到上一次存贮数据的基地址
 IIC_SAVEADD=Now_BlankAdd+1;
 addH=IIC_SAVEADD/256;  addL=IIC_SAVEADD%256;
 IIC_READ_ONEBYTE(addH,addL,2);
 Now_StartAdd=ICC_DATA*256+ICC_DATA1;
 //Now_BlankAdd=Now_StartAdd+0x24+SaveRunDevViIndex;   //150H--->174H(当前速度应该存入的值)

 //2b.重新读取该行驶段的起始行驶时间:
 /*
 IIC_SAVEADD=  Now_StartAdd+5;
 addH=IIC_SAVEADD/256;  addL=IIC_SAVEADD%256;
 IIC_READ_ONEBYTE(addH,addL,3);
 addH=ICC_DATA; addL=ICC_DATA1;
 start_second=ICC_DATA2;    //开始的秒
 startRunTime=addH*60+addL; //开始行驶的时间(时*60+分)*/

 IIC_SAVEADD=  Now_StartAdd+28;
 addH=IIC_SAVEADD/256;  addL=IIC_SAVEADD%256;
 IIC_READ_ONEBYTE(addH,addL,3);
 addH=ICC_DATA; addL=ICC_DATA1;
 start_second=ICC_DATA2;    //开始的秒
 startRunTime=addH*60+addL; //开始行驶的时间(时*60+分)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -