📄 125k.c
字号:
#include <REG52.H>
sfr T2MOD = 0xc9;
sbit speak_port = P2^5;
#define time0 60 //90us
#define time1 200 //300us
#define time2 460 //690us
//读卡头内部变量
sbit rf_data1 = P1^5;
bit inbak = 1;
unsigned char byte_buffer[4];
unsigned char currency_temp[4];
unsigned int pulse_time;
unsigned char eerom_delay;
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM 韦根解码 MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
/***等待电平跳变******************************************/
bit wait_change(void)
{
unsigned char long_time = 200; //22.1184------ 1次为4.3us
while(inbak == rf_data1) {if(--long_time == 0) return(0);}
pulse_time = TH1;
pulse_time = ((pulse_time << 8) & 0xff00) | TL1;
TH1 = 0; TL1 = 0;
inbak = rf_data1;
return(1);
}
//***返回:读卡成功标记,成功读卡数据放在 byte_buffer[4]中 ************************
bit read_IDka(void)
{
unsigned char i, j;
unsigned char five_bit, verify_row, bit_buffer[11];
bit verify_bit, compare_bit;
start_readid:
//CLEARWDT;
//确定起始标识
if(!wait_change()) return(0);
if((pulse_time < time1) || inbak) goto start_readid;
for(i=0;i<16;i++)
{
if(!wait_change()) return(0);
if(pulse_time>time1 || pulse_time<time0) goto start_readid;
}
//speak_port = !speak_port;
//保存位数据
for(i=0; i<11; i++)
{
five_bit = 0;
for(j=0; j<5; j++)
{
five_bit <<= 1; if(!wait_change()) return(0);
if(pulse_time <= time1)
{
if(pulse_time < time0) goto start_readid;
if(!wait_change()) return(0); //有空跳
if(pulse_time<time0 || pulse_time>time1) goto start_readid;
}
else if(pulse_time > time2) goto start_readid;
if(inbak == 0) five_bit |= 0x01;
}
bit_buffer[i] = five_bit;
}
//行校验
for(i=2;i<10;i++) //从第二行开始
{
verify_bit = 0; five_bit = bit_buffer[i];
for(j=0;j<5;j++)
{
if( five_bit & 0x01 ) verify_bit = !verify_bit;
five_bit >>= 1;
}
if( verify_bit ) goto start_readid;
}
//列校验
verify_row = 0x02; //从第一列开始
for(i=0;i<4;i++) //共4列
{
verify_bit = 0;
for(j=0;j<11;j++)
{
five_bit = bit_buffer[j];
if( five_bit & verify_row ) verify_bit = !verify_bit;
}
if( verify_bit ) return(0);
verify_row <<= 1; //准备校验下一列
}
//合并成4字节数据
for(i=0,j=2;i<4;i++)
{
bit_buffer[j] <<= 3; bit_buffer[j] &= 0xf0; //高字节
five_bit = bit_buffer[j]; j++;
bit_buffer[j] >>= 1; bit_buffer[j] &= 0x0f; //低字节
byte_buffer[i] = five_bit | bit_buffer[j]; j++;
}
//屏蔽全0卡号和全ff卡号
if(!byte_buffer[3] && !byte_buffer[2] && !byte_buffer[1] && !byte_buffer[0]) return(0);
if(byte_buffer[0] == 0xff && byte_buffer[1] == 0xff
&& byte_buffer[2] == 0xff && byte_buffer[0] == 0xff) return(0);
//读2次卡号相同才认为成功
compare_bit = !compare_bit;
if(compare_bit)
{
currency_temp[0] = byte_buffer[0]; currency_temp[1] = byte_buffer[1];
currency_temp[2] = byte_buffer[2]; currency_temp[3] = byte_buffer[3];
goto start_readid;
}
else if(currency_temp[0] == byte_buffer[0] && currency_temp[1] == byte_buffer[1]
&& currency_temp[2] == byte_buffer[2] && currency_temp[3] == byte_buffer[3]) return(1);
}
main()
{
T2CON = 0;
T2MOD = 0x02;
RCAP2H = 0xff;
RCAP2L = 0xf0;
TR2 = 1;
while(1)
{
if(read_IDka())
{
speak_port = !speak_port;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -