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

📄 main.c

📁 RFID模块 RF24E1读卡程序,用Keil C编译成功!
💻 C
字号:

 /*==========================================================================================
  Copyright (C), 2005, RegalCyber Tech. Co., Ltd.
  File name:   main.C
  Author: Zhangui Duan   Version: v1.2   Date: 2005-3-30

  Description:
     此程序文件主要是当手触摸屏幕的时候,发送寻卡信号,接收卡号并将卡号后三字节用Wiegand格式输出。
  		1,主程序 
  		2,初始化程序
  Other Description:
  		 由 Keil C51 V7.05 编译通过

  Function List:  
    1. 	主程序
		void main(void);
	2,	初始化程序
		void Init(void);
		
  History:          
    1. Date:
       Author:
       Modification:

============================================================================================*/
#include "main.h"
#include <stdio.h>
#include "adc.h"

#define Delay_If    for(temp_num2=0;((temp_num2<20)&&(test2<0x30));temp_num2++,Delayms(1))
#define DEBUG  1
 unsigned char rr;
 unsigned char TIME;
/****************************************************************************************
  Function:        isr_INT0
  Description:     定时器0 190us中断
                    主要功能就是保证每秒钟将卡号计数器加1
  Calls:           
  Called By:        void main(void);			 
  Input:     
  Output:    
  Return:    
  Others:    
****************************************************************************************/
/*
void isr_INT0(void) interrupt 1 using 1
{
  unsigned char i;
  Time_count++;
  if(Time_count==5264)  //定时1S时间到 (5264)
  {
	Time_count=0;
    rr++;
	if(rr>=TIME)
	{
		overtime=1;//TIMEs时间到,置超时标志
		rr=0;    }	
	for(i=0;i<Max_Card_Num;i++)	 
	{
	  if(No_Data[i].Counter<0xff)No_Data[i].Counter++;//数据库中每个卡号的计数器加1
	  if((No_Data[i].Counter>=TIME)&&(No_Data[i].Counter<0xff))
	  {	    
	 		No_Data[i].No=0;			//将此卡号从数据库中删除
			No_Data[i].Counter=0xff; 	//将此卡号对应的计数器恢复到初始化的值
	  }
	}
	
  }
}	   */
/*********************************************************************************************
  Function:        main
  Description:     发送寻卡信号,接收卡号并按照Wiegand格式输出
  Calls:           
  					Init();
    				Init_Receiver();
					Transmitter();
					Delayms();
					Receiver();
					Wiegand_Out();
  Called By:      			 
  Input:     
  Output:    
  Return:    
  Others:    
*********************************************************************************************/

void main(void)
{
	unsigned char temp_num2;
  	unsigned char test2;
	Init();
	rconfbuf[0]=0x4f;//初始化发送和接收的配置字,默认收发功率为:0dBm,收发速率为:250Kbps
	rconfbuf[1]=0x05;
	tconfbuf[0]=0x4f;
	tconfbuf[1]=0x04;
  	
//----------------------------------------------
    //存储或者是从eeprom中取出卡号和配置参数
//----------------------------------------------
  	InitADC();  
  	Data0=0;
  	Data1=0;
  	TRCOUNT=0;
  	while(1)
   {
  	 /*do
  	 { 
   	    test2=ReadADC();
		LED_red=0;
		Delay_If;
		if(test2>0x30)break; 
		LED_red=1;
  		Delay_If;
		if(test2>0x30)break;
      
  	 }while(1);  */
	Touch_Identify();
   }
   	
}
  

/*************************************************
  Function:        Touch_Identify
  Description:     参数配置
  					1,将配置参数存入FLASH中
					2,从FLASH中读出配置参数
  Calls:           	void EEInit(void);
					unsigned char EERead(unsigned int addr);
					void EEWrite(unsigned int addr, unsigned char b);
  Called By:        void main(void)			 
  Input:     	    set_card
                    根据此输入值判断是否有进行参数配置
  Output:    
  Return:    
  Others:    
*************************************************/ 
void Touch_Identify(void)
{
  
   	LED_red=0;	
	ET0=1;	//开定时中断
  	overtime=0; //清超时标志
  	Time_count=0; //1S计时器(Time_count=5264的时候为1S)
  	rr=0; 
	if(receive_cardno( )==CardNoRight) //发送寻卡信息,接收卡号,如果有卡则校验接收的卡号
	{  
		#ifdef DEBUG
			
			//	printf("RxBuf is: %bu ,", RxBuf[0]);
				printf("%bu",  RxBuf[1]);
				printf("%bu",  RxBuf[2]);
				printf("%bu",  RxBuf[3]);
				printf("%bu",  RxBuf[4]);
				printf("%bu",  RxBuf[5]);
				printf("%bu",  RxBuf[6]);
				printf("%bu",  RxBuf[7]);
				printf("%bu",  RxBuf[8]);
				printf("%bu",  RxBuf[9]);
				printf("%bu",  RxBuf[10]);
				printf("%bu",  RxBuf[11]);
				printf("%bu,\n", RxBuf[12]);

		
   
	/*		PutChar(RxBuf[1]);
			PutChar(RxBuf[2]);
			PutChar(RxBuf[3]);
			PutChar(RxBuf[4]);
			PutChar(RxBuf[5]);
			PutChar(RxBuf[6]);
			PutChar(RxBuf[7]);
			PutChar(RxBuf[8]);
			PutChar(RxBuf[9]);
			PutChar(RxBuf[10]);
			PutChar(RxBuf[11]);
			PutChar(RxBuf[12]);
			//PutChar(TIME);	*/
		#endif
	}
		ET0=0;//关闭定时器
		LED_green=1;
}



/****************************************************************************************
  Function:        receive_cardno
  Description:     发送寻卡信息,并接收卡号
  Calls:           
  Called By:        void main(void);			 
  Input:     
  Output:    
  Return: 
        如果有卡号且正确则返回0x01, 否则返回0x00  
  Others:    
****************************************************************************************/

unsigned char receive_cardno()
{
   unsigned char cardright_err;
   unsigned char RNum,Rnum;
	//准备接收卡号
	Init_Receiver(); //接收数据初始化
	//清空接收区
	for(Rnum=0;Rnum<RNUM;Rnum++)
	{
		 RxBuf[Rnum]=0;	
	}
	RNum=0;
	do{
	  	RNum++;
	    Receiver(RxBuf);
		//判断发送过来的是否是正确的卡号
		if((RxBuf[0]==ReceiveCardNo)&&((RxBuf[1]^RxBuf[2]^RxBuf[3]^RxBuf[4]^RxBuf[5]^RxBuf[6]^RxBuf[7]^RxBuf[8]^RxBuf[9]^RxBuf[10]^RxBuf[11]^RxBuf[12])==RxBuf[13]))RNum=53;
		Delayms( RCdelaytime);
       }while(RNum<50);	//连续接收50次
	if(RNum==53)cardright_err=CardNoRight;//有卡号且正确
   else cardright_err=CardNoErr;//没卡或者卡号错误
   return (cardright_err);
}

/*********************************************************************************************
  Function:        Init
  Description:     CPU的初始化
  					1,I/O口的方向初始化
					2,I/O口的输出初始化
					3,SPI初始化
					3,串口初始化
					4,发送接收缓冲区初始化
  Calls:           
  Called By:        void main(void);			 
  Input:     
  Output:    
  Return:    
  Others:    
*********************************************************************************************/
	  
void Init(void)
{
//	unsigned char i;
//  Port ini
    P0_ALT = 0x06;  // Select alternate functions on pins P0.1 and P0.2,  TXD RXD 
    P0_DIR = 0x09;                  // P0.0, P0.3 is input(S1, S2), the rest output
    P0 = 0xF0;                      // P0.7-P0.4 = 1 for OFF LED_red,green,DATA0,DATA1   
    P1_DIR = 0x03;		   			// P0.0, P0.3 is input(S3, S4),

	LED_red=1;
	LED_green=1;
//	LED3=1;
//	LED4=1;
    
    PWR_UP = 1;         // Turn on Radio
    Delay100us(30);    // Wait > 3ms 
    SPICLK = 0;        // Max SPI clock (XTAL/8)
    SPI_CTRL = 0x02;   // Connect internal SPI controller to Radio

//  serial communication ini
    TH1 = 230;      // 19200@16MHz (when T1M=1 and SMOD=1)
    CKCON |= 0x10;  // T1M=1 (/4 timer clock)
    PCON = 0x80;    // SMOD=1 (double baud rate)
    SCON = 0x52;    // Serial mode1, enable receiver
    //TMOD = 0x20;    // Timer1 8bit auto reload 
    TMOD = 0x22;    // //定时器0,1工作在方式2 
    TCON = 0x40;    // Start timer1    
		
//定时器0初始化
	TH0   = 2; 	//192us	  
	TL0   = TH0;
	TR0   = 1;      //允许定时器0计数            
	EA=1;          //打开总中断控制位 
	ET0=0;		  //关闭定时中断

	TRCOUNT=0;
	RxBuf[0]=0;
	RxBuf[1]=0;
}

⌨️ 快捷键说明

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