demo.c
上传用户:zqdhsx28
上传日期:2010-03-30
资源大小:154k
文件大小:5k
源码类别:

RFID编程

开发平台:

C/C++

  1. #include <reg52.h>
  2. //#include <string.h>
  3. //#include <stdio.h>
  4. //u2270b 读卡子程序,利用T0解码
  5. #define uchar unsigned char
  6. #define EMBIT P1^1
  7. uchar OLDEM=0;
  8.         SCON |= 0xc0;  //开启帧错误位。UART设置为9位。
  9.         TCON |= 0x00;  
  10.         PCON &= 0x7f; 
  11.         TMOD |= 0x11;  //定义T0工作模式定时器0作为双8位定时计数 器。
  12.                //TL0为8位定时/计数器通过标准定时器0控制位控制。
  13.                //TH0仅作为8位定时器,由定时器1控制位控制,此模式下定时/计数器1关闭。
  14. bit bitchange(void)//检查数据
  15.     {
  16.       uchar outtime;
  17.       bit bitc;
  18.       bitc=1;
  19.       outtime=200;
  20. bitchlp1:      
  21.       if (((EMBIT==OLDEM) && (outtime!=0))==1)//数据正确且当outtime不为0时循环
  22.        {
  23.          outtime--;
  24.          rst_wdog();
  25.          goto bitchlp1;
  26.        }
  27.       if (outtime==0)//时间到时,返回bitc标志。
  28.        {
  29.         bitc=0;
  30.        }
  31.       OLDEM=EMBIT;
  32.       return bitc;
  33.     }
  34. bit findlongpluse(void)
  35.     {
  36.       bit retbit;
  37.       retbit=1;
  38.       OLDEM=EMBIT;
  39.       TH0=0;
  40.       TL0=0;
  41.       TR0=0;
  42.       if (bitchange()==0)
  43.        {
  44.          goto errfindlong;
  45.        }
  46.       TR0=1;
  47. findllp1:
  48.       if (bitchange()==0)
  49.        {
  50.          goto errfindlong;
  51.        }
  52.       TR0=0;
  53.       if (TH0>2)
  54.        {
  55.          goto errfindlong;
  56.        }
  57.       if (TH0==2)
  58.        {
  59.          goto findllp2;
  60.        }
  61.       if ((TH0==1) && (TL0>98)) 
  62.        {
  63.          goto findllp2;
  64.        }
  65.       if ((TH0==0) && (TL0<100))
  66.        {
  67.          goto errfindlong;
  68.        }
  69.       TH0=0;
  70.       TL0=0;
  71.       TR0=1;
  72.       goto findllp1;
  73. errfindlong:retbit=0;
  74. findllp2:   return retbit;
  75.     }
  76. bit readbit(void)
  77.    {
  78.      bit retbit;
  79.      retbit=1;
  80.      TH0=0;
  81.      TL0=0;
  82.      TR0=1;
  83.      if (bitchange()==0)
  84.       {
  85.         goto errreadbit;
  86.       }
  87.      TR0=0;
  88.      if (TH0>2)
  89.       {
  90.        goto errreadbit;
  91.       }
  92.      if ((TH0==0) && (TL0<100))
  93.       {
  94.         goto errreadbit;
  95.       }
  96.      if (TH0==2)
  97.       {
  98.        goto okreadbit;
  99.       }
  100.      if ((TH0==1) && (TL0>35))
  101.       {
  102.         goto okreadbit;
  103.       }
  104.      TH0=0;
  105.      TL0=0;
  106.      TR0=1;
  107.      if (bitchange()==0)
  108.       {
  109.         goto errreadbit;
  110.       }
  111.      TR0=0;
  112.      if (TH0>1)
  113.       {
  114.        goto errreadbit;
  115.       }
  116.      if ((TH0==0) && (TL0<100))
  117.       {
  118.        goto errreadbit;
  119.       }
  120.      if ((TH0==1) && (TL0>35))
  121.       {
  122.        goto errreadbit;
  123.       }
  124.      goto okreadbit;
  125. errreadbit:retbit=0;
  126. okreadbit:return retbit;
  127.    }
  128. bit findbegin(void)
  129.     {
  130.      bit retbit;
  131.      uchar tempdata;
  132.      uint fk;
  133.      fk=1000;
  134.      retbit=1;
  135.      tempdata=0;
  136.      if (findlongpluse()==0)
  137.       {
  138.         goto errfindbegin;
  139.       }
  140. findbelp1:
  141.      if (readbit()==0)
  142.       {
  143.        goto errfindbegin;
  144.       }
  145.      if (OLDEM==0)
  146.       {
  147.        if (tempdata==0xff)
  148.         {
  149.          goto okfindbegin;
  150.         }
  151.        tempdata=tempdata<<1;
  152.        tempdata=tempdata | 1;
  153.       }
  154.      else
  155.       {
  156.        tempdata=tempdata<<1;
  157.       }
  158.      fk--;
  159.      if (fk==0)
  160.       {
  161.        goto errfindbegin;
  162.       }
  163.      goto findbelp1;
  164. errfindbegin: retbit=0;
  165. okfindbegin:return retbit;
  166.     }
  167. bit rdemdata(void)
  168.     {
  169.       bit retbit;
  170.       uchar i;
  171.       uchar j;
  172.       uchar parity;
  173.       uchar emcheck;
  174.       emcheck=0;
  175.       retbit=1;
  176.       if (findbegin()==0)
  177.        {
  178.         goto errrdem;
  179.        }
  180.       for (j=0;j<=4;j++)
  181.        {
  182.         parity=0;
  183.         for (i=1;i<=4;i++)
  184.          {
  185.           if (readbit()==0)
  186.            {
  187.             goto errrdem;
  188.            }
  189.           emdata[j]=emdata[j]<<1;
  190.           if (OLDEM==0)
  191.            {
  192.              emdata[j]=emdata[j] | 1;
  193.              parity++;
  194.            }
  195.          }
  196.         if (readbit()==0)
  197.          {
  198.           goto errrdem;
  199.          }
  200.         if (OLDEM==0)
  201.          {
  202.            parity++;
  203.          }
  204.         if ((parity & 1)==1)
  205.          {
  206.            goto errrdem;
  207.          }
  208.         parity=0;
  209.        
  210.        for (i=1;i<=4;i++)
  211.          {
  212.            if (readbit()==0)
  213.             {
  214.              goto errrdem;
  215.             }
  216.            emdata[j]=emdata[j]<<1;
  217.            if (OLDEM==0)
  218.             {
  219.              emdata[j]=emdata[j] | 1;
  220.              parity++;
  221.             }
  222.           }
  223.         if (readbit()==0)
  224.          {
  225.               goto errrdem;
  226.          }
  227.         if (OLDEM==0)
  228.          {
  229.               parity++;
  230.          }
  231.         if ((parity&1)==1)
  232.             {
  233.               goto errrdem;
  234.             }
  235.         }
  236.         for (i=1;i<=5;i++)
  237.          {
  238.           if (readbit()==0)
  239.            {
  240.              goto errrdem;
  241.            }
  242.           emcheck=emcheck<<1;
  243.           if (OLDEM==0)
  244.            {
  245.              emcheck=emcheck | 1;
  246.            }
  247.          }
  248.         if ((emcheck&1)==1)
  249.          {
  250.            goto errrdem;
  251.          }
  252.         emcheck=emcheck<<3;
  253.         for (j=0;j<=3;j++)
  254.          {
  255.           parity=0;
  256.           for (i=0;i<=4;i++)
  257.            {
  258.              if (((emdata[i]<<j) & 0x80)==0x80)
  259.               {
  260.                 parity++;
  261.               }
  262.              if (((emdata[i]<<j) & 0x8)==0x8)
  263.               {
  264.                parity++;
  265.               }
  266.            }
  267.           if (((emcheck<<j) & 0x80)==0x80)
  268.            {
  269.              parity++;
  270.            }
  271.           if ((parity%2)==1)
  272.            {
  273.             goto errrdem;
  274.            }
  275.          }
  276.         goto okrdemdata;
  277. errrdem:retbit=0;
  278. okrdemdata:return retbit;
  279.     }