⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 head.c

📁 125K曼彻斯特编码的只读ID卡读头程序
💻 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 + -