|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 liyuqing0318 于 2020-4-23 07:32 编辑
媳妇车遥控只有三个按键,一个解锁键,一个上锁键,一个响铃键(不知道厂家怎么想的,设计这么个无用键,不小心按到,声光报警,经常被吓一跳!)用惯了后备箱无钥匙解锁,真适应不了这个后备箱。
改装理想:是用汽车自带遥控器就能进行开启后备箱。
经过观察:发现解锁时按一次遥控按键,车黄灯会闪两次,上锁时就只会闪一次,而且转向和双闪时黄灯点亮的时间比解锁时的时间要长一些。
设计原理:抓取解锁时黄灯闪两次的机会,进行记录,如果在三秒内,又出现了第二次黄灯闪两次,就开启后备箱锁。
材料价格:拉伸弹簧一个10元,拉杆电机一个12元,贴片元件十几个5元。
在此感谢 极速PCB超级工厂对本项目的大力支持:lol:捷配极速PCB超级工厂
施工只需要把左尾转向灯和后备箱照明灯接两根线拉到后备箱钥匙孔处,再钻一个孔固定拉杆电机,再用铁丝弯个拉杆就可以了。
原理图:I接车尾左侧的转向黄灯,MO接电机,REC用来录取按键组合参数(只要能让黄灯闪四下,就会解锁,方便自己设定按键关系)。
用了几天,非常可靠,因为是精准测量开锁时黄灯点亮的时间,所以转向或双闪时一点都不冲突。
整机待机电流不到4毫安,没给电瓶添加负担。

整个板双面胶加扎带,固定在拉杆电机尾部。

PCB图:

3D图:

实物图:
双面胶+扎带将线路板固定在电机一侧。
上车取后备箱照明灯常电12V。不破坏线,红线直接夹在插头上。

黄色线为转向灯取来的信号线。
红色线为后备箱照明灯取来的常电。
一开始安装在这里,无奈电机力气太小拉不开锁,又把电机改到了钥匙孔那里。

接线很简单:红色线为后备箱照明灯取来的常电。黄色线为转向灯取来的信号线。兰色线接车体。
安装位置后来我改到了箱盖钥匙孔这个地方(这里只需要很小的拉力就可以解锁),安装很简单,我只钻了一个孔,固定了电机一个脚,并把地线一起固定了。泡沫是防止开车时异响。
(电机是通电缩回,断电伸出,我自己在电机伸缩皮套那里加个细弹簧)

==================================
#include <STC8.h>
#include "intrins.h"
#define WT_24M 0x81 //EEPROM操作24MHz
#define WT_12M 0x83 //EEPROM操作12MHz
#define WT_6M 0x84 //EEPROM操作6MHz
bit Lamp,Key,Cache,OUTb,H1,H2,H3,H4; //灯状态,按键状态,缓存否,输出标记,标记位
unsigned char Temp,i; //状态计时
unsigned char Lamp_H1,Lamp_H2,Lamp_H3,Lamp_H4; //灯亮时间
unsigned int IN_delay,OUT_delay; //输入延时,输出延时
unsigned int Rec_delay,Unlock_delay; //解锁时间,录入延时
unsigned char address;
sbit IN1 =P5^4; //转向灯的输入脚
sbit Rec_key =P5^5; //录制的设定按键
sbit OUT1=P3^0; //输出脚群
sbit OUT2=P3^1;
sbit OUT3=P3^2;
sbit OUT4=P3^3;
/////////////延时函数=1mS/16//////////////////
void delay(unsigned int i)
{
unsigned int j;
for(i; i > 0; i--)
for(j = 5; j > 0; j--);
}
//////////////端口初始化////////////////
void PortInit()
{
P3M0=0x00; //准双向口,灌电流20mA,拉电流150uA
P3M1=0x00;
P5M0=0x00;
P5M1=0x00;
}
/*******输入状态*************/
void IN() //解锁一次,亮灭两次时间为1S。每次状态为250mS,计25个数,每个数10mS。
{
if(++IN_delay>10) //主循环每运行10次共0.01s就扫描一次
{ IN_delay=0; //记录次数
if(++Temp>250) //超过2.5s时长未改变状态
{
H1=H2=H3=H4=0; //标记位清零
Temp=0; //记录清0
OUT4=0; //////////////////
}
if((IN1)&(!Lamp)) //端口跳高,
{
Lamp=1; //记录当前灯为高
Temp=0; //记录清0
OUT4=1; ////////////////////////
}
if((!IN1)&(Lamp)) //端口跳低,
{ Lamp=0; //记录当前灯为低
OUT4=0; ////////////////////////
if(!H1) //第一次高记录
{
if(Cache)Lamp_H1=Temp; //缓存标志为1,记录时间
if(Lamp_H1-2<Temp&Temp<Lamp_H1+2)
{ H1=1; } //标记位
else
{ H1=0; }
Temp=0; //记录清0
}
if((H1)&(!H2)) //第二次高记录
{
if(Cache)Lamp_H2=Temp; //缓存标志为1,记录时间
if(Lamp_H2-2<Temp&Temp<Lamp_H2+2)
{ H2=1; } //标记位
else
{ H2=0; }
Temp=0; //记录清0
}
if((H1)&(H2)&(!H3)) //第三次高记录
{
if(Cache)Lamp_H3=Temp; //缓存标志为1,记录时间
if(Lamp_H3-2<Temp&Temp<Lamp_H3+2)
{ H3=1; } //标记位
else
{ H3=0; }
Temp=0; //记录清0
}
if((H1)&(H2)&(H3)&(!H4)) //第四次高记录
{
if(Cache)Lamp_H4=Temp; //缓存标志为1,记录时间
if(Lamp_H4-2<Temp&Temp<Lamp_H4+2)
{ H4=1; } //标记位
else
{ H4=0; }
Temp=0; //记录清0
}
Temp=0; //记录清0
}
if(H1&H2&H3&H4) //符合输出条件
{
OUTb=1; //输出标记
H1=H2=H3=H4=0; //标记位清零
}
}
}
/*******输出状态*************/
void OUT()
{ if(++OUT_delay>20) //主循环每运行20次共0.02秒就扫描一次
{ OUT_delay=0;
if(OUTb) //符合输出
{ OUTb=0;
Unlock_delay=0; //解锁时间清零
OUT1=OUT2=OUT3=1; //全部输出
OUT4=1; //////////////////////////
}
else
{ Unlock_delay++; //解锁时间++
if(Unlock_delay>3) OUT1=0;
if(Unlock_delay>5) OUT2=0;
if(Unlock_delay>8) OUT3=0;
}
}
}
/*******EEPROM操作*************/
void IapIdle() //iap空闲关闭操作
{
IAP_CONTR = 0; //关闭IAP功能
IAP_CMD = 0; //清命令寄存器
IAP_TRIG = 0; //清触发寄存器
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
IAP_ADDRL = 0;
}
char IapRead(int addr) //iap读操作
{ char dat;
IAP_CONTR = WT_6M; //使能IAP功能
IAP_CMD = 1; //设置IAP读命令
IAP_ADDRL = addr; //设IAP低地址
IAP_ADDRH = addr>>8; //设IAP高地址
IAP_TRIG = 0x5a; //写触发命令5a
IAP_TRIG = 0xa5; //写触发命令a5
_nop_();
dat = IAP_DATA; //读IAP数据
IapIdle(); //关闭IAP功能
return dat;
}
void IapProgram(int addr,char dat) //IAP写操作 (地址+数据)
{
IAP_CONTR = WT_6M; //使能IAP功能
IAP_CMD = 2; //设置IAP写命令
IAP_ADDRL = addr; //设IAP低地址
IAP_ADDRH = addr>>8; //设IAP高地址
IAP_DATA = dat; //写IAP数据
IAP_TRIG = 0x5a; //写触发命令5a
IAP_TRIG = 0xa5; //写触发命令a5
_nop_();
IapIdle(); //关闭IAP功能
}
void IapErase(int addr) //IAP擦除操作
{
IAP_CONTR = WT_6M; //使能IAP功能
IAP_CMD = 3; //设置IAP擦除命令
IAP_ADDRL = addr; //设IAP低地址
IAP_ADDRH = addr>>8; //设IAP高地址
IAP_TRIG = 0x5a; //写触发命令5a
IAP_TRIG = 0xa5; //写触发命令a5
_nop_();
IapIdle(); //关闭IAP功能
}
/*******录入状态*************/
void REC() //按键按下为低电平,
{ if(++Rec_delay>500) //主循环每运行500次0.5秒就扫描一次
{ Rec_delay=0;
if((!Rec_key)&(!Key)) //按键被第一次按下,
{ Key=1; //记录当前按键被按下
Cache=1; //缓存标志
}
if((Rec_key)&(Key)) //按键第一次抬起,
{ Key=0; //记录当前按键被抬起
Cache=0; //缓存标志
IapErase(0x0040); //写入数据前必须先擦除扇区(512字节)写入FF
IapProgram(0x0040,Lamp_H1); //更新密钥
IapProgram(0x0041,Lamp_H2); //更新密钥
IapProgram(0x0042,Lamp_H3); //更新密钥
IapProgram(0x0043,Lamp_H4); //更新密钥
}
}
}
/****************读钥匙密码***********************/
void Load_Password()
{
Lamp_H1 = IapRead(0x0040); //读取密码
Lamp_H2 = IapRead(0x0041); //读取密码
Lamp_H3 = IapRead(0x0042); //读取密码
Lamp_H4 = IapRead(0x0043); //读取密码
}
///////////////////主程序///////////////////////
void main()
{
PortInit(); //端口初始化
OUT1=OUT2=OUT3=OUT4=0; //关闭全部输出
Load_Password(); //加载钥匙密码
WDT_CONTR = 0X24; //使能看门狗,定时1.05秒,0x24=00100100
while(1)
{
WDT_CONTR |= 0X10; //喂狗 0x10= 00010000
IN(); //扫描灯端口
OUT(); //输出信号
REC(); //学习
delay(90); //延时 1ms
}
}
===============================
|
打赏
-
查看全部打赏
|