?? file19.c
字號:
/*電梯門禁系統,采用H6152讀卡器讀寫Mifare射頻卡,讀卡器與系統主機采用CAN總線通信;
CAN總線控制器為SJA1000;文件MODULE.CARD用于讀卡器與射頻卡的通信,文件MODULE.CAN用于
讀卡器通過CAN總線與系統主機的通信。*/
/*********************************************************************************************
* 讀卡器與射頻卡的通信 *
* *****************MODULE.CAR***************** *
* 讀卡器控制器為AT89C51 *
**********************************************************************************************/
#include<reg51.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
#define _MHZ_ 11
void m_reset();//H6152軟復位
void m_start_check();//進入卡片檢測狀態
void m_end_con();//停止卡片檢測
uchar m_auto_select(uchar *buf);//自動選中卡片
uchar m_select(uchar *sn);//選中指定的卡片
uchar m_login(uchar sector,uchar keytype, uchar *keyvalue); //登陸指定扇區
uchar m_read_block(uchar block,uchar *buf);// 讀塊
uchar m_read_value(uchar block,uchar*buf);//讀數據塊
uchar m_read_register(uchar addr,uchar*result);//讀工作寄存器
uchar m_write_block(uchar block,uchar*buf);//寫塊
uchar m_write_value(uchar block,uchar*buf);//寫入數據塊
uchar m_write_register(uchar addr,uchar mydata);//寫入工作寄存器
uchar m_write_memory(uchar addr,uchar*buf);// 寫入密碼
uchar m_increment(uchar block,uchar*value,uchar*result);// 加值
uchar m_decrement(uchar block,uchar*value,uchar*result);//減值
void m_error();
void delay10ms(uint count);
void m_send_cmd(uchar*str);//串口發送命令
void Byte2Hexcat(uchar*byte,uchar len,uchar*str);// 字符數組轉換為十六進制字符串并附接至給定字符串
void Hex2Byte(uchar*str,uchar*byte);//十六制字符轉換為字符數組
uchar m_buf[0x25];//緩沖區
//密碼類型
enum
{
M_KEY_A=0xaa,//使用密碼A
M_KEY_B=0xbb,//使用密碼B
M_KEY_DEFAULT=0xff//使用默認密碼
};
//返回值類型
enum
{
M_OK='L',//操作成功
M_ERR_N='N',//無卡
M_ERR_F='F',//操作失敗
M_ERR_E='E',//格式錯誤
M_ERR_I='I',//非數值塊
M_ERR_X='X',//操作后無法讀出
M_ERR_U='U'//未知錯誤
};
//串口初始化
void UART_INIT()
{
//"9600,,n,8,1",外接晶振11.0592
TMOD=0x20;
TH1=250;
TL1=250;
TR1=1;
PCON=0x80;
SCON=0x50;
ES=0;
}
//H6152軟復位
void m_reset()
{
strcpy(m_buf,"x");
m_send_cmd(m_buf);
delay10ms(25);
}
//進入卡片檢測狀態
void m_start_check()
{
strcpy(m_buf,"");
m_send_cmd(m_buf);
delay10ms(1);
m_buf[0]='c';
m_send_cmd(m_buf);
delay10ms(1);
RI=0;
while(!RI);
delay10ms(1);
RI=0;
while(!RI);
}
//停止卡片檢測
void m_end_con()
{
strcpy(m_buf,"");
m_send_cmd(m_buf);
delay10ms(1);
}
//自動選中卡片
uchar m_auto_select(uchar*buf)
{
uchar i;
strcpy(m_buf,"m\r");
m_send_cmd(m_buf);
for(i=0;i<8;i++)
{
RI=0;
while(!RI);
*(m_buf+i)=SBUF;
if((*(m_buf+i)>0x39)&&(*(m_buf+i)<'a'))
return *(m_buf+i);
}
*(m_buf+8)=0;
Hex2Byte(m_buf,buf);
strcpy(m_buf,"m");
Byte2Hexcat(buf,4,m_buf);
delay10ms(1);
m_send_cmd(m_buf);
for(i=0;i<8;i++)
{
RI=0;
while(!RI);
*(m_buf+i)=SBUF;
if((*(m_buf+i)>0x39)&&(*(m_buf+i)<'a'))
return *(m_buf+i);
}
return 0;
}
//選中指定的卡片
uchar m_select(uchar*sn)
{
uchar i;
strcpy(m_buf,"m");
Byte2Hexcat(sn,4,m_buf);
m_send_cmd(m_buf);
for(i=0;i<8;i++)
{
RI=0;
while(!RI);
*(m_buf+i)=SBUF;
if((*(m_buf+i)>0x39)&&(*(m_buf+i)<'a'))
return *(m_buf+i);
}
return 0;
}
//登陸指定扇區
uchar m_login(uchar sector,uchar keytype,uchar*keyvalue)
{
uchar tmp1;
if(sector>16) //扇區超過16報警
return M_ERR_E;
strcpy(m_buf,"l");
Byte2Hexcat(§or,1,m_buf);
if(((keytype>0x10)&&(keytype<0x2f))||((keytype>0x30)&&(keytype<0x4f)))/*使用密碼寄存器00..2F
中的內容*/
Byte2Hexcat(&keytype,1,m_buf);
else if((keytype==M_KEY_A)||(keytype==M_KEY_B))//使用密碼A或密碼B登錄
{
Byte2Hexcat(&keytype,1,m_buf);
if(keyvalue==NULL)
strcat(m_buf,"\r");
else
Byte2Hexcat(keyvalue,6,m_buf);
}
else if(keytype==M_KEY_DEFAULT)//使用默認密碼登錄
{
strcat(m_buf,"\r");
}
else
return M_ERR_U;
m_send_cmd(m_buf);
RI=0;
while(!RI);
tmp1=SBUF;
if(tmp1=='L')//登錄成功
return 0;
else
return tmp1;//錯誤
}
// 讀塊
uchar m_read_block(uchar block,uchar*buf)
{
uchar i;
if(block>64)//塊超過64報錯
return M_ERR_E;
strcpy(m_buf,"r");
Byte2Hexcat(&block,1,m_buf);
m_send_cmd(m_buf);
for(i=0;i<32;i++)
{
RI=0;
while(!RI);
*(m_buf+i)=SBUF;
if((*(m_buf+i)>0x39)&&(*(m_buf+i)<'a'))
return *(m_buf+i);
}
*(m_buf+32)=0;
Hex2Byte(m_buf,buf);
return 0;
}
//寫塊
uchar m_write_block(uchar block,uchar*buf)
{
uchar i;
if(block>64)
return M_ERR_E;
strcpy(m_buf,"w");
Byte2Hexcat(&block,1,m_buf);
Byte2Hexcat(buf,16,m_buf);
m_send_cmd(m_buf);
for(i=0;i<8;i++)
{
RI=0;
while(!RI);
*(m_buf+i)=SBUF;
if((*(m_buf+i)>0x39)&&(*(m_buf+i)<'a'))
return *(m_buf+i);
}
return 0;
}
//寫入工作寄存器
uchar m_write_register(uchar addr,uchar mydata)
{
uchar i;
if(addr>0x13)//工作寄存器最大地址0x13
return M_ERR_E;
strcpy(m_buf,"we");
Byte2Hexcat(&addr,1,m_buf);
Byte2Hexcat(&mydata,1,m_buf);
m_send_cmd(m_buf);
for(i=0;i<2;i++)
{
RI=0;
while(!RI);
*(m_buf+i)=SBUF;
if((*(m_buf+i)>0x39)&&(*(m_buf+i)<'a'))
return *(m_buf+i);
}
return 0;
}
// 加值
uchar m_increment(uchar block,uchar*value,uchar*result)
{
uchar i;
if(block>64)
return M_ERR_E;
strcpy(m_buf,"+");
Byte2Hexcat(&block,1,m_buf);
Byte2Hexcat(value,4,m_buf);
for(i=0;i<8;i++)
{
RI=0;
while(!RI);
*(m_buf+i)=SBUF;
if((*(m_buf+i)>0x39)&&(*(m_buf+i)<'a'))
return *(m_buf+i);
}
*(m_buf+8)=0;
Hex2Byte(m_buf,result);
return 0 ;
}
//
void main()
{
uchar sn[4];
bit chk=0;
UART_INIT();
m_reset();
m_start_check();
m_end_con();
m_auto_select(sn);
if(m_login(0x01,M_KEY_DEFAULT,NULL))
m_error();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -