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

📄 can.c

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

void can_init(void)
{
    uchar whamr0,whamr1,a,b,c;  
 
   P2_7=0;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();

    P2_7=1;

    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);

}

//2005.01.06    LHM  显示板改进
void senddata(void)
{   
/*
    uchar csenddata;
    //发送数据(条件:1.外呼按钮按下+未收到外呼灯点亮数据+开入点滤波100ms)
    //        (条件:2.锁梯信号+开入点滤波100ms)
    //        (条件:3.消防信号+开入点滤波100ms)
    //        (条件:4.消防返回信号+开入点滤波100ms)
    if(P1_7==1){   
        if((data5045.cF3==0) && (data5045.cF4==0)){     //当功能F3和F4都设置为0时,仅发一次
            if((time1_flg==1)&&(P1_1==0)&&(m_existupcallflg==0)){  //上呼设定
                csenddata = getsenddata();
                dispose_sendata(0x55, csenddata);
                time1_flg=0;
                time1_count=TIMER_FILTER_NUM;
            }
            if((time2_flg==1)&&(P1_3==0)&&(m_existdowncallflg==0)){  //下呼设定
                csenddata = getsenddata();
                dispose_sendata(0x55, csenddata);
                time2_flg=0;
                time2_count=TIMER_FILTER_NUM;
            }
        }else{
            if((time1_flg==1)&&(P1_1==0)&&(m_existupcallflg==0)){  //上呼设定
                csenddata = getsenddata();
                dispose_sendata(0x55, csenddata);
                time1_flg=0;
                time1_count=TIMER_FILTER_NUM;
            }
            if((time2_flg==1)&&(P1_3==0)&&(m_existdowncallflg==0)){  //下呼设定
                csenddata = getsenddata();
                dispose_sendata(0x55, csenddata);
                time2_flg=0;
                time2_count=TIMER_FILTER_NUM;
            }

			if(time6_flg==1){
	            csenddata = getsenddata();
	            dispose_sendata(0x55, csenddata);
				time6_flg=0;
				time6_count=TIMER_1000ms;
			}
        }

    }

    if(m_RecData.cMaxFloor==1){     //上电后,当初始最大楼层数为1时,发"读最大楼层数"
        if(time7_flg==1){
            dispose_sendata(0x5A, 0x00);
            time7_flg=0;
            time7_count=TIMER_200ms;
        }
    }
*/
}

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) && (m_cFireServiceFlg==0)*/){
        abit_3=1;abit_2=0;                            //设置消防服务
        m_cFireServiceFlg=1;
    }else if(P1_4==1){
        abit_3=0;abit_2=1;
        m_cFireServiceFlg=0;
    }
    
    if((P1_5==0) /*&& (data5045.cF4==1) && (m_cFireFlg==0)*/){
        abit_5=1;abit_4=0;                            //设置消防
    }else if(P1_5==1){
        abit_5=0;abit_4=1;
    }
    
    if((P1_6==0) /*&& (data5045.cF3==1) && (m_cLockFlg==0)*/){
        abit_7=1;abit_6=0;                           //设置锁梯
    }else{
        abit_7=0;abit_6=1;
    }
    
    //删去"点击一次设置外呼,再点击一次取消外呼"    2004.09.27(接赵工指示修正)
    if(P1_0==0){
        abit_1=1;abit_0=0;                           //设置上呼信号:注意:设置时是否不对。应该在有1~0变化时,才发送一个信号
    }else if(P1_2==0){
        abit_1=0;abit_0=1;                           //设置下呼信号
    }else{
        abit_0=0;abit_1=0;
    }


    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_count=TIMER_400ms;
		 time_nocan_flg=0;
    }
}

//2005.01.06    LHM  显示板改进
void dispose_recdata(/*uchar c0id1,uchar c0id2,*/uchar c0command,uchar c0data)
{

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

        if(m_RecData.cCurFloor!=cTemp){
            m_cWholeMoveOKFlg=0;
            m_cMoveCnt=0;        
            m_cMoveTimer=TIMER_ONELINE_NUM;
            m_cNewLineFlg=0;
        }
        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==0xcc){     //确保上呼灯下呼灯灭
        P1_1=0;P1_3=0;
    }else if(c0command==0x5a){
        if((c0id1==whacr0)&&(c0id2==whacr1)){//如果can0的发送标识符和外呼的接收代码相同
            if(c0data==0x50){      //上呼梯灯亮
                P1_1=1; 
                m_existupcallflg=1;
            }else if(c0data==0x05){ //下呼梯灯亮
                P1_3=1;
                m_existdowncallflg=1;
            }else if(c0data==0xa0){ //上呼梯灯灭
                P1_1=0;
                m_existupcallflg=0;
            }else if(c0data==0x0a){ //下呼梯灯灭
                P1_3=0;
                m_existdowncallflg=0;   
            }else if(c0data==0xcc){ //全消
                P1_1=0;      
                m_existupcallflg=0; 
                P1_3=0;
                m_existdowncallflg=0;  
            }      
        }
    }else if(c0command==0xa5){     //显示亮度(休眠),对应锁梯
        if(c0data==0x55){           //休眠
            m_cLockDarkFlg=1;
        }else if(c0data==0xAA){     //正常
            m_cLockDarkFlg=0;
        }

    }else if(c0command==0x3c){     //检修
        if(c0data==0x55){           //否
			P2_6=0;
            m_cRepairFlg=0;
        }else if(c0data==0xAA){     //是
			P2_6=1;
            m_cRepairFlg=1;
        }

    }else if(c0command==0xc3){     //锁梯
        if(c0data==0x55){           //否
		  	P2_5=0;
            m_cLockFlg=0;
        }else if(c0data==0xAA){     //是
		  	P2_5=1;
            m_cLockFlg=1;
        }
    }else if(c0command==0x3A){      //消防
        if(c0data==0x55){           //取消消防
            m_cFireFlg=0;
            m_cFireBaseFlg=0;
        }else if(c0data==0x3C){     //消防但不在基站
            m_cFireFlg=1;
            m_cFireBaseFlg=0;
        }else if(c0data==0xC3){     //消防且在基站
            m_cFireFlg=1;
            m_cFireBaseFlg=1;
        }
    }*/else if(c0command==0x33){     //最大楼层数
        m_RecData.cMaxFloor=c0data-1;
    }/*else if(c0command==0xA3){
        if(c0data==0x55){           //否
            m_cStopFlg=0;
        }else if(c0data==0xAA){     //是
            m_cStopFlg=1;
        }
    }*/

}

⌨️ 快捷键说明

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