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

📄 cid.lst

📁 C 语言的 ID卡开发应用 详细的介绍和使用C语言开发ID读卡器
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V6.10  CID                                                                    11/05/2008 12:38:04 PAGE 1   


C51 COMPILER V6.10, COMPILATION OF MODULE CID
OBJECT MODULE PLACED IN D:\ID2\cid.OBJ
COMPILER INVOKED BY: D:\应用软件\lope\kc51\bin\C51.exe D:\ID2\cid.c SMALL OT(0,SIZE) SB OR DB OE

stmt level    source

   1          /*-- 曼码调制的非接触ID卡通用读卡程序编制
   2          /******************头文件********************/
   3          #include "string.h"
   4          #include <reg52.h>
   5          #include <intrins.h>
   6          #include <math.h>
   7          
   8          #if 0
              #define p 9
              #define l 10
              #endif
  12          /******************宏定义*********************/
  13          sbit P17 = P1^7; 
  14          sbit P37 = P3^7;
  15          sbit P16 = P1^6; 
  16          sbit P36 = P3^6;
  17          sbit P15 = P1^5;
  18          sbit P35 = P3^5;
  19          sbit P14 = P1^4; 
  20          sbit P34 = P3^4;
  21          sbit P13 = P1^3; 
  22          sbit P33 = P3^3;
  23          sbit P12 = P1^2; 
  24          sbit P32 = P3^2;
  25          sbit P11 = P1^1; 
  26          sbit P31 = P3^1;
  27          sbit P10 = P1^0; 
  28          sbit P30 = P3^0;
  29          sbit P27 = P2^7; 
  30          sbit P07 = P0^7;
  31          sbit P26 = P2^6; 
  32          sbit P06 = P0^6;
  33          sbit P25 = P2^5; 
  34          sbit P05 = P0^5;
  35          sbit P24 = P2^4; 
  36          sbit P04 = P0^4;
  37          sbit P23 = P2^3; 
  38          sbit P03 = P0^3;
  39          sbit P22 = P2^2; 
  40          sbit P02 = P0^2;
  41          sbit P21 = P2^1; 
  42          sbit P01 = P0^1;
  43          sbit P20 = P2^0; 
  44          sbit P00 = P0^0;
  45          
  46          #define uchar unsigned char
  47          #define uint unsigned int
  48          
  49          #define RF_DATA_IN P17 //接收来至U2270B的数据"Output"
  50          #define SO P31 //单片机输出数据到用户接口
  51          #define SCK P16 //同步时钟输出
  52          #define CP P15 //卡存在信号输出
  53          #define MSEL P13 //数据发送方式选择
  54          #define WATCHDOG P21 //看门狗
  55          #define RED_LED  P10 //led灯
C51 COMPILER V6.10  CID                                                                    11/05/2008 12:38:04 PAGE 2   

  56          #define GREEN_LED P11 //led灯
  57          #define DD P12 //蜂鸣器
  58          
  59          /****************全局变量***********************/
  60          uchar data Read_RF_Data[11]; //暂存从U2270B上接收的数据
  61          uchar data ID_Data[6]; //暂存经效验后的正确数据
  62          uint data TIMER_1=0;
  63          bit Check_Data_bit; //效验请求标志位
  64          /****************函数列表***********************/
  65          void Recive_RF_Data(void);
  66          void Check_Data(void);
  67          void Clern_Number(void);
  68          void Send_RS232net(uchar Data[],uchar Num);
  69          void delay0_2ms(uint count);
  70          void delay1ms(uint count);
  71          void dida(uchar j);
  72          /*****************串口初始话*********************/
  73          void Data_start(void)
  74          {DD=0x00;
  75   1       RED_LED=0x00;
  76   1       TMOD=0x21; //T0方式1,T1工作于方式2
  77   1       TH1=0x00; //初始化T1计时器
  78   1       TL1=0x00;
  79   1       TR1=0;
  80   1       SCON=0x50; //串行口初始化
  81   1       PCON=0x80; //SMOD位设置
  82   1       TH0=0x00; //初始化T0计时器
  83   1       TL0=0x04;
  84   1       TR0=0;
  85   1       ES=1; //开放串行口中断
  86   1       EA=1; //开放总中断
  87   1      }
  88          /**********************************************/
  89          /*主函数*/
  90          /**********************************************/
  91          void main(void)
  92          {
  93   1        delay1ms(100);
  94   1        Data_start();
  95   1        while(1)
  96   1        {
  97   2         WATCHDOG=~WATCHDOG;
  98   2         Recive_RF_Data(); //调用接收RF数据函数
  99   2         if(Check_Data_bit==1) //如果此位为1,有一组数据申请效验
 100   2          {
 101   3           Check_Data(); //调用数据效验函数
 102   3           Check_Data_bit=0;
 103   3          }
 104   2         }
 105   1      }
 106          /*********************************************/
 107          /*接收RF数据*/
 108          /*********************************************/
 109          void Recive_RF_Data(void)
 110          {
 111   1      /////////////////////定义局部变量
 112   1        uchar header,pc;
 113   1        uchar temp;
 114   1        uchar temp1;
 115   1        uint temp2;
 116   1        uchar ByteCounter; //字节计数器
 117   1        uchar *PData;
C51 COMPILER V6.10  CID                                                                    11/05/2008 12:38:04 PAGE 3   

 118   1        uchar BitCounter; //位计数器
 119   1        ////////////////////初始化变量值
 120   1        header=0;pc=4;
 121   1        PData=Read_RF_Data;
 122   1        temp=0;
 123   1        temp1=0;
 124   1        ByteCounter=0;
 125   1        BitCounter=5;
 126   1        /////////////////////检测一个稳定的低电平
 127   1      str:
 128   1        WATCHDOG=~WATCHDOG;
 129   1        if(RF_DATA_IN==0)
 130   1        if(RF_DATA_IN==0)
 131   1        if(RF_DATA_IN==0)
 132   1        if(RF_DATA_IN==0)
 133   1        if(RF_DATA_IN==0)
 134   1        {
 135   2         _nop_();
 136   2         _nop_();
 137   2         _nop_();
 138   2         _nop_();
 139   2         _nop_();
 140   2         _nop_();
 141   2         _nop_();
 142   2         _nop_();
 143   2         _nop_();
 144   2         _nop_();
 145   2      ////////////////////检测一个起始位电平
 146   2        while(RF_DATA_IN==0); //当电平由低向高跳变时启动计时器
 147   2          TR0=1;
 148   2          _nop_();
 149   2          _nop_();
 150   2          _nop_();
 151   2          _nop_();
 152   2          _nop_();
 153   2          _nop_();
 154   2          _nop_();
 155   2          _nop_();
 156   2          _nop_();
 157   2          _nop_();
 158   2      ////////////////////检测9个"header"
 159   2         while(RF_DATA_IN==1);
 160   2           TR0=0;
 161   2           TF0=0;
 162   2           TIMER_1=TH0;
 163   2           TIMER_1=(TIMER_1<<8)+TL0;
 164   2           TH0=0x00;
 165   2           TL0=0x04;
 166   2           temp2=0x108;
 167   2         if(TIMER_1>temp2) // >520us
 168   2           {
 169   3           goto str;
 170   3           }
 171   2           temp2=0xf9;
 172   2         if(TIMER_1<temp2) // <490us
 173   2           {
 174   3           goto str;
 175   3           }
 176   2         do
 177   2          {
 178   3           TIMER_1=0;
 179   3           WATCHDOG=~WATCHDOG;
C51 COMPILER V6.10  CID                                                                    11/05/2008 12:38:04 PAGE 4   

 180   3           while(RF_DATA_IN==0);
 181   3           TR0=1;
 182   3           _nop_();
 183   3           _nop_();
 184   3           _nop_();
 185   3           _nop_();
 186   3           _nop_();
 187   3           _nop_();
 188   3           _nop_();
 189   3           _nop_();
 190   3           _nop_();
 191   3           _nop_();
 192   3           while(RF_DATA_IN==1);
 193   3           TR0=0;
 194   3           TF0=0;
 195   3           TIMER_1=TH0;
 196   3           TIMER_1=(TIMER_1<<8)+TL0;
 197   3           TH0=0x00;
 198   3           TL0=0x04;
 199   3           temp2=0x90;
 200   3           if(TIMER_1>temp2)// >280us
 201   3            {
 202   4             header=0;
 203   4             goto str;
 204   4             }
 205   3            temp2=0x77;
 206   3           if(TIMER_1<temp2)// <230us
 207   3            {
 208   4             header=0;
 209   4             goto str;
 210   4             }
 211   3             header++;
 212   3            }while(header<8);
 213   2            TR0=0;
 214   2            TF0=0;
 215   2      ///////////////////如果9个"header"都对,开始接收卡内数据
 216   2            TH0=0xff; //time:300us
 217   2            TL0=0x6a;
 218   2            TR0=1;
 219   2            if(header==8)
 220   2              {
 221   3               do
 222   3               {
 223   4                do
 224   4                  {
 225   5      
 226   5                 while(TF0==0); //等待一个位周期
 227   5                 TF0=0;
 228   5               if(RF_DATA_IN==1) temp=1;
 229   5               else temp=0;
 230   5            while(RF_DATA_IN==temp) //检测电平跳变否?
 231   5            {
 232   6             if(TF0==1) //如果300us计时到还未跳变,视为非法电平!!!
 233   6             {
 234   7              TR0=0;
 235   7              TF0=0;
 236   7              goto str;
 237   7             }
 238   6            }
 239   5            TH0=0xff; //time:300us
 240   5            TL0=0x6a;
 241   5            temp=~RF_DATA_IN;
C51 COMPILER V6.10  CID                                                                    11/05/2008 12:38:04 PAGE 5   

 242   5            temp1=(temp1<<1)|temp;
 243   5            BitCounter--;
 244   5            }while(BitCounter); //一个字节完否
 245   4            *(PData+ByteCounter)=temp1; //将一字节数据存入缓存数组
 246   4            temp1=0;
 247   4            BitCounter=5;
 248   4            ByteCounter++;
 249   4            WATCHDOG=~WATCHDOG;
 250   4            }while(ByteCounter<10);
 251   3           do
 252   3            {
 253   4             WATCHDOG=~WATCHDOG;
 254   4             while(TF0==0); //等待一个位周期
 255   4             TF0=0;
 256   4             if(RF_DATA_IN==1) temp=1;
 257   4             else temp=0;
 258   4             while(RF_DATA_IN==temp) //检测电平跳变否?
 259   4             {
 260   5              if(TF0==1) //如果300us计时到还未跳变,视为非法电平!!!
 261   5              {
 262   6               TR0=0;
 263   6               TF0=0;
 264   6               goto str;
 265   6              }
 266   5             }
 267   4             TH0=0xff; //time:300us
 268   4             TL0=0x6a;
 269   4             temp=~RF_DATA_IN;
 270   4             temp1=(temp1<<1)|temp;
 271   4             pc--;
 272   4             }while(pc); //一个字节完否
 273   3             Read_RF_Data[10]=temp1; //将一字节数据存入缓存数组
 274   3      ///////////////////检测最后一个停止位
 275   3             while(TF0==0);
 276   3             TR0=0;
 277   3             TF0=0;
 278   3             if(RF_DATA_IN==1) temp=1;
 279   3             else temp=0;
 280   3             while(RF_DATA_IN==temp) //检测电平跳变否?
 281   3              {
 282   4              if(TF0==1) //如果300us计时到还未跳变,视为非法电平!!!
 283   4             {
 284   5              TR0=0;
 285   5              TF0=0;
 286   5              goto str;
 287   5              }
 288   4             }
 289   3             temp=~RF_DATA_IN;
 290   3             if(temp==0) //如果停止位正确
 291   3              {
 292   4              Check_Data_bit=1; //置效验请求标志
 293   4              }
 294   3             else //如果停止位不正确
 295   3             {
 296   4             Clern_Number(); //清除
 297   4             }
 298   3             }
 299   2             }
 300   1             }
 301          /*********************************************/
 302          /*效验数据*/
 303          /*********************************************/
C51 COMPILER V6.10  CID                                                                    11/05/2008 12:38:04 PAGE 6   

 304          void Check_Data(void)
 305          {
 306   1      /////////////////////定义局部变量
 307   1           uchar temp;

⌨️ 快捷键说明

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