www.pudn.com > file19.rar > file19.c


/*电梯门禁系统,采用H6152读卡器读写Mifare射频卡,读卡器与系统主机采用CAN总线通信; 
CAN总线控制器为SJA1000;文件MODULE.CARD用于读卡器与射频卡的通信,文件MODULE.CAN用于 
读卡器通过CAN总线与系统主机的通信。*/ 
 
/********************************************************************************************* 
*                              读卡器与射频卡的通信                                                               * 
*                  *****************MODULE.CAR*****************                              * 
*                              读卡器控制器为AT89C51                                                             * 
**********************************************************************************************/   
 
#include  
#include 
#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(); 
 
}