数码之家

 找回密码
 立即注册
搜索
查看: 264|回复: 8

[C51] 有大神有老站大众can的附件或者指明下代码哪里出错了吗?

[复制链接]
发表于 2024-5-15 09:31:52 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
想模拟下大众185主机can模拟器,但是复制代码编译不通过,老站的附件又不能下,请有附件的大神给发一份或者帮忙看下代码哪里不对,编译不能通过,应该是这几句


    loadbuf=loadbuf[j]; //添反码
    loadbuf++;
    loadbuf&=0x01;
   }
   j++;


原帖地址:http://bbs.mydigit.cn/read.php?tid=1614190
发表于 2024-5-15 10:54:39 | 显示全部楼层
老站的附件可以下载啊,就是要M币
回复 支持 反对

使用道具 举报

发表于 2024-5-16 09:30:16 | 显示全部楼层
这不就是我写的程序么,因为论坛的原因,贴在网页上的代码带有中括号的会自动消失.所以就错了.
有m币的话你可以直接下载附件.,工程包是没有问题的.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-23 21:33:04 | 显示全部楼层
decai 发表于 2024-5-16 09:30
这不就是我写的程序么,因为论坛的原因,贴在网页上的代码带有中括号的会自动消失.所以就错了.
有m币的话你可 ...

大佬出现,膜拜下!是的,就是您写的帖子,几乎每个楼层都刷了,也看到您说过是丢了中括号,也有群友说丢失中括号的是i++和j++,但是没找到在哪。麻烦您指导下或者给个附件,老站确实M币不够
回复 支持 反对

使用道具 举报

发表于 2024-5-24 14:46:43 | 显示全部楼层
loadbuf=loadbuf[j]看上去感觉有问题,loadbuf[j]说明loadbuf是一个数组,loadbuf自身是一个指向数组起始位置的指针,loadbuf=loadbuf[j]就是把loadbuf数组里面下标为j的元素赋值给loadbuf这个指针本身,感觉有问题
回复 支持 反对

使用道具 举报

发表于 2024-5-24 23:17:47 | 显示全部楼层
我来借花献佛!  我那时候也问了为啥出错 有人说括号被吃了  我就下载了附件
以下是当时我根据 @decai  大佬的代码改的 用定时器0来发码 1T单片机都可以用 换单片机不用调整延时时间
测试过12mhz 也能用 但是后来还是改成24mhz了
单片机下载时候一定要设置为24mhz 不然
#define k500 0xd0
#define k125 0x40
#define k100 0x10

这里计时数据要改成对应主频的计时时间

sbit KEY1=P3^3;

sbit can_l=P5^5;        // 测试主板
根据自己的 单片机改 这两个端口
要发送开机码 需要把KEY1 拉低



  1. #include <STC15.H>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define ulong unsigned long
  6.        


  7.        
  8. #define k500 0xd0
  9. #define k125 0x40
  10. #define k100 0x10


  11. uint code cancode[][4][7]=
  12. {
  13.        
  14. //数据代表意思依次为
  15.         //贞id,数据字节数,4个数据不满4个补0,crc校验,can速度
  16.         //暂时只做了最长4个数据的,crc只是看的,实际发送的值是程序自动计算的,
  17.         //can的速度暂时只支持100k,125k,500k,
  18.         { //5gg 035 185 高尔夫7 //500k               
  19.                 {0x5f0,4,0xe4,0xff,0x00,0x00,500},//开灯
  20.                 {0x5f0,4,0x00,0x00,0x00,0x00},//关灯
  21.                 {0x3c0,4,0xa0,0xa0,0x03,0x00},//ACC_ON
  22.                 {0x3c0,4,0x00,0x00,0x00,0x00},//ACC_OFF               
  23.         },
  24.                
  25.         { //34d 035 185 //500k
  26.                 {0x470,4,0x00,0x00,0x47,0x00,500},//开灯
  27.                 {0x470,4,0x00,0x00,0x00,0x00},//关灯
  28.                 {0x570,4,0x03,0x00,0x00,0x00},//ACC_ON
  29.                 {0x570,4,0x00,0x00,0x00,0x00}//ACC_OFF
  30.         },
  31.         { //rcd300+//100k
  32.                 {0x635,4,0x60,0x60,0x00,0x00,100},//开灯
  33.                 {0x635,4,0x00,0x00,0x00,0x00},//关灯
  34.                 {0x271,4,0x87,0x00,0x00,0x00},//ACC_ON
  35.                 {0x271,4,0x00,0x00,0x00,0x00}//ACC_OFF
  36.         },
  37. };



  38. void Timer0Init(bit dat)                //定时器工作于计时模式
  39. {
  40.         AUXR |= 0x80;                //定时器时钟1T模式
  41.         TMOD &= 0xF0;                //设置定时器模式       
  42.         if(dat)                                //定时模式
  43.         {
  44.                 EA=1;
  45.                 TL0 = 0x40;                //设置定时初值                //1毫秒@24.000MHz
  46.                 TH0 = 0xA2;                //设置定时初值
  47.                 TF0 = 0;                //清除TF0标志
  48.                 ET0 = 1;                //定时器中断
  49.                 TR0 = 1;                //定时器0开始计时
  50.                
  51.         }
  52.         else                        //计时模式
  53.         {
  54.                 EA=0;
  55.                 TL0 = 0xd0;                //设置定时初值
  56.                 TH0 = 0xff;                //设置定时初值
  57.                 TF0 = 0;                //清除TF0标志
  58.                 ET0 = 0;                //定时器中断
  59.                 TR0 = 0;                //定时器计时
  60.         }
  61. }


  62. sbit KEY1=P3^3;
  63. sbit Test=P5^4;
  64. sbit can_l=P5^5;        // 测试主板


  65. void out_candat(uchar dat,uchar id)
  66. {
  67.         uint temp,temp1;
  68.         uchar i=0,j,k;
  69.         char idata  loadbuf[90];
  70.         temp=cancode[dat][id][0] << 5;
  71.        
  72.         loadbuf[i++]=0;
  73.         for(j=11;j;j--)
  74.         {
  75.                 if(temp & 0x8000)        loadbuf[i++]=1;
  76.                 else                                loadbuf[i++]=0;
  77.                 temp <<= 1;
  78.         }
  79.         loadbuf[i++]=0;                //非远程请求
  80.         loadbuf[i++]=0;                //非扩展帧
  81.         loadbuf[i++]=0;                //保留位
  82.         temp = cancode[dat][id][1] << 4;
  83.         for(j=4;j;j--)
  84.         {
  85.                 if(temp & 0x80)        loadbuf[i++]=1;
  86.                 else                        loadbuf[i++]=0;
  87.                 temp <<= 1;
  88.         }
  89.         temp1 = cancode[dat][id][1];
  90.         for(j=0;j<temp1;j++)
  91.         {
  92.                 temp = cancode[dat][id][2+j];
  93.                 for(k=0;k<8;k++)
  94.                 {
  95.                         if(temp&0x80)         loadbuf[i++] = 1;
  96.                         else                         loadbuf[i++] = 0;
  97.                         temp <<= 1;
  98.                 }
  99.         }
  100.        
  101.         temp=0;
  102.         j=0;
  103.         while(j<i)
  104.         {
  105.                 temp1=((uint)(loadbuf[j++]))<<14;
  106.                 temp=temp1^temp;
  107.                 temp<<=1;
  108.                 if(temp&0x8000)temp^=0x4599;
  109.         }
  110.         temp&=0x7fff;
  111.         temp<<=1;
  112.         for(j=15;j;j--)//crc
  113.         {
  114.                 if(temp&0x8000)        loadbuf[i++]=1;
  115.                 else                        loadbuf[i++]=0;
  116.                 temp<<=1;       
  117.         }
  118.         loadbuf[i++]=1;
  119.         loadbuf[i++]=0;
  120.         loadbuf[i++]=1;               
  121.         j=79;
  122.         for(;i;) loadbuf[j--]=loadbuf[--i];
  123.        
  124.         i=loadbuf[0]=0;
  125.         temp=1;
  126.         for(j+=2;j<80;)                 //重新左对齐,并逢5添码
  127.         {
  128.                 if(loadbuf[i]==loadbuf[j])
  129.                 {
  130.                         loadbuf[++i]=loadbuf[j];                       
  131.                         temp++;
  132.                         if(temp>=5)
  133.                         {
  134.                                 temp=1;
  135.                                 i++;
  136.                                 loadbuf[i]=loadbuf[j];        //添反码
  137.                                 loadbuf[i]++;
  138.                                 loadbuf[i]&=0x01;
  139.                         }
  140.                         j++;
  141.                 }
  142.                 else
  143.                 {
  144.                         loadbuf[++i]=loadbuf[j++];                       
  145.                         temp=1;               
  146.                 }
  147.         }
  148.         for(j=7;j;j--)
  149.         loadbuf[i++]=0x01;        //大众主机无 接收应答  所以不发送等待应答 直接默认已经有其他从机应答
  150. //        loadbuf[i++]=0x00;  //大众主机无 接收应答  所以不发送等待应答 直接默认已经有其他从机应答
  151.        
  152.        
  153.         if                (temp=cancode[dat][0][6] == 500)temp = k500;
  154.         else if        (temp=cancode[dat][0][6] == 125)temp = k125;
  155.         else if        (temp=cancode[dat][0][6] == 100)temp = k100;        //速度判断
  156.        
  157.         TL0 = temp;       
  158.         TR0 = 1;                //定时器0开始计时       
  159.        

  160.         for(j=0;j<i;j++)        //发送数据
  161.         {
  162.                 while(!TF0);
  163.                 TF0=0;                       
  164.                 can_l=loadbuf[j];
  165.                 TL0 = temp;                //设置定时初值
  166.         }       
  167.         TR0 = 0;       
  168. }





  169. uint  sys_time=0;
  170. uchar key_time=0;
  171. uchar key_f=0;

  172. void Delay5ms()                //@24.000MHz
  173. {
  174.         unsigned char i, j;

  175.         _nop_();
  176.         _nop_();
  177.         i = 156;
  178.         j = 213;
  179.         do
  180.         {
  181.                 while (--j);
  182.         } while (--i);
  183. }

  184. uchar anjian()
  185. {         
  186.         static uchar key_up=1;//按键按松开标志       
  187.         if(key_up&&KEY1)                //按键松开标志有效 且有按键按下
  188.         {
  189.                 key_f = 1;        //按键按下开始计时
  190.                

  191.                
  192.                 if(key_time>=20)//如果按下时间达到超过20ms
  193.                 {
  194.                         key_f = 0;        //停止计时
  195.                         if(KEY1)                {key_up=0;key_time=0;return 1;}//如果按键还处于按下状态 计时清零  记录按下状态 返回按键值 按下按键返回一次该按键号 不松手不会再次返回按键号
  196.                        
  197.                 }
  198.         }
  199.         else if(!key_up&&KEY1)        {key_time=0; return 2;}  //此处用于检测按键被持续按下状态 一直按下 则一直返回 这里用于检测机器开机状态
  200.         else if(KEY1==0)                                                                //如果按键松开
  201.         {
  202.                 key_up=1;                                                                         //按键松开标志置位
  203.                 key_f=0;
  204.                 key_time=0;
  205.         }            
  206.         return 0;// 无按键按下
  207. }

  208. void main()
  209. {
  210.         uchar key;
  211.         uchar k = 0;
  212.         uchar k1 = 60;
  213.        
  214.         P0M0 = 0x00;
  215.     P0M1 = 0x00;
  216.     P1M0 = 0x00;
  217.     P1M1 = 0x00;
  218.     P2M0 = 0x00;
  219.     P2M1 = 0x00;
  220.     P3M0 = 0x00;
  221.     P3M1 = 0x00;
  222.     P4M0 = 0x00;
  223.     P4M1 = 0x00;
  224.     P5M0 = 0x00;
  225.     P5M1 = 0x00;

  226.         Timer0Init(1);
  227.         sys_time=450;
  228.         while(1)
  229.         {
  230.                 key=anjian();
  231.                 if(key==0)        //检测线被拉低 发送acc 和 开灯模式
  232.                 {
  233.                        
  234.                         if(k1<50)                        //每隔500ms 发送50次
  235.                         {
  236.                                 Test = !Test;
  237.                                
  238.                                 Timer0Init(0);                //定时器计时模式
  239.                                
  240.                                 out_candat(0,0);        //开灯
  241.                                 Delay5ms();       
  242.                                 out_candat(0,2);        //开ACC_ON       
  243.                                
  244.                                 Timer0Init(1);                //定时器定时模式
  245.                                
  246.                                
  247.                                 k1++;
  248.                         }
  249.                        
  250.                         if(sys_time>=500)
  251.                         {
  252.                                 sys_time=0;
  253.                                 k1=0;
  254.                         }
  255.                         k=0;
  256.                 }       

  257.                 if(key==2)
  258.                 {               
  259.                         if(k < 30)        // 检测线拉高后 发送30次关机关灯 后静默 有的机器可以立马处于低功耗模式  有的机器需要十分钟左右进入低功耗模式
  260.                         {
  261.                                 Test = !Test;
  262.                                
  263.                                 Timer0Init(0);
  264.                                
  265.                                 out_candat(0,3);        //关机
  266.                                 Delay5ms();       
  267.                                 out_candat(0,1);        //关灯
  268.                                 Timer0Init(1);       
  269.                                
  270.                                 k++        ;
  271.                                
  272.                         }
  273.                        
  274.                         else
  275.                         {
  276.                                 sys_time=0;
  277.                                 Test=1;
  278.                                 k1=0;
  279.                         }               
  280.                 }
  281.                
  282.         }               
  283. }


  284. //定时器0中断函数
  285. void Timer0Interrupt(void) interrupt 1
  286. {
  287.         sys_time++;
  288.         if(key_f)
  289.         key_time++;//低电平有效次数        
  290. }
复制代码

打赏

参与人数 1家元 +60 收起 理由
踏云行 + 60 感谢分享,资料收下,我先研究下,谢谢.

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2024-5-25 14:21:38 来自手机浏览器 | 显示全部楼层
在电脑上安装个UC浏览器登陆,就可以下载老站的东西了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-25 21:47:48 | 显示全部楼层
文凤轩 发表于 2024-5-25 14:21
在电脑上安装个UC浏览器登陆,就可以下载老站的东西了。

谢谢回复,老站M币不够
回复 支持 反对

使用道具 举报

发表于 2024-5-25 23:20:04 来自手机浏览器 | 显示全部楼层
xueyunmichen 发表于 2024-5-24 23:17
我来借花献佛!  我那时候也问了为啥出错 有人说括号被吃了  我就下载了附件
以下是当时我根据 @decai  大 ...

应该是搞反了  key1不被拉低 也就是说 key1悬空时 发开机码 被拉低 发送关机码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-6-17 11:43 , Processed in 0.327601 second(s), 16 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表