📄 can0.c
字号:
#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 + -