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

📄 file19.c

📁 H6152读Mifare射频卡通信.zip
💻 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(&sector,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 + -