×

大众车机的模拟解码器

lixiaoyao lixiaoyao 发表于2016-04-12 19:40:47 浏览3338 评论1

1人参与发表评论

 

一直看到坛友发的模拟器,芯片太多不好做.
我没有自己画图,就借网友的图修改修改做个示意就好了,反正很简单.
蓝牙背光可用并可自己控制。修改了车机can的两根线用于下载程序,下载好了之后这两根又是按键背光和点火.
顺便把我自己写的程序也贡献出来好了.
当时因为数据的来源原因一直没有发布,但是现在已经在网上开始流传了,应该不能怪我头上了.
先贴我的修改好的图,就一张,和示意用的电路图,修改网友的来的.不是抄袭哈.实在是就是这么简单
这些都不重要,重要的是我的c程序.一直用到现在,证明是可靠的.
你可以随意添加适用的数据.我这只有5gg 035 185 和 34d 035 185的
当然也可以加低速的,不过程序可以参考我的,你添加低速的发送程序,
理论上可以高速低速全整合,可以通吃所有的can车机(前提车机只收不发并且你有数据)
看来大家挺关心大众车机的模拟解码器的,我也发布下我自己做的吧.绝对最简单


直接贴代码加工程

#define nop _nop_()
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#include<stc15f104e.h>
#include<intrins.h>
#include<erjinzhi.h>
//型号:stc15f104e   频率设定为12MHz
sbit can_l=P3^4;  //输出引脚,和rx同相
sbit acc=P3^0;   //点火
sbit led=P3^1;   //背光
uchar time;
void delay(uint t)
{
uchar i,j;
for(;t;t--)
  for(i=200;i;i--)
   for(j=25;j;j--);
}
void sendcan(uint canid,uchar num,uchar dat1,uchar dat2,uchar dat3,uchar dat4,uint cancrc)
{
uchar i,j;
uchar idata loadbuf[80];
for(i=79;i;i--)loadbuf=0xff;
loadbuf[0]=0; //起始
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;
}
for(j=8;j;j--)//数据1
{
  if(dat1&0x80)loadbuf[i++]=1;
  else  loadbuf[i++]=0;
  dat1<<=1;
}
for(j=8;j;j--)//数据2
{
  if(dat2&0x80)loadbuf[i++]=1;
  else  loadbuf[i++]=0;
  dat2<<=1;
}
for(j=8;j;j--)//数据3
{
  if(dat3&0x80)loadbuf[i++]=1;
  else  loadbuf[i++]=0;
  dat3<<=1;
}
for(j=8;j;j--)//数据4
{
  if(dat4&0x80)loadbuf[i++]=1;
  else  loadbuf[i++]=0;
  dat4<<=1;
}
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=79;    //j指向底部
for(;i;)
  loadbuf[j--]=loadbuf[--i];//底部对齐
num=1;
i=loadbuf[0]=0;
for(j+=2;j<80;)   //重新左对齐,并逢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<80;)loadbuf[i++]=0x01;
for(i=0;i<80;i++)
{
  can_l=loadbuf;
  nop;nop;nop;
}    
}
void main()
{
delay(400);
for(time=10;time>0;time--)
{
  delay(500);
  if(acc)sendcan(0x3c0,0x4,0xa0,0xa0,0x33,0x33,0x1ceb);//开电源
  else   sendcan(0x3c0,0x4,0x00,0x00,0x00,0x00,0x0190);//关电源
  delay(100);
  if(led)sendcan(0x5f0,0x4,0xe4,0xe4,0x00,0x00,0x1efd);//开大灯
  else   sendcan(0x5f0,0x4,0x00,0x00,0x00,0x00,0x0391);//关大灯
}
while(1)
{
//  delay(60000);time++;
  if(acc)sendcan(0x3c0,0x4,0xa0,0xa0,0x33,0x33,0x1ceb);//开电源
  else   sendcan(0x3c0,0x4,0x00,0x00,0x00,0x00,0x0190);//关电源
  delay(100);
  if(led)sendcan(0x5f0,0x4,0xe4,0xe4,0x00,0x00,0x1efd);//开大灯
  else   sendcan(0x5f0,0x4,0x00,0x00,0x00,0x00,0x0391);//关大灯
//  sendcan(0x470,0x4,0x00,0x00,0x47,0x00,0x3d5a);
//  sendcan(0x470,0x4,0x00,0x00,0x00,0x00,0x769f);
//  delay(100);
//  sendcan(0x5f0,0x4,0xe4,0xe4,0x00,0x00,0x1efd);
//  sendcan(0x5f0,0x4,0x00,0x00,0x00,0x00,0x0391);
//  delay(100);
//  sendcan(0x570,0x4,0x03,0x00,0x00,0x00,0x0c63);
//  sendcan(0x570,0x4,0x00,0x00,0x00,0x00,0x2f6b);
//  delay(100);
//  sendcan(0x3c0,0x4,0xa0,0xa0,0x33,0x33,0x1ceb);
//  sendcan(0x3c0,0x4,0x00,0x00,0x00,0x00,0x0190);
//  delay(400);
}
}


工程: can.rar (36 K) 下载次数:4
编译好的hex文件直接在工程中.
不过要注意的是频率要选择12m.另外我为了适应适应自己的车机,重新修改到p3.4输出了。你需要重新定义编译下。

[ 此帖被decai在2016-04-12 11:29重新编辑 ]
               
  • 看来大家挺关心大众车机的模拟解码器的,我也发布下我自己做的吧.绝对最简单

访客
访客 访客2021-01-25 16:59:45 · 回复 大侠:
loadbuf=loadbuf[j]; //添反码
loadbuf++;
loadbuf&=0x01;
这三行能给修正一下吗?