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(); 
		} 
	} 
	 
}