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

📄 rficrdwr.lst

📁 单片机实现非接触式IC卡读写电路图加源码 帮助大家读写IC卡
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.02b   RFICRDWR                                                             12/10/2005 20:06:41 PAGE 1   


C51 COMPILER V7.02b, COMPILATION OF MODULE RFICRDWR
OBJECT MODULE PLACED IN RFICRdWr.OBJ
COMPILER INVOKED BY: E:\EDATOOLS\KEILC7.0\C51\BIN\C51.EXE RFICRdWr.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*****************************************/
   2          /* Copyright (c) 2005, 通信工程学院      */
   3          /* All rights reserved.                  */
   4          /* 作    者:戴 佳                                               */
   5          /*****************************************/
   6          
   7          #include "RFICRdWr.h"
   8          
   9          /* 延时t毫秒函数 */
  10          void delay(uint t)
  11          {
  12   1              uint i;
  13   1              while(t--)
  14   1              {
  15   2                      /* 对于11.0592M时钟,约延时1ms */
  16   2                      for (i=0;i<125;i++)
  17   2                      {}
  18   2              }
  19   1      }
  20          
  21          /* 定时器0中断服务子程序 */
  22          void timer0() interrupt 1 using 1
  23          {
  24   1              TR0 = 0;                                // 停止计数
  25   1      
  26   1              TH0 = -5000/256;                // 重设计数初值
  27   1              TL0 = -5000%256;
  28   1      
  29   1              count++;        
  30   1      
  31   1              if (count>300)                  // 第一次检测到卡1.5s后
  32   1              {
  33   2                      count = 0;
  34   2                      if(!flagok)     // 如果检测到1.5s后读写标志还是失败,则蜂鸣器报警
  35   2                      {
  36   3                              BP = 0;
  37   3                              delay(2000);    // 报警持续2s
  38   3                              BP = 1;
  39   3                      }               
  40   2              }
  41   1              else
  42   1                      TR0 = 1;                        // 启动T0计数
  43   1      }
  44          
  45          /* 串口发送命令函数 */
  46          void sendcmd(uchar *str)
  47          {
  48   1              while(*str != 0)
  49   1              {
  50   2                      TI = 0;                 // 清发送标志位
  51   2                      SBUF = *str;    // 发送数据
  52   2                      str++;
  53   2                      while(!TI);     // 等待发送完成
  54   2              }
  55   1      }
C51 COMPILER V7.02b   RFICRDWR                                                             12/10/2005 20:06:41 PAGE 2   

  56          
  57          /* 字符数组转换为16进制字符串函数,16进制字符串附接在给定字符串后,
  58            参数byte为数组地址,len为数组长度,str为转换后字符串 */
  59          void Byte2Hex(uchar *byte,uchar len,uchar *str)
  60          {
  61   1              uchar i, j;
  62   1              uchar tmp;
  63   1      
  64   1              j = strlen(str); 
  65   1              for(i=0; i<len; i++)
  66   1              {
  67   2                      tmp = ((*byte)>>4)&0x0f;    // 字节高位
  68   2                      if(tmp < 0x0a)
  69   2                              *(str+j) = tmp+0x30;
  70   2                      else
  71   2                              *(str+j) = tmp-0x0a+'a';
  72   2                      str++;
  73   2                      tmp = (*byte)&0x0f;             // 字节低位
  74   2                      if(tmp < 0x0a)
  75   2                              *(str+j) = tmp+0x30;
  76   2                      else
  77   2                              *(str+j) = tmp-0x0a+'a';
  78   2                      str++;
  79   2              }
  80   1              *(str+j) = 0;                                   // 字符串结束
  81   1      }
  82          
  83          /* 16进制字符串转换为字节数组函数,参数str为要转换的字符串,byte为
  84          转换后数组地址,若str长度不为偶数,则转换后最后一个字节高位补0*/
  85          void Hex2Byte(uchar *str, uchar *byte)
  86          {
  87   1              uchar tmp;
  88   1      
  89   1              while(*str != 0)
  90   1              {
  91   2                      tmp = ((*str)<<4)&0xf0;         // 字节高位
  92   2                      str++;
  93   2                      if(*str == 0) // 若str长度为奇数,则转换后最后一个字节高位补0
  94   2                      {
  95   3                              *byte = (tmp>>4)&0x0f;
  96   3                              return;
  97   3                      }
  98   2                      tmp += (*str)&0x0f;             // 字节低位
  99   2                      *byte = tmp;
 100   2                      byte++;
 101   2              }
 102   1      }
 103          
 104          /* 串口初始化 */
 105          void serial_init()
 106          {
 107   1              /* 9600,n,8,1,外部晶振11.0592MHz,查询方式 */
 108   1              TMOD = 0x20;                    // T1使用工作方式2
 109   1              TH1 = 250;                              // 设置T1初值
 110   1              TL1 = 250;
 111   1              TR1 = 1;                                // T1开始计数
 112   1              PCON = 0x80;                    // SMOD = 1
 113   1              SCON = 0x50;                    // 工作方式1,波特率9600bit/s,允许接收
 114   1              ES = 0;                                 // 关闭串行中断
 115   1      }
 116          
 117          /* H6152复位函数 */
C51 COMPILER V7.02b   RFICRDWR                                                             12/10/2005 20:06:41 PAGE 3   

 118          void H6152Rst()
 119          {
 120   1              strcpy(hbuf,"x");
 121   1              sendcmd(hbuf);                  // 发送命令"x"
 122   1              delay(300);                             // 延时300ms确保H6152复位完毕
 123   1      }
 124          
 125          /* 卡片检测函数,检测到有卡在读写器有效区域内返回 */
 126          void cardcheck()
 127          {
 128   1              strcpy(hbuf,"c");
 129   1              sendcmd(hbuf);                  // 发送命令"c",命令进入“连续读”模式
 130   1              delay(10);                              // 延时10ms
 131   1      
 132   1              /* 一旦发现串口接收到数据就立即返回,
 133   1              表示检测到读写器有效区域内有卡片 */
 134   1              RI = 0;
 135   1              while(!RI);
 136   1              delay(10);                              // 延时10ms,消抖
 137   1              RI = 0;
 138   1              while(!RI);
 139   1              /* 确认工作区内有卡片,返回 */
 140   1      }
 141          
 142          /* 停止卡片检测函数,即取消“连续读"模式 */
 143          void endcheck()
 144          {
 145   1              strcpy(hbuf," ");
 146   1              sendcmd(hbuf);                  // 发送" "取消”连续读“模式
 147   1              delay(10);                              // 延时10ms
 148   1      }
 149          
 150          /* 自动选卡函数,读取所有卡片,随机选中并
 151                  返回其序列号,主要用于第一次选卡 */
 152          uchar autoselect(uchar *buf)
 153          {
 154   1              uchar i;
 155   1              strcpy(hbuf,"m\r");
 156   1              sendcmd(hbuf);                  // 发送"m<CR>"
 157   1              for(i=0;i<8;i++)                // 接收第一张卡的序列号
 158   1              {
 159   2                      RI = 0;
 160   2                      while(!RI);
 161   2                      *(hbuf+i) = SBUF;
 162   2      
 163   2                      /* 如果接收到错误信息则返回错误代码 */
 164   2                      if((*(hbuf+i)>0x39)&&(*(hbuf+i)<'a'))
 165   2                              return *(hbuf+i);
 166   2              }
 167   1              *(hbuf+i) = 0;
 168   1              Hex2Byte(hbuf,buf);             // 第一张卡片序列号由16进制字符串转换为字节数组
 169   1      
 170   1              strcpy(hbuf,"m");
 171   1              Byte2Hex(buf,4,hbuf);
 172   1              delay(10);
 173   1              sendcmd(hbuf);                  // 发送"m<SN>",选中第一张卡片
 174   1              for(i=0;i<8;i++)                // 接收选中卡片的序列号
 175   1              {
 176   2                      RI = 0;
 177   2                      while(!RI);
 178   2                      *(hbuf+i) = SBUF;
 179   2                      /* 如果接收到错误信息则返回错误代码 */
C51 COMPILER V7.02b   RFICRDWR                                                             12/10/2005 20:06:41 PAGE 4   

 180   2                      if((*(hbuf+i)>0x39)&&(*(hbuf+i)<'a'))
 181   2                              return *(hbuf+i);
 182   2              }
 183   1      
 184   1              return 0;                               // 成功
 185   1      }
 186          
 187          /* 指定选卡函数,根据制定序列号选卡 */
 188          uchar snselect(uchar *sn)
 189          {
 190   1              uchar i;
 191   1      
 192   1              strcpy(hbuf,"m");
 193   1              Byte2Hex(sn,4,hbuf);    // 将序列号sn转换为16进制字符串
 194   1              delay(10);
 195   1              sendcmd(hbuf);                  // 发送"m<SN>",选中第一张卡片
 196   1              for(i=0;i<8;i++)                // 接收选中卡片的序列号
 197   1              {
 198   2                      RI = 0;

⌨️ 快捷键说明

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