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

📄 system.c

📁 125K曼彻斯特编码的只读ID卡读头程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
+---------------------------------------------------+
| Project: SYSTEM with STC12CX052                   |
| File:    SYSTEM.C                                 |
| Data:    2008-12-08                               |
| Version: V 1.0                                    |
| Initial Editor: Li Jifeng                         |
+---------------------------------------------------+
| following environments are supported              |
| Processor: STC12CX052                             |
| Compiler: WAVE V                                  |
| hardware: JF-2008                                 |
+---------------------------------------------------+
|    Copyright (C) JF Ltd, 2008                     |
|       All Rights reserved                         |
+---------------------------------------------------+
| 功能简介: the system function                     |
+---------------------------------------------------+
*/

#include "system.h"

//bit uart_rcv_finish;
//static bit uart_start_flag;
//bit tx_flag;            //串口收发状态标志  tx_flag=1 发状态  tx_flag=0 收状态

//static UINT8 data DataBuf[5] = {"27"};                          //信息区
//static UINT8 data send_buf[24] = {"~EC2A3300E000000000FC34"};	//发送数据区
//static UINT8 data rec_buf[18] = {"EC2A0033E028000002"};         //接收数据区
//static UINT8 data com_n;
//static UINT8 data uart_rcv_flag = 0;
//static UINT8 data uart_rcv_len;
//static UINT8 data uart_rcv_n;
//static UINT8 data sum_buf[5] = {"FC40"};

bit last_level_flag = 0;  //上次读卡时电平
bit wait_flag = 0;        //等待发送标志
bit led_flag = 0;         //led显示标志
bit new_flag = 0;         //读到新卡标志
UINT8 data wait_time = 40;     //等待发送时间 2 秒
UINT8 data led_time = 15;      //led 闪烁时间 1 秒
UINT8 data card_code[12];
UINT8 data old_card[12];

//static UINT16 Txsum1;
//static UINT16 Txsum = 0x350;
//static UINT16 Rxsum = 0x390;
//static UINT16 Rxsum1 = 0x390;
//static UINT16 Rxsum2;

/***********************************************************************************
函数名称:uart_send_byte()
功能:串口发送函数
函数参数:udata:发送的数据
***********************************************************************************/
void uart_send_byte(UINT8 udata)
{
    TI = 0;
    SBUF = udata;
    while (TI == 0);
    TI = 0;
}
/***********************************************************************************
函数名称:uart_send()
功能:串口发送函数
函数参数:*send_buf:发送的数据
**********************************************************************************
void uart_send(UINT8 *send_buf)
{
    while (*send_buf != 0x00)
    {
        uart_send_byte(*send_buf);
        send_buf++;
    }
}*/
/***********************************************************************************
函数名称:uart_send1()
功能:串口发送函数
函数参数:*send_buf:发送的数据
         n:数据个数
***********************************************************************************/
void uart_send1(UINT8 *send_buf,UINT8 n)
{
    while (n--)
    {
        uart_send_byte(*send_buf);
        send_buf++;
    }
}
/***********************************************************************************
函数名称:uart_isr()
功能描述:串口中断服务子程序
函数参数:无
EC2A0033E02800000227FBBF
**********************************************************************************
static void uart_isr(void)  interrupt SIO_VECTOR using 3
{
    UINT8 tmp;
    if (RI)
    {
        RI = 0;
        tmp = SBUF;
        if (tmp == '~')                            //帧头
        {
            uart_start_flag = 1;
            uart_rcv_flag = 0;
            com_n = 0;
        }
        else if (uart_start_flag)
        {
            switch (uart_rcv_flag)
            {
                case 0:if (tmp == rec_buf[com_n])
                       {
                          com_n++;
                       }
                       else
                       {
                         uart_start_flag = 0;
                       }
                       if (com_n == 17)
                       {
                           uart_rcv_flag = 1;
                       }
                       break;
               default:uart_start_flag = 0;
                       break;
            }
        }

    }
}*/
/***********************************************************************************
函数名称:PCA_isr()
功能描述:PCA中断服务子程序
函数参数:无
***********************************************************************************/
static UINT8 PCAM0_timer_tick,PCAM0_timer_N;
bit PCAM0_timer_out;
static void PCA_isr(void) interrupt PCA_VECTOR using 3
{
    if (CCF0)
    {
        CCF0 = 0;
        CH = CH_VALUE;              //定时记数初值
        CL = CL_VALUE;              //定时记数初值
        /*if(wait_flag)               //等待发送维根数据标志
        {
           if(--wait_time == 0)
           {
              wait_flag = 0;
              Ready = 1;
           }
        }*/
        if(led_flag)               //led 显示
        {
           if(--led_time == 0)
           {
              CR = 0;
              led_flag = 0;
              LED = 1;
           }
        }
    }
}
/***********************************************************************************
函数名称:read_head()
函数参数:无
功    能 : 读U2270程序,
           U2270B周期为512us
           1. 启动U2270后等待刷卡脉冲,如果10毫秒内没有脉冲信号退出
           在等待时间超过2秒没有得到主CPU应答情况取消发送

           ( 1 ) 脉冲宽度>300的脉冲下跳表示数据1, 脉冲上跳表示数据0
                 脉冲宽度<250的脉冲跳变认为是空跳变。 9个连续1是头码

           ( 2 ) 变量n用于记录头码个数. head_flag=0; 等待并解析头码
           ( 3 ) 变量 j 用于记录数据为宽度,5个位1个字节,4个有效位,
                 1个校验位(低5位)
           ( 4 ) 变量 i 用于记录卡号字节数,

EM卡数据格式如下:
---------------------------------------------------------------------
标识头     H    H    H    H    H    H    H    H    H
---------------------------------------------------------------------
用户标识        U7   U6   U5   U4    P    00
                              U3   U2   U1   U0    P    14=
---------------------------------------------------------------------
卡片号码        D31  D30  D29  D28   P    00
                              D27  D26  D25  D24   P    00
                              D23  D22  D21  D20   P    0F
                              D19  D18  D17  D16   P    1B
                              D15  D14  D13  D12   P    1D
                              D11  D10  D9   D8    P    05
                              D7   D6   D5   D4    P    0A
                              D3   D2   D1   D0    P    03
X = 列校验;  P = 行校验       X    X    X    X     0    10
=====================================================================
00 14 00 00 0F 1B 1D 05 0A 03 10 00
00 14 00 00 0F 1B 1E 1D 0A 17 1E 00
***********************************************************************************/
void read_head(void)
{
    bit head_flag;
    UINT8 data i,j,n,m,s,k;
    UINT8 data *sip;
    union sa
    {
       UINT16 kk;
       UINT8 sk[2];
    }sz;
    for(m=0;m<12;m++)
    {
       card_code[m] = 0;
       old_card[m] = 0;
    }
    s = 0;
    while(s != 2)
    {
       //WDT_CONTR = 0x3c;
       CFE = 0;                      //启动u2270
       new_flag = 0;                 //读到新卡标志清零
       head_flag = 0;
       n = 0;
       i = 0;
       j = 0;
       last_level_flag = 0;          //上次读卡时电平标志清零
       sip = &card_code;
       TH0 = 0;
       TL0 = 0;
       TR0 = 1;
       while(!DIN)
       {
          if(TH0 > 6)
          {
             TR0 = 0;
             return;
          }
       }
       TH0 = 0;
       TL0 = 0;
       while(DIN)
       {
          if(TH0 > 6)
          {
             TR0 = 0;
             return;
          }
       }
       TH0 = 0;
       TL0 = 0;
       //WDT_CONTR = 0x3c;
       while(i < 11)
       {
          if(!last_level_flag)       //上次读卡时是低电平
          {
             while(!DIN)
             {
                if(TH0 > 6)
                {
                   TR0 = 0;
                   return;
                }
             }
             sz.sk[0] = TH0;
             sz.sk[1] = TL0;
             last_level_flag = 1;
             if(sz.kk > 300)            //不是空跳转则是有效数据0
             {
             TL0 = 0;
             TH0 = 0;
                if(head_flag)
                {
                   *sip <<= 1;
                   if(++j > 4)
                   {
                      j = 0;
                      ++i;
                      //*sip &= 0x1f;
                      ++sip;
                   }

⌨️ 快捷键说明

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