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

📄 system.c

📁 125K曼彻斯特编码的只读ID卡读头程序
💻 C
📖 第 1 页 / 共 2 页
字号:
                }
                else n = 0;
             }
          }
          else                       //上次读卡时电平是高电平
          {
             while(DIN)
             {
                if(TH0 > 6)
                {
                   TR0 = 0;
                   return;
                }
             }
             sz.sk[0] = TH0;
             sz.sk[1] = TL0;
             last_level_flag = 0;
             if(sz.kk > 300)         //不是空跳转则是有效数据0
             {
             TL0 = 0;
             TH0 = 0;
                if(head_flag)
                {
                   *sip <<= 1;
                   *sip |= 1;
                   if(++j > 4)
                   {
                      j = 0;
                      ++i;
                      //*sip &= 0x1f;
                     ++sip;
                   }
                }
                else if(++n == 9)
                {
                   head_flag = 1;
                   i = 0;
                   j = 0;
                   sip = &card_code;
                }
             }
          }
       }
       TR0 = 0;
       CFE = 1;   //读禁止
       //WDT_CONTR = 0x3c;
       new_flag = 1;
       s = 2;
       n = 0;
       for(i=0;i<11;i++)
       {
          n |= card_code[i];
          if(card_code[i] & 0xe0)
          {
             new_flag = 0;
             return;
          }
          //else if(card_code[i] != old_card[i])
          //   {
          //      old_card[i] = card_code[i];
          //      card_code[i] = 0;
          //      new_flag = 0;
          //      s = 0;
          //   }
       }
       if(n == 0)
       {
          new_flag = 0;
          return;
       }
    }
    if(card_code[10]&0x01)             //最后1位=1 则错误
    {
       new_flag = 0;
       return;
    }
    k = 0;
    for(i=0;i<10;i++)
    {
       ACC = card_code[i];
       if(P)                           //行校验
       {
          new_flag = 0;
          return;
       }
       k ^= ACC;
    }
    k ^= card_code[10];
    k &= 0x1e;                         //列校验
    if(k)
    {
       new_flag = 0;
       return;
    }

    for(i=2;i<10;i++)
    {
       card_code[i] =  card_code[i]>>1;
    }
    card_code[10] = 0;
    for(i=2;i<10;i++)
    {
       card_code[10] ^=  card_code[i];
    }
    //card_code[10] = card_code[10] ^ card_code[1];
    card_code[0] = 0xAA;               //帧头
    card_code[1] = 0xAA;               //帧头
    card_code[11] = 0x55;              //帧尾
    uart_send1(card_code,12);

    CCF0 = 0;
    CH = CH_VALUE;                     //定时记数初值
    CL = CL_VALUE;                     //定时记数初值
    CR = 1;                            //PCA计数器计数开

    LED = 0;                           //接收到一个刷卡信号以后输出指示
    led_flag = 1;                      //led显示标志
    led_time = 15;                     //led 闪烁时间 1.5 秒

    //WDT_CONTR = 0x3c;
}

//=====================================================================
//曼彻斯特码处理函数
//曼切斯特码头特征: 在码缓冲区中连续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
//=====================================================================
//00 14 00 00 0F 1B 1E 1D 0A 17 1E 00
//00  A  0  0  7  D  F  E  5  B  F
/*void decode_data()
{
    UINT8 i,k,s;
    //WDT_CONTR = 0x3c;
//------------------------------------------------------------------------------
//判断程序接收到的数据是否正确
//00 14 00 00 0F 1B 1D 05 0A 03 10 00
//00 14 00 00 0F 1B 1E 1D 0A 17 1E 00

    s = card_code[0];

    DT1 = 1;                             //输出数据值

    wait_flag = 1;                       //等待发送维根数据标志
    wait_time = 10;                      //等待发送时间500毫秒
    Ready = 0;                           //输出=0,通知主CPU准备发送韦根数据
    //while(!wait_flag);

//--------------------------------------------------------------------------
//开始发送数据, i=发送的数据个数,k=发送的数据位
//向主CPU传送EM卡的卡号,采用串行移位寄存器方式发送数据
//DT1传送数据,SCLK 传送同步时钟, SCLK=0时数据有效,SCLK=1时改变数据
    i=0; k=0;
    while(1)
    {   if(s&0x80)DT1=1;else DT1=0;       //输出数据值
        wait_time=6;
        while(SCLK)
        {   //WDT_CONTR=0x3c;
            if(!wait_flag){Ready=1;return;}
        }
        wait_time=6;
        while(!SCLK)
        {   //WDT_CONTR=0x3c;
            if(!wait_flag){Ready=1;return;}
        }
        wait_time=6;
        s<<=1;
        if(++k>7)  //1个字节数据发送完毕
        {   k=0; if(++i>12){Ready=1;return;}
            else s=card_code[i];
        }
    }
}*/
/***********************************************************************************
函数名称:sys_init()
功能描述:系统初始化子程序
参    数:无
***********************************************************************************/
void sys_init(void)
{
    P1 = 0xFF;
    P3 = 0xFF;
    LED = 0;
    EA  = 0;
    //WDT_CONTR = 0x3C;    //喂狗

    //send_buf[23] = 0x0D;
    //sum_buf[4] = 0x0D;
    //uart_rcv_finish = 0;
    //uart_start_flag = 0;
    //uart_rcv_flag = 0;
    //tx_flag = 0;         //接收状态

/*  定时器0初始化        */
    TMOD &= 0xF0;
    TMOD |= 0X01;          //工作方式
    TH0 = 0;
    TL0 = 0;

/*  定时器1初始化
    timer1_out = 0;
    timer1_tick = 0;
    timer1_N = 0x7D0;
    //AUXR &= 0xBF;               //12T模式
    //AUXR |= T1x12;              //1T模式
    TMOD &= 0x0F;
    TMOD |= TMOD_VALUE1;          //工作方式
    TH1 = TH1_VALUE;
    TL1 = TL1_VALUE;

    //PT1 = 1;                    //定时器1中断优先级高
    ET1 = 1;                      //定时器1中断开
    //TR1 = 0;                    //定时器1关
    TR1 = 1;                      //定时器1开        */

/*  串口初始化  */
/*  定时器1作波特率发生器          */
    //AUXR &= 0xBF;               //12T模式
    //AUXR |= T1x12;              //1T模式
    SCON = SCON_VALUE;
    TMOD &= 0x0F;
    TMOD |= TMOD_VALUE;                 //工作方式2,8位自动重装
    TH1 = TH1_VALUE;
    TL1 = TL1_VALUE;
    //PCON &= 0x7F;               //波特率不倍增
    PCON |= 0x80;                 //波特率倍增
    //PS = 1;                       //串口中断优先级高
    //ES = 1;                       //串口中断开
    TR1 = 1;                      //定时器1开

/*  PCA初始化       */
    CCON = 0;                     //PCA中断溢出标志清零,PCA计数器禁止,CF,CR,CCF1,CCF0
    CMOD = CMOD_VALUE;            //PCA记数脉冲选择,Fosc/12
    //CMOD |= CIDL;               //空闲模式PCA计数器停止工作

    CH = CH_VALUE;                //定时记数初值
    CL = CL_VALUE;                //定时记数初值
    /* PCA模块0定时模式或高速输出模式设置       */
    PCAM0_timer_out = 0;
    PCAM0_timer_tick = 0;
    PCAM0_timer_N = 9;
    CCAPM0 = CCAPM0_VALUE;        //PCA模块0工作模式
    CCAP0L = CCAP0L_VALUE;        //PCA模块0捕获/比较初值     定时和高速输出模式用
    CCAP0H = CCAP0H_VALUE;        //PCA模块0捕获/比较初值     定时和高速输出模式用
    //PCA_PWM0 = 0x00;            //PWM第九位清0
    //PCA_PWM0 = 0x03;            //PWM第九位置1
    /* PCA模块1定时模式或高速输出模式设置
    PCAM1_timer_out = 0;
    PCAM1_timer_tick = 0;
    PCAM1_timer_N = 9;
    CCAPM1 = CCAPM1_VALUE;        //PCA模块1工作模式
    CCAP1L = CCAP1L_VALUE;        //PCA模块1捕获/比较初值     定时和高速输出模式用
    CCAP1H = CCAP1H_VALUE;        //PCA模块1捕获/比较初值     定时和高速输出模式用
    //PCA_PWM0 = 0x00;            //PWM第九位清0
    //PCA_PWM0 = 0x03;            //PWM第九位置1              */

    //CMOD |= ECF;                //PCA记数溢出中断使能
    //CR = 1;                       //允许PCA计数器计数
    EPCA_LVD = 1;                 //PCA中断开

    EA = 1;
    uart_send1(old_card,12);
    LED = 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -