📄 w26.c
字号:
#include <REG51.H>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define time0 100 //150us
#define time1 234 //350us
#define time2 450 //675us
sbit spek = P3^7;
uint out_delay;
sbit g_led = P1^7;
sbit r_led = P1^6;
sbit data0 = P3^4;
sbit data1 = P3^5;
//***卡号处理的有关定义***************
uchar aux_buffer0[3],aux_buffer1[3],aux_buffer2[3];
uchar aux_point;
bit aux_flag;
//读卡头内部变量
sbit rf_data1 = P3^6;
bit inbak = 1;
uint temp;
uchar overtime;
uchar byte_buffer[5];
/*********************************************************/
//***发送位数据*******************************************/
//********************************************************/
void send_bitdata( bit databit)
{
//发送数据1
if( databit )
{
data1 = 0;
out_delay = 15;
while( --out_delay );
data1 = 1;
out_delay = 150;
while( --out_delay );
}
//发送数据0
else
{
data0 = 0;
out_delay = 15;
while( --out_delay );
data0 = 1;
out_delay = 150;
while( --out_delay );
}
}
/*********************************************************/
//***发送数据*********************************************/
/*********************************************************/
bit senddata(void)
{
uint H12bit; //用于前12位的校验
bit H12bit_verify = 0, L12bit_verify = 1;
uchar i;
ulong send_24bit; //待发送的24位卡数据
H12bit = byte_buffer[1]; H12bit <<= 8;
H12bit |= byte_buffer[2];
send_24bit |= byte_buffer[1]; send_24bit <<= 8;
send_24bit |= byte_buffer[2]; send_24bit <<= 8;
send_24bit |= byte_buffer[3]; send_24bit <<= 8;
//求前12位的校验位
for(i=0;i<12;i++)
{
H12bit <<= 1;
if(CY) H12bit_verify = !H12bit_verify;
}
send_bitdata( H12bit_verify );
//发送卡数据
for(i=0;i<24;i++)
{
send_24bit <<= 1;
send_bitdata( CY );
if( i>11 && CY ) L12bit_verify = !L12bit_verify; //求后12位的校验位
}
send_bitdata( L12bit_verify );
}
/*********************************************************/
/***等待电平跳变******************************************/
/*********************************************************/
void wait_change(void)
{
overtime = 0;
while(inbak == rf_data1)
{
if(++overtime == 0x0ff)
aux_flag = 0;
}
temp = TH0; temp <<= 8;
temp |= TL0;
TH0 = 0; TL0 = 0;
inbak = rf_data1;
}
//*****************************************************************************************/
//返回:读卡成功标记,成功读卡数据放在 byte_buffer[4]中
//*****************************************************************************************/
bit read_IDka(void)
{
unsigned char i, j;
unsigned char verify_byte, verify_row;
unsigned char five_bit, bit_buffer[11];
bit verify_bit;
//确定起始标识
wait_change();
if( temp<time1 || inbak==1 ) return(0);
for(i=0;i<16;i++)
{
wait_change();
if(temp>time1 || temp<time0) return(0);
}
r_led = !r_led;
//保存位数据
for(i=0; i<11; i++)
{
five_bit = 0;
for(j=0; j<5; j++)
{
five_bit <<= 1;
wait_change();
if(temp<=time1)
{
if(temp<time0) return(0);
wait_change(); //有空跳
if(temp<time0 || temp>time1) return(0);
}
else if(temp>time2) return(0);
if( inbak == 0 ) five_bit |= 0x01;
}
bit_buffer[i] = five_bit;
}
//行校验
for(i=2;i<10;i++)
{
verify_bit = 0;
verify_byte = bit_buffer[i];
for(j=0;j<5;j++)
{
if( verify_byte & 0x01 ) verify_bit = !verify_bit;
verify_byte >>= 1;
}
if( verify_bit ) return(0);
}
//列校验
verify_row = 0x02;
for(i=0;i<4;i++)
{
verify_bit = 0;
for(j=0;j<11;j++)
{
verify_byte = bit_buffer[j];
if( verify_byte & 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++;
}
return(1);
}
//******************************************************************************************/
//主程序开始
//******************************************************************************************/
main()
{
SCON = 0x50;
TMOD = 0x21;
TH0 = 0xf0;
TL0 = 0x00;
TR0 = 1;
while(1)
{
r_led = 0;
if( read_IDka()&& aux_flag == 0)
{
aux_buffer0[aux_point] = byte_buffer[1];
aux_buffer1[aux_point] = byte_buffer[2];
aux_buffer2[aux_point] = byte_buffer[3];
aux_point++;
if(aux_point == 3)
{
aux_point = 0;
if( aux_buffer0[0] == aux_buffer0[1] && aux_buffer0[1] == aux_buffer0[2]
&& aux_buffer1[0] == aux_buffer1[1] && aux_buffer1[1] == aux_buffer1[2]
&& aux_buffer2[0] == aux_buffer2[1] && aux_buffer2[1] == aux_buffer2[2])
{
aux_flag = 1;
senddata();
spek = 0; g_led = 0;
out_delay = 0x3fff; //0x0ffff = 390ms
while(--out_delay);
spek = 1; g_led = 1;
}
}
}
}//***end while(1)
}//*****end main()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -