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

📄 main.c

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

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

  Description:
     此程序文件主要是完成接收读卡器的寻卡信号,再发送四字节的卡号
  		1,主程序 
  		2,初始化CPU,I/O口,串口,RTC,SPI等
  Other Description:
  		 由 Keil C51 V7.05 编译通过

  Function List:  
    1. 	主程序
		void main(void);
	2,	初始化程序
		void Init(void);
		
  History:          
    1. Date:  2005-6-12
       Author:Zhangui Duan
       Modification: 由于卡号要与普通的IC卡兼容,将卡号设置为4个字节,所以发送的有效数据宽度
	   由原来的40位改为48位(1字节前置码+4字节卡号+1字节校验字节),同时发送缓冲区直接设置
	   为数组,字节长度为6字节

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

//#define DEBUG 1

/**********************************************************************************************
  Function:        main
  Description:     定时休眠,通过RTC唤醒,
  				   判断收到寻卡信号,发送卡号,并判断是否出了此区域,
  Calls:           
  					Init();
    				Init_Receiver();
					Transmitter();
					Delayms();
					Receiver();
  Called By:      			 
  Input:     
  Output:    
  Return:    
  Others:    
**********************************************************************************************/
 void main(void)
 {
    //unsigned char _set_card;
    //_set_card=Config();//接收配置读卡器发送过来的卡号,并返回卡号
    //RW_Flash(_set_card);//存储或者是从eeprom中取出卡号和配置参数
	Init();
	Init_Receiver(); //接收初始化
	TxBuf[0]=TransmitCardNo;//前置码
	TxBuf[1]=1;	TxBuf[2]=2;TxBuf[3]=3;TxBuf[4]=4;TxBuf[5]=5;TxBuf[6]=6;TxBuf[7]=7;TxBuf[8]=8;TxBuf[9]=9;TxBuf[10]=9;
	TxBuf[11]=8;TxBuf[12]=7;
	TxBuf[13]=TxBuf[1]^TxBuf[2]^TxBuf[3]^TxBuf[4]^TxBuf[5]^TxBuf[6]^TxBuf[7]^TxBuf[8]^TxBuf[9]^TxBuf[10]^TxBuf[11]^TxBuf[12]; //校验字节

   // WriteRTC(TIME/TICK); //设置唤醒定时器
   WriteRTC(300);
    while(1)
    { 
    //----------------------------------------------
	  //发送卡号
    //----------------------------------------------;
    	  //REGX_CTRL = 0x0b; 					 //关闭唤醒定时器
          //while(REGX_CTRL & 0x10)             // Wait for the interface to be ready
    //        ;
		  #ifdef DEBUG
		  LED4=0;
		  PutChar(0x55);
    	  Delayms(1);  
    	  LED4=1;
		  #else
		  Transmitter(&TxBuf[0]);//发送卡号
		  #endif
		  Delay100us(200); 
	  	  CK_CTRL=0x03;//省电模式	          	    	
  	  } 
  }

 /*************************************************
  Function:        RW_Flash
  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 RW_Flash(unsigned char set_card)
{
   	unsigned char m;
	unsigned int addr_card,config_addr;
  	EEInit();     //eeprom 初始化
	config_addr=Addr_Cardno+4;//初始化配置参数存放地址	
  //--------------------------------------------//
   //如果需要配置,则将卡号和配置参数写到FLASH中
	if(set_card)
	{
	    if(!((RxBuf[1]==0)&&(RxBuf[2]==0)&&(RxBuf[3]==0)&&(RxBuf[4]==0)))
		{
		   //如果4字节卡号数据全部为0,则发送过来的卡号数据就不需要存储到FLASH中
			for(m=1,addr_card=Addr_Cardno;m<5;m++,addr_card++)
			{
				EEWrite(addr_card, RxBuf[5-m]);	//将4字节卡号参数写到FLASH中
    		}
		}
			EEWrite(config_addr, RxBuf[5]);//将配置参数写到FLASH中
			EEWrite((config_addr+1), RxBuf[6]);//将时间参数写到FLASH中
	}
  //--------------------------------------------//
	//从FLASH中读出4字节的卡号以及配置参数
	for(m=1,addr_card=Addr_Cardno;m<5;m++,addr_card++)
	{
		TxBuf[m]=EERead(addr_card);    //读取卡号
	}
	tconf.buf[13]=EERead(config_addr); //读取发送配置参数
	rconf.buf[13]=tconf.buf[13];      //读取接收配置参数
	TIME=EERead(config_addr+1); 	  //读取时间参数
}

 /*************************************************
  Function:        Config
  Description:     参数配置
  					1,接收配置读卡器发送过来的卡号,收发功率,收发速率
					2,返回上述参数给配置读卡器
  Calls:           	void Init(void)
					void Init_Receiver(void)
					void Receiver(unsigned char *rxbuf)
                    void Transmitter(unsigned char *txbuf)
  Called By:        void main(void)			 
  Input:     
  Output:    
  Return:    
  Others:    
*************************************************/ 
unsigned char Config(void)
{
	unsigned char s,Rnum,set_card_sign;
	Init();
	Init_Receiver(); //接收初始化
	set_card_sign=0;
	Rnum=0;
	do{
	  	Rnum++;
	  #ifdef DEBUG
	    LED3=0;
	  #endif
	    //Init_Receiver(); //接收初始化
	  	for(s=0;s<RNUM;s++)
		{
		 RxBuf[s]=0;	
		} 
	    Receiver(RxBuf);
		//判断是否是设置卡号命令
		if((RxBuf[0]==SetCardNo)&&((RxBuf[1]^RxBuf[2]^RxBuf[3]^RxBuf[4]^RxBuf[5]^RxBuf[6])==RxBuf[7]))
		{
			Rnum=255;
			set_card_sign=1;
			/*
		   #ifdef DEBUG
	  		 LED3=1;
	  	   #endif
		   */
		}	
	  Delayms( Setdelaytime);	//延时1ms
	  /*
	#ifdef DEBUG
	  LED4=0;
	#endif
	*/
    }while(Rnum<250);         //连续接受5秒数据
	/*
	#ifdef DEBUG
	 LED4=1;
	#endif
	*/
//----------------------------------------------
    //将接收到的卡号和参数返回给设置读卡器
//----------------------------------------------
	if(set_card_sign)
	{	TxBuf[0]=TransmitCardNo;
	    TxBuf[1]=RxBuf[1];
		TxBuf[2]=RxBuf[2];
		TxBuf[3]=RxBuf[3];
		TxBuf[4]=RxBuf[4];
	    TxBuf[5]=RxBuf[7];
		Delayms(5);
		Rnum=0;
		do{
	  		Rnum++;
			Transmitter(&TxBuf[0]);//发送接收到的数据
			/*
		  #ifdef DEBUG
	 	 	LED3=0;
    	 	Delayms(5);  
   	 	 	LED3=1;
		  #endif
		  */
	  		Delay100us(RCdelaytime);
		   }while(Rnum<5);	//连续发送5次数据
	}
  return set_card_sign;
}

/*************************************************
  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)
 {

//  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 LED1-LED4    
    P1_DIR = 0x03;		   			// P0.0, P0.3 is input(S3, S4),

	LED1=1;
	LED2=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;      // 9600@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 
    TCON = 0x40;    // Start timer1 
 }   


⌨️ 快捷键说明

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