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

📄 main.c

📁 读写ID卡源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************
* File:         MAIN.C                                                      *
* Version:      1.0                                       	       		    *
* Created:      21.06.2005                                                  *
* Last Change:  22.06.2005                                                  *
* Author:       yuanjun yin                                                 *
* Compiler:     KEIL C51 uVision2 V2.23                                     *
* Description:  89C54RD+-Firmware for MFRC500 Demo Serial Reader            *
****************************************************************************/
#include "main.h"
#include <p89c51rx.h>
//sbit    LED	        		= P3^5;
sbit    M_BIT               = P3^2;
sbit    A_500                 = P1^5;
sbit    B_500                 = P1^6;
sbit    C_500                 = P1^7;
sbit    led_1               =P3^3;
sbit    led_2               =P3^4;
sbit    led_3               =P3^5;
sbit    led_4               =P3^7;
sbit	SECOND_3            =P1^0;        //取消
sbit	SECOND_8            =P1^1;        //抢庄
sbit    save                =P1^2;
sbit     vvvv               =P1^4;
void sort(void);
// Serial Number of the MFRC500 

//unsigned char tt[2];
uchar snr_counter=1;
uchar M_STA;        //定时读写标志   =1,起始   =2
unsigned char RCV_BYTE;
unsigned char M_LRC;
unsigned char M_BITS;
unsigned char M_BYTES;
uchar M_IDATA[5];
uchar snr[4];
uchar snr1[4];
uchar snr2[4];
uchar snr3[4];
uchar snr4[4];
//uchar snr5[4];
uchar rxhead;
uchar txhead=0;
uchar receive_buf1[1];
uchar send_buf[8];
uchar mjcounter;
//uchar desk_counter=0;
uchar mjdata;
uchar sameoutvalue;
uint  mscounter;
uint  mscounter1;
uint  secondcounter;
uint  secondcounter1;
//unsigned char blockdata[16];
uchar size;
uchar yyj;

unsigned int yyjyj;
unsigned char outnum;

void init(void);
//void led_flash(void);
unsigned char mifare_init(void);
unsigned char read_3card(void);
unsigned char CMP_STRING(unsigned char *pt1,
                         unsigned char *pt2,unsigned char len);
//void rec_comm(void);
unsigned char read_card3(void);
void cpu_sleep(void);
unsigned char output(uchar hhh);
uchar press_key(void);
void selectout(unsigned char tt);
void swapdata(unsigned int *x,unsigned int *y);
void press_data(uchar tty);
unsigned char blockdata[16];
void cmpdata(void);
void sort_mjdata(void);
//void rec_comm(void);
void sameout(unsigned char tt);
void clearout(void);
void flash_led(void);
void m_readcard(void);  
unsigned char readcard(void);
void write_eeprom(unsigned int addrdata,unsigned char data2);
void write_pagedata(unsigned char pagenumber);
unsigned char read_eeprom(unsigned int addrdata);
void erase_eeprom(unsigned char sectors);
void read_cardno(void);
void select_500(unsigned char ss1);
void led_light(unsigned char select);
void read_first(void);
void time2init(void);
unsigned char readcard1(void);
void on_led(unsigned char yyj);
void off_led(unsigned char yyj);
unsigned char readcance(void);
unsigned char bdata flag;
//		sbit out_flag=flag^0;
//		sbit up_flag=flag^1;             //上活门标志
//		sbit down_flag=flag^2;           //下活门标志
//		sbit life_flag=flag^3;           //生死门标志
//		sbit second_flag=flag^4;         //输出二次标志
//		sbit reset_flag=flag^5;
		sbit s8_flag=flag^6;
		sbit error_flag=flag^7;

sbit  ACC0 = ACC^0;
sbit  ACC7 = ACC^7;

unsigned char bdata flag1;
		sbit M_FLAG=flag1^0;
		sbit HALF_FLAG=flag1^1;
		sbit SHORT_FLAG=flag1^2;
		sbit RCV_BIT=flag1^3;
		sbit M_DATA_FLAG=flag1^4;
		sbit receive_flag=flag1^5;
		sbit R_MRC=flag1^6;


unsigned char bdata flag2;
		sbit cance_flag=flag2^0;
		sbit output_flag=flag2^1;
		sbit st_1=flag2^2;
		sbit st_cance=flag2^3;
		sbit st_a4=flag2^4;
		sbit st_e=flag2^5;
		sbit st_e1=flag2^6;


unsigned char bdata flag3;
		sbit st_e2=flag3^0;
		sbit st_e3=flag3^1;
		sbit st_e4=flag3^2;
		sbit sec1=flag3^3;
		sbit sec2=flag3^4;
		sbit sec3=flag3^5;
		sbit sec4=flag3^6;

unsigned char bdata flag4;
		sbit first_flag=flag4^0;
		sbit second_flag=flag4^1;
		sbit readsecond_flag=flag4^2;
		sbit third_flag=flag4^3;
		sbit readthird_flag=flag4^4;
		sbit sansecond_flag=flag4^5;
		sbit readcance_flag=flag4^6;
/****************************************************************************
****************************************************************************/
void 	main (void)
{
  unsigned char counter,counter2,ttt;
  unsigned char mfout=2;//readbuf[16];
  unsigned char tt1[2];
  unsigned char status1;
  unsigned char cardserialno[4];
  unsigned char *sak1;
  unsigned char i,ii,iii,tt,ss;
  unsigned int j;
  unsigned char c1=0,c2=0,c3=0,c4;

  init();

  mjcounter=1;	
  
	yyjyj=0;
	read_cardno();
	for(;;)
	{
//		secondcounter1++;
		if(save==0)
		{
			read_first();
		}
		else
		{
			
		}
	}
}
/****************************************************************************
****************************************************************************/
unsigned char readcance(void)
{
	unsigned char i,ii;
	for(i=4;i<8;i++)
	{
		select_500(i);
		ii=readcard();
		if(ii==0)
		{
			led_light(6);
			return 0;
		}
//		led_light(6);
	}
	return 1;
}
void on_led(unsigned char yyj)
{
	switch(yyj)
	{
		case 0:
		led_1=0;
		break;
		case 1:
		led_2=0;
		break;
		case 2:
		led_3=0;
		break;
		case 3:
		led_4=0;
		break;
		default:
		break;
	}
}
void off_led(unsigned char yyj)
{
	switch(yyj)
	{
		case 0:
		led_1=1;
		break;
		case 1:
		led_2=1;
		break;
		case 2:
		led_3=1;
		break;
		case 3:
		led_4=1;
		break;
		case 10:
		led_1=1;
		led_2=1;
		led_3=1;
		led_4=1;
		break;
		default:
		break;
	}
}
void 	init (void)
{

		 IP=0x00;
		 TCON=1;    
		 TMOD=0x12;     //定时器0为8位自动重装;定时器1为16位计数器工作方式
		 time2init();
		      //外部中断0的触发方式为边沿方式
		 SCON=0x50;
		 PCON|=0x80;           //dual 4800X2=9600
//		 TH1=TL1=0xfa;        //TH1=TL1=256-(11059200/4800/32/12+0.5)
		 TH1=0x00;
		 TL1=0x00;
		 TR1=1;
		 ES=1;
		 EA=1;
}
void time2init(void)
{
	T2MOD &= 0xFC; /* T2OE=0;定时器2输出不允许 */
	T2MOD |= 0x01; /* DCEN=1;可以设置为向上/下计数:此程序中为向上达到0xff时溢出*/ 
	EXF2=0; /* reset flag 定时器2外部标志位清除*/
	TCLK=0;
	RCLK=0; /* disable baud rate generator 不用于波特率发生器*/ 
	EXEN2=0; /* ignore events on T2EX 视T2EX(P1.1)端信号无效*/ 
	TH2=0xFC;//MSB_reload_value; /* Init msb_value 填入初始化值*/ 
	TL2=0x66;//LSB_reload_value; /* Init lsb_value */ 
	RCAP2H=0xFb;//MSB_reload_value; /* reload msb_value重载值 */ 
	RCAP2L=0x66;//LSB_reload_value; /* reload lsb_value */ 
	C_T2=0; /* timer mode 定时模式*/ 
	CP_RL2=0; /* reload mode 重载模式*/ 
//	EA=1; /* interupt enable 中断允许*/ 
	ET2=1; /* enable timer2 interrupt 允许T2中断*/ 
	TR2=1; /* timer2 run 开始计时*/
}

void select_500(unsigned char ss1)
{
	unsigned char s1;
	s1=ss1;
	switch(s1)
	{
		case 0:       //第一个500
		A_500=0;
		B_500=0;
		C_500=0;
		break;
		case 1:        //第二个500
		A_500=1;
		B_500=0;
		C_500=0;
		break;
		case 2:        //第三个500
		A_500=0;
		B_500=1;
		C_500=0;
		break;
		case 3:        //第四个500
		A_500=1;
		B_500=1;
		C_500=0;
		break;
		case 4:        //第五个500
		A_500=0;
		B_500=0;
		C_500=1;
		break;
		case 5:        //第六个500
		A_500=1;
		B_500=0;
		C_500=1;
		break;
		case 6:        //第七个500
		A_500=0;
		B_500=1;
		C_500=1;
		break;
		case 7:        //第八个500
		A_500=1;
		B_500=1;
		C_500=1;
		break;
		default:
		break;
	}
}
unsigned char readcard(void)
{
		uchar i,ss;
		m_readcard();
		TH1=0x20;
		TL1=0xff;
		TF1=0;
		TR1=1;
		ET1=0;
		ES=0;
		while(1)
		{
			if(M_FLAG==1)
			{
//				TMOD=0x12;
//				TR1=0;
//				TH1=TL1=0xfa;
//				TH1=0x00;
//				TL1=0xff;
//				TR1=1;
//				ET1=1;           //开T1中断
				M_FLAG=0;
				for(i=0;i<4;i++)
				snr[i]=M_IDATA[i+1];
				ss=CMP_STRING(snr,snr4,4);
				if(ss==0)return 0;
				else return 1;
			}
			if(TF1==1)
			{
				return 1;
			}
//			if(error_flag==1)
//			{
//				return 1;
//			}
		}
}
unsigned char readcard1(void)
{
		uchar i,ss;
//		TMOD=0x12;
		m_readcard();

		while(1)
		{
			if(M_FLAG==1)
			{

				M_FLAG=0;
				for(i=0;i<4;i++)
				snr[i]=M_IDATA[i+1];
				return 0;
			}
			if(error_flag==1)
			{
				return 1;
			}
		}
}

void m_readcard(void)
{
	uchar i;
	for(i=0;i<5;i++)
	M_IDATA[i]=0;
	error_flag=0;
	TR0=0;
	ET0=0;
//	TCON=1; 
	IT0=1;   
	PX0=1;
	M_STA=0;
	TH0=0x16;   //256uS定时参数,在11.0592MHz的情况下
//	TH0=0xfe;
//	TL0=0x2b;
//	TH0=0x01;
   	M_FLAG=0;
	SHORT_FLAG=0;
	R_MRC=0;
	EX0=1;
	EA=1;
}
void led_light(unsigned char select)
{
	unsigned int i;
	switch(select)
	{
		case 0:
			led_1=0;
			for(i=0;i<30000;i++);
			led_1=1;
			break;
		case 1:
			led_2=0;
			for(i=0;i<30000;i++);
			led_2=1;
			break;
		case 2:
			led_3=0;
			for(i=0;i<30000;i++);
			led_3=1;
			break;
		case 3:
			led_4=0;
			for(i=0;i<30000;i++);
			led_4=1;
			break;
		case 4:
			SECOND_3=0;
			for(i=0;i<30000;i++);
			SECOND_3=1;
			break;
		case 5:
			SECOND_8=0;
			for(i=0;i<30000;i++);
			SECOND_8=1;
			break;
		case 6:
			vvvv=0;
			for(i=0;i<500;i++);

⌨️ 快捷键说明

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