⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readermodule.c.bak

📁 Use this program to decode the Manchester Code of the RFID. Validate the accessibility of detected c
💻 BAK
📖 第 1 页 / 共 5 页
字号:
                                                                                                                                                                                                                                                                                                          
/*****************************************************************************************************
This is the source code for keypad reader

******************************************************************************************************/                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                               
#include <REG52.H>
#include <stdio.h>                /* prototype declarations for I/O functions */

sbit	P00		=	P0^0;
sbit	P01		=	P0^1;                        																																	
sbit	P02		=	P0^2;                        																																	
sbit	P03		=	P0^3;                        																																	
sbit	P04		=	P0^4;                        																																	
sbit	P05		=	P0^5;                        																																	
sbit	P06		=	P0^6;                        																																	
sbit	P07		=	P0^7;
sbit    PUSHBUTTON	=	P2^0;//P1^0;
sbit 	BUZZER  	=	P1^0;//P1^1;
sbit	LED0		=	P1^2;                 																																	
sbit	LED_GREEN	=	P1^4;//P1^3;
//sbit	LED_RED		=	P1^2;//P1^4;																																		     																																	
sbit	DOORSENSOR 	=	P2^1;//P2^0;
sbit 	TAMPER		=	P2^4;//P2^1;
sbit 	DOORRELAY 	=	P2^2;
sbit 	ALARMRELAY 	=	P2^3;
sbit	LED3		=	P2^7;                        																																	                        																																	                        																																	
sbit	EXT		=	P3^2;                        																																	
sbit 	SDA 		= 	P3^7;
sbit 	SCL 		= 	P3^6;
sbit	SHD 		=	P3^3;//P3^0;

#define	RELAY_ON		0
#define RELAY_OFF		1
#define LED_ON			0
#define	LED_OFF			1
#define SLEEP			1
#define WAKEUP			0
#define BUZZ_CNT		50			
#define ON			1 			
#define OFF			0 			
#define HIGH 			1 			
#define LOW			0 			
#define MAXCARDCHAR		10			
#define CLOCKINTERVAL		25			
#define CARDTIMELIMIT		20//22 kk changed 14/4/06 sort of too insensitive 			
#define MAXKEYCHAR 	  	10
#define O_CARDnPIN		0x01   // Normal Card Mode 0x01 = 0
#define O_AUTOPIN		0x02   // 1 -> On
#define O_LOCKOUT		0x04   // 1 -> LockOut
#define O_SECURITYOFF   	0x08   // 1 -> off
#define O_ARM			0x10   // 1 -> Arm
#define O_CARD			0x20	//CARD
#define O_CARDorPIN		0x22
//#define E_RELEASE		0x01
//#define E_FACCODE		0x02
//#define E_PIN			0x04
#define MAX_LOCK_RELEASE_TIME   0x60	// second
#define MAX_DOOR_OPEN_TIME  	0x99	// second
#define MAX_SOUNDER_TIME    	0x30	// minute
#define high_byte(x)		((x & 0xFF00) >> 8)// Get high byte macro
#define MAX_PINNO		10
#define MAX_CARD_ADD		4028	//5027-jah
#define EEPROM_LAST_BYTE	9//4032	
#define TIMER0CNT		0x56;
#define START_CARD_ADD		32
#define TESTING

void put_c(unsigned char buf);
void beep (unsigned char duration);
void longtos (char* ddata, unsigned long *tno);
void beepbeep (unsigned char count);
void ClearBuzz(void);
void process_button(void);
void process_led(void);
void process_buzzer(void);
void initmcu(void);
void ResetUserEvent (void);
void I2C_Start(void);
void I2C_Stop(void);
char I2C_Write(unsigned char byte);
unsigned char I2C_Read(void);
//void ACK(void);
void NAK(void);
char write_eeprom_bytes(unsigned int add, unsigned char dataout);
unsigned char get_eeprom_bytes (unsigned int add);
//char write_block(unsigned char page, unsigned char *dataout, char count);
unsigned char get_eeprom_bytes1 (void);
void InitDB(void);
void WriteSysDB(void);
void GetSysDB (void);
void ClearUserDB(void);
unsigned char InstallThisCard(void);
unsigned char DeleteThisCard (void);
unsigned char FindThisCard(void);
void Process_Input(void);
void flush_keypad(void);
void turn_relay_on (void);
void ReloadKeyTimeOut (void);
char write_block(unsigned int startadd, unsigned char *dataout, char count);	//12/15/2005 9:24PM
void RestoreCardPos(void);
//void ProcessUserEvent(void);
//void checkcollision(void);


//variable for process_buzzer
#define BUZZCOUNTER 90      //10
idata char buzzer_type=0;
idata unsigned char buzz_duration;
idata unsigned int buzz_counter;

//variables for card
idata unsigned int cardpos=0;
unsigned int cardpos_last;	//12/18/2005 9:43PM
idata unsigned char lockoutcount=0;
//idata unsigned char comsinbuffer;
idata unsigned char ledcount0=0;
char ColdStartCheck=1,tempi;
unsigned char door_relay_duration;
idata unsigned char dooropentime;
//unsigned char EmptyFlag

/*==============================================================================
			KEYPAD READER REALATED VARIABLES

================================================================================*/
struct TOperationFlag
{
	unsigned gnewcard		: 1;			
	unsigned WaitingKey		: 1;																							
	unsigned DoorOpen    	        : 1;												
	unsigned doorwasopened 	        : 1;																
    	unsigned char EmptySign;	//12/19/2005 10:43PM
} ;
idata struct TOperationFlag Flags;

struct DHeader
{
	unsigned char OperationMode;    	
    	unsigned char MasterPin      	[3];	
	unsigned char AutoPin   [MAX_PINNO][2];
	unsigned char DoorOpenTime;
	unsigned char LockReleaseTime;	
	
};
idata struct DHeader SystemDatabase;
typedef struct
{
	char CardNo [3];
    	char Lockcount;
}TCardRec;

TCardRec gcrec;

unsigned char ch=0,bit_keyhold=0,key_count,button_state=1,KeyChar [MAXKEYCHAR];
unsigned int keytimeout;
unsigned char idata secdly;
/*********************************************************************************
			MENU RELATED VARIABLES
*********************************************************************************/
unsigned char MainMenuItem;
unsigned char SubMenuItem;

/*=============================================================================
			CARD RELATED VARIABLES
=============================================================================*/
unsigned int clock_isr_counter1 = 0,rdr=0;
unsigned char card_exist=0, cardbitBufer[10],previousstate,anticollision=0;
unsigned char cardtime =18,bitcount=0,cbitcount=0,nibin=0,parity=0,bytecount=0;
unsigned char cardbytein[MAXCARDCHAR+2],CardDataIn=0,startpattern=0,columnparity=0;
//unsigned int cpin;	//12/4/2005 10:34AM
//unsigned int dpin;	//12/4/2005 10:34AM
/**************************************************************************************
			MEMORY RELATED VARIABLES
**************************************************************************************/
char idata temp_masterpin1[3],temp_masterpin2[3],masterpinCount=0;
/*
data signal	      75clock 	
		   <------->;If data signal interval exceeded 70clocks then refer to previousstate	
___     ___     ___     ______	      ______
   |   |   |   |   |   |      |      |	
   |___|   |___|   |___|      |______|		
   <--->	   <---------->	
   32clock		       96clock
   		   <----->	
   <------>	     50clock  ; for every 50clock after falling interval of data signal, record the previousstate	
     64clock				
Remarks:Data read in upon falling edge detection
*/

void timer0_ISR (void) interrupt 1  //interrupt every 200us -- 25clock cycles 
{		
	if(++clock_isr_counter1 == 3)//(50/CLOCKINTERVAL) )			//equivalent to 2				
		previousstate=EXT;				
			
	else if(clock_isr_counter1==250)
	{	
		clock_isr_counter1=0;
		TR0=0;				
	}	
	TH0 = 0xff;//(65536 - 146) / 256;
	TL0 = TIMER0CNT;//-123;//(65536 - 146) % 256;	
}
/******************************************************************************
Interrupt 1, INT1-not using here
*******************************************************************************/
void ex1_isr (void) interrupt 2
{
		    				
}

/***********************************************************************************
Timer 2 overflow interrupt at 0.039s
byte start from 4, as the cardbytein contain start byte 

**********************************************************************************/
unsigned char xorbit;
void timer2_overflow(void) interrupt 5											
{
	TF2 = 0;            /* Clear the interrupt request */
	
	secdly++;		
	if(++ledcount0>=40)	//35
	{
		ledcount0=0;
		LED0^=1;
		if(Flags.DoorOpen)
		{
			xorbit^=1;
			if(xorbit)
				BUZZER=1;
			else
				BUZZER=0;
				
			//BUZZER^=1;
			put_c('X');
		}
	}
	
	
	cardtime++;
	/*
	if(cardtime++ >CARDTIMELIMIT )	
		cardtime=CARDTIMELIMIT;	//jah
	*/	
	if (keytimeout>1)        keytimeout--;		//leave 1 for keytimeout to be detected and deduct  
}							//at checkkeytimeout()
/****************************************************************************************************
External interrupt 0 
Take care of the DEMOD_IN input from the EM4095
*****************************************************************************************************/
void ex0_isr (void) interrupt 0//void ex1_isr (void) interrupt 2
{
	cardtime = 0;	//11/19/2005 4:21PM removed to prevent some noise signal IN
	TR0=0;
	TH0 = 0xff;
	TL0 = TIMER0CNT;
	TR0=1;
	
	
	
	if(!anticollision)					//kk 21/10/05
	{
	if(clock_isr_counter1 >= 4)											//600us ;phase change in data format
	{
		//P02^=1;
		if((previousstate==HIGH)||(clock_isr_counter1>=6))//7//(100/CLOCKINTERVAL)))//change state from 1 to 0, read in 1 follow by 0
		{	
			
			nibin  |= 0x01;	
			cbitcount++;			
			bitcount++;
			nibin = nibin <<1;
			parity++;			
			if ((cbitcount <=60) && (cbitcount >=11))	
		        {
		            if (bitcount == 5)
		            {
		            	if(parity & 0x01)			//odd parity
				{
					cardbytein[bytecount++]= (~(nibin>>2)) & 0x0f;
			        	
			        	if (bytecount>=MAXCARDCHAR)
		        		{
		        			cardbytein[bytecount+1]=0;
		        			CardDataIn      = 	1;		
		        			anticollision	=1;			//kk 21/10/05
		        			cardtime	= 	18;
        			        	SHD=SLEEP; //11/28/2005 9:05PM	
        			        			
		        			}		                	
		                }
		                
		                else
		                {		                	
					cbitcount = 0;            				            		
		            		startpattern=0;
		            		rdr=0;				//redetect upon state change of 1 to 0
		                }
		                bitcount  = 0;				//after every 5 bits reset bit count
				nibin     = 0;				//after every 5 bits reset nibin
				parity    = 0;
		    	    }		
		    	    nibin &= 0xfe;    	    
		    	    cbitcount++;			
		    	    bitcount++;				
		    	    nibin = nibin <<1;	
		    	    ch=0;		    	    	
		    	    
		        }
		        else if(cbitcount >=61)		
		        {
		            if (bitcount == 5)				//after 1 bit shifted, bit count up to 5  
		            {						//take care of the 0 bit left behind!!				
		            	if(1)//!ch)				//stop bit
		            	{
		            		cbitcount	=	0;
		            		//CardDataIn      = 	1;
		                	rdr 		= 	0;	
		                	columnparity	= 	nibin&0x0f;
		                	cardtime	= 	18;
		                	startpattern	=	0;
		                	bytecount=0;
		                	bitcount  = 0;			//reset all parameter, search for the 
					nibin     = 0;			//correct start pattern					
		            	}
		            }		            
		            else
		            {
		            	cbitcount++;	
		        	bitcount++;	
		        	nibin &= 0xfe;				
				nibin = nibin <<1;	
				ch=0;					//subsequent data will decoded as 0							
		            }		            
		        }
		        else						//especially for start pattern detection
		        { 
		        	if(startpattern<9)//if(!startpattern)
		        	{
		        		startpattern=1;
		        		rdr=1;
		        		cbitcount=1;
		        	}	
		        	cbitcount++;	
		        	bitcount++;		
		        	nibin &= 0xfe;			
				nibin = nibin <<1;	
				ch=0;					//subsequent data will decoded as 0							
			}				
		}
		else 							//change state from 0 to 1, read in 1 
		{	
			
			if(rdr)						//start all data decoding upon the possible of start pattern detection
			{
				if(cbitcount<10)			//change state before start pattern detected
				{
					bitcount  = 0;			//reset all parameter, search for the 
					nibin     = 0;			//correct start pattern
					cbitcount = 0;            		
		            		parity    = 0;
		            		startpattern=0;
		            		rdr=0;					
				}
				else 
				{
					nibin |= 0x01;		
					bitcount++;
		        		cbitcount++;
		    			nibin = nibin << 1;		//shift data 1 to buffer
		    			ch=1;				//subsequent signal will decoded as 1		    			
		    			parity++;			    			
	    			}
	    		}	    		
		}			
	}	
	else 								//in normal data cycle
	{
		if(rdr)							//once a 1 to 0 state change was detected, enable
		{							//subsequent incoming data				
			if(!ch)	//9/10/2005 10:09AM					// data 0
			{		
				if(cbitcount<=10)	
					startpattern++;
				
				nibin &= 0xfe;				
			}
			else //if(ch)//(ch==1)-9/4/2005 10:48PM
			{
				
				nibin  |= 0x01;				//data 1
				parity++;				
			}	
			bitcount++;
	        	cbitcount++;
	    		nibin = nibin << 1;
	        	nibin &= 0x3f;					//If bitcount count up to five then 00xx xxxx
	        }	
	}
	
        if (cbitcount==10)						//after 9 bits received -included 1 high from interchange state
        {
        	if(startpattern == 9)					//but not all 0(count from 1)
        	{	
        		
        	}
        	else 
        	{        		            		
			cbitcount = 0;   			
            		startpattern=0;
            		rdr=0;						//redetect upon state change of 1 to 0
            		           		
        	}        		
        	bytecount=0;
        	bitcount  = 0;						//reset all parameter, search for the 
		nibin     = 0;						//correct start pattern			         		
            	parity    = 0;
        }
        
        else if ((cbitcount <=60) && (cbitcount >=11))	
        {
            if (bitcount == 5)
            {
            	if(parity & 0x01)					//odd parity
		{
			cardbytein[bytecount++]= (~(nibin>>2)) & 0x0f;
	        	if (bytecount>=MAXCARDCHAR)
        		{
        			cardbytein[bytecount+1]=0;
        			CardDataIn      = 	1;  
        			anticollision=1;			//kk 21/10/05
        			cardtime	= 	18;
      				SHD=SLEEP;	//11/28/2005 9:05PM
      				
        		}                	
                }                
                else
                {                	
			cbitcount = 0;            		            		
            		startpattern=0;
            		rdr=0;						//redetect upon state change of 1 to 0
                }
                bitcount  = 0;						//reset all parameter, search for the 
		nibin     = 0;						//correct start pattern
		parity =0;
    	    }
        }
        else if(cbitcount >=61)		
        {
            if (bitcount == 5)
            {
            	if(1)//!ch)						//stop bit
            	{
            		cbitcount	=	0;
            		//CardDataIn      = 	1;
                	rdr 		= 	0;	
                	columnparity	= 	nibin&0x0f;
                	cardtime	= 	18;
                	bytecount=0;
                	startpattern	=	0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -