📄 11d.c
字号:
#include <reg51.h>
#include "intrins.h"
#define BYTE unsigned char
sbit UART_RX_BIT =P3^1;
sbit UART_TX_BIT =P3^2;
sbit DIG1 =P3^4;
sbit DIG2 =P3^5;
BYTE SendData[32],ReciData[10];
BYTE tmpCardNo[4];
BYTE tmpResult;
void SoftUART_PutByte(BYTE psData);
BYTE SoftUART_GetByte(void);
BYTE XORCheck(BYTE *psData,BYTE length);
//void Delay_10ms(void);
void Delay_52us_NOP(void);
void Delay_26us_NOP(void);
// 19200 BAUD
// 1 Bit = 1/19200 = 52us
// 1.5 Bit = 52us + 0.5 * 52us = 78us
// 1 Byte = 52 * 10 = 520us
BYTE Commu_Test(void);
BYTE DownLoad_Psd(BYTE BlockNo,BYTE KeyType,BYTE *CardKey);
BYTE Search_Card(void);
BYTE Psd_Verify(BYTE BlockNo,BYTE KeyType,BYTE *CardNo);
BYTE Read_Card(BYTE BlockNo);
BYTE Write_Card(BYTE BlockNo,BYTE *CardData);
BYTE TurnOff_Card(void);
BYTE Shut_RF(BYTE OnOff);
void BuzzOne(BYTE Time);
void SetRes(BYTE RES,BYTE NUM);
void Display(BYTE dispData);
void main(void)
{
BYTE tmpKeyType,tmpBlockNo,tmpKey[6];
BYTE tmpData[16];
BYTE tmpRes;
BYTE i;
tmpKeyType = 0; // KEY A
tmpBlockNo = 4; // Block 4
for(i=0;i<6;i++) tmpKey[i] = 0xFF;
for(i=0;i<4;i++) tmpCardNo[i]=0;
for(i=0;i<16;i++) tmpData[i]=i;
for(;;)
{
//Step1:通讯测试
tmpRes=Commu_Test();
SetRes(tmpRes,1);
//Step2:下载密码
tmpRes=DownLoad_Psd(tmpBlockNo,tmpKeyType,tmpKey);
SetRes(tmpRes,2);
//Step3:寻卡
tmpRes=Search_Card();
SetRes(tmpRes,3);
//Step4:验证密码
tmpRes=Psd_Verify(tmpBlockNo,tmpKeyType,tmpCardNo);
SetRes(tmpRes,4);
//Step5:读卡
tmpRes=Read_Card(tmpBlockNo);
SetRes(tmpRes,5);
//Step6:写卡
tmpRes=Write_Card(tmpBlockNo,tmpData);
SetRes(tmpRes,6);
//Step7:关闭卡
tmpRes=TurnOff_Card();
SetRes(tmpRes,7);
//Step8:关闭或打开射频电路
tmpRes=Shut_RF(1);
SetRes(tmpRes,8);
//Additianl:蜂鸣器
BuzzOne(200);
//-------------------------------
Display(tmpResult);
}
}
//***************************************************
void SoftUART_PutByte(BYTE psData)
{
BYTE i;
BYTE UART_Data;
UART_Data = psData;
for(i = 0; i < 10; i++)
{
if(i == 0)
{
UART_TX_BIT = 0; // generate start bit
}
else if(i == 9)
{
UART_TX_BIT = 1; // generate stop bit
}
else
{
if(UART_Data & 0x01)
{
UART_TX_BIT = 1; // generate HIGH level
}
else
{
UART_TX_BIT = 0; // generate LOW level
}
UART_Data >>= 1;
}
Delay_52us_NOP();
}
}
//-----------------------------------------------
BYTE SoftUART_GetByte(void)
{
BYTE i;
BYTE UART_Data;
UART_Data = 0x00;
// 增加超时处理: 未连接/未上电/通讯错误等
while(UART_RX_BIT); // Wait for start bit
Delay_52us_NOP();
Delay_26us_NOP();
for(i = 0; i < 8; i++)
{
if(UART_RX_BIT)
{
if(i < 8) UART_Data |= 0x80;
}
if(i < 7) UART_Data >>= 1;
Delay_52us_NOP();
}
UART_RX_BIT = 1;
return UART_Data;
}
BYTE XORCheck(BYTE *psData,BYTE length)
{
BYTE i;
BYTE XORData;
XORData = 0;
for(i = 0; i < length; i++)
{
XORData ^= psData[i];
}
return XORData;
}
void Delay_52us_NOP(void)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
void Delay_26us_NOP(void)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
}
//------------------------------------------------------------------
//------------------------------------------------------------------
//------------------------------------------------------------------
BYTE Commu_Test(void)
{
BYTE i;
//--------------------------------------------------------------------
// command:3C 04 00 60 00 00 BCC 0D
// send 8 byte
//--------------------------------------------------------------------
SendData[0] = 0x3c;
SendData[1] = 0x04;
SendData[2] = 0x00;
SendData[3] = 0x60;
SendData[4] = 0x00;
SendData[5] = 0x00;
SendData[6] = XORCheck(SendData,6);
SendData[7] = 0x0d;
for(i = 0; i < 8; i++)
{
SoftUART_PutByte(SendData[i]);
}
//--------------------------------------------------------------------
// Right: 3C 01 01 BCC 0D
// Error: 3C 01 00 BCC 0D
//--------------------------------------------------------------------
for(i = 0; i < 5; i++)
{
ReciData[i] = SoftUART_GetByte();
if(ReciData[i] == 0x0d) break;
}
if(ReciData[2] != 0X01) return 1;
return 0;
}
//------------------------------------------------------------------
BYTE DownLoad_Psd(BYTE BlockNo,BYTE KeyType,BYTE *CardKey)
{
BYTE i;
//--------------------------------------------------------------------
// command:command:3C 0A 01 69 00(A套密码) 00(扇区号=00~15) 六字节卡密码 BCC 0D
//--------------------------------------------------------------------
SendData[0] = 0x3c;
SendData[1] = 0x0a;
SendData[2] = 0x01;
SendData[3] = 0x69;
SendData[4] = KeyType;//0x00;
SendData[5] = BlockNo;//0x00;
for(i = 0; i < 6; i++) SendData[6 + i] = CardKey[i];
SendData[12] = XORCheck(SendData,12);
SendData[13] = 0x0d;
for(i = 0; i < 13; i++)
{
SoftUART_PutByte(SendData[i]);
}
//--------------------------------------------------------------------
// Right: 3C 02 00 00 BCC 0D
// Error: 3C 01 FF(错误返回代码) BCC 0D
//--------------------------------------------------------------------
for(i = 0; i < 6; i++)
{
ReciData[i] = SoftUART_GetByte();
if(ReciData[i] == 0x0d) break;
}
if(ReciData[1] != 0x02) return 1;
return 0;
}
//------------------------------------------------------------------
BYTE Search_Card(void)
{
BYTE i;
//--------------------------------------------------------------------
// command:command:3C 04 01 70 00(寻卡模式00(IDLE)或01(ALL)) 00 BCC 0D
//--------------------------------------------------------------------
SendData[0] = 0x3c;
SendData[1] = 0x04;
SendData[2] = 0x01;
SendData[3] = 0x70;
SendData[4] = 0x00;
SendData[5] = 0x00;
SendData[6] = XORCheck(SendData,6);
SendData[7] = 0x0d;
for(i = 0; i < 8; i++)
{
SoftUART_PutByte(SendData[i]);
}
//--------------------------------------------------------------------
// Right: 3C 05 四字节卡号 00 BCC 0D
// Error: 3C 01 FF(错误返回代码) BCC 0D
//--------------------------------------------------------------------
for(i = 0; i < 9; i++)
{
ReciData[i] = SoftUART_GetByte();
if(ReciData[i] == 0x0d) break;
}
if(ReciData[2] != 0x05)
{
for(i=0;i<4;i++) tmpCardNo[i]=ReciData[i+2];
return 1;
}
return 0;
}
//------------------------------------------------------------------
BYTE Psd_Verify(BYTE BlockNo,BYTE KeyType,BYTE *CardNo)
{
BYTE i;
//--------------------------------------------------------------------
// command:3C 08 01 6A 00(A密码或B密码01) 00(块号) 四字节卡号 BCC 0D
//--------------------------------------------------------------------
SendData[0] = 0x3c;
SendData[1] = 0x08;
SendData[2] = 0x01;
SendData[3] = 0x6a;
SendData[4] = KeyType;//0x00;
SendData[5] = BlockNo;//0x00;
for(i = 0; i < 4; i++) SendData[6 + i] = CardNo[i];
SendData[10] = XORCheck(SendData,10);
SendData[11] = 0x0d;
for(i = 0; i < 12; i++)
{
SoftUART_PutByte(SendData[i]);
}
//--------------------------------------------------------------------
// Right: 3C 02 00 00 BCC 0D
// Error: 3C 01 FF(错误代码) BCC 0D
//--------------------------------------------------------------------
for(i = 0; i < 6; i++)
{
ReciData[i] = SoftUART_GetByte();
if(ReciData[i] == 0x0d) break;
}
if(ReciData[2] != 0x02) return 1;
return 0;
}
//------------------------------------------------------------------
BYTE Read_Card(BYTE BlockNo)
{
BYTE i;
//--------------------------------------------------------------------
// command:3C 04 01 66 00(绝对块号) 00 BCC 0D
//--------------------------------------------------------------------
SendData[0] = 0x3c;
SendData[1] = 0x04;
SendData[2] = 0x01;
SendData[3] = 0x66;
SendData[4] = BlockNo;//0x00;
SendData[5] = XORCheck(SendData,5);
SendData[6] = 0x0d;
for(i = 0; i < 7; i++)
{
SoftUART_PutByte(SendData[i]);
}
//--------------------------------------------------------------------
// Right: 3C 12 00 DATA0~DATA15 BCC 0D
//Error: 3C 01 FF(错误返回代码) BCC 0D
//--------------------------------------------------------------------
for(i = 0; i <5; i++)
{
ReciData[i] = SoftUART_GetByte();
if(ReciData[i] == 0x0d) break;
}
if(ReciData[2] != 0x12) return 1;
return 0;
}
//------------------------------------------------------------------
BYTE Write_Card(BYTE BlockNo,BYTE *CardData)
{
BYTE i;
//--------------------------------------------------------------------
// command:3C 13 01 67 00(绝对块号) DATA0~DATA15 BCC 0D
//--------------------------------------------------------------------
SendData[0] = 0x3c;
SendData[1] = 0x13;
SendData[2] = 0x01;
SendData[3] = 0x67;
SendData[4] = BlockNo;//0x00;
for(i = 0; i < 15; i++) SendData[5 + i] = CardData[i];
SendData[21] = XORCheck(SendData,21);
SendData[22] = 0x0d;
for(i = 0; i < 23; i++)
{
SoftUART_PutByte(SendData[i]);
}
//--------------------------------------------------------------------
// Right: 3C 02 00 00 BCC 0D
//Error: 3C 01 FF(错误返回代码) BCC 0D
//--------------------------------------------------------------------
for(i = 0; i < 6; i++)
{
ReciData[i] = SoftUART_GetByte();
if(ReciData[i] == 0x0d) break;
}
if(ReciData[2] !=0x02) return 1;
return 0;
}
//------------------------------------------------------------------
BYTE TurnOff_Card(void)
{
BYTE i;
//--------------------------------------------------------------------
// command:3C 04 01 68 00 00 51 0D
//--------------------------------------------------------------------
SendData[0] = 0x3c;
SendData[1] = 0x04;
SendData[2] = 0x01;
SendData[3] = 0x68;
SendData[4] = 0x00;
SendData[5] = 0x00;
SendData[6] = 0x51;
SendData[7] = 0x0d;
for(i = 0; i < 8; i++)
{
SoftUART_PutByte(SendData[i]);
}
//--------------------------------------------------------------------
// Right: 3C 02 00 00 3E 0D
//Error: 3C 01 FF (错误返回代码)BCC 0D
//--------------------------------------------------------------------
for(i = 0; i < 6; i++)
{
ReciData[i] = SoftUART_GetByte();
if(ReciData[i] == 0x0d) break;
}
if(ReciData[2] != 0x02) return 1;
return 0;
}
//------------------------------------------------------------------
BYTE Shut_RF(BYTE OnOff)
{
BYTE i;
//--------------------------------------------------------------------
// command:3C 03 01 72 00(00-关闭射频电路,01-唤醒射频电路) BCC 0D
//--------------------------------------------------------------------
SendData[0] = 0x3c;
SendData[1] = 0x03;
SendData[2] = 0x01;
SendData[3] = 0x72;
SendData[4] = OnOff;
SendData[5] = XORCheck(SendData,5);
SendData[6] = 0x0d;
for(i = 0; i < 7; i++)
{
SoftUART_PutByte(SendData[i]);
}
//--------------------------------------------------------------------
// Right:3C 02 00 00 BCC 0D
//Error:3C 01 FF (错误返回代码)BCC 0D
//--------------------------------------------------------------------
for(i = 0; i < 6; i++)
{
ReciData[i] = SoftUART_GetByte();
if(ReciData[i] == 0x0d) break;
}
if(ReciData[2] != 0x02) return 1;
return 0;
}
//------------------------------------------------------------------
void BuzzOne(BYTE Time)
{
BYTE i;
//--------------------------------------------------------------------
// command:3C 03 01 6B 55(TIME) BCC 0D
//--------------------------------------------------------------------
SendData[0] = 0x3c;
SendData[1] = 0x03;
SendData[2] = 0x01;
SendData[3] = 0x6b;
SendData[4] = Time;
SendData[5] = XORCheck(SendData,5);
SendData[6] = 0x0d;
for(i = 0; i < 7; i++)
{
SoftUART_PutByte(SendData[i]);
}
}
void SetRes(BYTE RES,BYTE NUM)
{
BYTE temp1,temp2;
if(RES==0)
{
temp1=0xFF<<NUM;
temp2=0xFF>>7-NUM;
tmpResult=temp1||temp2;
}
}
void Display(BYTE dispData)
{
P1=dispData;
//_clr_(DIG1);
//delay(10);
//_setb_(DIG1);
P1=~dispData;
//_clr_(DIG2);
//delay(10);
//_setb(DIG2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -