www.pudn.com > Moniterrfid.rar > rfid.c
//******************************************************************************************
// 头文件处理
//******************************************************************************************
#include <18F252.H>
#device ICD=TRUE
#fuses HS,NOWDT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#use fast_io(c)
#use fast_io(a)
#use fast_io(b)
//******************************************************************************************
// IO口处理
//******************************************************************************************
#define RF_DATA_IN PIN_C2
#bit Time_Out= 0xff2.2
#bit Star_Timer= 0xfd5.7
//******************************************************************************************
// 变量处理
//******************************************************************************************
// LCD 模块命令
#define DISP_ON 0x0C //开显示
#define DISP_ON_C 0x0E //开显示, 开指针
#define DISP_ON_B 0x0F //开显示, 开指针,开闪烁
#define DISP_OFF 0x08 //关显示
#define CLR_DISP 0x01 //清显示的操作数
#define ENTRY_INC 0x06 //操作数
#define ENTRY_INC_S 0x07 //操作数
#define ENTRY_DEC 0x04 //操作数
#define ENTRY_DEC_S 0x05 //操作数
#define DD_RAM_ADDR 0x80 //初始化第一行显示的操作数
#define DD_RAM_UL 0xc0 //初始化第二行显示的操作数
//*******************************************************
int16 TIMER_1=0;
int8 moniter_Data[11],normal_Data[11];
int8 sendData[11];
int1 Check_Data_bit;
int8 temp;
int8 flag,jing;
int16 last_timer,width,haha;
int8 timeout=0,bit_over=1,bitdata=0;
int8 a=0,b=0;
//******************************************************************************************
// 寄存器处理
//******************************************************************************************
#byte ADCON0=0xfc2
#byte ADCON1=0xfc1
#byte TRISA=0xf92
#byte ADRESH=0xfc4
#byte STATUS=0xfd8
#byte PORTA=0xf80
#byte PORTB=0xf81
#byte TRISA=0xf92
#byte TRISB=0xf93
#byte SPBRG=0xfaf
#byte TXSTA=0xfac
#byte RCSTA=0xfab
#byte TRISC=0xf94
#byte PIE1=0xf9d
#byte RCREG=0xfae
#define GO 2
#define C 0
#define RCIE 5
#bit tim3Str= 0xfb1.0
#bit over= flag.0
#bit LCD_DB7= PORTB.5
#bit LCD_DB6= PORTB.4
#bit LCD_DB5= PORTB.3
#bit LCD_DB4= PORTB.2
#bit LCD_E= PORTA.5
#bit LCD_RS= PORTB.1
#bit LCD_DB7_DIR= TRISB.5
#bit LCD_DB6_DIR= TRISB.4
#bit LCD_DB5_DIR= TRISB.3
#bit LCD_DB4_DIR= TRISB.2
#bit LCD_E_DIR= TRISA.5
#bit LCD_RS_DIR= TRISB.1
#bit CFE_DIR= TRISA.2
#bit CFE = PORTA.2
//******************************************************************************************
// 函数声明处理
//******************************************************************************************
void moniter(void);
void moniter_Inti(void);
void moniter_Clern_Number(void);
void moniter_Recive(void);
//******************************************************************************************
void normal(void);
void normal_Inti(void);
void normal_Clern_Number(void);
void normal_Recive(void);
//*******************************************************************************
void simulation_Inti(void);
void simulation(void);
void TIMER3_isr(void);
//*******************************************************************************
void InitADKEY(void);
int8 GetADKEY(void);
void InitLCD(void);
void putcLCD(int8 Byte);
void SendCmd(int8 Byte);
void clrLCD(void);
void write(int8 Byte);
//******************************************************************************************
// 监听模块
//******************************************************************************************
#INT_CCP1
void rise (void)
{
if(a==1)
{
b=1;
if(CCP_1320)
{
if(width>330&&width<800)
{
bitdata=1;
bit_over=1;
last_timer=CCP_1;
}
else
{
timeout=1;
}
}
}
#INT_CCP2
void fall (void)
{
a=1;
if(CCP_2320)
{
if(width>330&&width<800)
{
bitdata=0;
bit_over=1;
last_timer=CCP_2;
}
else
{
timeout=1;
}
}
}
void moniter_Inti(void)
{
setup_ccp1(CCP_CAPTURE_RE); // Configure CCP1 to capture rise
setup_ccp2(CCP_CAPTURE_FE); // Configure CCP2 to capture fall
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); // Start timer 1
setup_timer_0(RTCC_INTERNAL|RTCC_OFF|RTCC_8_BIT|RTCC_DIV_1);
set_tris_c(0x86);
disable_interrupts(GLOBAL);
enable_interrupts(INT_CCP1);
enable_interrupts(INT_CCP2);
}
//************************************************************
void moniter_Clern_Number(void)
{
moniter_Data[0]=0;
moniter_Data[1]=0;
moniter_Data[2]=0;
moniter_Data[3]=0;
moniter_Data[4]=0;
moniter_Data[5]=0;
moniter_Data[6]=0;
moniter_Data[7]=0;
moniter_Data[8]=0;
moniter_Data[9]=0;
moniter_Data[10]=0;
}
//************************************************************
void moniter_Recive(void)
{
int8 header,pc;
int8 temp,temp1;
int16 temp2;
int8 ByteCounter;
int8 *PData,*PData1;
int8 BitCounter;
int16 fall,rise,num;
int16 value,delay_time;
str:
disable_interrupts(GLOBAL);
if(input(RF_DATA_IN)==1)
if(input(RF_DATA_IN)==1)
if(input(RF_DATA_IN)==1)
if(input(RF_DATA_IN)==1)
if(input(RF_DATA_IN)==1)
{
enable_interrupts(GLOBAL);
while(b==0);
a=0;b=0;
delay_us(1);
if(haha<430||haha>550)
{
goto str;
}
last_timer=CCP_1;
header=0;
value=0;
do
{
jing=header;
bit_over=0;
timeout=0;
num=0;
while(!bit_over)
{
delay_us(1);
num++;
if(num>600)
{
timeout=1;
break;
}
}
bit_over=0;
if(!(timeout==0&&bitdata==1))
{
timeout=0;
goto str;
}
// value+=TIMER_1;
header=header+1;
}while(header<8);
// delay_time=value*0.2;
if(header==8)
{
ByteCounter=0;
PData=moniter_Data;
do
{
BitCounter=5;
temp1=0;
do
{
bit_over=0;
timeout=0;
num=0;
while(!bit_over)
{
delay_us(1);
num++;
if(num>600)
{
timeout=1;
break;
}
}
bit_over=0;
if(timeout==1)
{
timeout=0;
goto str;
}
temp=bitdata;
temp1=(temp1<<1)|temp;
BitCounter--;
}while(BitCounter);
*(PData+ByteCounter)=temp1;
ByteCounter=ByteCounter+1;
}while(ByteCounter<11);
if(temp==0)
{
PData=moniter_Data;
PData1=sendData;
for(ByteCounter=0;ByteCounter<11;ByteCounter++)//有5个字节数据
{
temp=(((*(PData+ByteCounter))&0x10)>>4)+(((*(PData+ByteCounter))&0x08)>>3)+(((*(PData+ByteCounter))&0x04)>>2)+(((*(PData+ByteCounter))&0x02)>>1);
if(ByteCounter==10)
{
temp1=*(PData+ByteCounter)&0x1f;
*(PData1+ByteCounter)=temp1;
}
else
{
if((temp&0x01)==((*(PData+ByteCounter))&0x01))//效验高4位
{
temp1=*(PData+ByteCounter)&0x1f;
*(PData1+ByteCounter)=temp1;
temp1=(temp1&0x1e)>>1;
*(PData+ByteCounter)=temp1;
}
else
{
moniter_Clern_Number();//并清所有数据
goto str;
}
}
}
output_high(PIN_C5);
delay_ms(1000);
output_low(PIN_C5);
Check_Data_bit=1;
disable_interrupts(GLOBAL);
disable_interrupts(INT_CCP1);
disable_interrupts(INT_CCP2);
SendCmd(0xc0);
putcLCD(' ');
putcLCD(' ');
putcLCD(' ');
putcLCD(' ');
putcLCD(' ');
putcLCD('s');
putcLCD('u');
putcLCD('c');
putcLCD('c');
putcLCD('e');
putcLCD('s');
putcLCD('s');
}
else
{
moniter_Clern_Number();
goto str;
}
}
}
}
//***************************************************************
void moniter(void)
{
int8 temp;
delay_ms(100);
moniter_Inti();
wo:
moniter_Recive();
if(Check_Data_bit==0)
goto wo;
else
{
Check_Data_bit=0;
simulation_Inti();
while(1)
{
simulation();
}
}
}
//******************************************************************************************
// 读卡模块
//******************************************************************************************
void normal_Inti(void)
{
setup_ccp1(CCP_CAPTURE_RE); // Configure CCP1 to capture rise
setup_ccp2(CCP_CAPTURE_FE); // Configure CCP2 to capture fall
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); // Start timer 1
setup_timer_0(RTCC_INTERNAL|RTCC_OFF|RTCC_8_BIT|RTCC_DIV_1);
set_tris_c(0x86);
}
//************************************************************
void normal_Clern_Number(void)
{
normal_Data[0]=0;
normal_Data[1]=0;
normal_Data[2]=0;
normal_Data[3]=0;
normal_Data[4]=0;
normal_Data[5]=0;
normal_Data[6]=0;
normal_Data[7]=0;
normal_Data[8]=0;
normal_Data[9]=0;
normal_Data[10]=0;
}
//************************************************************
void normal_Recive(void)
{
int8 header,pc;
int8 temp,temp1;
int16 temp2;
int8 ByteCounter;
int8 *PData,*PData1;
int8 BitCounter;
int16 fall,rise;
str:
if(input(RF_DATA_IN)==0)
if(input(RF_DATA_IN)==0)
if(input(RF_DATA_IN)==0)
if(input(RF_DATA_IN)==0)
if(input(RF_DATA_IN)==0)
{
while(input(RF_DATA_IN)==0);
rise=CCP_1;
delay_us(10);
while(input(RF_DATA_IN)==1);
fall=CCP_2;
TIMER_1=fall-rise;
if(falltemp2)
{
goto str;
}
temp2=540;
if(TIMER_1temp2)
{
header=0;
goto str;
}
temp2=230;
if(TIMER_1>4)+(((*(PData+ByteCounter))&0x08)>>3)+(((*(PData+ByteCounter))&0x04)>>2)+(((*(PData+ByteCounter))&0x02)>>1);
if(ByteCounter==10)
{
temp1=*(PData+ByteCounter)&0x1f;
*(PData1+ByteCounter)=temp1;
}
else
{
if((temp&0x01)==((*(PData+ByteCounter))&0x01))//效验高4位
{
temp1=*(PData+ByteCounter)&0x1f;
*(PData1+ByteCounter)=temp1;
temp1=(temp1&0x1e)>>1;
*(PData+ByteCounter)=temp1;
}
else
{
normal_Clern_Number();//并清所有数据
goto str;
}
}
}
output_high(PIN_C5);
delay_ms(1000);
output_low(PIN_C5);
Check_Data_bit=1;
SendCmd(0xc0);
putcLCD(' ');
putcLCD(' ');
putcLCD(' ');
putcLCD(' ');
putcLCD(' ');
putcLCD('s');
putcLCD('u');
putcLCD('c');
putcLCD('c');
putcLCD('e');
putcLCD('s');
putcLCD('s');
}
else
{
normal_Clern_Number();
goto str;
}
}
}
}
//***************************************************************
void normal(void)
{
int8 temp;
delay_ms(100);
normal_Inti();
ni:
normal_Recive();
if(Check_Data_bit==0)
goto ni;
else
{
Check_Data_bit=0;
simulation_Inti();
while(1)
{
simulation();
}
}
}
//******************************************************************************************
// 模拟卡片模块
//******************************************************************************************
#INT_TIMER3
void TIMER3_isr(void)
{
over=1;
set_timer3(65082);
}
void simulation_Inti(void)
{
setup_timer_3(T3_INTERNAL|0x00);
set_timer3(65082);
over=0;
enable_interrupts(INT_TIMER3);
enable_interrupts(global);
CFE_DIR=0;
}
void simulation(void)
{
int8 header,*PData,count,i,run;
tim3Str=1;
for(header=0;header<9;header++)
{
tim3Str=1;
CFE=1;
delay_us(251);
CFE=0;
while(over==0);
over=0;
tim3Str=0;
}
PData=sendData;
for(count=0;count<11;count++)
{
temp=*(PData+count);
temp=temp<<3;
// delay_us(1);
for(i=0;i<5;i++)
{
run=temp&0x80;
if(run==0)
{
tim3Str=1;
CFE=0;
delay_us(256);
CFE=1;
}
else
{
tim3Str=1;
CFE=1;
delay_us(256);
CFE=0;
}
temp=temp<<1;
while(over==0);
over=0;
tim3Str=0;
}
}
}
//******************************************************************************************
// 主函数模块
//******************************************************************************************
void InitADKEY(void)
{
#asm
movlw 0x41
movwf ADCON0
movlw 0x02
movwf ADCON1
bsf TRISA,0
#endasm
}
int8 GetADKEY(void)
{
int8 ADKEYH;
int8 KEYRES;
#asm
bsf ADCON0,GO
IsOver:
btfsc ADCON0,GO
goto IsOver
movf ADRESH,W
movwf ADKEYH
movlw 0x31
movwf KEYRES
KEY1:
movlw 0xcb
subwf ADKEYH,W
btfss STATUS,C
goto KEY2
goto KEYOUT
KEY2:
incf KEYRES,F
movlw 0xa8
subwf ADKEYH,W
btfss STATUS,C
goto KEY3
goto KEYOUT
KEY3:
incf KEYRES,F
movlw 0x8f
subwf ADKEYH,W
btfss STATUS,C
goto KEY4
goto KEYOUT
KEY4:
incf KEYRES,F
movlw 0x7c
subwf ADKEYH,W
btfss STATUS,C
goto KEY5
goto KEYOUT
KEY5:
incf KEYRES,F
movlw 0x6f
subwf ADKEYH,W
btfss STATUS,C
goto KEY6
goto KEYOUT
KEY6:
incf KEYRES,F
movlw 0x63
subwf ADKEYH,W
btfss STATUS,C
goto KEY7
goto KEYOUT
KEY7:
incf KEYRES,F
movlw 0x5a
subwf ADKEYH,W
btfss STATUS,C
goto KEY8
goto KEYOUT
KEY8:
incf KEYRES,F
movlw 0x53
subwf ADKEYH,W
btfss STATUS,C
goto KEY9
goto KEYOUT
KEY9:
incf KEYRES,F
movlw 0x4c
subwf ADKEYH,W
btfss STATUS,C
goto KEY0
goto KEYOUT
KEY0:
movlw 0x30
movwf KEYRES
KEYOUT:
movf KEYRES,W
#endasm
return KEYRES;
}
void InitLCD(void)
{
LCD_DB7_DIR=0;
LCD_DB6_DIR=0;
LCD_DB5_DIR=0;
LCD_DB4_DIR=0;
LCD_E_DIR=0;
LCD_RS_DIR=0;
LCD_DB7=0;
LCD_DB6=0;
LCD_DB5=0;
LCD_DB4=0;
LCD_E=0;
LCD_RS=0;
LCD_E=1; //清数据线
LCD_E=0;
LCD_DB5=1; //设置LCD工作方式
LCD_E=1;
LCD_E=0;
delay_ms(1000);
SendCmd(0x28);
SendCmd(DISP_ON);
SendCmd(ENTRY_INC);
SendCmd(DD_RAM_ADDR);
clrLCD();
}
void putcLCD(int8 mychar)
{
LCD_RS=1; //设置为送数据模式
write(mychar);
mychar=mychar<<4;
write(mychar);
delay_ms(100);
}
void SendCmd(int8 mychar)
{
LCD_RS=0; //设置为送命令模式
write(mychar);
mychar=mychar<<4;
write(mychar);
delay_ms(100);
}
void clrLCD(void)
{
SendCmd(CLR_DISP);
}
void write(int8 mychar)
{
if((mychar&0x80)!=0)
LCD_DB7=1;
else
LCD_DB7=0;
if((mychar&0x40)!=0)
LCD_DB6=1;
else
LCD_DB6=0;
if((mychar&0x20)!=0)
LCD_DB5=1;
else
LCD_DB5=0;
if((mychar&0x10)!=0)
LCD_DB4=1;
else
LCD_DB4=0;
LCD_E=1;
LCD_E=0;
}
void main(void)
{
int8 temp;
CFE_DIR=0;
InitADKEY();
InitLCD();
SendCmd(0x40);
SendCmd(0x40);
putcLCD(0x18);
putcLCD(0x18);
putcLCD(0x07);
putcLCD(0x08);
putcLCD(0x08);
putcLCD(0x08);
putcLCD(0x07);
putcLCD(0x00);
while(1)
{
SendCmd(0x80);
putcLCD(' ');
putcLCD(' ');
putcLCD(' ');
putcLCD(' ');
putcLCD('M');
putcLCD('a');
putcLCD('i');
putcLCD('n');
putcLCD(' ');
putcLCD('M');
putcLCD('e');
putcLCD('n');
putcLCD('u');
SendCmd(0xc0);
putcLCD('1');
putcLCD(':');
putcLCD('M');
putcLCD('o');
putcLCD('n');
putcLCD('M');
putcLCD('o');
putcLCD('d');
putcLCD('2');
putcLCD(':');
putcLCD('N');
putcLCD('o');
putcLCD('r');
putcLCD('M');
putcLCD('o');
putcLCD('d');
temp=0;
while(GetADKEY()==0x30);
temp=GetADKEY();
delay_ms(20);
if(temp!=GetADKEY())
continue;
while(GetADKEY()!=0x30);
clrLCD();
delay_us(1);
if(temp==0x31)
{
SendCmd(0x80);
putcLCD(' ');
putcLCD(' ');
putcLCD(' ');
putcLCD(' ');
putcLCD('M');
putcLCD('o');
putcLCD('n');
putcLCD('M');
putcLCD('o');
putcLCD('d');
delay_ms(1000);
moniter();
clrLCD();
}
else if(temp==0x32)
{
SendCmd(0x80);
putcLCD(' ');
putcLCD(' ');
putcLCD(' ');
putcLCD(' ');
putcLCD('N');
putcLCD('o');
putcLCD('r');
putcLCD('M');
putcLCD('o');
putcLCD('d');
delay_ms(1000);
normal();
clrLCD();
}
else
{
SendCmd(0x80);
putcLCD(' ');
putcLCD(' ');
putcLCD('E');
putcLCD('o');
putcLCD('r');
putcLCD('r');
putcLCD(' ');
putcLCD('C');
putcLCD('h');
putcLCD('o');
putcLCD('i');
putcLCD('c');
putcLCD('e');
delay_ms(1000);
clrLCD();
}
}
}