標題:
EV1527學習碼無線遙控汽車防盜器單片機程序資料
[打印本頁]
作者:
z637300
時間:
2024-7-30 08:45
標題:
EV1527學習碼無線遙控汽車防盜器單片機程序資料
EV1527是一片由CMOS設計制造的可預
燒內(nèi)碼的學習碼編碼芯片,由軟件解碼。內(nèi)碼共有2O位
元可預燒100萬組內(nèi)碼組合,大大降低了使用編碼上重復
的機率。更重要的是其不可復制性,并且由于可以自學
習,當發(fā)射模塊丟了,只要對接收模塊進行自學習就可以
使原先的發(fā)射模塊失效,大大提高了安全性
單片機源程序如下:
/*
;======================硬件結(jié)構(gòu)======================
;
; __________
;
;
*/
//8路控制程序
//
#include <pic.h>
__CONFIG( WDTDIS & PWRTEN &INTOSCIO & MCLRDIS & BOREN & CPD & CPROTECT);
#define uchar unsigned char
#define uint unsigned int
#define rfin RA0
#define learnkey RA5
#define LED RA4
#define VT RA1
#define OUT1 RC2
#define OUT2 RC1
#define OUT3 RC0
#define OUT4 RA2
#define L_M RC5
#define max_how 15
//學習變量
uchar learnbuf0;
uchar learnbuf1;
uchar learnbuf2;
//===================//
bit learnf;
bit fun_out;
bit learn_ok;
bit fun_ok;
//========================//
//記時間變量
uchar temp0;
uchar temp1;
uchar temp2;
uchar out_temp0;
uchar out_temp1;
//=========================//
//RF接收變量
uchar rec_count;
uchar lo_buf;
uchar hi_buf;
uchar cs2;
uchar cs1;
uchar cs0;
//RF接收標志
bit rfstart1;
bit rfstart;
bit rfok;
bit rf_er;//接收失敗
//===============================//
//定時中斷
void interrupt all ()
{
CLRWDT();
temp0++;
out_temp0++;
if(T0IF==1)
{
T0IF=0;
TMR0=0;
}
if(TMR1IF==1)
{
TMR1IF=0;//清中斷標志位
TMR1L=180;
TMR1H=255;
}
if(out_temp0>200)
{
out_temp0=0;
out_temp1++;
if(out_temp1>20)
{
out_temp1=0;
VT=0;
if(L_M==0)
{
OUT1=0;
OUT2=0;
OUT3=0;
OUT4=0;
}
}
/*
if(out_temp1>30)
{
out_temp1=0;
if(L_M==0)
{
OUT1=0;
OUT2=0;
OUT3=0;
OUT4=0;
}
}
*/
}
//時間程序
if(temp0>200)//2MS
{
CLRWDT();
temp0=0;
temp1++;
if(temp1>10)
{
fun_ok=0;
}
if(temp1>50)
{
}
if(temp1>8)
{
learn_ok=0;//400ms
}
if(temp1>200)
{
CLRWDT();
temp1=0;
temp2++;
if(temp2>6)
{
learnf=0;//學習時間為20秒
}
}
}
//RF接受程序
if(rfin==1)
{
if(rfstart1==1)//由低到高開始接收
{
if(lo_buf>hi_buf)//判斷是否低電平
{
if(lo_buf>5&&lo_buf<19&&hi_buf>2&&hi_buf<9)
{
rec_count++;//是低電平
cs0<<=1;//移動一位
}
else
{//接收失敗
rf_er=1;
}
}
else if(lo_buf<hi_buf)//判斷是否低高電平
{
if(lo_buf>2&&lo_buf<9&&hi_buf>5&&hi_buf<19)//判斷高電平是否大于900US和低電平大于200US
{
rec_count++;//是高電平
cs0<<=1;//移動一位
cs0++;
}
else
{
rf_er=1;
}
}
else if(lo_buf==hi_buf)
{
rf_er=1;
}
if(rf_er==1)
{
rfstart=0;//接收失敗
rec_count=0;
rfok=0;
}
else
{
if(rec_count==8){cs2=cs0;}
else if(rec_count==16){cs1=cs0;}
}
if(rec_count==24)
{
rfok=1;//接收成功
}
hi_buf=0;//rfstart1==1函數(shù)
}
else if(lo_buf>30&&lo_buf<180)//判斷同步頭
{
rfstart=1;//檢測到正確的同步頭
rec_count=0;//接收位數(shù),清除0
}
hi_buf++;
lo_buf=0;
rfstart1=0;
rf_er=0;//接收失敗標志
}
//===================================//
else
{ //輸入端口為低電
lo_buf++;
if(rfstart==1)//開始接收標志
{
rfstart1=1;
}
else
{
hi_buf=0;
}
}
}//TMR1IF==1函數(shù)內(nèi)
//==============================//
void learnkeypr(void)
{
if(learn_ok==0)//正在學習
{
uchar i,b;
uint j;
LED=0;
CLRWDT();
CLRWDT();
CLRWDT();
if(learnkey==0)
{
//LED=1;
for(j=0;j<=50000;j++){}
if(learnkey==0)
{
PORTC=0;
PORTA=0;
LED=1;
temp0=0;
temp1=0;
temp2=0;
while((temp2<2)&&learnkey==0)//6==20S
{
LED=1;
CLRWDT();
}//長按25秒擦除EE
if(learnkey==0)
{
LED=1;
b=0x0ff;
for(i=0;i<=127;i++){EEPROM_WRITE(i=i,b);}
LED=0;
CLRWDT();
while(learnkey==0){}
}
else
{
CLRWDT();
temp0=0;
temp1=0;
temp2=0;
LED=0;
learnf=1;//進入學習
}
}
}
}
}
//===============================================//
void init(void){ //初始化函數(shù)
CLRWDT();
OSCCAL=_READ_OSCCAL_DATA();
CMCON=0X07; //關(guān)閉比較器
//MOVLW TRISAV ; 0111B
//MOVWF TRISA
//MOVLW TRISBV
//MOVWF TRISC
TRISA=0b11101001;
TRISC=0b11111000;
GIE=1;//開總中斷
PEIE=1;
TMR1IE=1; //開啟定時中斷1
T0IE=0; //關(guān)閉定時器1中斷
OPTION=0X00; //開內(nèi)部上拉
T1CON=0X01;//使用定時器1
TMR1L=180;
TMR1H=255; //定義100US中斷一次
WPUA=0X0;//關(guān)閉上拉
PORTA=0;
PORTC=0;
}
void learnok(void)
{
LED=1;//學習成功
learn_ok=1;//學習成功
learnf=0;
temp0=0;
temp1=0;
temp2=0;
}
void save_learn(void)
{
EEPROM_WRITE(127,learnbuf0);//存入指針
learnbuf0=learnbuf0*3;
EEPROM_WRITE(learnbuf0=learnbuf0,cs0);
learnbuf0++;
EEPROM_WRITE(learnbuf0=learnbuf0,cs1);
learnbuf0++;
EEPROM_WRITE(learnbuf0=learnbuf0,cs2);
learnok();
}
復制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1