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(); }