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

📄 can.c

📁 一整套电梯控制器源程序
💻 C
字号:
#include "public.h"

void can_init(void)
{
    uchar whamr0,whamr1,a,b,c;  
 
    if(data5045.cF0==0){
        a=0x09;
    }else{
        a=0x06;
    }  
    
    c=data5045.cF1+1;

    //定义代码和掩码
    whacr0=((a<<3)|(c>>3));             //01001(控制器为1)或00110(为其他的值)+层楼数的高3位:要分奇偶数值*/
    whacr1=((c<<5)|(0x00>>3));          //层楼数的低3位+RTR+随机数*/                      
    whamr0=0x07;                                       //00000+111                                                                    
    whamr1=0xff;
    //定义发送标识符
    a=cCtrlNum[data5045.cF0];
    b=(data5045.cF1+1);
    whid1=((a<<3)|(b>>3));                             //控制器标识符+层楼数的高3位*/
    whid2=((b<<5)|(0x00>>3));			              //层楼数的低3位+随机数*/                                                                                             
    
    
    do{XBYTE[((P2&0xe0)|0x0F)*256]=0x09;}							  //进入复位状态,为单滤波方式
    while(XBYTE[((P2&0xe0)|0x0F)*256]&0x01==0);                       //复位信号的查询和置位
    //定义时钟分配器,CLKOUT没有使用,则clock off为1,RXINTEN为0,CBP置位,CAN 模式为Pelican,为1;
    XBYTE[((P2&0xe0)|0x0F)*256+31]=0xc8;
    XBYTE[((P2&0xe0)|0x0F)*256+3]=0;                                //禁止SJA1000所有的中断
    XBYTE[((P2&0xe0)|0x0F)*256+16]=whacr0;                             //定义接收代码和掩码
    XBYTE[((P2&0xe0)|0x0F)*256+17]=whacr1;
    XBYTE[((P2&0xe0)|0x0F)*256+18]=0x00;
    XBYTE[((P2&0xe0)|0x0F)*256+19]=0x00;
    XBYTE[((P2&0xe0)|0x0F)*256+20]=whamr0;
    XBYTE[((P2&0xe0)|0x0F)*256+21]=whamr1;
    XBYTE[((P2&0xe0)|0x0F)*256+22]=0xff;
    XBYTE[((P2&0xe0)|0x0F)*256+23]=0xff;
    // 定义总线定时器:波特率为:125kbit,采样点为:87。5%
    XBYTE[((P2&0xe0)|0x0F)*256+6]=0x02;                              //此时为12兆晶振。
    XBYTE[((P2&0xe0)|0x0F)*256+7]=0x1c;
    //当为8兆晶振时,应该为:XBYTE[0x06]=0x01;XBYTE[0x07]=0x1c;
    //定义CAN输出:TX1悬空,TX0为推拉方式,输出为Normal方式
    //当为16兆晶振时,应该为:XBYTE[0x06]=0x03;XBYTE[0x07]=0x1c;
    
    
    //定义CAN输出:TX1悬空,TX0为推拉方式,输出为Normal方式
    XBYTE[((P2&0xe0)|0x0F)*256+8]=0x1a;
    //定义RX buffer start address RBSA(由于每个数据帧为11个字节)
    
    do                                                    //置位复位状态
    {XBYTE[((P2&0xe0)|0x0F)*256]=0x08;}                                  //运行状态,单滤波
    while((XBYTE[((P2&0xe0)|0x0F)*256]&0x01)!=0x00);

}


void senddata(void)
{   
//  uchar csenddata;
    //发送数据(条件:1.外呼按钮按下+未收到外呼灯点亮数据+开入点滤波100ms)
    //        (条件:2.锁梯信号+开入点滤波100ms)
    //        (条件:3.消防信号+开入点滤波100ms)
    //        (条件:4.消防返回信号+开入点滤波100ms)
    if(P1_7==1){     
/*
        if((time1_flg==1)&&(P1_1==0)){  //上呼设定或没有
            csenddata = getsenddata();
            dispose_sendata(0x55, csenddata);
            time1_flg=0;
        }
        if((time2_flg==1)&&(P1_3==0)){  //下呼设定或没有
            csenddata = getsenddata();
            dispose_sendata(0x55, csenddata);
            time2_flg=0;
        }
        if(time3_flg==1){               //锁梯
            csenddata = getsenddata();
            dispose_sendata(0x55, csenddata);
            time3_flg=0;
        }
        if(time4_flg==1){               //消防
            csenddata = getsenddata();
            dispose_sendata(0x55, csenddata);
            time4_flg=0;
        }
        if(time5_flg==1){               //消防返回
            csenddata = getsenddata();
            dispose_sendata(0x55, csenddata);
            time5_flg=0;
        } 
        if(m_RecData.cMaxFloor==1){     //上电后,当初始最大楼层数为1时,发"读最大楼层数"
            dispose_sendata(0x5A, 0x00);
        }
*/
    }

}

void dispose_sendata(uchar data1,uchar data2)                                            //发送数据,每次发送两个数据
{     do {}
      while((XBYTE[((P2&0xe0)|0x0F)*256+2]&0x04)!=0x04);   //判断发送缓冲区是否释放   
      XBYTE[((P2&0xe0)|0x0F)*256+16]=0x02;                 //数据长度为2;
      XBYTE[((P2&0xe0)|0x0F)*256+17]=whid1;                //主机的发送标识符:00110+层楼数(1~50)
      XBYTE[((P2&0xe0)|0x0F)*256+18]=whid2;
      XBYTE[((P2&0xe0)|0x0F)*256+19]=data1;
      XBYTE[((P2&0xe0)|0x0F)*256+20]=data2;
      XBYTE[((P2&0xe0)|0x0F)*256+1]=0x01;
}

uchar getsenddata(void)
{

    if((P1_4==0) && (data5045.cF4==1)){
        abit_3=1;abit_2=0;                             //设置消防
    }else{
        abit_3=0;abit_2=1;
    }
    
    if((P1_5==0) && (data5045.cF4==1)){
        abit_5=1;abit_4=0;                            //设置消防返回
    }else{
        abit_5=0;abit_4=1;
    }
    
    if((P1_6==0) && (data5045.cF3==1)){
        abit_7=1;abit_6=0;                           //设置锁梯
    }else{
        abit_7=0;abit_6=1;
    }


    return(abit);

}

void receivedata(void)
{
    uchar c0id1,c0id2,c0command,c0data;
    if((XBYTE[((P2&0xe0)|0x0F)*256+2]&1)==1){
         c0id1=XBYTE[((P2&0xe0)|0x0F)*256+17];     //接收的数据id1
         c0id2=XBYTE[((P2&0xe0)|0x0F)*256+18];     //接收的数据id2
       	 c0command=XBYTE[((P2&0xe0)|0x0F)*256+19]; //接收的命令  
         c0data=XBYTE[((P2&0xe0)|0x0F)*256+20];    //接收的参数
         XBYTE[((P2&0xe0)|0x0F)*256+1]=0xc;
         
         dispose_recdata(/*c0id1,c0id2,*/c0command,c0data);/*调用数据处理*/
         time_nocan_flg=0;
         time_nocan_count=TIMER_NOCANDATA_NUM;
    }else{
         time_nocan_flg=1;                         //确保置没收到can数据标志
    }
}

void dispose_recdata(/*uchar c0id1,uchar c0id2,*/uchar c0command,uchar c0data)
{

    uchar cTemp;
    uchar cValidFlg=0;
    if(c0command==0x55){           //显示楼层数(LHM QUESTION:负楼层的显示以前的程序似乎并未实现)
        if((c0data>=0xf7)&&(c0data<=0xff)){    //当输入值为-9 --- -1时,相对应显示输入值为0~8.显示为:-9~-1                                
            cTemp=(c0data-0xf7);
            cValidFlg=1;
        }else if((c0data>=1)&&(c0data<=48)){   //当输入值为1~48时,显示输入值为:9~56.显示为:1~48;                
            cTemp=(c0data+8);
            cValidFlg=1;
        }else if((c0data>=61)&&(c0data<=69)){  //当输入值为61~69时,显示输入值为:69~77.显示为:B1~B9         
            cTemp=(c0data+8);
            cValidFlg=1;
        }

        if(m_RecData.cCurFloor!=cTemp){
            m_cWholeMoveOKFlg=0;
            m_cMoveCnt=0;        
            m_cMoveTimer=TIMER_ONELINE_NUM;
            m_cNewLineFlg=0;
        }

        //2005.01.20 合法性检查后才登记
        if(cValidFlg==1){
            m_RecData.cCurFloor = cTemp;
        }
    }else if(c0command==0xaa){     //显示方向
        if(c0data==0x55){          //上  
            m_RecData.cDirect=1;
        }else if(c0data==0xaa){    //下
            m_RecData.cDirect=0;
        }else if(c0data==0x00){    //无
            m_RecData.cDirect=0xFF;  
        }
    }else if(c0command==0xa5){     //显示亮度(休眠),对应锁梯
        if(c0data==0x55){           //休眠
            m_cLockDarkFlg=1;
        }else if(c0data==0xAA){     //正常
            m_cLockDarkFlg=0;
        }
    }else if(c0command==0x5A){      //超载
        if(c0data==0x55){           //是
            m_cOverloadFlg=1;
        }else if(c0data==0xAA){     //否
            m_cOverloadFlg=0;
        }
    }else if(c0command==0xCC){      //报站
/*      if(c0data==0x55){           //是
            m_cReportFlg=1;
        }else if(c0data==0xAA){     //否
            m_cReportFlg=0;
        }*/

        m_cReportFlg=1;
        m_cReportIdx=c0data;        //报站索引
    }
}                                     

⌨️ 快捷键说明

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