?? read_card.c
字號:
#include"c8051f020.h"
#define uint unsigned int
#define uchar unsigned char
#define main_add 0
#define slave_add 1
uint xdata CardData[1000]; //卡中數據
uint *p_CardBufBegin=&CardData[0];
uint *p_CardBufEnd=&CardData[500];
uint *p_CardBufIn=&CardData[0];
uint *p_CardBufOut=&CardData[0];
uint *p_CardBufOutCur=&CardData[0];
uchar CardCountRead;
uchar CardCountCur;
uchar oldCardNo[4]; //上一張卡號
uchar newCardNo[4]; //下一張卡號
uchar CardKey[6]; //卡密碼
uchar KeyType; //密碼類型
uchar SectorNo; //扇區號
uchar BlockNo; //塊號
uchar check_sum;
uchar comm_lenth;
uchar rx1_data_num;
uchar xdata tx0[60],*p_tx0=tx0,tx0_num; //串口0
uchar xdata rx0[60],*p_rx0=rx0,rx0_num;
uchar xdata tx1[210],*p_tx1=tx1,tx1_num; //串口1
uchar xdata rx1[20],*p_rx1=rx1,rx1_num;
bit tx0_over;
bit delay_en,delay_over;
uchar delay_count,i;
void TIME0_ISR(void);
void UART0_ISR(void);
void UART1_ISR(void);
void config(void);
void Delay_10ms(void);
uchar Commu_Test(void); //通訊測試
uchar DownLoad_Psd(uchar,uchar,uchar *); //下載密碼
uchar Search_Card(void); //尋卡
uchar Psd_Verify(uchar,uchar,uchar *); //密碼驗證
uchar Read_Card(uchar); //讀卡
void Close_Card(void); //關閉卡片
void Buzz_One(uchar); //蜂鳴器響一聲
//============*主函數*=================
void main(void)
{config();
EA=1;
TR0=1;
TR2=1;
TMR3CN=0x04;
tx0_over=0;
delay_en=0;
delay_over=0;
rx0_num=0;
rx1_num=0;
CardCountRead=0;
check_sum=0;
while(Commu_Test()!=1);
// CardKey[0]=0x38;
// CardKey[1]=0x57;
// CardKey[2]=0x91;
// CardKey[3]=0x41;
// CardKey[4]=0x50;
// CardKey[5]=0x33;
// KeyType=0x00;
// SectorNo=0x01;
// while(DownLoad_Psd(KeyType,SectorNo,CardKey)!=1);
while(1)
{while(Search_Card()==0);
if(Psd_Verify(0x00,0x04,newCardNo)==0)
{Close_Card();
continue;
}
for(i=0;i<4;i++)
{if(newCardNo[i]!=oldCardNo[i])
{if(Read_Card(0x04)==1)
{Buzz_One(0x30);
for(i=0;i<4;i++)
oldCardNo[i]=newCardNo[i];
}
break;
}
}
Close_Card();
}
}
//=====================================
// 中斷服務程序
//=====================================
void TIME0_ISR(void) interrupt 1 using 1 //系統時鐘中斷(1ms)
{TH0=0xf1; //2ms
TL0=0x9a;
if(delay_en==1)
if(--delay_count==0)
{delay_en=0;
delay_over=1;
}
}
//-------------------------------------
void UART0_ISR(void) interrupt 4 using 2 //串口0中斷
{if(TI0==1)
{TI0=0;
if(--tx0_num!=0)
SBUF0=*p_tx0++;
else
{p_tx0=tx0;
tx0_over=1;
}
}
if(RI0==1)
{RI0=0;
rx0[rx0_num++]=SBUF0;
}
}
//-------------------------------------
void UART1_ISR(void) interrupt 20 using 3 //串口1中斷
{uchar temp,i;
temp=SCON1;
if((temp&=0x02)!=0)
{SCON1&=0xfd;
if(--tx1_num!=0)
SBUF1=*p_tx1++;
else
{p_tx1=tx1;
// tx1_over=1;
}
}
temp=SCON1;
if((temp&=0x01)!=0)
{SCON1&=0xfe;
temp=SBUF1;
switch(rx1_num)
{case 0:
if(temp==0xd7)
{check_sum^=temp;rx1_num++;}
break;
case 1:
if(temp==0x09)
{check_sum^=temp;rx1_num++;}
else
{rx1_num=0;check_sum=0;}
break;
case 2:
if(temp==main_add) //源地址
{check_sum^=temp;rx1_num++;}
else
{rx1_num=0;check_sum=0;}
break;
case 3:
if((temp==slave_add)||(temp==0xff)) //目的地址
{check_sum^=temp;rx1_num++;}
else
{rx1_num=0;check_sum=0;}
break;
case 4:
comm_lenth=temp; //命令長度
check_sum^=temp;
rx1_num++;
break;
case 5:
rx1[rx1_data_num]=temp; //命令碼
check_sum^=temp;
if(++rx1_data_num==comm_lenth)
rx1_num++;
break;
case 6:
if(check_sum==temp)
rx1_num++;
else
rx1_num=0;
check_sum=0;
break;
case 7:
rx1_num=0;
rx1_data_num=0;
if(temp==0x16)
switch(rx1[0])
{case 1:
tx1[0]=0xeb;
check_sum^=tx1[0];
tx1[1]=0x90;
check_sum^=tx1[1];
tx1[2]=slave_add;
check_sum^=tx1[2];
tx1[3]=main_add;
check_sum^=tx1[3];
p_CardBufOutCur=p_CardBufOut;
if(CardCountRead<=100)
{CardCountCur=CardCountRead;
tx1[4]=CardCountCur*2+1;
}
else
{CardCountCur=100;
tx1[4]=201;
}
check_sum^=tx1[4];
tx1[5]=0x81;
check_sum^=tx1[5];
if(CardCountCur!=0)
{for(i=0;i<CardCountCur;i++)
{tx1[6+i*2]=*p_CardBufOutCur&0x00ff;
check_sum^=tx1[6+i*2];
tx1[7+i*2]=(*p_CardBufOutCur>>8)&0x00ff;
check_sum^=tx1[7+i*2];
if(++p_CardBufOutCur==p_CardBufEnd)
p_CardBufOutCur=p_CardBufBegin;
}
}
tx1[CardCountCur*2+6]=check_sum;
tx1[CardCountCur*2+7]=0x16;
check_sum=0;
tx1_num=CardCountCur*2+8;
SBUF1=*p_tx1++;
break;
case 2:
// check_time=1;
break;
case 3:
if(rx1[1]==CardCountCur)
{CardCountRead -= CardCountCur;
p_CardBufOut=p_CardBufOutCur;
}
default:
break;
}
break;
}
}
}
//=====================================
void Delay_10ms(void)
{delay_count=10;
delay_over=0;
delay_en=1;
while(delay_over!=1);
}
//=====================================通訊測試
uchar Commu_Test(void)
{uint n=0;
tx0[0]=0x3c;
tx0[1]=0x04;
tx0[2]=0x00;
tx0[3]=0x60;
tx0[4]=0x00;
tx0[5]=0x00;
tx0[6]=0x58;
tx0[7]=0x0d;
tx0_num=8;
SBUF0=*p_tx0++;
while(tx0_over!=1);
rx0_num=0;
while(n<65535)
{if(rx0_num>=4) break;
n++;
}
Delay_10ms();
rx0_num=0;
if(rx0[2]==0x01)
return 1;
else
return 0;
}
//=====================================下傳密碼
uchar DownLoad_Psd(uchar tmpKeyType,uchar tmpSectorNo,uchar *tmpCardKey)
{uint i,n=0;
tx0[0]=0x3c;
tx0[1]=0x0a;
tx0[2]=0x01;
tx0[3]=0x69;
tx0[4]=tmpKeyType;
tx0[5]=tmpSectorNo;
for(i=0;i<6;i++)
tx0[6+i]=tmpCardKey[i]; //六字節卡密碼
tx0[12]=0;
for(i=0;i<12;i++)
tx0[12]^=tx0[i];
tx0[13]=0x0d;
tx0_num=14;
SBUF0=*p_tx0++;
while(tx0_over!=1);
rx0_num=0;
while(n<65535)
{if((rx0[1]==0x02)&&(rx0_num>=6)) break;
if((rx0[1]==0x01)&&(rx0_num>=5)) break;
n++;
}
Delay_10ms();
rx0_num=0;
if(rx0[1]==0x02)
return 1;
else
return 0;
}
//=====================================尋卡命令
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -