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

📄 源程序0.c

📁 can2 2 3 4 34 543 5 435
💻 C
📖 第 1 页 / 共 3 页
字号:
/*以下进行数据拼装处理,并发送到主控制器的是压缩的BCD码*/
/*第一参数*/
tmh=buf[0]-0x30;
tmh=tmh&0x0f;
tmh<<=4;
tml=buf[1]-0x30;
tml=tml&0x0f;
dat=tmh|tml;
cantxbuf[6]=dat; 

tmh=buf[2]-0x30;
tmh=tmh&0x0f;
tmh<<=4;
tml=buf[3]-0x30;
tml=tml&0x0f;
dat=tmh|tml;
cantxbuf[7]=dat; 

/*第二参数*/
tmh=buf[4]-0x30;
tmh=tmh&0x0f;
tmh<<=4;
tml=buf[5]-0x30;
tml=tml&0x0f;
dat=tmh|tml;
cantxbuf[8]=dat; 

tmh=buf[6]-0x30;
tmh=tmh&0x0f;
tmh<<=4;
tml=buf[7]-0x30;
tml=tml&0x0f;
dat=tmh|tml;
cantxbuf[9]=dat; 
}

/**************************************
 通过CAN将设置的参数传送带主控制器函数
***************************************/
void cantransfer(void)
{
  uchar i,ljh,itemid=0;
  readfromlcd(itemid);
  cantxbuf[0]=0x88;
  cantxbuf[1]=0;
  cantxbuf[2]=TOID;
  cantxbuf[3]=0;
  cantxbuf[4]=ID;
  cantsbuf[5]=0x01;
if(f_yb1)cantxbuf[10]=0x01;
else     cantxbuf[10]=0x00;
ljh=0;
for(i=5;i<=10;i++)
  ljh=ljh+cantxbuf[i];
 cantxbuf[11]=ljh;

jx1 :
     tdata_can();
     while(!recok);
     recok=0;
     if(huisong)
{
    for(i=0;i<13;i++)
      cantxbuf[i]=canbuf[i];
  trdata_can();
  huisong=0;
}
if(canbuf[11]!=ljh)goto jx1;
itemid=1;
readfromlcd(itemid);
cantxbuf[0]=0x88;
cantxbuf[1]=0;
cantxbuf[2]=TOID;
cantxbuf[3]=0;
cantxbuf[4]=ID;
cantxbuf[5]=0x02;
if(f_yb2)cantxbuf[10]=0x01;
else     cantxbuf[10]=0x00;
ljh=0;
for(i=5;i<=10;i++)
  ljh=ljh+cantxbuf[i];
cantxbuf[11]=ljh;

jx2 :
     tdata_can();
     while(!recok);
     recok=0;
     if(huisong)
{
    for(i=0;i<13;i++)
      cantxbuf[i]=canbuf[i];
  trdata_can();
  huisong=0;
}
if(canbuf[11]!=ljh)goto jx2;
itemid=2;
readfromlcd(itemid);
cantxbuf[0]=0x88;
cantxbuf[1]=0;
cantxbuf[2]=TOID;
cantxbuf[3]=0;
cantxbuf[4]=ID;
cantxbuf[5]=0x03;
if(f_yb3)cantxbuf[10]=0x01;
else     cantxbuf[10]=0x00;
ljh=0;
for(i=5;i<=10;i++)
  ljh=ljh+cantxbuf[i];
cantxbuf[11]=ljh;


f_over=1;
message();

jx3 :
     tdata_can();
     while(!recok);
     recok=0;
     if(huisong)
{
    for(i=0;i<13;i++)
      cantxbuf[i]=canbuf[i];
  trdata_can();
  huisong=0;
}
if(canbuf[11]!=ljh)goto jx3;
itemid=3;
readfromlcd(itemid);
cantxbuf[0]=0x88;
cantxbuf[1]=0;
cantxbuf[2]=TOID;
cantxbuf[3]=0;
cantxbuf[4]=ID;
cantxbuf[5]=0x02;
if(f_yb4)cantxbuf[10]=0x01;
else     cantxbuf[10]=0x00;
ljh=0;
for(i=5;i<=10;i++)
  ljh=ljh+cantxbuf[i];
cantxbuf[11]=ljh;

jx4 :
     tdata_can();
     while(!recok);
     recok=0;
     if(huisong)
{
    for(i=0;i<13;i++)
      cantxbuf[i]=canbuf[i];
  trdata_can();
  huisong=0;
}
 if(canbuf[11]!=ljh)goto jx4;
}
/***********************************************
蜂鸣器告警函数
 告警类型由参数决定,不同的参数显示不同的错误信息
 01:从LCD读取数据转换错误,告警形式为较慢的告警
 02:CAN通信错误
 03:为压力超量程告警
 04:预留 
********************************************/
void warnbeep(uchar wtype)
{ 
   uchar i,ttt,j,k;
   switch(wtype)
{
   case 1: ttt=200;
    break;
   case 2: ttt=100;
    break;
   case 3: ttt=10;
    break;
   case 4: ttt=1;
    break;
 }
 while(1)
{
   for(i=0;i<ttt;i++)
     for(j=0;j<100;j++)
       for(k=0;k<200;k++)
 f_beep=1;
message();
 for(i=0;i<ttt;i++)
     for(j=0;j<100;j++)
       for(k=0;k<200;k++)
 f_beep=0;
message();
 for(i=0;i<ttt;i++)
     for(j=0;j<100;j++)
       for(k=0;k<200;k++)
 f_beep=1;
message();
 for(i=0;i<ttt;i++)
     for(j=0;j<100;j++)
       for(k=0;k<200;k++)
 f_beep=0;
message();


if(wtype==3)
break;
}
}


/*******************************
等待液晶写入完成函数(判忙函数)
*********************************/
void wait(void)
{
    do
{ACC=LCDCOM_R;} while(BF==1); /*查BF标志*/
}

/***********************
延迟函数
**********************/
void delay(void)
{
  uchar i,j;
  for(i=0;i<100;i++)
     for(j=0;j<100;j++)
 }

/******************************************
液晶屏初始化函数
 8位总线,4行
 输入模式:地址增量,显示屏不动
开光标,并闪
******************************************/
void init_lcd(void)
{    LCDCOM_W=0x38;
     delay();
     LCDCOM_W=0x38;
     delay();
     LCDCOM_W=0x38;
     delay();
     wait();
     LCDCOM_W=0x38;
     wait();
     LCDCOM_W=0x06;
     wait();
     LCDCOM_W=0x0c;
     wait();
     LCDCOM_W=0x01;
     wait();
}

/**************************************
显示主界面函数
 显示格式为:
 第1行:B1:XXXX XXXX XXXX X
 第2行:B2:XXXX XXXX XXXX X
 第3行:B3:XXXX XXXX XXXX X
 第4行:B4:XXXX XXXX XXXX X
 本函数显示除X以外的其他部分
***************************************/
void display(void)
{
   wait();
   LCDCOM_W=0x01;
   wait();
   LCDCOM_W=0x80;
   writelcd('B');
   writelcd('1');
   writelcd(':');
  wait();
  LCDCOM_W=0xc0;
   writelcd('B');
   writelcd('2');
   writelcd(':');
  wait();
   writelcd('B');
   writelcd('3');
   writelcd(':');
  wait();
   writelcd('B');
   writelcd('4');
   writelcd(':');
}
 /*******************************************
指示控制函数
  指示灯或蜂鸣器根据各自的标志位进行开关控制
**********************************************/
void message(void)
{
   uchar lout=0xff;
   if(f_yb1)
      lout=led1;
   else
      lout=0x01;
   if(f_yb2)
      lout=led2;
   else
      lout=0x02;
   if(f_yb3)
      lout=led3;
   else
      lout=0x04;
   if(f_yb4)
      lout=led4;
   else
      lout=0x08;
   if(f_ready)
      lout=ledready;
   else
      lout=0x20;
   if(f_over)
      lout=ledover;
   else
      lout=0x40;
   if(f_beep)
      lout=beepon;
   else
      lout=beepoff;
LADD=lout;
}



/***************************************************************************
从EEPROM中读取数据
   读取数据项参数由ITEMID决定,读取后的数据转化为BCD码临时存入BUFROM缓冲区
前4个字节为下限压力,后4个字节为上限压力
****************************************************************************/
void readeeprom(uchar itemid)
{
  uint sadr;
  uchar i;
  switch(itemid)
{
  case 1:
         sdar=0x0000;
         for(i=0;i<8;i++)
         {
           buf_rom[i]=readbyte_eeprom(sadr);
            sdar++;
          }
          break;
  case 2:
         sdar=0x0008;
         for(i=0;i<8;i++)
         {
           buf_rom[i]=readbyte_eeprom(sadr);
            sdar++;
          }
          break;
  case 3:
         sdar=0x0010;
         for(i=0;i<8;i++)
         {
           buf_rom[i]=readbyte_eeprom(sadr);
            sdar++;
          }
          break;
  case 4:
         sdar=0x0018;
         for(i=0;i<8;i++)
         {
           buf_rom[i]=readbyte_eeprom(sadr);
            sdar++;
          }
          break;
}
}
/********************************************
从EEPROM读1个字节函数
  参数:ADDR为欲读单元地址
  函数值:为读出内容
*********************************************/
uchar readbyte_eeprom(uint addr)
{
   uchar tt;
   WMCON|=EEMEN_;
   tt=XBYTE[addr];
   WMCON^=EEMEN_;
   return(tt);
}


/*******************************************************
写1个字节到EEPROM函数,在失败情况下,重试1次
 参数:ADDR为欲写单元地址,VAL为写入内容
 函数值:错误标志,=0,表示正确写入;=1,表示不能正确写入
*********************************************************/
bit writebyte_eeprom(uint,uchar val)
{
   uchar tt;
   WMCON|=EEMEN_;
   WMCON|=EEMWE_;
   XBYTE[addr]=val;
   for(tt=0;tt<10;tt++)
      delay 1ms();
  tt=XBYTE[addr];
 if(tt==val)
{
   WMCON^=EEMWE_;
   WMCON^=EEMEN_;
   return(0);
}
else
{
     XBYTE[addr]=val;
     for(tt=0;tt<10;tt++)
     delay 1ms();
     tt=XBYTE[addr];
     if(tt==val)
    {      
        WMCON^=EEMWE_;
   	WMCON^=EEMEN_;
   	return(0); 
  }
   WMCON^=EEMWE_;
   WMCON^=EEMEN_;
   return(1);
}
}
/*************************************************
从EEPROM中读取压力上、下限参数并显示
**************************************************/
void displayeeprom(void)
{
  uchar i;
  readeeprom(1);
  for(i=0;i<4;i++)
       buf_yl[i]=buf_rom[i];
   disp_yl(0x84);
  for(i=4;i<8;i++)
       buf_yl[i-4]=buf_rom[i];
   disp_yl(0x89);
  readeeprom(2);
  for(i=0;i<4;i++)
       buf_yl[i]=buf_rom[i];
   disp_yl(0xc4);
  for(i=4;i<8;i++)
       buf_yl[i-4]=buf_rom[i];
   disp_yl(0xc9);
  readeeprom(3);
  for(i=0;i<4;i++)
       buf_yl[i]=buf_rom[i];
   disp_yl(0x98);
  for(i=4;i<8;i++)
       buf_yl[i-4]=buf_rom[i];
   disp_yl(0x9d);
  readeeprom(4);
  for(i=0;i<4;i++)
       buf_yl[i]=buf_rom[i];
   disp_yl(0xd8);
  for(i=4;i<8;i++)
       buf_yl[i-4]=buf_rom[i];
   disp_yl(0xdd);
}
  
















































































⌨️ 快捷键说明

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