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

📄 main.lst

📁 51控制RC500读写程序源代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V6.12  MAIN                                                                   08/18/2007 23:20:49 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN .\main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\main.c BROWSE DEBUG OBJECTEXTEND CODE

stmt level    source

   1          /****************************************************************************
   2          * File :  main.c                                                            *
   3          * COPYRIGHT BY HUOYAN LTD.COMPANY                                           *
   4          * Version:      V5.2                                       			        *
   5          * Created:      18.11.2002                                                  *
   6          * Last Change:  8.Jan.2005                                                  *
   7          * Author:       NIL                                                         *
   8          * Compiler:     KEIL C51 V7.10                                              *
   9          * Description:  AT89S52-Firmware for MFRC500 Demo Serial Reader             *
  10          *                                                                           *
  11          ****************************************************************************/
  12          #define __SRC
  13          #include "main.h"
  14          #undef  __SRC
  15          
  16          #include <string.h>
  17          #include <stdio.h>
  18          #include <absacc.h>
  19          #include <intrins.h>
  20          #include "AT89S52.h"
  21          #include "Mfreg500.h"
  22          #include "M500a.h"
  23          
  24          
  25          #define uchar	unsigned char
  26          #define uint unsigned int
  27          //#define DataPort P0				// 数据端口
  28          
  29          
  30          //pin define  mcu控制管脚定义
  31               
  32          sbit RC500RST   =   P1^0;		//由高变低时复位RC500
  33          sbit RC500CS=P1^1;
  34          sbit CARD_LED=P1^2;
  35          sbit SPEAKER    =   P1^3; 		  
  36          
  37          bit bcard;
  38          
  39          ///////////////////////////////////////////////////////////////////////
  40          // 主函数
  41          ///////////////////////////////////////////////////////////////////////
  42          void main(void)
  43          { 	//设置变量
  44   1          uchar baud;
  45   1        
  46   1      
  47   1          InitSystem();       //初始化系统	  
  48   1      	// bcard=0;
  49   1          
  50   1         	delay_10ms(5);					
  51   1          while (1)
  52   1          { 	
  53   2      	
  54   2              // KeyPress();	处理按键
  55   2         		delay_10ms(5);   
C51 COMPILER V6.12  MAIN                                                                   08/18/2007 23:20:49 PAGE 2   

  56   2      		//检查串口命令标志	
  57   2       	    if (bCmd)   
  58   2      	    {	
  59   3      		     
  60   3      		    bCmd = FALSE;     //清零命令标志以便接收下一个命令
  61   3      			if(RevBuffer[0]==0x10)	    //测试蜂鸣器
  62   3      		    {
  63   4      		    	RevBuffer[2]=RevBuffer[1];    //蜂鸣时间存到RevBuffer[2]
  64   4      	  	    	cmd_ok();               //发送测试结果01 00给上位机
  65   4      		    	TI=1;		                  //准备发给上位机数据
  66   4      		    	SPEAKER=1;              //开蜂鸣器和指示灯
  67   4      		        CARD_LED=ON;
  68   4      				delay_10ms(RevBuffer[2]);    //延时
  69   4      		    	SPEAKER=0;
  70   4                      CARD_LED=OFF;              
  71   4       			    
  72   4      		    }
  73   3      	    	else if(RevBuffer[0]==0x11)   //串口参数设置,设置通讯波特率
  74   3      	    	{
  75   4          			switch(RevBuffer[1])     
  76   4          			{
  77   5          				case 0:
  78   5      	    				baud=BAUD_9600;
  79   5      	    				break;
  80   5      	    			case 1:
  81   5      	    				baud=BAUD_14400;
  82   5      		    			break;
  83   5      	    			case 2:
  84   5      	    				baud=BAUD_19200;
  85   5      	    				break;
  86   5      	    			case 3:
  87   5      	    				baud=BAUD_28800;
  88   5      	    				break;
  89   5      	    			case 4:
  90   5      	    				baud=BAUD_38400;
  91   5      	    				break;
  92   5      	    			case 5:
  93   5      	    				baud=BAUD_57600;
  94   5      	    				break;
  95   5      	    			case 6:
  96   5      	    				baud=BAUD_115200;
  97   5      	    				break;
  98   5      	    			default:
  99   5      	    				baud=BAUD_19200;
 100   5      	    				break;
 101   5      	    		}				
 102   4      	    		cmd_ok();	        //发送测试结果01 00给上位机
 103   4      	    		TI=1;                    
 104   4      	    		delay_10ms(5);			//延时设置波特率 
 105   4      	    		TR1   = 0;
 106   4      	    		TH1   = baud;
 107   4      	    		TL1   = TH1;
 108   4      	    		delay_10ms(2);
 109   4      	    		TR1   = TRUE;
 110   4      	    	}
 111   3      	    	    	
 112   3             		else
 113   3          		{
 114   4           			uart_process();        // 进入串口处理程序	
 115   4          			TI=1;                 //处理完准备发送结果给上位机 
 116   4          		}
 117   3      	
C51 COMPILER V6.12  MAIN                                                                   08/18/2007 23:20:49 PAGE 3   

 118   3      					                 		  			
 119   3      	 			
 120   3      			 }
 121   2      		
 122   2      	 }
 123   1      }
 124          
 125          ///////////////////////////////////////////////////////////////////////
 126          // 系统初始化
 127          ///////////////////////////////////////////////////////////////////////
 128          void InitSystem(void)
 129          { 
 130   1          RC500CS=0;	            	//选中RC500
 131   1      	RC500RST=0;	               //复位
 132   1      
 133   1      	ET2 = FALSE; 	              // T/C2关中断
 134   1      	T2CON = 0x04;		      //TR2=1,设为TIMER2,auto reload 
 135   1          PCON = 0x80;              
 136   1          SCON = 0x70;              // SMOD = 1;  
 137   1          TMOD = 0x21;              //TMOD = 0x22;
 138   1      
 139   1      	TH1   = BAUD_19200;       //默认波特率
 140   1      	TL1   = TH1;
 141   1      	TR1   = TRUE;             // 以T1作为波特率发生器
 142   1          
 143   1      	ET1=FALSE;
 144   1      	IT0 =TRUE;    			// Config ext0 as edge trigger for RC500
 145   1          EX0 =TRUE; 			// Enable ext0 interrupt for RC500
 146   1          EA = TRUE;			// Enable all interrupts
 147   1      	TR2=FALSE;                   //Close T2
 148   1      	IP=0x10;			// 设串口中断高优先级
 149   1       	ES = TRUE;               //打开串口
 150   1      
 151   1      	bCmd=FALSE;         //初始化为0,没有收到命令
 152   1      					
 153   1      	beep(1);          //开机喇叭和指示灯测试
 154   1          splash(1);
 155   1       	MfConfig();			//配置RC500    
 156   1         
 157   1        
 158   1      }
 159          
 160          ///////////////////////////////////////////////////////////////////////
 161          // 串口接收和发送中断
 162          //数据包格式:数据包长度L(1byte)+命令字C(1byte)+数据包D(L-1 bytes)
 163          //其中数据包长度是从命令字开始算起的。
 164          ///////////////////////////////////////////////////////////////////////
 165          void Uart_Int(void) interrupt 4 using 1
 166          {
 167   1          uchar len, i;
 168   1        	uint j=0;
 169   1       
 170   1        	if(RI)        //收到数据
 171   1      	{	
 172   2      		len=SBUF;  //第一个字节是数据包的长度
 173   2      		RI=0;	   //清零RI以便接收下一个
 174   2      		for(i=0;i<len;i++)
 175   2      		{
 176   3      			while(!RI)
 177   3      			{
 178   4      				j++;
 179   4      				if(j>1000)
C51 COMPILER V6.12  MAIN                                                                   08/18/2007 23:20:49 PAGE 4   

 180   4      				{
 181   5      				    break;
 182   5      				}
 183   4      			}
 184   3      			if(j<1000)
 185   3      			{
 186   4      				RevBuffer[i]=SBUF;    
 187   4      				RI=0;
 188   4      				j=0;
 189   4      			}
 190   3      			else
 191   3      			{
 192   4      			    break;
 193   4      			}
 194   3      		}
 195   2      		if(i==len)
 196   2      		{
 197   3      			REN=0;            // 清零接收位
 198   3      			bCmd=TRUE;       //接收完毕,收到命令有效,置位1
 199   3      		}
 200   2      	}
 201   1      	else if(!RI && TI)   //发送-RI=0,TI=1
 202   1      	{
 203   2      		TI=0;
 204   2      		len=RevBuffer[0];    //发送的第一个字节是包的长度
 205   2      		for(i=0;i<len+1;i++)
 206   2      		{
 207   3      			SBUF=RevBuffer[i];
 208   3      			while(!TI);
 209   3      			TI=0;			
 210   3      		}
 211   2      		REN=1;
 212   2      	}
 213   1      }
 214          ///////////////////////////////////////////////////////////////////////
 215          // IC卡命令处理函数
 216          ///////////////////////////////////////////////////////////////////////
 217          void uart_process(void)
 218          {
 219   1      	uchar cmd;
 220   1      	uchar status;
 221   1      	
 222   1      	cmd = RevBuffer[0];
 223   1      	switch(cmd)
 224   1      	{		
 225   2      				
 226   2      		case 0x20:     // Request ,寻卡
 227   2      			status=M500PiccCommonRequest(RevBuffer[1],&RevBuffer[2]);
 228   2      			if(status!=0)
 229   2      			{
 230   3      				status=M500PiccCommonRequest(RevBuffer[1],&RevBuffer[2]);
 231   3      				if(status!=0)
 232   3      				{
 233   4      					RevBuffer[0]=1;	
 234   4      					RevBuffer[1]=status;
 235   4      					break;
 236   4      				}
 237   3      			}
 238   2      			if(RevBuffer[2]==2)
 239   2      				cardtype=mifare1S70;       // Mifare1 S70 卡
 240   2      			else if(RevBuffer[2]==4)
 241   2      				cardtype=mifare1S50;       // Mifare1 S50 卡
C51 COMPILER V6.12  MAIN                                                                   08/18/2007 23:20:49 PAGE 5   

 242   2      			else if(RevBuffer[2]==16)
 243   2      				cardtype=mifarelight;     // Mifare Light 卡
 244   2      			else
 245   2      				cardtype=unknowncard;
 246   2      			RevBuffer[0]=3;	               // 返回3个字节:状态(1字节)+卡类型(2字节)
 247   2      			RevBuffer[1]=status;
 248   2      			break;
 249   2      			
 250   2      		case 0x21:                         // 防冲突 读卡的系列号 CardSnr
 251   2      			status = M500PiccCascAnticoll(0,&RevBuffer[2]);
 252   2      			if(status!=0)		//失败
 253   2      			{
 254   3      				RevBuffer[0]=1;
 255   3      				RevBuffer[1]=status;
 256   3      				break;
 257   3      			}
 258   2      			memcpy(CardSnr,&RevBuffer[2],4);   //读出4字节序列号
 259   2      			RevBuffer[0]=5;          // 返回5个字节:状态(1字节)+序列号(4字节)                
 260   2      			RevBuffer[1]=status;
 261   2      			break;	
 262   2      		case 0x22:		                    // 选择卡 Select Card
 263   2      			status=M500PiccCascSelect(CardSnr,&RevBuffer[2]);
 264   2      			if(status!=MI_OK)
 265   2      			{
 266   3      				RevBuffer[0]=1;	
 267   3      				RevBuffer[1]=status;
 268   3      				break;
 269   3      			}
 270   2      
 271   2      			RevBuffer[0]=3;
 272   2      			RevBuffer[1]=status;            
 273   2      			break;
 274   2      		case 0x23:	    // Key loading into the MF RC500's EEPROM
 275   2      		            // 校验卡密码(E2)
 276   2      			status=M500PiccAuthE2(RevBuffer[1],CardSnr,RevBuffer[2],RevBuffer[3]);
 277   2      			RevBuffer[0]=1;
 278   2      			RevBuffer[1]=status;			
 279   2      			break;							
 280   2      		case 0x24:     // Key loading into the MF RC500's EEPROM
 281   2      		            // 下载密码(E2)
 282   2      			status=M500PcdLoadKeyE2(RevBuffer[1],RevBuffer[2],&RevBuffer[3]);
 283   2      			RevBuffer[0]=1;
 284   2      			RevBuffer[1]=status;		

⌨️ 快捷键说明

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