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

📄 rficrdwr.lst

📁 51单片机C语言应用程序设计实例精讲.rar
💻 LST
📖 第 1 页 / 共 2 页
字号:
 199   2                      while(!RI);
 200   2                      *(hbuf+i) = SBUF;
 201   2                      /* 如果接收到错误信息则返回错误代码 */
 202   2                      if((*(hbuf+i)>0x39)&&(*(hbuf+i)<'a'))
 203   2                              return *(hbuf+i);
 204   2              }
 205   1      
 206   1              return 0;                               // 成功
 207   1      }
 208          
 209          /* 登录扇区函数,参数sect为扇区号,keytype为密码类型,keyvalue为密码内容。
 210                  keyvalue为NULL时,表示使用默认密码;keytype为0x10~0x2f和0x30~0x4f
 211                  之间或者0xff时,程序忽略keyvalue的内容。                         */
 212          uchar loginsect(uchar sect,uchar keytype,uchar *keyvalue)
 213          {
 214   1              uchar tmp;
 215   1      
 216   1              if(sect>16)                             // 扇区号超过16报错
 217   1                      return ERR_E;
 218   1      
 219   1              strcpy(hbuf,"l");
 220   1              Byte2Hex(&sect,1,hbuf); // 将sect转换为16进制字符串
 221   1      
 222   1              if(((keytype>0x10)&&(keytype<0x2f))||((keytype>0x30)&&(keytype<0x4f)))
 223   1                      Byte2Hex(&keytype,1,hbuf);      // "l<sect><reg>
 224   1              else if((keytype==KEY_A)||(keytype==KEY_B))     // 使用密码A或B登录
 225   1              {
 226   2                      Byte2Hex(&keytype,1,hbuf);
 227   2                      if (keyvalue==NULL)
 228   2                              strcat(hbuf,"\r");              // "l<sect>aa<CR>或"l<sect>bb<CR>"
 229   2                      else
 230   2                              Byte2Hex(keyvalue,6,hbuf);      // "l<sect>aa<value>或"l<sect>bb<value>"
 231   2              }
 232   1              else if(keytype==KEY_DEFAULT)   // 使用默认密码登录
 233   1                      strcat(hbuf,"\r");                      // "l<sect><CR>
 234   1              else
 235   1                      return ERR_U;                           // 未知错误
 236   1      
 237   1              sendcmd(hbuf);                                  // 发送命令
 238   1      
 239   1              RI = 0;
 240   1              while(!RI);
 241   1              tmp = SBUF;
C51 COMPILER V7.02b   RFICRDWR                                                             12/10/2005 20:06:41 PAGE 5   

 242   1              if(tmp=='L')                                    // 登录成功
 243   1                      return 0;
 244   1              else
 245   1                      return tmp;                                     // 返回错误
 246   1      }
 247          
 248          /* 读块函数,将块中内容读至缓冲区,缓冲区长度应为16字节 */
 249          uchar readblock(uchar block,uchar *buf)
 250          {
 251   1              uchar i;
 252   1      
 253   1              if (block>64)                                   // 块号超过64报错
 254   1                      return ERR_E;
 255   1              strcpy(hbuf,"r");
 256   1              Byte2Hex(&block,1,hbuf);                // block转换为16进制字符串
 257   1              sendcmd(hbuf);                                  // "r<block>"
 258   1      
 259   1              for (i=0;i<32;i++)                              // 接收块数据
 260   1              {
 261   2                      RI = 0;
 262   2                      while(!RI);
 263   2                      *(hbuf+i) = SBUF;
 264   2                      /* 如果接收到错误信息则返回错误代码 */
 265   2                      if((*(hbuf+i)>0x39)&&(*(hbuf+i)<'a'))
 266   2                              return *(hbuf+i);
 267   2              }
 268   1              *(hbuf+32) = 0;
 269   1              Hex2Byte(hbuf,buf);             // 将块内容由16进制字符串转换为字节数组
 270   1      
 271   1              return 0;                                               // 成功
 272   1      }
 273          
 274          /* 写块函数,将缓冲区中内容写入块,缓冲区长度16字节 */
 275          uchar writeblock(uchar block,uchar *buf)
 276          {
 277   1              uchar i;
 278   1      
 279   1              if (block>64)                                   // 块号超过64报错
 280   1                      return ERR_E;
 281   1              strcpy(hbuf,"w");
 282   1              Byte2Hex(&block,1,hbuf);                // block转换为16进制字符串
 283   1              Byte2Hex(buf,16,hbuf);                  // 将要写入块的内容转换为16进制字符串
 284   1              sendcmd(hbuf);                                  // "w<block><data>"
 285   1      
 286   1              for (i=0;i<32;i++)                              // 接收返回数据,为写入的内容
 287   1              {
 288   2                      RI = 0;
 289   2                      while(!RI);
 290   2                      *(hbuf+i) = SBUF;
 291   2                      /* 如果接收到错误信息则返回错误代码 */
 292   2                      if((*(hbuf+i)>0x39)&&(*(hbuf+i)<'a'))
 293   2                              return *(hbuf+i);
 294   2              }
 295   1      
 296   1              return 0;                                               // 成功
 297   1      }
 298          
 299          /* 主程序,选取一张卡,将0~15共16个数写入扇区1的块0中,然后再从该扇区的
 300                  块0中读出这16个数,存入缓冲区block0buf,接着再将block0buf中的内容写入
 301                  该扇区的块1中,最后再从块1中读出16个数,存入缓冲区block1buf中。本程序
 302                  的主要功能是验证H6152模块对非接触式IC卡的读写                           */
 303          void main()
C51 COMPILER V7.02b   RFICRDWR                                                             12/10/2005 20:06:41 PAGE 6   

 304          {
 305   1              char sn[4];
 306   1              uchar sectno,blockno;                   // 扇区号、块号
 307   1              uchar blockbuf[16];                             // 要写入块的内容缓冲区
 308   1              uchar i;
 309   1              
 310   1              sectno = 1;                                             // 扇区1
 311   1              blockno = 0;                                    // 块0
 312   1              flagok = 0;
 313   1              flagfirst = 1;
 314   1              flagselok = 0;
 315   1              flaglogok = 0;
 316   1              count = 0;
 317   1              
 318   1              for (i=0;i<16;i++)                              // 写入0~15共16字节
 319   1                      blockbuf[i]=i;
 320   1      
 321   1              CTRL = 0;                                               // H6152正常工作
 322   1              BP = 1;                                                 // 蜂鸣器不发声
 323   1      
 324   1              EA = 1;
 325   1              TMOD = 0x01;                                    // 模式1,T0为16位定时/计数器
 326   1              TH0 = -5000/256;                                // 设置计数初值
 327   1              TL0 = -5000%256;
 328   1              ET0 = 1;                                                // 打开T0中断   
 329   1      
 330   1              serial_init();                                  // 串口初始化   
 331   1      
 332   1              H6152Rst();                                             // H6152复位
 333   1              
 334   1              while(!flagok)                                   
 335   1              {
 336   2                      cardcheck();                            // 卡片检测
 337   2                      endcheck();                                     // 停止检测
 338   2                      if (flagfirst)                          // 如果是第一次选卡
 339   2                      {
 340   3                              flagfirst = 0;
 341   3                              if (autoselect(sn)==0)  // 第一张卡片选择成功,并保存序列号sn
 342   3                              {
 343   4                                      flagselok = 1;  
 344   4                                      TR0 = 1;                        // T0开始计时   
 345   4                              }
 346   3                      }
 347   2                      else
 348   2                      {
 349   3                              if(snselect(sn)==0)             // 指定序列号sn的卡片选择成功
 350   3                                      flagselok = 1;                          
 351   3                      }
 352   2              if (flagselok)
 353   2                      {
 354   3                              if(loginsect(sectno,KEY_DEFAULT,NULL)=='L')             // 登录成功
 355   3                                      flaglogok = 1;
 356   3                              else
 357   3                              {
 358   4                                      flagselok = 0;                                  // 登录不成工,重新去选卡
 359   4                                      flaglogok = 0;
 360   4                              }
 361   3                              if (flaglogok)
 362   3                              {
 363   4                                      flagwr = writeblock(blockno,blockbuf);
 364   4                                      if(flagwr!=0)
 365   4                                              flagselok = 0;                  // 写块错误,重新去选卡
C51 COMPILER V7.02b   RFICRDWR                                                             12/10/2005 20:06:41 PAGE 7   

 366   4                                      else
 367   4                                      {                                       
 368   5                                              flagrd = readblock(blockno,block0buf);
 369   5                                              if (flagrd!=0)
 370   5                                                      flagselok = 0;          // 读块错误,重新去选卡
 371   5                                              else
 372   5                                              {                                               
 373   6                                                      flagwr = writeblock(blockno+1,block0buf);
 374   6                                                      if (flagwr!=0)
 375   6                                                              flagselok = 0;  // 写块错误,重新去选卡
 376   6                                                      else
 377   6                                                      {                                                       
 378   7                                                              flagrd = readblock(blockno+1,block1buf);
 379   7                                                              if (flagrd!=0)
 380   7                                                                      flagselok = 0;  // 读块错误,重新去选卡
 381   7                                                              else
 382   7                                                                      flagok = 1;                                     // 读写成功
 383   7                                                      }
 384   6                                               }
 385   5                       }
 386   4                               }
 387   3                      }
 388   2          }
 389   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1396    ----
   CONSTANT SIZE    =     19    ----
   XDATA SIZE       =     69    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      3      54
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      4    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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