📄 main.c
字号:
/****************************************************************************
* 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 + -