4月16更新了程序.依然要自己按硬件输出修改信号输出引脚.不会的可以和我一样连接在p3.4直接用编译好的hex文件该文件直接包含在工程中.程序花了两天研究crc算法并添加,为了可以使用没有crc的数据,因为我发现网上找不到现成的软件来计算can的crc15另外独立出数据,可以方便大家添加删除.至于发送程序就不要改了,超过了内存使用量就要提高速度了,需要重新校准.总之欢迎
大家测试,因为我只有一个机器,算是闭门造车.大家测试后提供机器编号和实际情况.更欢迎大家提供补充数据和速度另外看坛友说关机后因为没有关闭数据的发送所以引起待机功耗大,程序中已经有提供做法就是检测到机器关闭就发送关闭数据后停止运行等待下次开机但是因为你们没有对应的硬件连线,所以我注释掉了.我连接在p3.5脚.没有对应的就不要去掉才注释,会引起程序当掉的,只给有对应连接的使用的.以后哪天心血来潮了加个遥控开关机,也仅是开关机,音量啥的没有数据,难点 一直看到坛友发的模拟器,芯片太多不好做.
我没有自己画图,就借网友的图修改修改做个示意就好了,反正很简单.
蓝牙背光可用并可自己控制。修改了车机can的两根线用于下载程序,下载好了之后这两根又是按键背光和点火.
顺便把我自己写的程序也贡献出来好了.
当时因为数据的来源原因一直没有发布,但是现在已经在网上开始流传了,应该不能怪我头上了.
先贴我的修改好的图,就一张,和示意用的电路图,修改网友的来的.不是抄袭哈.实在是就是这么简单
这些都不重要,重要的是我的c程序.一直用到现在,证明是可靠的.
你可以随意添加适用的数据.我这只有5gg 035 185 和 34d 035 185的
当然也可以加低速的,不过程序可以参考我的,你添加低速的发送程序,
理论上可以高速低速全整合,可以通吃所有的can车机(前提车机只收不发并且你有数据)
直接贴代码加工程
/********************************************************
* 版权所有,仿冒不究
* 程序因机器和数据的缺少,没有仔细测试
* 希望大家共同提供数据补充修改,
* 暂时用12m速度的原因,添加附加功能会出错.
* 若需要添加其他功能如遥控等需要更多的内存需要提高频率并重修延时参数
* 此程序不适合12t的51单片机使用,还是因为速度不够.
**********************************************************/
#define nop _nop_()
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#include<stc15f104e.h>
#include<intrins.h>
#include<absacc.h>
//#include<erjinzhi.h>
//stc15f104e 频率设定为12MHz
sbit onoffcheck=P3^5; //开关机检测,用于关机降耗
sbit can_l=P3^4; //输出引脚,和rx同相
sbit acc=P3^0; //点火
sbit led=P3^1; //背光
uint code cancode[][4][8]={
//数据代表意思依次为
//贞id,数据字节数,4个数据不满4个补0,crc校验,can速度
//暂时只做了最长4个数据的,crc只是看的,实际发送的值是程序自动计算的,
//can的速度暂时只支持100k,125k,500k,
{ //5gg 035 185 高尔夫7
{0x5f0,4,0xe4,0xe4,0x00,0x00,0x1efd,500},//开灯
{0x5f0,4,0x00,0x00,0x00,0x00,0x0391},//关灯
{0x3c0,4,0xa0,0xa0,0x33,0x33,0x1ceb},//ACC_ON
{0x3c0,4,0x00,0x00,0x00,0x00,0x0190}//ACC_OFF
},
{ //34d 035 185
{0x470,4,0x00,0x00,0x47,0x00,0x3d5a,500},//开灯
{0x470,4,0x00,0x00,0x00,0x00,0x769f},//关灯
{0x570,4,0x03,0x00,0x00,0x00,0x0c63},//ACC_ON
{0x570,4,0x00,0x00,0x00,0x00,0x2f6b}//ACC_OFF
},
{ //rcd300+
{0x635,4,0x60,0x60,0x00,0x00,0x34bb,100},//开灯
{0x635,4,0x00,0x00,0x00,0x00,0x25dd},//关灯
{0x271,4,0x87,0x00,0x00,0x00,0x4d9f},//ACC_ON
{0x271,4,0x00,0x00,0x00,0x00,0x2683}//ACC_OFF
},
};
#define part (sizeof(cancode)/4/8/2) //每部分4条8元素2字节
#define buflen 80
uchar canpart;
void delay(uint t)
{
uchar i,j;
for(;t;t--)
for(i=220;i;i--)
for(j=12;j;j--);
}
/*
uint crccale(uchar *bitbuf,uchar len)
{
uint crcreg,nextbit; //crc计算
// bit crcnext;
uchar i=0;
crcreg=0;
while(i<len)
{
nextbit=((uint)(bitbuf[i++]))<<14;
crcreg=nextbit^crcreg;
crcreg<<=1;
if(crcreg&0x8000)crcreg^=0x4599;
}
return (crcreg&0x7fff);
} */
void sendcan(uint canid,uchar num,uchar dat1,uchar dat2,uchar dat3,uchar dat4,uint speed)
{
uint cancrc;
uchar i,j;
uchar idata loadbuf[buflen];
uint nextbit;
if((num==0)||(num>8))return;
loadbuf[0]=num;
i=1;
canid<<=5;
for(j=11;j;j--)//id
{
if(canid&0x8000)loadbuf[i++]=1;
else loadbuf[i++]=0;
canid<<=1;
}
loadbuf[i++]=0; //非远程请求
loadbuf[i++]=0; //非扩展帧
loadbuf[i++]=0; //保留位
num<<=4;
for(j=4;j;j--)//数据长度
{
if(num&0x80)loadbuf[i++]=1;
else loadbuf[i++]=0;
num<<=1;
}
num=loadbuf[0]-1;
for(j=8;j;j--)//数据1
{
if(dat1&0x80)loadbuf[i++]=1;
else loadbuf[i++]=0;
dat1<<=1;
}
if(num--)
{
for(j=8;j;j--)//数据2
{
if(dat2&0x80)loadbuf[i++]=1;
else loadbuf[i++]=0;
dat2<<=1;
}
}
if(num--)
{
for(j=8;j;j--)//数据3
{
if(dat3&0x80)loadbuf[i++]=1;
else loadbuf[i++]=0;
dat3<<=1;
}
}
if(num)
{
for(j=8;j;j--)//数据4
{
if(dat4&0x80)loadbuf[i++]=1;
else loadbuf[i++]=0;
dat4<<=1;
}
}
num=loadbuf[0];
loadbuf[0]=0;
cancrc=0;
j=0;
while(j<(num*8+19))
{
nextbit=((uint)(loadbuf[j++]))<<14;
cancrc=nextbit^cancrc;
cancrc<<=1;
if(cancrc&0x8000)cancrc^=0x4599;
}
cancrc&=0x7fff;
cancrc<<=1;
for(j=15;j;j--)//crc
{
if(cancrc&0x8000)loadbuf[i++]=1;
else loadbuf[i++]=0;
cancrc<<=1;
}
loadbuf[i++]=1;
loadbuf[i++]=0;
loadbuf[i++]=1; //
j=buflen-1; //j指向底部
for(;i;)
loadbuf[j--]=loadbuf[--i];//底部对齐
num=1;
i=loadbuf[0]=0;
for(j+=2;j<buflen;) //重新左对齐,并逢5添码
{
if(loadbuf
==loadbuf[j])
{
loadbuf[++i]=loadbuf[j];
num++;
if(num>=5)
{
num=1;
i++;
loadbuf=loadbuf[j]; //添反码
loadbuf++;
loadbuf&=0x01;
}
j++;
}
else
{
loadbuf[++i]=loadbuf[j++];
num=1;
}
}
for(i++;i<buflen;)loadbuf[i++]=0x01;
if(speed==500)
{
for(i=0;i<buflen;i++)
{
can_l=loadbuf;
nop;nop;nop;
}
}
if(speed==125)
{
for(i=0;i<buflen;i++)
{
can_l=loadbuf;
for(j=(3000/125-6);j;j--);
nop;//
}
}
//添加需要新的速度时for(j=(3000/125-6);j;j--); 中的125就是需要的速度
//并且速度并不精确,可能还需要nop来细调
if(speed==100)
{
for(i=0;i<buflen;i++)
{
can_l=loadbuf;
for(j=(3000/100-6);j;j--);
nop;//nop;nop;
}
}
}
void senditem(uint partnum,uchar idx)
{
uint canid,speed;
uchar candlc,dat[4];
idx--;
canid=cancode[partnum][idx][0];
candlc=cancode[partnum][idx][1];
dat[0]=cancode[partnum][idx][2];
dat[1]=cancode[partnum][idx][3];
dat[2]=cancode[partnum][idx][4];
dat[3]=cancode[partnum][idx][5];
// cancrc=cancode[partnum][idx][6];
speed=cancode[partnum][0][7];
sendcan(canid,candlc,dat[0],dat[1],dat[2],dat[3],speed);
}
void main()
{
onoffcheck=1;
while(1)
{
delay(300);
if(acc) //开电源
{
for(canpart=0;canpart<part;canpart++)
senditem(canpart,3);
}
else //关电源
{
for(canpart=0;canpart<part;canpart++)
senditem(canpart,4);
}
delay(100);
if(led) //开灯 背光开
{
for(canpart=0;canpart<part;canpart++)
senditem(canpart,1);
}
else //关灯 背光关
{
for(canpart=0;canpart<part;canpart++)
senditem(canpart,2);
}
/* if(onoffcheck)
{
delay(100);
for(canpart=0;canpart<part;canpart++)
senditem(canpart,2);
delay(100);
for(canpart=0;canpart<part;canpart++)
senditem(canpart,4);
while(onoffcheck);
} */
}
}
工程:
编译好的hex文件直接在工程中.
不过要注意的是频率要选择12m.另外我为了适应适应自己的车机,重新修改到p3.4输出了。你需要重新定义编译下。
<erjinzhi.h>你们应该没有,请直接注释掉
@hopestone:大众车机解码器终于搞定,并实现完美关机
http://bbs.mydigit.cn/read.php?tid=2218765