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

📄 can

📁 can通信源码
💻
📖 第 1 页 / 共 2 页
字号:
Delay(60000);

}  
}
}
///////////////////////////////////////////////////主函数////////////////////////////////////
void main(void)
{
bit Flag;
RST=0; 
Delay(200);
Delay(200);
RST=1;    
LCD_init(); 
LCD_Clear(); 

    SJA_RST = 0; //复位引脚
	Delay(100);
    SJA_RST = 1;//CAN总线复位管脚
 	Delay(100);
	Delay(100);
	Delay(100);
    SJA_CS = 0;//CAN总线片选有效
   Delay(100);
    SJA_CS = 1;//CAN总线片选无效,保证数据线上的变化不会影响SJA1000
//CPU初始化

    CAN_init(); //SJA1000初始化,对 SJA1000寄存器的读写是采用外部寄存器寻址方式,所以不需要程序单独控制片选有效无效
    _nop_();
    _nop_();
	Delay(200);
TMOD |=0x01;//定时器设置 0.1ms in 12M crystal
TH0=(65536-100)/256; 
TL0=(65536-100)%256;//定时0.1mS 
IE= 0x82;  //打开中断
TR0=1;
xsg();
CYCLE = 10;// 时间可以调整 这个是10调整 8位PWM就是256步

    while(1)
{
/////////////////////
while(qieh)
{
CAN_RXD();
  anjian();
while(!Flag)
  {
   Delay(5000); //延时时间,从一个亮度到下一个亮度的间隔时间,速度快就能看到连续效果

   PWM_ON++;//这个使用较长延时,以便能看清楚变化过程

   anjian();
   if(PWM_ON == CYCLE)
      {           //这个里可以添加其他程序 如到最亮时候控制设备
      Flag=1;
	  }
  }


CAN_RXD(); 
 while(Flag)     //亮度递减 同上,是个相反的过程
  {
   Delay(5000);

   PWM_ON--;
   anjian();
CAN_RXD();
   if(PWM_ON == 0)
      {
      Flag=0;
	  }
  }

}


///////////////////////
while(!qieh)
{
     CAN_RXD();   

    if(PWM_Num>=5)
         PWM_Num=0;
         switch(PWM_Num)
        {
       case 4:PWM_ON=0;break;//高电平时长 
       case 3:PWM_ON=4;break;
       case 2:PWM_ON=6;break;
       case 1:PWM_ON=8;break;
       case 0:PWM_ON=10;break;
       default:break;
        }
     

 
if(p14==0)
{
 Delay(300);
 if(p14==0)
  {
  qieh=1;
  }
}
CAN_RXD();
anjian();
}
}
} 

void CAN_init( void )
{ uchar ACRR[4];
    uchar AMRR[4];
    ACRR[0] = 0x00;
    ACRR[1] = 0x01;
    ACRR[2] = 0x02;
    ACRR[3] = 0x03;//接收代码寄存器,节点1
    AMRR[0] = 0xff;
    AMRR[1] = 0xff;
    AMRR[2] = 0xff;
    AMRR[3] = 0xff;//接收屏蔽寄存器。 只接收主机发送的信息
    //  .0=1---reset MODRe,进入复位模式,以便设置相应的寄存器
    	 //防止未进入复位模式,重复写入;
    MODR   = 0x09;

    CDR  = 0x88;//时钟分频; CDR.3=1--时钟关闭, CDR.7=0---basic CAN, CDR.7=1---Peli CAN

    BTR0 = 0x03;
    BTR1 = 0x1c;//16M晶振,波特率125Kbps

    IER  = 0x01;// .0=1--接收中断使能;  .1=0--关闭发送中断使能
    OCR  = 0xaa;// 配置输出控制寄存器
    CMR  = 0x04;//命令寄存器;释放接收缓冲器

    ACR  = ACRR[0];
    ACR1 = ACRR[1];
    ACR2 = ACRR[2];
    ACR3 = ACRR[3];//初始化标示码

    AMR  = AMRR[0];
    AMR1 = AMRR[1];
    AMR2 = AMRR[2];
    AMR3 = AMRR[3];//初始化掩码


	MODR   = 0x08;
}


 void CAN_yuan( void )
{                    
				 uchar data qushu;
				    uchar data TX_buffer[ N_can ] ;
                       CMR=0x04;
			
/*向CPU里面写数据*/ TX_buffer[0] = 0xc8;//TX.7=1扩展帧;TX.6=0数据帧; .3=1数据长度
					    TX_buffer[1] = 0x11;//本节点地址
					    TX_buffer[2] = 0x22;//
					    TX_buffer[3] = 0x33;//
					    TX_buffer[4] = 0x44;//
																		
						 
					   do{
    qushu=SR;
   	Delay(100);
	Delay(100);

      }while(qushu&0x20);
     do{
        qushu=SR;
           	Delay(100);
       }while(qushu&0x10);//


	   		        TBSR   = TX_buffer[0];
				    TBSR1  = TX_buffer[1];
				    TBSR2  = TX_buffer[2];
				    TBSR3  = TX_buffer[3];
				    TBSR4  = TX_buffer[4];
				   

					CMR = 0x01;	
Delay(100);
	Delay(100);

				 
}



void CAN_TXD( void )
{                    
				 uchar data qushu;
				    uchar data TX_buffer[ N_can ] ;
                       CMR=0x04;
			
/*向CPU里面写数据*/ TX_buffer[0] = 0x88;//TX.7=1扩展帧;TX.6=0数据帧; .3=1数据长度
					    TX_buffer[1] = 0x11;//本节点地址
					    TX_buffer[2] = 0x22;//
					    TX_buffer[3] = 0x33;//
					    TX_buffer[4] = 0x44;//
																		
						    TX_buffer[5]  = PWM_Num;
						    TX_buffer[6]  = 0xef;
						    TX_buffer[7]  = 0xee;
						    TX_buffer[8]  = 0x44;//
						    TX_buffer[9]  = 0x55;//
						    TX_buffer[10] = 0x66;//
						    TX_buffer[11] = 0x77;//
						    TX_buffer[12] =0x55;
					   do{
    qushu=SR;
   	Delay(100);
	Delay(100);

      }while(qushu&0x20);
     do{
        qushu=SR;
           	Delay(100);
       }while(qushu&0x10);//


	   		        TBSR   = TX_buffer[0];
				    TBSR1  = TX_buffer[1];
				    TBSR2  = TX_buffer[2];
				    TBSR3  = TX_buffer[3];
				    TBSR4  = TX_buffer[4];
				    TBSR5  = TX_buffer[5];
				    TBSR6  = TX_buffer[6];
				    TBSR7  = TX_buffer[7];
				    TBSR8  = TX_buffer[8];
				    TBSR9  = TX_buffer[9];
				    TBSR10 = TX_buffer[10];
				    TBSR11 = TX_buffer[11];
				    TBSR12  = TX_buffer[12];
					CMR = 0x01;	
Delay(100);
	Delay(100);

				 
}
		/////////delay程序////////////////
		void Delay(uint delay_time)
		{//延时程序
		    while(delay_time--)
		    {}
		}
void CAN_RXD( void )
{//接收数据函数,在中断服务程序中调用
	
    uchar data Judge;
    Judge=SR;

if(!(Judge&0x20))
{
 if(!(Judge&0x10))
  {     
if(Judge&0x01)
{
        RX_buffer[0] =  RBSR;
        RX_buffer[1] =  RBSR1;
        RX_buffer[2] =  RBSR2;
        RX_buffer[3] =  RBSR3;
        RX_buffer[4] =  RBSR4;
        RX_buffer[5] =  RBSR5;//接收湿度
        RX_buffer[6] =  RBSR6;
        RX_buffer[7] =  RBSR7;
        RX_buffer[8] =  RBSR8;//接收温度
        RX_buffer[9] =  RBSR9;
        RX_buffer[10] =  RBSR10;
        RX_buffer[11] =  RBSR11; //jia1
        RX_buffer[12] =  RBSR12;  //
        CMR=0x04;//释放接收缓冲器
        Judge = ALC;//释放仲裁随时捕捉寄存器
        Judge = ECC;//释放错误代码捕捉寄存器
 

if(RX_buffer[0]==0xc8)	
{  CAN_TXD();
}
if(RX_buffer[12]==2)	
{qh=1;
xswsd();//调用温度湿度接收程序



}
if(RX_buffer[12]==1)
{//LCD_Write_Chinese(0,2,4);
qieh=0;
PWM_Num=RX_buffer[11];
 qh=0;
xsg();//调用对方光照等级程序 

 
} 
      
}
}  
}  
}
/********************************/
/*      定时中断                */
/********************************/
void tim(void) interrupt 1 using 1
{
static unsigned char count; //
TH0=(65536-100)/256; 
TL0=(65536-100)%256;//定时0.1mS 

if (count==PWM_ON)
    {
     p10=0; //灯灭 
    }
  count++;
if(count == CYCLE)
    {
    count=0;
	if(PWM_ON!=0) //如果左右时间是0 保持原来状态
	   p10=1;//灯亮

    }
}



 //////液晶显示光照等级
void xsg(void)
{
  if(qh==0)  //液晶显示光照等级
 {
LCD_Clear(); 
LCD_Write_Chinese(0,0,4);//光
LCD_Write_Chinese(2,0,5);//照
 LCD_Write_Chinese(4,0,6) ; //等
LCD_Write_Chinese(6,0,7); //级
LCD_Write_Chinese(8,0,8);//为
LCD_Write_Charater(4,2,PWM_Num);//数据
 }
}



//////液晶显示对方的温度湿度
void xswsd(void)
{
 if(qh==1)
{
LCD_Clear(); 
LCD_Write_Chinese(0,0,0);//温
LCD_Write_Chinese(2,0,1);//度 
LCD_Write_Charater(4,0,10);//:
LCD_Write_Chinese(0,2,2);//湿 
LCD_Write_Chinese(2,2,3);//度 
LCD_Write_Charater(4,2,10);//:
LCD_Write_Charater(6,2,RX_buffer[5]);//湿度
LCD_Write_Charater(7,2,RX_buffer[6]);//
LCD_Write_Charater(8,2,RX_buffer[7]);//
LCD_Write_Charater(6,0,RX_buffer[8]);//温度
LCD_Write_Charater(7,0,RX_buffer[9]);//
LCD_Write_Charater(8,0,RX_buffer[10]);//
}

}

⌨️ 快捷键说明

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