有用STC51解码Keeloq(hcs301)的吗?
有用STC51解码Keeloq(hcs301)的吗? 以前用51做过,网上很容易下载到这种代码 fsmcu 发表于 2015-3-18 15:46以前用51做过,网上很容易下载到这种代码
要不你提供一个 ,我找到了pic 的但是对pic的 不熟悉 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 这里有个 谁可以下载吗 yxylxj 发表于 2015-3-18 16:06
51_KEELOQ_HCS301 现在常用的都是PIC解滚码 0/301,及那个DECRYPT的加密算法 很少能找到这样的C程 SCM 单 ...
你说的是这个吗?
jlhgold 发表于 2015-3-19 21:40
你说的是这个吗?
你的莫元为什么是负的。。。 jlhgold 发表于 2015-3-19 21:40
你说的是这个吗?
这个好像是的 没有验证 ,不知打坛友们 有没有实际验证过的 jlhgold 发表于 2015-3-19 21:40
你说的是这个吗?
这个有实验好用么?少文件吧! 沉默胜过白金 发表于 2015-3-19 21:46
你的莫元为什么是负的。。。
只是被扣了而已 呵呵 官方说用他们的代码智能用PIC的单片机。
我用过51的解Keeloq码,51会干扰无线接收板,能解码但接收距离会很近,用PIC的就很好。 {:handshake:}{:handshake:}{:handshake:} 这个不错,下来学习。 我也想了解STC51解码Keeloq(hcs301)的程序 #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]