切换到宽版
  • 40381阅读
  • 197回复

[音响]看来大家挺关心大众车机的模拟解码器的,我也发布下我自己做的吧.整合多种速度和数据 [复制链接]

上一主题 下一主题
离线decai
 

发帖
798
M币
6682
专家
13
粉丝
122
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2016-04-12
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
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共59条打赏M币+297专家+1
离线genieg

发帖
378
M币
144
专家
0
粉丝
19
只看该作者 1楼 发表于: 2016-04-12
好人啊!!虽然我没机子用不上,这种分享精神得赞一个!
离线yuyaoshi

发帖
97
M币
413
专家
0
粉丝
2
只看该作者 2楼 发表于: 2016-04-12
顶楼主的分享精神
离线yesing

发帖
6092
M币
13102
专家
1
粉丝
13
只看该作者 3楼 发表于: 2016-04-12
大公无私,好
离线20768797

发帖
1940
M币
2810
专家
2
粉丝
38
只看该作者 4楼 发表于: 2016-04-12
支持呀,这个改造的好。
离线1185257111

发帖
458
M币
456
专家
0
粉丝
3
只看该作者 5楼 发表于: 2016-04-12
这种分享精神得赞一个!
离线799946503

发帖
8938
M币
10137
专家
64
粉丝
273
只看该作者 6楼 发表于: 2016-04-12
这数据不是什么秘密,用几十块钱的USB逻辑分析仪接在原车上,很容易就知道应该发什么数据了
离线about

发帖
685
M币
1402
专家
1
粉丝
11
只看该作者 7楼 发表于: 2016-04-12
大公无私,好大公无私,好
离线zls8877

发帖
1861
M币
230
专家
1
粉丝
4
只看该作者 8楼 发表于: 2016-04-12
大公无私,好 。
离线fghjgjjfg

发帖
426
M币
277
专家
1
粉丝
24
只看该作者 9楼 发表于: 2016-04-12
本田缤智的车机可以用吗
快速回复
限80 字节
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
 
上一个 下一个