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

📄 c51.c

📁 一段C的小程序
💻 C
📖 第 1 页 / 共 5 页
字号:
uchar  GetSpecialAllocation(uchar index) //返回第index位上是1不是0;
{
 uchar a;
  IIC_READ_ONEBYTE(0,0x17,2);
if(index<9)
{
a=ICC_DATA;  // uchar code SetBits[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
index=8-index;
    a=SetBits[index]&a;
    if(a==0) {return 0xa0; }
    else     {return 0xa1;}
}

else
{
a=ICC_DATA1;  // uchar code SetBits[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
index=index-8;
index=8-index;
    a=SetBits[index]&a;
    if(a==0)  {return 0xa0; }
    else      {return 0xa1;}
 }
}


//得到一共有好多组特殊事故数据
uchar GetSpecialAll()
{
 uchar a;
 uchar c;
 uchar b;
 IIC_READ_ONEBYTE(0,0x17,2);

b=0;
 for(a=0;a<8;a++)
  {    c=SetBits[7-a]&ICC_DATA;
   if(c!=0) {b++;}
   }
 for(a=0;a<8;a++)
  {    c=SetBits[7-a]&ICC_DATA1;
   if(c!=0) {b++;}
   }
   a=b;
return a;
}
      */



/*
//处理出正确的特殊事故分配序列:需要将当前的记录改为特殊事故处理,将可能要将另一组去掉一组特殊事故值,
void DowithSpecialAllocation()
{
 uchar a,b,c,d;
 uint abc;

b=GetSpecialAll();       //得到一共有好多组特殊事故

 if(b<5)                  //直接将该处地置为特殊事故处理!
  {
       IIC_READ_ONEBYTE(0,0x16,1);b=ICC_DATA;
       SetSpecialAllocation (b,0Xa1);       //1.设置分配列表中的值
       abc= SmallViBaseAddress+(b-1)*220;   //2.设置存贮组中对应的标志位
       abc+=3;
       a=abc/256;b=abc%256  ;
       ICC_DATA=0xa1; IIC_WRITE_ONEBYTE(a,b,1);
    }

 else
 {//00000
//寻找离自己最远的一个序列号,将其置为非特殊疑点数据!!!
   IIC_READ_ONEBYTE(0,0x16,1);b=ICC_DATA;
      SetSpecialAllocation (b,0Xa1);         //1.设置分配列表中的值
       abc= SmallViBaseAddress+(b-1)*220;    //2.设置存贮组中对应的标志位
       abc+=3;
       a=abc/256;b=abc%256  ;
       ICC_DATA=0xa1; IIC_WRITE_ONEBYTE(a,b,1);

   c=0;
   if(PingJunZhuShu>10)   //表明翻页: 如果当前序列为8,这时7--1查询,再从15--8;
    {//2222
    d=b;
  for(b=d;b>=1;b--)
    {
      a= GetSpecialAllocation(b);
      if(a==0xa1)  { c++;}
       if(c>=6)
          {   SetSpecialAllocation (b,0Xa0); }//1.清除分配列表中的值

     }

  for(b=d+1;b<=15;b++)
      {
      a= GetSpecialAllocation(b);
      if(a==0xa1)  { c++;}
       if(c>=6)     { SetSpecialAllocation (b,0Xa0);  }       //1.设置分配列表中的值
      }//for

     } //2222
    else                  //表明未翻页: 如果当前序列为8,这时8-->1查询
     {//1111
     for(;b>0;b--)
       {
       a= GetSpecialAllocation(b);
       if(a==0xa1)  {   c++;}
       if(c>=6)     { SetSpecialAllocation (b,0Xa0);  }
       } // forB
  }   //1111
 }    //0000

IIC_READ_ONEBYTE(0,0x16,3);
     c=0;b=0;
}    //function
    */

void MoveToSpecial(uchar index)
{
uchar a,b,c;
uint abc_S,abc_T;
//1.源的存贮起始地址
  abc_S= SmallViBaseAddress+index*220;
  abc_T=abc_S+3;
  a=abc_T/256;b=abc_T%256  ;
  ICC_DATA=0xa0; IIC_WRITE_ONEBYTE(a,b,1);
for(c=0;c<220;c++,abc_S++)
 {
 a=abc_S/256;b=abc_S%256;
 IIC_READ_ONEBYTE(a,b,1);
 XBYTE[XDATAUSBBuffer+c]=ICC_DATA;
 }
//2.特殊事故数据的序列号处理
//b=共有好多组事故数据,a=当前应该存贮的序列号
 IIC_READ_ONEBYTE(0,0x19,2);b=ICC_DATA; a=ICC_DATA1;
 if(b>=5)
   { ICC_DATA=5;   ImportInfoEnable  =0xaa; IIC_WRITE_ONEBYTE(0,0x1a,1);  }
  else
   {ICC_DATA=a+1; ImportInfoEnable  =0xaa; IIC_WRITE_ONEBYTE(0,0x1a,1);  }
 a++;
 ICC_DATA=a;  ImportInfoEnable  =0xaa; IIC_WRITE_ONEBYTE(0,0x19,1);
 a--;
//3.目标的存贮起始地址
 abc_T= SpecialViBaseAddress +a*220;
   for(c=0;c<220;c++,abc_T++)
   {
   ICC_DATA=XBYTE[XDATAUSBBuffer+c];
   a=abc_T/256;b=abc_T%256;
   IIC_WRITE_ONEBYTE(a,b,1);
   }
}
/*
IIC_READ_ONEBYTE(0,0x1a,1); otherA=ICC_DATA;    //有好多组特殊事故的数据
addAll=220*otherA+SpecialViBaseAddress ;        //最高地址
 for(otherInt=SpecialViBaseAddress ;otherInt<addAll;otherInt++)
 {
  otherA=otherInt/256;otherB=otherInt%256;
 IIC_READ_ONEBYTE(otherA,otherB,1); otherA=ICC_DATA;     send_char(otherA);}
*/

void MoveAllSpecial()  //移动所有的特殊事故数据
{
 uchar a,AA1;
 uchar c;
 IIC_READ_ONEBYTE(0,0x17,1);AA1=ICC_DATA;
 for(a=0;a<8;a++)
  { c=SetBits[7-a]&AA1;
    if(c!=0) {MoveToSpecial(a); }
   }

 IIC_READ_ONEBYTE(0,0x18,1);AA1=ICC_DATA;
 for(a=0;a<8;a++)
  {  c=SetBits[7-a]&AA1;
     if(c!=0) {MoveToSpecial(a+8);}
   }
//清除所有的特殊事故记录
ICC_DATA=0;ICC_DATA1=0; ImportInfoEnable  =0xaa;
IIC_WRITE_ONEBYTE(0,0x17,2);
}



//设置重要的信息:启始地址,存贮的总个数,写入的数据
void SetImportRunInfo5(uchar StartAdd,uchar WriteDate)
{
if((StartAdd==0x10)&&(WriteDate==0)) //表明是清除当前记录中所有的瞬时速度记录(一共有15条)
  {
     ICC_DATA =0;   //瞬时速度存贮序列号
     ICC_DATA1=0;  //特殊事故分配序列 [1-->8]
     ICC_DATA2=0;  //特殊事故分配序列 [9-->15]
     ICC_DATA3=0;  //特殊事故存贮序列号
     ICC_DATA4=0;   //特殊事故总组数
     ImportInfoEnable  =0xaa; IIC_WRITE_ONEBYTE(0,0x16,5);
  }
 ICC_DATA=0xaa;  ICC_DATA1=0xbb;
 ICC_DATA2=WriteDate;  ICC_DATA3=WriteDate;
 ICC_DATA4=WriteDate+WriteDate;
 ImportInfoEnable  =0xaa;IIC_WRITE_ONEBYTE(0,StartAdd,5);
}

//设置重要的信息:启始地址,存贮的总个数,写入的数据
void SetImportRunInfo7(uchar StartAdd,uint WriteDate)
{
 ICC_DATA=0xaa; ICC_DATA1=0xbb;
 ICC_DATA2=WriteDate/256; ICC_DATA3=ICC_DATA2;
 ICC_DATA4=WriteDate%256; ICC_DATA5=ICC_DATA4;

 ICC_DATA6=ICC_DATA2+ICC_DATA3+ICC_DATA4+ICC_DATA5;
 ImportInfoEnable  =0xaa;IIC_WRITE_ONEBYTE(0,StartAdd,7);
}

void ResetAllSet()
{
/*
 //车辆信息:VIN号[17]--车牌号码[12]--车牌分类[1]
 for(commName=0;commName<41;commName++)
   {ICC_DATA =XBYTE[XDATAUSBBuffer +commName];ImportInfoEnable  =0xaa; IIC_WRITE_ONEBYTE(1,commName,1);}

 //1-3:驾驶员代码; 4-12:共9个BYTE-->18位
 for(commName=0;commName<21;commName++)
   {ICC_DATA =XBYTE[XDATAUSBBuffer +commName+41]; ImportInfoEnable  =0xaa;IIC_WRITE_ONEBYTE(0,0x80+commName,1);}

//设置记录仪的编号:
 for(commName=0;commName<9;commName++)
   {ICC_DATA =XBYTE[XDATAUSBBuffer +commName+62]; ImportInfoEnable  =0xaa;IIC_WRITE_ONEBYTE(0,commName+0x76,1); }
*/

   SetImportRunInfo5(0x60,60); StudentTime=60;      //学时时长(1小时/学时)
   SetImportRunInfo5(0x68,20);  StudentBeep=20;     //路练报警门限(15分钟)
   SetImportRunInfo7(0x30,640);  TZ_K=640;    //特征系数

   SetImportRunInfo5(0x4a,90); UserSetMaxViBeep=90;      //起速报警门限
   SetImportRunInfo5(0x3a,100); UserSetMaxViRecord=100;   //超速记录门限
   SetImportRunInfo5(0x20,180);  UserSetMaxRunTime=180;     //设置车辆超时驾驶时长  3小时
ICC_DATA  =15;MaxSmallViDiff=15;                        //急刹车条件
ICC_DATA1 =30;LCDProtectTime=30;                        //屏抱时长
ImportInfoEnable  =0xaa; IIC_WRITE_ONEBYTE(0,0x5a,2);

//开关取反的状态
ICC_DATA  =0xfa; switch_neg=0xfa; ImportInfoEnable  =0xaa; IIC_WRITE_ONEBYTE(0,0x59,1);
 
//重新设置安装的日期:
ICC_DATA=0xaa;ICC_DATA1=0xbb;ImportInfoEnable  =0xaa; IIC_WRITE_ONEBYTE(0,0x26,2);
ICC_DATA=year0;ICC_DATA1=month0;ICC_DATA1=day0;ImportInfoEnable  =0xaa; IIC_WRITE_ONEBYTE(0,0x28,3);
}

void CLSAllData()
 {
 SetImportRunInfo5(0x10,0);     //瞬时速度的总组数
 SetImportRunInfo7(0X40,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); //清除累计行驶里程
 ICC_DATA=0;  ICC_DATA1=0;IIC_WRITE_ONEBYTE(0x7f,0x00,2); //清除所有的设置清单记录

ICC_DATA=0;  ICC_DATA1=0; IIC_WRITE_ONEBYTE(0,0x1e,2);    //整点校时的时期记录进行清除

//重新写入新的标志
if (RunSegment==0xdd)        {RunSegment++;}
else if (RunSegment==0xde)   {RunSegment++;}
else if (RunSegment==0xdf)   {RunSegment=0xdd;}
else                         {RunSegment=0xdd;}
ICC_DATA=RunSegment; ImportInfoEnable  =0xaa; IIC_WRITE_ONEBYTE(0,0x5c,1);
 CLSALLSetRecord();  //清除全部的设置时间记录
  ResetAllSet();       //复位所有的设置
 }

//读取重要的信息:启始地址,存贮的总个数
void ReadImportRunInfo(uchar StartADD,uchar All_N)
{
//uchar adjustAll;
//uint  idata return_value=0;
//adjustAll= StartADD;
IIC_READ_ONEBYTE(0,StartADD,All_N);
if(All_N==5)
{
 //IIC_READ_ONEBYTE(0,adjustAll,1); XBYTE[0x7f80]=ICC_DATA;
StartADD=ICC_DATA2+ICC_DATA3;
if(ICC_DATA!=0xaa)          {ReturnIntValue  =0;}
if(ICC_DATA1!=0xbb)         {ReturnIntValue  =0;}
if(ICC_DATA2!=ICC_DATA3 )   {ReturnIntValue  =0;}
if(StartADD!=ICC_DATA4)    {ReturnIntValue  =0;}
ReturnIntValue  =   ICC_DATA2;
  // return ICC_DATA2;
}


else if(All_N==7)
{
StartADD=ICC_DATA2+ICC_DATA3+ICC_DATA4+ICC_DATA5;
if(ICC_DATA!=0xaa)         {ReturnIntValue  =0;}
if(ICC_DATA1!=0xbb)        {ReturnIntValue  =0;}
if(ICC_DATA2!=ICC_DATA3 )  {ReturnIntValue  =0;}
if(ICC_DATA4!=ICC_DATA5 )  {ReturnIntValue  =0;}
if(StartADD!=ICC_DATA6)   {ReturnIntValue  =0;}
    ReturnIntValue  =ICC_DATA2*256+ICC_DATA5;

// return return_value;
}
}

void send_char(unsigned char my_char)
{
uchar a,b;
b=0;
for(a=0;a<8;a++)
{ if (SetBits[a]&my_char!=0x00) {b++;}}
 if(b%2==0) {TB8=1;
 }
 else        {TB8=0;}
SBUF=my_char; while(TI==0);TI=0;
ClsWDT();
}




void beep()
{
 BEEP_CTL =0;
//OtherOutState(3,10);
 delay(6000);
 BEEP_CTL =1;
 //OtherOutState(3,20);
//OtherOutState(3,10); delay(5000);//delay(40000);  //delay(40000);
//OtherOutState(3,20);  // delay(20000);//delay(40000);//delay(40000);
}


void sendReturnInfo(uchar mode,uchar ReturnCommand)
{
uchar a0;
//delay(20000);
if (mode==0xee) //
{}
else           //发送正确
{
for(a0=0;a0<1;a0++)
{
TB8=0; send_char(0x55);       mode=0x55;
TB8=1; send_char(0x7a);       mode^=0x7a;
TB8=1;send_char(ReturnCommand); mode^=ReturnCommand;
TB8=0;send_char(0);            mode^=0;
TB8=0;send_char(0);            mode^=0;
TB8=0;send_char(0);            mode^=0; //备用字
TB8=0;send_char(mode);         //mode^=0xf0; //正确
}}
}


void StopState_TimeDisp() //在停止状态下显示时钟
{
uchar abc;

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

if (BeiGuang==0) //未关闭背光!!
{
abc=hour0;               DispSegmentNumber(3,abc/10,0); DispSegmentNumber(4,abc%10,0);
abc=minuts0;             DispSegmentNumber(5,abc/10,0); DispSegmentNumber(6,abc%10,0);
abc=second0;             DispSegmentNumber(7,abc/10,0); DispSegmentNumber(8,abc%10,0);
}
else
{
abc=hour0A;               DispSegmentNumber(3,abc/10,0); DispSegmentNumber(4,abc%10,0);

⌨️ 快捷键说明

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