yxylxj 发表于 2015-3-18 14:56:45

有用STC51解码Keeloq(hcs301)的吗?

有用STC51解码Keeloq(hcs301)的吗?

fsmcu 发表于 2015-3-18 15:46:51

以前用51做过,网上很容易下载到这种代码

yxylxj 发表于 2015-3-18 15:58:54

fsmcu 发表于 2015-3-18 15:46
以前用51做过,网上很容易下载到这种代码

要不你提供一个 ,我找到了pic 的但是对pic的 不熟悉

yxylxj 发表于 2015-3-18 16:06:12

yxylxj 发表于 2015-3-18 15:58
要不你提供一个 ,我找到了pic 的但是对pic的 不熟悉

51_KEELOQ_HCS301 现在常用的都是PIC解滚码 0/301,及那个DECRYPT的加密算法 很少能找到这样的C程 SCM 单片机开发 210万源代码下载- www.pudn.com
http://www.pudn.com/downloads194/sourcecode/embed/detail912953.html    这里有个 谁可以下载吗

jlhgold 发表于 2015-3-19 21:40:24

yxylxj 发表于 2015-3-18 16:06
51_KEELOQ_HCS301 现在常用的都是PIC解滚码 0/301,及那个DECRYPT的加密算法 很少能找到这样的C程 SCM 单 ...

你说的是这个吗?

沉默胜过白金 发表于 2015-3-19 21:46:36

jlhgold 发表于 2015-3-19 21:40
你说的是这个吗?

你的莫元为什么是负的。。。

yxylxj 发表于 2015-3-20 11:02:41

jlhgold 发表于 2015-3-19 21:40
你说的是这个吗?

这个好像是的 没有验证 ,不知打坛友们 有没有实际验证过的

dadian 发表于 2015-3-20 14:37:42

jlhgold 发表于 2015-3-19 21:40
你说的是这个吗?

这个有实验好用么?少文件吧!

jlhgold 发表于 2015-3-20 20:09:07

沉默胜过白金 发表于 2015-3-19 21:46
你的莫元为什么是负的。。。

只是被扣了而已 呵呵

maplewang 发表于 2015-7-28 13:52:46

官方说用他们的代码智能用PIC的单片机。

qxc16b 发表于 2015-8-4 14:51:44

我用过51的解Keeloq码,51会干扰无线接收板,能解码但接收距离会很近,用PIC的就很好。

bh7ijm 发表于 2015-8-18 16:36:25

{:handshake:}{:handshake:}{:handshake:}

sunzhilei123 发表于 2020-7-7 14:16:57

这个不错,下来学习。

wuyubin 发表于 2020-7-8 16:01:10

我也想了解STC51解码Keeloq(hcs301)的程序

yangjun4618 发表于 2020-9-1 14:04:55

#include "bsp_timer.h"
#include "bsp_rf.h"
#include "user.h"
#include "bsp_eeprom.h"
#include "bsp_key.h"
#include "bsp_init.h"

bit gReceiveSuccessFlag;      //接收标志 1表示成功
bit DecryptSuccessFlag;       //解码标志 1表示成功
unsigned char aux;
unsigned char RFdata_Buf;//hcs301数据缓存
unsigned char RFdata_save;
unsigned char key;            //按键值
unsigned char Decrypt_Data;//hcs301解码数据缓存
unsigned char data_save;
unsigned char SEED;
bit Ch1,Ch2,Ch3,Ch4;   
extern volatile unsigned char workMode;

#define BIT_TEST( b, n) (( (b) & (1<<(n))) != 0)

//企业代码
unsigned char setDcode={0x53,0x06,0xE5,0xBA,0x3A,0xF2,0x04,0x7E};

unsigned char Dcode;
/*
-------------------------------------
function: void Set_Dcode(void)
----->HCS301种子码设置,8字节十六进制
-------------------------------------
Input:   NULL
Ouput:   NULL
-------------------------------------
*/
void Set_Dcode(void)
{
                Dcode=setDcode;
    Dcode=setDcode;
    Dcode=setDcode;
    Dcode=setDcode;
    Dcode=setDcode;
    Dcode=setDcode;
    Dcode=setDcode;
    Dcode=setDcode;
}

/*
-------------------------------------
function: void Receive_hcs301Code(void)
----->HCS301编码接收,64bit数据存放在RFdata_Buf数值中
----->RFdata_Buf- 滚动部分
----->RFdata_Buf- 固定部分(-:SN : 高4位为键值 低4位为SN
-------------------------------------
Input:   NULL
Ouput:   NULL
-------------------------------------
*/
void Receive_hcs301Code(void)
{
        unsigned intLastCaptureData,Te_pulse,Te_half;
        unsigned char i_bits;
        unsigned char gRxBuffIndex=0;
        unsigned char gIndex=8;
        TR1 = 1;
        gReceiveSuccessFlag = 0;
        DecryptSuccessFlag = 0;
        setTim1Count(0);
        if(RF)
        {
                while(RF)
                {
                        if(getTim1Count()>10000) return;
                        //按键触发,立刻退出
                        if(!KEY) return;
                }
                setTim1Count(0);
                while(!RF)
                {
                        if(getTim1Count()>60000) return;
                        //按键触发,立刻退出
                        if(!KEY) return;
                }
               
                //获取信号头10Te
                LastCaptureData=getTim1Count();
                setTim1Count(0);
               
                //获取Te_pulse -> 1Te速率值
                Te_pulse=LastCaptureData/10;
                //0.5Te用于数据接收判定
                Te_half=Te_pulse>>1;
               
                for(i_bits=0;i_bits<64;i_bits++)
                {
                        while(getTim1Count() < Te_half);
                        setTim1Count(0);
                       
                        if(!RF)return;
                               
                        while(getTim1Count() <Te_pulse);
      setTim1Count(0);
               
                        if(RF)
                                RFdata_Buf=RFdata_Buf&0x7f;
                        else
                                RFdata_Buf=RFdata_Buf|0x80;
                               
                        gIndex=gIndex-1;
                       
                        if(gIndex)
                                RFdata_Buf=RFdata_Buf>>1;
                        else
                        {
                                gRxBuffIndex++;
                                gIndex=8;
                        }
                       
                        while(getTim1Count() <Te_pulse);       
                  setTim1Count(0);
               
                        if(RF)        return;
                       
                        while(!RF)
                        {
                                if(getTim1Count()>Te_pulse)
                                        return;
                        }
                       
                        setTim1Count(0);
                }
                gReceiveSuccessFlag=1;
                RFdata_save = RFdata_Buf;
                RFdata_save = RFdata_Buf;
                RFdata_save = RFdata_Buf;
                RFdata_save = RFdata_Buf;
                key = RFdata_Buf&0xf0;
                TR1 = 0;
        }
}

/*
-------------------------------------
function: void Receive_hcs301Code(void)
----->Hcs301一般模式解码
----->此解码程序可以在各种芯片上直接使用
-------------------------------------
Input:   NULL
Ouput:   NULL
-------------------------------------
*/
void Hcs301_Decrypt(void)
{
    unsigned char i, j, key;
    char p;   
    unsigned charccc,bbb;
   
    DecryptSuccessFlag = 0;//清除解码标志位
    p = 1;
    for (j=66; j>0; j--)
    {
      key = Dcode;
      if ( p < 0)
            p += 8;
      for (i=8; i>0; i--)
      {
            // NLF
            if ( BIT_TEST( RFdata_Buf,6))
            {
                if ( !BIT_TEST( RFdata_Buf,1))
                  aux = 0x3a; //0b00111010;   // 10
                else
                  aux = 0x5c;//0b0101 1100;   // 11
            }
            else
            {
                if ( !BIT_TEST( RFdata_Buf,1))
                  aux = 0x74; //0b01110100;   // 00
                else
                  aux = 0x2e;//0b00101110;   // 01
            }

            // move bit in position 7
            if ( BIT_TEST( RFdata_Buf,3))
                                                {
                                                                ccc=aux;
                                                                ccc=ccc&0x0f;
                                                                bbb=aux;
                                                                bbb=bbb>>4;
                                                                aux=ccc;
                                                                aux=aux<<4;
                                                                aux=aux+bbb;
       
                                                }
            if ( BIT_TEST( RFdata_Buf,0))
                aux<<=2;
            if (BIT_TEST( RFdata_Buf,0))
                aux<<=1;

            // xor with Buffer and Dkey
            aux ^= RFdata_Buf ^ RFdata_Buf ^ key;

                                                if(aux&0x80)
                                                                ccc=1;
                                                else
                                                                ccc=0;
               
                                                if(RFdata_Buf&0x80)
                                                                bbb=1;
                                                else
                                                                bbb=0;
                                                               
                                                RFdata_Buf=RFdata_Buf<<1;
                                                RFdata_Buf=RFdata_Buf|ccc;
                                                ccc=bbb;
                                               
                                                if(RFdata_Buf&0x80)
                                                                bbb=1;
                                                else
                                                                bbb=0;
                                                               
                                                RFdata_Buf=RFdata_Buf<<1;
                                                RFdata_Buf=RFdata_Buf|ccc;
                                                ccc=bbb;
                                               
                                                if(RFdata_Buf&0x80)
                                                                bbb=1;
                                                else
                                                                bbb=0;
                                                               
                                                RFdata_Buf=RFdata_Buf<<1;
                                                RFdata_Buf=RFdata_Buf|ccc;
                                                ccc=bbb;
                                               
                                                if(RFdata_Buf&0x80)
                                                        bbb=1;
                                                else
                                                        bbb=0;
                                                       
                                                RFdata_Buf=RFdata_Buf<<1;
                                                RFdata_Buf=RFdata_Buf|ccc;
                                                ccc=bbb;
            // rotate Dcode
            key<<=1;
      }
    }
}

/*
-------------------------------------
void NormalKeyGen(void)
----->Hcs301一般模式解码
----->此解码程序可以在各种芯片上直接使用
-------------------------------------
Input:   NULL
Ouput:   NULL
-------------------------------------
*/
void NormalKeyGen(void)
{
        unsigned char HOPtemp;        
        unsigned char SKEYtemp;        

        HOPtemp=RFdata_Buf;
        HOPtemp=RFdata_Buf;
        HOPtemp=RFdata_Buf;
        HOPtemp=RFdata_Buf;
       
        SEED=RFdata_Buf;
        SEED=RFdata_Buf;
        SEED=RFdata_Buf;
        SEED=RFdata_Buf;
       
        SEED &= 0x0f;               
        Set_Dcode();
        RFdata_Buf=SEED;
        RFdata_Buf=SEED;
        RFdata_Buf=SEED;
        RFdata_Buf=SEED;
                               
        RFdata_Buf |= 0x20;                        
        Hcs301_Decrypt();       
       
        SKEYtemp=RFdata_Buf;
        SKEYtemp=RFdata_Buf;
        SKEYtemp=RFdata_Buf;
        SKEYtemp=RFdata_Buf;
       
        RFdata_Buf=SEED;
        RFdata_Buf=SEED;
        RFdata_Buf=SEED;
        RFdata_Buf=SEED;
                               
        RFdata_Buf |= 0x60;            // add constant 0x60
        Set_Dcode();
        Hcs301_Decrypt();
       
        Dcode=RFdata_Buf;
        Dcode=RFdata_Buf;
        Dcode=RFdata_Buf;
        Dcode=RFdata_Buf;
       
        Dcode=SKEYtemp;
        Dcode=SKEYtemp;
        Dcode=SKEYtemp;
        Dcode=SKEYtemp;
       
        RFdata_Buf=HOPtemp;
        RFdata_Buf=HOPtemp;
        RFdata_Buf=HOPtemp;
        RFdata_Buf=HOPtemp;
        Hcs301_Decrypt();

        //解码成功
        if((RFdata_Buf==RFdata_Buf)&&((RFdata_Buf&0xf0)==(RFdata_Buf&0xf0)))
        {
   // Decrypt_Data:4byte SN
   // Decrypt_Data:1byte Count
       
           key = RFdata_Buf&0xf0;//按键值
           Decrypt_Data=RFdata_Buf&0x0f;
           Decrypt_Data=RFdata_Buf;
           Decrypt_Data=RFdata_Buf;
           Decrypt_Data=RFdata_Buf;
           Decrypt_Data=RFdata_Buf;
           Decrypt_Data=RFdata_Buf;
           DecryptSuccessFlag = 1;
        }
        else
                DecryptSuccessFlag = 0;
}

/*
-------------------------------------
function: void save_RFdata(unsigned char channle)
----->遥控对码数据存储
Input:   channle控制的通道数
Ouput:   NULL
-------------------------------------
*/
void save_RFdata(unsigned char channle)
{
        unsigned int _data,_addr,temp,j;
        unsigned char x,y;
        RFnumber = get_RFnumber();
        temp = RFnumber+1;
       
        temp /=64;//64*8 = 5120-7=8扇区
        if(RFnumber >= RF_number_Max)//闪烁五下表示存储已满
        {
                        led_flsah1(5);
                        systemMode = 0;
                        return;
        }
       
        RFdata_save = channle;
       
        for(_data = 0;_data < RFnumber; _data++)
        {
                _addr = RF_Start_Addr+RF_DataWidth*_data;
                y = 0;
                for(x=0; x<4; x++)
                {
                        if(IapRead(_addr+x) == RFdata_save)
                                y++;
                        else
                                break;
                }
               
                if(y == 4)//遥控已经存在,但通道改变
                {
                        //获取第一扇区数据
                        if(temp == 0)
                        {
                                //读取数据缓存
                                for(j = 0; j <512; j++) data_save = IapRead(j);
                                data_save = channle;
                                //擦除扇区
                                IapErase(0x0000);
                                //保存地址
                                for(j = 0; j <512; j++) IapProgram(j,data_save);
                        }
                        else
                        {
                                        //获取第temp个扇区的首地址
                                        _data = EEP_Blank*temp;
                                        //读取数据缓存
                                        for(j = 0; j <512; j++) data_save = IapRead(_data+j);
                                        data_save = channle;
                                        //擦除扇区
                                        IapErase(_data);
                                        //保存地址
                                        for(j = 0; j <512; j++) IapProgram(_data+j,data_save);
                        }
                        systemMode = 0;
                        LED1 = 0;
                        LED2 = 0;
                        LED3 = 0;
                        LED4 = 0;
                        return;
                }
        }
       
        //获取第一扇区数据
        if(temp == 0)
        {
                for(j = 0; j <512; j++) data_save = IapRead(j);
               
                _addr = RF_Start_Addr+RF_DataWidth*RFnumber;
               
                for(x = 0; x<5; x++) data_save = RFdata_save;

                RFnumber++;
                set_RFnumber(RFnumber);
               
                IapErase(0x0000);
                for(j = 0; j <512; j++) IapProgram(j,data_save);
        }
        else
        {
                _addr = RF_Start_Addr+RF_DataWidth*RFnumber;
                //直接保存数据
                for(x = 0; x<5; x++)IapProgram(_addr+x,RFdata_save);
               
                //更新遥控个数值
                for(j = 0; j <512; j++) data_save = IapRead(j);
                RFnumber++;
                set_RFnumber(RFnumber);
                IapErase(0x0000);
                for(j = 0; j <512; j++) IapProgram(j,data_save);
        }
       
        led_flsah1(2);
        systemMode = 0;
        LED1 = 0;
        LED2 = 0;
        LED3 = 0;
        LED4 = 0;
        return;
}

void find_RFdata(void)
{
        unsigned int _data,_addr;
        unsigned char x,y,channle;
        RFnumber = get_RFnumber();
       
        for(_data = 0;_data < RFnumber; _data++)
        {
                _addr = RF_Start_Addr+RF_DataWidth*_data;
                y = 0;
                for(x=0; x<4; x++)
                {
                        if(IapRead(_addr+x) == RFdata_save)
                                y++;
                        else
                                break;
                }
               
                if(y == 4)//遥控已经存在
                {
                        channle = IapRead(_addr+4);
                       
                        switch(channle)
                        {
                                        case 1:
                                                LED1=!LED1;
                                                pressCount1 = 0;
                                                if(workMode==0x01) if(OUT1 != 1) OUT1= 1;
                                                if(workMode==0x02) if(!Ch1)OUT1=!OUT1;
                                                Ch1 = 1;
                                                break;
                                       
                                        case 2:
                                                LED2=!LED2;
                                                pressCount2 = 0;
                                                if(workMode == 0x01) if(OUT2 != 1) OUT2= 1;
                                                if(workMode == 0x02) if(!Ch2)OUT2 = !OUT2;
                                                Ch2 = 1;
                                                break;
                                       
                                        case 3:
                                                LED3=!LED3;
                                                pressCount3 = 0;
                                                if(workMode == 0x01) if(OUT3 != 1) OUT3= 1;
                                                if(workMode == 0x02) if(!Ch3)OUT3 = !OUT3;
                                                Ch3 = 1;
                                                break;
                                       
                                        case 4:
                                                LED4=!LED4;
                                                pressCount4 = 0;
                                                if(workMode == 0x01) OUT4= 1;
                                                if(workMode == 0x02) if(!Ch4)OUT4 = !OUT4;
                                                Ch4 = 1;
                                                break;
                                       
                                        default:
                                                break;

                        }
                }
        }
}
页: [1]
查看完整版本: 有用STC51解码Keeloq(hcs301)的吗?