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

📄 can0.c

📁 充电车的控制板程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <can0.h>
#include <uart0.h>

#define TRE0 5
#define SET_485_TX0() PORTD &= ~(1<<TRE0)
#define SET_485_RX0() PORTD |= (1<<TRE0)


extern unsigned char tx0_period_en;
extern unsigned char Qtemp[4];
extern void read_Qout (void);

unsigned char CAN0_ADDR;
unsigned char CAN0_BUAD;
unsigned char UART_CAN0_BAUD;
unsigned char AIM_ADDR;

unsigned  int  work_time_car;//从对某一车辆充电到当前的时间
unsigned  int  work_time_perid;//从本阶段开始到当前的时间
unsigned  char work_time_counter;  
unsigned  char  work_time_en;

unsigned char state_counter_sec;
unsigned char state_counter_min;
unsigned char can_sent_time;
unsigned char can_sent_state_en;

void slave_device_sent41(void);
void slave_device_sent42(void);
void slave_device_sent43(void);

//extern void power_on_0  (void);
//extern void delay(unsigned int t);
void delay( unsigned  int t)
{
	for(;t>0;t--)
	{
	}
}
//------------------------------

void CAN0_INIT (void)
{
	unsigned char i;
	
	AIM_ADDR=   0x01;
	CAN0_ADDR = 0x80;
	
	CAN0_BUAD = 2;
	UART_CAN0_BAUD=2;
	for(i=0;i<15;i++)
	{
		tx0_buf[i]=0x00;
	}
	
	tx0_buf[0]=0xa0;
	
	tx0_buf[1]=CAN0_ADDR;
	tx0_buf[2]=CAN0_BUAD;
	tx0_buf[3]=UART_CAN0_BAUD;
	tx0_buf[4]=0x00;
	
	tx0_buf[5]=0x08;
	
	tx0_buf[6]=0xFF;
	tx0_buf[7]=0xFF;
	tx0_buf[8]=0xFF;
	tx0_buf[9]=0xFF;
	tx0_buf[10]=0x00;
	tx0_buf[11]=0x00;
	tx0_buf[12]=0x00;
	tx0_buf[13]=0x00;
	
	uart0_tx();
	
	work_time_en=0;
	work_time_car=0;
	work_time_perid=0;
	work_time_counter=0; 
}
//-----------------------
void can_485_test (void)
{
	unsigned int hxf_test;
	unsigned char temp[4];
	unsigned char i;
	hxf_test=0x00f7;
	
	for(i=0;i<4;i++)
	 temp[i]=0x00;
	
				do{
			  }while(!tx_en);
			  tx_en=0;
			  
        tx0_buf[0]=0xaa;
        
        tx0_buf[1]=0x1F;
        tx0_buf[2]=0xAA;
        tx0_buf[3]=0xAA;
        tx0_buf[4]=0xAA;
        
        tx0_buf[5]=0x08;
        
        tx0_buf[6]=Vout;
        tx0_buf[7]=Vout;
	
	      temp[3]=(Ids%10000)/1000;//千位
				temp[2]=(Ids%1000)/100;//百位
				temp[1]=(Ids%100)/10;//十位
				temp[0]=Ids%10;//个位
					
				tx0_buf[8] = temp[3]<<4;	
				tx0_buf[8]|=temp[2];
				tx0_buf[9]=temp[1]<<4;	
				tx0_buf[9]|=temp[0];

     //   tx0_buf[8]=0x33;
      //  tx0_buf[9]=0x44;
        tx0_buf[10]=temp[0];
        tx0_buf[11]=temp[1];
        tx0_buf[12]=temp[2];
        tx0_buf[13]=temp[3];
        
        SET_485_TX0();
	      UCSR0B=(1<<TXEN0)|(1<<UDRIE0);		 
 			
}

//--------------------
void command_handle0(void)
{
	unsigned char temp[4];
	unsigned char i;
  long int tempa;
  
  AIM_ADDR=   0x01;
	CAN0_ADDR = 0x80;
	
	switch (rx0_buf[1])
	{
		case 0x1F://test
			{
				switch (rx0_buf[2])
				{
					case 0x01:
						{
							 slave_device_sent41();
						};break;
					case 0x02:
						{
							slave_device_sent42();
						};break;
					case 0x03:
						{
							slave_device_sent43();
						};break;
						default:break;		
				}
				 
			};break;
			
			
		case 0x00://000  请求所有从站紧急停机,适用广播地址
			{  
				mode=4;
			};break;
		case 0x14:// 5 00
			{
				if(rx0_buf[2]==0x50)//请求读从站运行模式数据//4.2.1
				{
					//uart0_can_en ();
					do{
					}while(!tx_en);
					tx_en=0;
			
					switch(mode)
					{
						case 0://*******恒流限压
							{
								tx0_buf[0]=0xaa;
	
					tx0_buf[1]=0x0C;//300
					tx0_buf[2]=0x50;//0x50
					tx0_buf[3]=CAN0_ADDR;
					tx0_buf[4]=AIM_ADDR;
					tx0_buf[5]=0x08;
					
					tx0_buf[6]=(unsigned char) period_all<<4;
					tx0_buf[6]|=(unsigned char) period;
								
					tx0_buf[7]=0xa0+0xFF;
								
							//	Ichg
				temp[3]=(unsigned char)((Ichg%10000)/1000);//千位
				temp[2]=(unsigned char)((Ichg%1000)/100);//百位
				temp[1]=(unsigned char)((Ichg%100)/10);//十位
				temp[0]=(unsigned char) (Ichg%10);//个位
					
				tx0_buf[8]=temp[3]<<4;	
				tx0_buf[8]|=temp[2];
				tx0_buf[9]=temp[1]<<4;	
				tx0_buf[9]|=temp[0];
				
				temp[3]=(Vlmt%10000)/1000;//千位
				temp[2]=(Vlmt%1000)/100;//百位
				temp[1]=(Vlmt%100)/10;//十位
				temp[0]=Vlmt%10;//个位
					
				tx0_buf[10]=temp[3]<<4;	
				tx0_buf[10]|=temp[2];
				tx0_buf[11]=temp[1]<<4;	
				tx0_buf[11]|=temp[0];
				
				temp[3]=(Vstp%10000)/1000;//千位
				temp[2]=(Vstp%1000)/100;//百位
				temp[1]=(Vstp%100)/10;//十位
				temp[0]=Vstp%10;//个位
					
				tx0_buf[12]=temp[3]<<4;	
				tx0_buf[12]|=temp[2];
				tx0_buf[13]=temp[1]<<4;	
				tx0_buf[13]|=temp[0];
				
				SET_485_TX0();
	      UCSR0B=(1<<TXEN0)|(1<<UDRIE0);
				do{
			}while(!tx_en);				
								
			};break;
						case 1://******恒压限流
							{
								tx0_buf[0]=0xaa;
	
					tx0_buf[1]=0x0C;//300
					tx0_buf[2]=0x50;//0x50
					tx0_buf[3]=CAN0_ADDR;
					tx0_buf[4]=AIM_ADDR;
					tx0_buf[5]=0x08;
					
					tx0_buf[6]=(unsigned char) period_all<<4;
					tx0_buf[6]|=(unsigned char) period;
					
								tx0_buf[7]=0xa1;
								
				temp[3]=(Vchg%10000)/1000;//千位
				temp[2]=(Vchg%1000)/100;//百位
				temp[1]=(Vchg%100)/10;//十位
				temp[0]=Vchg%10;//个位
					
				tx0_buf[8]=temp[3]<<4;	
				tx0_buf[8]|=temp[2];
				tx0_buf[9]=temp[1]<<4;	
				tx0_buf[9]|=temp[0];
				
				temp[3]=(Ilmt%10000)/1000;//千位
				temp[2]=(Ilmt%1000)/100;//百位
				temp[1]=(Ilmt%100)/10;//十位
				temp[0]=Ilmt%10;//个位
					
				tx0_buf[10]=temp[3]<<4;	
				tx0_buf[10]|=temp[2];
				tx0_buf[11]=temp[1]<<4;	
				tx0_buf[11]|=temp[0];
				
				temp[3]=(Istp%10000)/1000;//千位
				temp[2]=(Istp%1000)/100;//百位
				temp[1]=(Istp%100)/10;//十位
				temp[0]=Istp%10;//个位
					
				tx0_buf[12]=temp[3]<<4;	
				tx0_buf[12]|=temp[2];
				tx0_buf[13]=temp[1]<<4;	
				tx0_buf[13]|=temp[0];
				
				SET_485_TX0();
	      UCSR0B=(1<<TXEN0)|(1<<UDRIE0);
	      do{
					}while(!tx_en);
								
							};break;
						case 2://********恒流定时
							{
								
								tx0_buf[0]=0xaa;
	
					tx0_buf[1]=0x0C;//300
					tx0_buf[2]=0x32;//50
					tx0_buf[3]=AIM_ADDR;
					tx0_buf[4]=CAN0_ADDR;
				  tx0_buf[3]=0xAA;
				  tx0_buf[4]=0xAA;
					tx0_buf[5]=0x08;
					
					tx0_buf[6]=(unsigned char) period_all<<4;
					tx0_buf[6]|=(unsigned char) period;
					
					tx0_buf[7]=0xa2;
													
				temp[3]=(Ids%10000)/1000;//千位
				temp[2]=(Ids%1000)/100;//百位
				temp[1]=(Ids%100)/10;//十位
				temp[0]=Ids%10;//个位
					
				tx0_buf[8] = temp[3]<<4;	
				tx0_buf[8]|=temp[2];
				tx0_buf[9]=temp[1]<<4;	
				tx0_buf[9]|=temp[0];
								
				tx0_buf[10]=0x00;
				tx0_buf[11]=0x00;	
				tx0_buf[12]=0x00;	
				tx0_buf[13]=0x00;	
					
				  
				SET_485_TX0();
	      UCSR0B=(1<<TXEN0)|(1<<UDRIE0);
	      do{
					}while(!tx_en);
							};break;
						case 3://*****恒压定时
							{
								
								tx0_buf[0]=0xaa;
	
					tx0_buf[1]=0x0C;//300
					tx0_buf[2]=0x32;//0x50
					tx0_buf[3]=AIM_ADDR;
					tx0_buf[4]=CAN0_ADDR;
					tx0_buf[5]=0x08;
					
					tx0_buf[6]=(unsigned char) period_all<<4;
					tx0_buf[6]|=(unsigned char) period;
					
								
				tx0_buf[7]=0xa3;
								
				temp[3]=(Vds%10000)/1000;//千位
				temp[2]=(Vds%1000)/100;//百位
				temp[1]=(Vds%100)/10;//十位
				temp[0]=Vds%10;//个位
					
				tx0_buf[8]=temp[3]<<4;	
				tx0_buf[8]|=temp[2];
				tx0_buf[9]=temp[1]<<4;	
				tx0_buf[9]|=temp[0];
								
				for(i=10;i<14;i++)
				  tx0_buf[i]=0x00;
				  
				 SET_485_TX0();
	      UCSR0B=(1<<TXEN0)|(1<<UDRIE0); 
	      do{
					}while(!tx_en);
	      
				};break;			
						case 4://关机
							{
								tx0_buf[0]=0xaa;
	
					tx0_buf[1]=0x0C;//300
					tx0_buf[2]=0x32;//0x50
					tx0_buf[3]=AIM_ADDR;

⌨️ 快捷键说明

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