📄 head.c
字号:
//=====================================================================
//filename : time1()
//功 能 : 定时器1中断服务程序,定时时间50mS, 如果处于等待发送状态
// 在等待时间超过2秒没有得到主CPU应答情况取消发送
//=====================================================================
void timer1() interrupt 3 using 3
{
TL1 = 0xb0;
TH1 = 0x3c; //定时器1=100us;
time_50ms_flag = 1; //50ms则读一次读头程序
if(wait_flag) //等待发送维根数据标志
{
if(--wait_time == 0)
{
wait_flag = 0;
Ready = 1;
}
}
if(led_flag) //led 显示
{
if(--led_time == 0)
{
led_flag = 0;
LED = 1;
}
}
}
//=====================================================================
//曼彻斯特码处理函数
//曼切斯特码头特征: 在码缓冲区中连续9个1则是头码
// 找到头码后纪录数据启始位置
// 找到头码返回1,没有头码返回0
//
//数据格式如下:
// U7 U6 U5 U4 P 0 = 用户标识
// U3 U2 U1 U0 P 1 = 用户标识
// D31 D30 D29 D28 P 2
// D27 D26 D25 D24 P 3
// D23 D22 D21 D20 P 4
// D19 D18 D17 D16 P 5
// D15 D14 D13 D12 P 6
// D11 D10 D9 D8 P 7
// D7 D6 D5 D4 P 8
// D3 D2 D1 D0 P 9
// X X X X 0
//
// X 列校验 P 行校验
//数据正确返回0 错误返回1
//=====================================================================
void decode_data()
{
UINT8 i,k,s;
WDT_CONTR = 0x3c;
clr_oldbuf();
//------------------------------------------------------------------------------
//判断程序接收到的数据是否正确
//00 14 00 00 0F 1B 1D 05 0A 03 10 00
//00 14 00 00 0F 1B 1D 05 0A 03 10 00
if(card_code[10] & 0x01)
{
clr_rcbuf();
return;
} //最后1位=1 则错误
k = 0;
for(i=0;i<10;i++) //列校验,偶校验; 行校验,异或校验;
{
s=card_code[i];
if(s & 0xe0)
{
clr_rcbuf();
return;
}
ACC = s;
if(P)
{
clr_rcbuf();
return;
}
k ^= ACC;
}
k ^= card_code[10];
k &= 0x1e;
if(k)
{
clr_rcbuf();
return;
}
card_code[11] = 0x12;
s = card_code[0];
DT1 = 0; //输出数据值
TL1 = 0XB0;
TH1 = 0X3C;
wait_flag = 1; //等待发送维根数据标志
wait_time = 10; //等待发送时间500毫秒
LED = 0; //接收到一个刷卡信号以后输出指示
led_flag = 1; //led显示标志
led_time = 15; //led 闪烁时间 2 秒
Ready = 0; //输出=0,通知主CPU准备发送韦根数据
//--------------------------------------------------------------------------
//开始发送数据, i=发送的数据个数,k=发送的数据位
//向主CPU传送EM卡的卡号,采用串行移位寄存器方式发送数据
//dt1传送数据,dt0 传送同步时钟, dt0=0时数据有效,dt0=1时改变数据
i = 0;
k = 0;
while(1)
{
if(s & 0x80)
DT1 = 1;
else DT1 = 0; //输出数据值
wait_time = 6;
while(DT0)
{
WDT_CONTR = 0x3c;
if(!wait_flag)
{
Ready=1;
clr_rcbuf();
return;
}
}
wait_time = 6;
while(!DT0)
{
WDT_CONTR = 0x3c;
if(!wait_flag)
{
Ready = 1;
clr_rcbuf();
return;
}
}
wait_time = 6;
s <<= 1;
if(++k > 7) //1个字节数据发送完毕
{
k = 0;
if(++i > 12)
{
Ready = 1;
clr_rcbuf();
return;
}
else s = card_code[i];
}
}
}
//
void clr_rcbuf()
{
UINT8 i;
UINT8 data *sip;
sip =& card_code;
for(i=0;i<12;i++)
{
*sip = 0;
sip++;
}
}
//
void clr_oldbuf()
{
UINT8 i;
UINT8 data *sip;
sip =& old_card;
for(i=0;i<12;i++)
{
*sip = 0;
sip++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -