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

📄 c51.c

📁 一段C的小程序
💻 C
📖 第 1 页 / 共 5 页
字号:

//-----------------------------------------------------------------------------
//----如果当前时间与上次停车时间相同的话,说明后面的数据要覆盖前面的数据-------
//-----------------------------------------------------------------------------
 if(otherB==0) {SaveRunDevViIndex--;Now_BlankAdd--;}

 //3. 比如上一次停车时候时12:10分,当前时间为12:15分,这时,就要将10--15分内的分钟速度全部写为0
 for(otherA=1;otherA<otherB;otherA++)     //此段为车停止的时间
  {
//A1.存贮此时的平均速度
   addH= Now_BlankAdd/256;       addL= Now_BlankAdd%256;
   ICC_DATA=0;     IIC_WRITE_ONEBYTE(addH,addL,1);
//A2.存入空白地址及平均速度个数
   Now_BlankAdd++;
   SaveRunDevViIndex++;    //当前一共有好多个平均速度
  }
//A3.写入空白地址
SetImportRunInfo7(0x40,Now_BlankAdd);

//A5.读取当前段是不是在停车前已经疲劳驾驶了1
otherInt=Now_StartAdd+10;  addH= otherInt/256; addL= otherInt%256;
IIC_READ_ONEBYTE(addH,addL,2);
 if((ICC_DATA==0X0f)&&(ICC_DATA1==0X0F))
  {  TooLongBeepTime=0;
     IsRunTooLong=1;      isTooLongBeep=1;
     Disp_SegMentLcd(23,0x08);  }

//A6.存入当前的组数的起始地址(变化的)
otherInt=Now_BlankAdd+1; addH=  otherInt/256; addL= otherInt%256;
ICC_DATA=Now_StartAdd/256;ICC_DATA1=Now_StartAdd%256;
IIC_WRITE_ONEBYTE(addH,addL,2);
//A7.存入当前的时间,作为本次驾驶的结束时间,驾驶员的卡号,在第二次开始时,以决定是不是需要分配新的空间
otherInt=Now_BlankAdd+3;  addH= otherInt/256;  addL= otherInt%256;
 ICC_DATA  =year0; ICC_DATA1 =month0;  ICC_DATA2 =day0;
 ICC_DATA3 =hour0; ICC_DATA4 =minuts0; ICC_DATA5 =second0;
 IIC_WRITE_ONEBYTE(addH,addL,6);           //存贮时间

//A8.存入卡号(由于卡号没有变,所以不需要再存入一次了!)
//otherInt=Now_BlankAdd+9;  addH= otherInt/256; addL= otherInt%256;
// ICC_DATA  =KaHao0; ICC_DATA1 =KaHao1;  ICC_DATA2 =KaHao2;
// ICC_DATA3 =KaHao3;  IIC_WRITE_ONEBYTE(addH,addL,4);           //存贮卡号

//A9.存平均速度的个数
otherInt=Now_BlankAdd+13;       //当前结尾的偏移+13处
addH=otherInt/256;    addL=otherInt%256;
ICC_DATA =SaveRunDevViIndex/256; ICC_DATA1=SaveRunDevViIndex%256;;
IIC_WRITE_ONEBYTE(addH,addL,2);
goto InitFinish;}
}
}

InitNewRoom:
 XBYTE[0X7F45]=XRAM1;  XBYTE[0X7F46]=XRAM2;  XBYTE[0X7F47]=XRAM3;//时分秒
//------------------------------------------------------------------
//---新的记录开始了,读出新的空白地址在那--在Now_StartAdd地址处-----
//------------------------------------------------------------------
if( Now_BlankAdd>0x171) //至少有一段
{
//由这个now_blankADD查找到超始地址,如果不为0x150,也不用处理
otherInt=Now_BlankAdd+1;
addH=otherInt/256;addL=otherInt%256;
IIC_READ_ONEBYTE(addH,addL,2);
//b.读取上一组的起始地址
 Now_StartAdd=ICC_DATA*256+ICC_DATA1;
  if(Now_StartAdd>0x150)
   {SeekMeBeforeDriverInfo();}
  }

 ReadBlankAddress();
if(Now_BlankAdd>0x150) {Now_StartAdd=Now_BlankAdd+15;}      //将当前的空白地址作为新一组的启动地址
else                   {Now_StartAdd=0x150;}

Now_BlankAdd= Now_StartAdd+36;  //确定当前的空白地址为: 启动地址+36

//A.写入标志位
IIC_SAVEADD=Now_StartAdd;
addH=Now_StartAdd/256;  addL=Now_StartAdd%256; 
ICC_DATA =0xee;  ICC_DATA1 =RunSegment;  
IIC_WRITE_ONEBYTE(addH,addL,2);
 
//B.存入当前的时间,作为本次驾驶的起始时间
IIC_SAVEADD=Now_StartAdd+2;         //0x152
addH=IIC_SAVEADD/256;  addL=IIC_SAVEADD%256;
ICC_DATA =Xother1; ICC_DATA1 =Xother2; ICC_DATA2 =Xother3;
ICC_DATA3 =XRAM1; ICC_DATA4 =XRAM2 ; ICC_DATA5 =XRAM3 ;
IIC_WRITE_ONEBYTE(addH,addL,6);


//C1.累计行驶里程存贮器内清零
 BeforeCount0=0;
IIC_SAVEADD=Now_StartAdd+8;          //0X158
addH=IIC_SAVEADD/256;  addL=IIC_SAVEADD%256;
ICC_DATA =0; ICC_DATA1 =0; IIC_WRITE_ONEBYTE(addH,addL,2);

IIC_SAVEADD=Now_StartAdd+0x20;        //0X170
addH=IIC_SAVEADD/256;  addL=IIC_SAVEADD%256;
ICC_DATA =0; ICC_DATA1 =0; IIC_WRITE_ONEBYTE(addH,addL,2);


//C2.超时及超速记录标记清除
IIC_SAVEADD=Now_StartAdd+10;          //0X158
addH=IIC_SAVEADD/256;  addL=IIC_SAVEADD%256;

 if(isTooLongBeep==1)
  {ICC_DATA=0xf0; ICC_DATA1=0xf0; ICC_DATA2=0; ICC_DATA3=0;}
 else
  {ICC_DATA=0; ICC_DATA1=0; ICC_DATA2=0; ICC_DATA3=0;}
 IIC_WRITE_ONEBYTE(addH,addL,4);

//E.存卡号到该组地址分配区
IIC_SAVEADD=Now_StartAdd+14;        //0X15A
addH=IIC_SAVEADD/256;  addL=IIC_SAVEADD%256;
 ICC_DATA  =KaHao0; ICC_DATA1 =KaHao1;  ICC_DATA2 =KaHao2;
 ICC_DATA3 =KaHao3;  IIC_WRITE_ONEBYTE(addH,addL,4);           //存贮卡号
//存入驾驶证号
otherInt=Now_StartAdd+18;        //0x162
IIC_SAVEADD=otherInt+9;
 otherA=0;
//DEBUG
//send_char(0xfe);send_char(11);
 for(;otherInt<IIC_SAVEADD;otherInt++,otherA++)
  {
  addH=otherInt/256;  addL=otherInt%256;
  ICC_DATA= XBYTE[JaShiNoAddress+otherA];
  IIC_WRITE_ONEBYTE(addH,addL,1)   ;
  addH= ICC_DATA;
//DEBUG
 // send_char( addH);
 }

otherInt=Now_StartAdd+28;        //0x16C
addH=otherInt/256;  addL=otherInt%256;
ICC_DATA=XBYTE[0X7F45];
ICC_DATA1=XBYTE[0X7F46];
ICC_DATA2=XBYTE[0X7F47];
IIC_WRITE_ONEBYTE(addH,addL,3);

 //对剩下的空间进行清除
otherInt=Now_StartAdd+31;        //0x162
IIC_SAVEADD= Now_StartAdd +36;
 for(;otherInt<IIC_SAVEADD;otherInt++)
  {
  addH=otherInt/256;  addL=otherInt%256;
  ICC_DATA= 0; IIC_WRITE_ONEBYTE(addH,addL,1)   ;
  }

//F.平均速度存贮的个数清除
SaveRunDevViIndex =0;

//IIC_SAVEADD=Now_StartAdd+0x20;        //0X170
//Now_BlankAdd=IIC_SAVEADD+4; //平均速度存贮的第一个地址
//addH=IIC_SAVEADD/256;  addL=IIC_SAVEADD%256;
//ICC_DATA =0xfb; ICC_DATA1 =0xfb; ICC_DATA2 =0; ICC_DATA3=0; IIC_WRITE_ONEBYTE(addH,addL,4);

//G.存入平均速度的个数为SaveRunDevViIndex:个是在当前结尾的偏移+13处
otherInt=Now_BlankAdd+13;       //当前结尾的偏移+13处
addH=otherInt/256;    addL=otherInt%256;
ICC_DATA =0; ICC_DATA1=0 ;
IIC_WRITE_ONEBYTE(addH,addL,2);

//H.存入当前的组数的起始地址(变化的)
otherInt=Now_BlankAdd+1;
  addH=  otherInt/256;
  addL= otherInt%256;
ICC_DATA=Now_StartAdd/256;ICC_DATA1=Now_StartAdd%256;
IIC_WRITE_ONEBYTE(addH,addL,2);

//I.存入当前的时间,作为本次驾驶的结束时间,驾驶员的卡号,在第二次开始时,以决定是不是需要分配新的空间
otherInt=Now_BlankAdd+3;
  addH= otherInt/256;
  addL= otherInt%256;
 ICC_DATA  =year0; ICC_DATA1 =month0;  ICC_DATA2 =day0;
 ICC_DATA3 =XRAM1 ; ICC_DATA4 =XRAM2 ; ICC_DATA5 =XRAM3 ;
 IIC_WRITE_ONEBYTE(addH,addL,6);           //存贮时间
//h.存入卡号
otherInt=Now_BlankAdd+9;
  addH= otherInt/256;
  addL= otherInt%256;
 ICC_DATA  =KaHao0; ICC_DATA1 =KaHao1;  ICC_DATA2 =KaHao2;
 ICC_DATA3 =KaHao3;  IIC_WRITE_ONEBYTE(addH,addL,4);           //存贮卡号

//J.开始记录新的起始时间-->超时判断
XRAM1= XBYTE[0X7F45]; XRAM2= XBYTE[0X7F46]; XRAM3= XBYTE[0X7F47];//时分秒
IIC_SAVEADD=XRAM1*60+XRAM2 ;  //车开始驾驶的时候 ,用来进行超时判断的
startRunTime= IIC_SAVEADD;    //将当前的时间作为开车的时间
start_second=XRAM3;


//DEBUG
//send_char(0xfe);send_char(22);    send_char( KaHao0);  send_char( KaHao1);    send_char( KaHao2);send_char( KaHao3);
//J.存入当前的地址作为空白地址(固定地址处)
 SetImportRunInfo7(0x40,Now_BlankAdd);

InitFinish:
//------------------------------------------------------------
//-------------K.对总的瞬时速度的数的处理,分配空间--------------
//------------------------------------------------------------
IIC_READ_ONEBYTE(0,0x10,5);
if(ICC_DATA!=0xaa)        {PingJunZhuShu=0;goto GetA;}
if(ICC_DATA1!=0xbb)       {PingJunZhuShu=0;goto GetA;}
if(ICC_DATA2!=ICC_DATA3)  {PingJunZhuShu=0;goto GetA;}
PingJunZhuShu =ICC_DATA2;

GetA:
if( PingJunZhuShu >=10)
 {PingJunZhuShu=10;}
//如果当前一共有10组数据的话,就一直将该值设定为10组,只能等于10
else if(PingJunZhuShu<10)
{   PingJunZhuShu++;}
  ICC_DATA=0xaa; ICC_DATA1=0xbb;
   ICC_DATA2=PingJunZhuShu;  ICC_DATA3=PingJunZhuShu;
   ICC_DATA4=PingJunZhuShu+PingJunZhuShu;
   ImportInfoEnable  =0xaa; IIC_WRITE_ONEBYTE(0,0x10,5);

  //D.200个瞬时速度移位操作的个数清除
  SaveStopCarViIndex=0;
  IIC_READ_ONEBYTE(0,0x16,1);   addH=ICC_DATA; //读取当前共有好多组瞬时速度了(0--10),以确定存贮的偏移地址
 addH++;   if(addH>10){addH=1;}
/* while(1)
 {
  addH++;   if(addH>15){addH=1;}
 addL=GetSpecialAllocation(addH);   //如果该处不是疑点数据,将存贮空间指定在此!!
 if(addL==0)  {break;}
 }*/
ICC_DATA=addH;ImportInfoEnable  =0xaa; IIC_WRITE_ONEBYTE(0,0x16,1);
addH--;
IIC_SAVEADD=addH*220;
IIC_SAVEADD+=SaveStopCarViIndex;
SmallViIndexAddress=SmallViBaseAddress+ IIC_SAVEADD;  //确定最终的存贮位置:

IIC_SAVEADD= SmallViIndexAddress;
 //L.存卡号到瞬时速度移位存贮处
 addH=IIC_SAVEADD/256;  addL=IIC_SAVEADD%256;
 ICC_DATA  =KaHao0; ICC_DATA1 =KaHao1;  ICC_DATA2 =KaHao2;
 ICC_DATA3 =0xA0;ICC_DATA4 =0;  IIC_WRITE_ONEBYTE(addH,addL,5); //存贮卡号--个数清除为0

                ICC_DATA=0xf0;     //存贮翻页标记 :F0(no) --FA(yes)
                           IIC_SAVEADD=SmallViIndexAddress+11;
                           addH=IIC_SAVEADD/256;  addL=IIC_SAVEADD%256;
                           IIC_WRITE_ONEBYTE(addH,addL,1);
}
//--------------------------------------------------------------
  }
else     {  //表明车处于停止状态 Stopwxf,并持续5个脉冲以上才为停止状态!
  StopWait++;
addL= StopWait;
if ((IsRunState==1)&&(addL>2)) //表明车是从开的状态到停止状态,而不是处于还没有开的状态
   {

 DoWithStopSegment:
   IsRunState=0;  Count25For5s=0;  BeforeCount0=0;
  beep();
if  (SoftStop==1) //表明是00点钟的切换
   { XRAM1 =23;    XRAM2  =59;      XRAM3  =59;  }       //停止驾驶的时间
else
   { XRAM1 =hour0; XRAM2  =minuts0; XRAM3  =second0;}    //停止驾驶的时间

//-----------------------------------------------------------------------------------------
//------------------------------写入总的累计的里程数的小数部分-----------------------------
//-----------------------------------------------------------------------------------------
  addH=Count_H;     addL=Count_L;
  otherInt=addH*256+addL; //开始计数的值
  IIC_SAVEADD= TH0*256+TL0;   //当前计数器值

  if( IIC_SAVEADD> otherInt)
    {  IIC_SAVEADD= IIC_SAVEADD-otherInt;    }
  else
    { IIC_SAVEADD=0;}                       //异常情况
      SmallViIndexAddress  =IIC_SAVEADD;    //临时借用一下


 //读取旧的累计里程小数部分
   IIC_READ_ONEBYTE(0,0x71,2);
   otherInt=ICC_DATA*256+  ICC_DATA1;                 //旧的累计里程小数部分
  NowIC_StartAddress  = otherInt+  IIC_SAVEADD;       //总的累计里程 =旧的小数部分+当前定时器内的 部分!


  otherInt=TZ_K*8;     //640*8=5120;
  if( NowIC_StartAddress  > otherInt)
   {
   IIC_SAVEADD= NowIC_StartAddress-otherInt;
   //---------------------------------
   //---对总的累计行驶里程进行加1----
   //---------------------------------
   IIC_READ_ONEBYTE(0,0x73,2); otherA=ICC_DATA;otherB=ICC_DATA1;
   otherInt=otherA*256+otherB; otherInt++;
   ICC_DATA=otherInt/256;ICC_DATA1=otherInt%256;
   ImportInfoEnable  =0xaa; IIC_WRITE_ONEBYTE(0,0x73,2);

  }
  else
    {IIC_SAVEADD= NowIC_StartAddress; }
  ICC_DATA=  IIC_SAVEADD/256;  ICC_DATA1=   IIC_SAVEADD%256;
  ImportInfoEnable  =0xaa;    IIC_WRITE_ONEBYTE(0,0x71,2);
//-------------------------------------------------------------------------------------------
//------------------------------写入此段的累计的里程数的小数部分-----------------------------
//-------------------------------------------------------------------------------------------
  TH0=Count_H;     TL0=Count_L;
//读取的累计里程小数部分
  otherInt=Now_StartAdd+0x20;        //0X170
  addH=otherInt/256;  addL=otherInt%256;
  IIC_READ_ONEBYTE(addH,addL,2);
  otherInt=ICC_DATA*256+  ICC_DATA1;                 //旧的累计里程小数部分
  NowIC_StartAddress  = otherInt+SmallViIndexAddress;       //总的累计里程 =旧的小数部分+当前定时器内的 部分!

  otherInt=TZ_K*8;     //640*8=5120;
 if( NowIC_StartAddress  > otherInt)
   {
   //--------------------------------------------
   //---对当前存贮组段的累计行驶里程进行加1------
   //--------------------------------------------
   IIC_SAVEADD=Now_StartAdd+8;    //空白地址加上8
   addH=IIC_SAVEADD/256;  addL=IIC_SAVEADD%256;
   //a.读取旧的行速里程
   IIC_READ_ONEBYTE(addH,addL,2);otherA=ICC_DATA;otherB=ICC_DATA1;
   //b.旧的里程数加1,再写回去: //比例应进行更改
   otherInt=otherA*256+otherB;
   otherInt++;
   otherA=otherInt/256;otherB=otherInt%256;
  ICC_DATA=otherA;ICC_DATA1=otherB;IIC_WRITE_ONEBYTE(addH,addL,2);
  otherInt=TZ_K*8;     //640*8=5120;
  IIC_SAVEADD= NowIC_StartAddress-otherInt;   }
  else
    {IIC_SAVEADD= NowIC_StartAddress; }
  //写入小数部分!
  otherInt=Now_StartAdd+0x20;
  addH=otherInt/256;  addL=otherInt%256;
  ICC_DATA=IIC_SAVEADD/256;ICC_DATA1=IIC_SAVEADD%256;
  IIC_WRITE_ONEBYTE(addH,addL,2);
//-------------------------------------------------------------------------------------------
//-------------------------写入这一分钟的平均车速(最后一个)----------------------------------
//-------------------------------------------------------------------------------------------
  if(BigIndex==0)     { BigAddVi=OldVi*10;BigIndex=1;}
if  (SoftStop==1) //表明是00点钟的切换
     { BigAddVi=OldVi*10;BigIndex=1;}

  otherInt= (BigAddVi/BigIndex);
//A1.存贮此时的平均速度
    addH= Now_BlankAdd/256;
    addL= Now_BlankAdd%256;
   ICC_DATA=otherInt/10;
  IIC_WRITE_ONEBYTE(addH,addL,1);
//A2.存入空白地址及平均速度个数
  Now_BlankAdd++;
  SaveRunDevViIndex++;
//A3.写入空白地址
SetImportRunInfo7(0x40,Now_BlankAdd);
//A4.存入当前的组数的起始地址(变化的)
otherInt=Now_BlankAdd+1; addH=  otherInt/256; addL= otherInt%256;
ICC_DATA=Now_StartAdd/256;ICC_DATA1=Now_StartAdd%256;
IIC_WRITE_ONEBYTE(addH,addL,2);
//A5.存入当前的时间,作为本次驾驶的结束时间,驾驶员的卡号,在第二次开始时,以决定是不是需要分配新的空间
otherInt=Now_BlankAdd+3;  addH= otherInt/256;  addL= otherInt%256;
 ICC_DATA  =Xother1; ICC_DATA1 =Xother2;  ICC_DATA2 =Xother3;
 ICC_DATA3 =XRAM1; ICC_DATA4 =XRAM2; ICC_DATA5 =XRAM3;
 IIC_WRITE_ONEBYTE(addH,addL,6);           //存贮时间

//A6.存入卡号;
 otherInt=Now_BlankAdd+9;  addH= otherInt/256; addL= otherInt%256;
 ICC_DATA  =KaHao0; ICC_DATA1 =KaHao1;  ICC_DATA2 =KaHao2;
 ICC_DATA3 =KaHao3;  IIC_WRITE_ONEBYTE(addH,addL,4);           //存贮

⌨️ 快捷键说明

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