标题:
PIC16F639单片机的PKE方案源程序 3D天线可低频(125K)唤醒,空中高频端数据采用滚...
[打印本页]
作者:
lddjss
时间:
2020-6-28 15:12
标题:
PIC16F639单片机的PKE方案源程序 3D天线可低频(125K)唤醒,空中高频端数据采用滚...
PIC16F639单片机C语言代码,附件完整工程MPLAB IDE可直接打开,主要功能:3D天线可低频(125K)唤醒,空中高频端数据采用滚码方式加密,PIC内部硬件加密没用。。。
单片机源程序如下:
#include <pic.h>
#include <string.h>
#include"Keeloq.h"
__CONFIG(0x1004); //0001 0000 0000 0100
#define LED RC0
#define AFECS RC1 // CS
#define AFESCLK RC2 // SCLK
#define AFESDI RC3 // SDI
bit Wake_flag = 0; //休眠、工作标志位
/*******************************************************************************************/
/*void write_byte(unsigned char com,unsigned char addr,unsigned char byte) */
/*com命令 addr为地址 byte要写入寄存器的数据 */
/*写命令0x07 读命令0x06 */
/*******************************************************************************************/
void write_byte(unsigned char com,unsigned char addr,unsigned char byte)
{
unsigned char i,temp;
unsigned char dat;
unsigned char crc;
TRISC = 0x00; //RC0.1.2.3.4.5输出
asm("nop");
asm("nop");
AFESCLK = 0;
AFESDI = 0;
AFECS = 0; //使能SPI
com = com << 4; //0000 0111
temp = addr|com; //0111 xxxx
temp = temp << 1; //将高位移除
for(i=0;i<7;i++) //写命令加地址
{
dat = temp&0x80;
temp = temp << 1;
if(dat==0x80)
AFESDI = 1;
else
AFESDI = 0;
AFESCLK = 1; //产生上升沿
asm("nop");
asm("nop");
asm("nop");
asm("nop");
AFESCLK = 0;
//AFESDI = 0;
}
crc = 0; //用于数据位1的个数
temp = byte;
for(i=0;i<8;i++)
{
dat = temp&0x80;
temp = temp <<1;
if(dat==0x80)
{
AFESDI = 1;
crc ++;
}
else
AFESDI = 0;
AFESCLK = 1; //进行数据采样
asm("nop");
asm("nop");
asm("nop");
asm("nop");
AFESCLK = 0;
//AFESDI = 0;
}
if(crc%2==0) //偶数个1
{
AFESDI = 1;
AFESCLK = 1; //进行数据采样
asm("nop");
asm("nop");
asm("nop");
asm("nop");
AFESCLK = 0;
AFESDI = 0;
}
else
{
AFESDI = 0;
AFESCLK = 1; //进行数据采样
asm("nop");
asm("nop");
asm("nop");
asm("nop");
AFESCLK = 0;
AFESDI = 0;
}
TRISC = 0x08;
AFECS = 1;
}
/*******************************************************************************************/
/*unsigned char read_byte(unsigned char addr) */
/*addr为地址 返回读到数据 */
/*先写入命令+地址+无效数据(合计16位)拉高CS 再拉低CS 发送SCLK时钟读出数据 */
/*******************************************************************************************/
unsigned char read_byte(unsigned char addr)
{
unsigned int temp = 0;
unsigned char i;
write_byte(0x06,addr,0x00); //先写入命令和地址和无效数据
TRISC = 0x00; //0000 0100
asm("nop");
asm("nop");
asm("nop");
asm("nop");
AFECS = 0;
for(i=0;i<16;i++) // 1010 0000 1
{
AFESCLK = 1;
if(AFESDI) temp = temp|0x01;
temp = temp<<1;
AFESCLK = 0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
TRISC = 0x08;
AFECS = 1;
temp = temp>>1;
return temp;
}
/*******************************************************************************************/
/*void LF_Configuration(void) */
/*低频配置 */
/*写命令0x07 读命令0x06 */
/*******************************************************************************************/
void LF_Configuration(void)
{
//const unsigned char AFEConfig[6]={0x00,0x00,0x00,0x00,0x00,0x30};//解调输出无唤醒
const unsigned char AFEConfig[6]={0xa0,0x00,0x00,0x00,0x00,0x00};//解调输出唤醒序列
unsigned char i,j,k; //0xa0,0x00,0x00,0x00,0x00,0x10
unsigned char AFEConfig6 = 0; //列校验
for(i=0;i<8;i++) //校验数据,生成列校验寄存器的值
{
j = 0;
AFEConfig6 = AFEConfig6 <<1;
for(k=0;k<6;k++)
{
switch(i)
{
case 0: j = j^(AFEConfig[k]&0x80);
break;
case 1: j = j^(AFEConfig[k]&0x40);
break;
case 2: j = j^(AFEConfig[k]&0x20);
break;
case 3: j = j^(AFEConfig[k]&0x10);
break;
case 4: j = j^(AFEConfig[k]&0x08);
break;
case 5: j = j^(AFEConfig[k]&0x04);
break;
case 6: j = j^(AFEConfig[k]&0x02);
break;
case 7: j = j^(AFEConfig[k]&0x01);
break;
}
}
if(j==0) AFEConfig6 = AFEConfig6 | 0x01;
}
/* while(1)
{
write_byte(0x07,0x00,AFEConfig[0]);
Delay_1ms(5);
} */
write_byte(0x07,0x00,AFEConfig[0]);
write_byte(0x07,0x01,AFEConfig[1]);
write_byte(0x07,0x02,AFEConfig[2]);
write_byte(0x07,0x03,AFEConfig[3]);
write_byte(0x07,0x04,AFEConfig[4]);
write_byte(0x07,0x05,AFEConfig[5]);
write_byte(0x07,0x06,AFEConfig6);
}
/*******************************************************************************************/
/*初始化时钟、IO、中断 */
/*******************************************************************************************/
void InIt(void)
{
TRISC = 0x00; //0000 0000 //RC0.1.2.3.4.5输出
OSCCON = 0x71; //0110 0001 //内部振荡器用于系统时钟:8MHz
PCON = 0x00; //0000 1011 //电源控制
T1CON=0x00;
EECON1=0x00;
CMCON0 = 0x07; //关闭引脚比较器功能、模拟端口转入数字端口
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
key-pic16f639.rar
(132.86 KB, 下载次数: 50)
2020-6-28 15:11 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
philix
时间:
2020-11-4 14:53
实际量产过吗?
作者:
chscn
时间:
2021-1-25 10:13
不全,只是钥匙部分的低频唤醒
作者:
peishuaihua
时间:
2024-1-8 09:18
IMMO功能无线充电这块做过吗
作者:
keyway
时间:
2024-9-15 08:36
样品1颗不到5元,量产后1颗涨到100元,microchip我好怕喔.
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1