找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5847|回复: 8
打印 上一主题 下一主题
收起左侧

51单片机FM1702SL读卡器控制程序

  [复制链接]
跳转到指定楼层
楼主
该程序为51单片机的FM1702代码

单片机源程序如下:

  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <FM1702.h>
  4. #include   <STDIO.H>
  5. #define        PAUSE_INT        EA=0;
  6. #define        START_INT        EA=1;
  7. #define uchar unsigned  char
  8. #define uint  unsigned  int

  9. #define TRUE   1
  10. #define FALSE  0


  11. sbit  rst =P0^7;
  12. sbit  cs  =P0^6;
  13. sbit  si  =P0^5;
  14. sbit  sck =P0^4;
  15. sbit  so  =P0^3;

  16. sbit  led =P1^3;
  17. sbit  beep=P3^7;

  18. sbit K1=P1^0;
  19. sbit K2=P1^1;
  20. uchar flag=0;
  21. unsigned char date;
  22. unsigned char        TxData[5];
  23. void UART_Init();
  24. uchar Receive();
  25. void Send(unsigned char back);
  26. void        send_char_com(uchar ch);
  27. void        send_string_com(uchar *str, uchar strlen);


  28. /////变量定义///////////////

  29. uchar         RevBuffer[24];                    /* FM1702命令发送接收缓冲区 */
  30. uchar         UID[5];                            /* 序列号 */
  31. uchar  Secnr;                                /* 块号 */
  32. #define         m1erea                 0x01     //要操作的扇区号
  33. uint     pay=1;                                //刷卡扣取的金额,2个字节,65535
  34. uint     put=100;                        //刷卡充值的金额,每刷一次充值100元
  35. uint     ctime,cctime;
  36. uchar    ctimeH,ctimeL;
  37. uchar lcd[5];
  38. bit ICValueFlag=1;              //IC卡分值为0标志位
  39. bit payflag=0;
  40. /////变量定义///////////////



  41. ////////////////////// 子函声明 /////////////////////////////
  42. uchar SPIRead(char reg_ad);
  43. void SPIWrite(char reg_ad,char reg_data);
  44. void Write_FIFO(uchar count, uchar  *buff);
  45. uchar Clear_FIFO(void);
  46. uchar Judge_Req(uchar  *buff);
  47. uchar Command_Send(uchar count, uchar *buff, uchar Comm_Set);
  48. uchar Request(uchar mode);
  49. void delay(uint x);
  50. uchar Read_FIFO(uchar *buff);
  51. //void Save_UID(uchar row, uchar col, uchar length);
  52. uchar AntiColl();
  53. uchar Check_UID();
  54. //void Set_BitFraming(uchar row, uchar col);
  55. uchar Select_Card();
  56. char M500HostCodeKey(  uchar *uncoded, uchar *coded);
  57. uchar Load_key_CPY(uchar *buff);
  58. void keyto();
  59. uchar block_numset(uchar block_num);
  60. uchar MIF_Write(uchar *buff, uchar Block_Adr);
  61. uchar Read_E2(uchar lsb, uchar msb, uchar count, uchar *buff);
  62. uchar CRCrdadandset(uchar * buff,uchar RW);

  63. void initial_LCD();
  64. void DispalyLcd();
  65. void LCD_Data(uchar LCDbyte );
  66. void WriteCommand(uchar a);
  67. void displayUid();
  68. void displaymun(uchar temp1,uchar temp2,uchar temp3,uchar temp5,uchar buff1,uchar buff2,uchar buff3);

  69. void dis_Request1();
  70. void dis_Request2();
  71. void dis_Request3();
  72. void LCD_PutString(unsigned char x,unsigned char y,uchar *s);

  73. ////////////////////////////////////////////////////////////////////
  74. ////////////////////////////////////////////////////////////////////

  75. void Init_FM1702()
  76. {       
  77.         uchar temp;
  78.         uint        i;
  79.         sck = 1;
  80.         so = 1;
  81.         si = 1;
  82.         rst = 1;                                    /* FM1702复位 */
  83.         for(i = 0; i < 0xff; i++)
  84.         {
  85.                 _nop_();                     /*等待约140ms, 11.0592*/
  86.         }
  87.         rst = 0;
  88.         for(i = 0; i < 0xff; i++)      
  89.         {
  90.                 _nop_();
  91.         }
  92.      ///////////  init_spi  ///////////////////////////////////////////////       
  93.         while(temp = SPIRead(Command) != 0)        /* 等待Command = 0,FM1702复位成功 */
  94.         {
  95.                 _nop_();
  96.         }
  97. ////////////////////////////////////////////////////////////////////////////
  98.     SPIWrite(Page_Sel,0x80);                 //往PAG里面写0X80初始化SPI接口
  99.         for(i = 0; i < 0xff; i++) /* 延时 */
  100.         {
  101.                 if(temp=SPIRead(Command) == 0x00)        //如果Command为0表示初始化SPI接口成功
  102.                 {
  103.                         SPIWrite(Page_Sel,0x00);        //往PAG里面写0开使用SPI接口
  104.                 }
  105.         }
  106.      ////////// init_FM1702 ///////////////////////////////////////
  107.         SPIWrite(InterruptEn,0x7f);        //address 06H  /* 中断使能/禁止寄存器 */off
  108.         SPIWrite(Int_Req,0x7f);     //address 07H    /* 中断请求标识寄存器 */清0
  109.         SPIWrite(TxControl,0x5b);        //address 11H    /* 发送控制寄存器 */
  110.         SPIWrite(RxControl2,0x01);  //address 1EH    设置接收控制寄存器
  111.         SPIWrite(RxWait,0x07);                //address 21H    设置接收和发送之间的时间间隔
  112.     SPIWrite(TypeSH,0x00);      //0:TYPEA模式*//* 1:TYPEB模式*//* 2:上海模式*/
  113. }       
  114. ////////////////////////////////////////////////////////////////////////////



  115. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  116. //名称: spi_byte_transceive                                                    //
  117. //功能: 该函数实现SPI通讯的数据收发                                            //
  118. //                                                                               //
  119. //输入:                                                                        //
  120. //      发送数据                                                               //
  121. //                                                                             //
  122. //输出:                                                                        //
  123. //      接收数据                                                               //
  124. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  125. char spi_byte_transceive(char sendbyte)
  126. {
  127.   char i,temp;
  128.   for(i=0;i<8;i++)
  129.    {  
  130.             sck=0;
  131.             if(sendbyte & 0x80)                //位运算,判断最高位是否为1
  132.              {
  133.                       si=1;
  134.              }
  135.             else
  136.              {
  137.                       si=0;
  138.              }
  139.             sendbyte <<= 1;   
  140.             sck=1;
  141.             temp <<= 1;
  142.             if(so)
  143.             temp |= 0x01;
  144.    }
  145.             sck=0;
  146.              _nop_();
  147.          _nop_();
  148.             si=0;
  149.             return (temp);
  150. }


  151. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  152. //名称: rc531_register_write                                                   //
  153. //功能: 该函数实现通过SPI接口对RC531中一个寄存器写入值                         //
  154. //                                                                             //
  155. //输入:                                                                        //
  156. //     RC531目标寄存器地址和写入值                                             //
  157. //                                                                             //
  158. //输出:                                                                        //
  159. //     N/A                                                                     //
  160. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  161. void SPIWrite(char reg_ad,char reg_data)
  162. {   
  163.     sck=0;                               //时钟
  164.     reg_ad <<= 1;
  165.     cs=0;                              //接口选通
  166.     reg_ad &= 0x7F;                      //最高位为0表示写
  167.     spi_byte_transceive(reg_ad);     //写地址
  168.     spi_byte_transceive(reg_data);  //写数据
  169.     cs=1;
  170.     return;
  171. }

  172. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  173. //名称: rc531_register_read                                                    //
  174. //功能: 该函数实现通过SPI接口读取RC531中一个寄存器的值                         //
  175. //                                                                             //
  176. //输入:                                                                        //
  177. //     RC531目标寄存器地址                                                     //
  178. //                                                                             //
  179. //输出:                                                                        //
  180. //     目标寄存器的值                                                          //
  181. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  182. uchar SPIRead(char reg_ad)
  183. {   char temp;
  184.     sck=0;       //时钟
  185.      _nop_();
  186.      _nop_();
  187.     cs=0;      //接口选通开
  188.     reg_ad <<= 1;                          //reg_ad左移一位付值给reg_ad
  189.     reg_ad |= 0x80;                        //reg_ad跟“0X80”或运算后付值给reg_ad   最高位为1表示读
  190.    
  191. ……………………

  192. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
读卡器程序.zip (91.34 KB, 下载次数: 117)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:143486 发表于 2017-12-26 15:52 | 只看该作者
很好刷刷刷
回复

使用道具 举报

板凳
ID:271657 发表于 2018-1-4 21:42 | 只看该作者
支持下楼主 小弟刚来 多给几分让我好试试程序
回复

使用道具 举报

地板
ID:276348 发表于 2018-1-21 22:38 | 只看该作者
单片机要学习的内容还是比较多的。
回复

使用道具 举报

5#
ID:191710 发表于 2018-6-14 16:14 | 只看该作者
不错不错。。。
回复

使用道具 举报

6#
ID:383818 发表于 2018-8-7 14:57 | 只看该作者
需要多交流学习啊
回复

使用道具 举报

7#
ID:593106 发表于 2020-5-10 21:24 | 只看该作者
感谢分享,正需要
回复

使用道具 举报

8#
ID:23844 发表于 2021-10-10 15:14 | 只看该作者
感谢分享,下载一份研究研究
回复

使用道具 举报

9#
ID:29579 发表于 2022-8-19 14:13 | 只看该作者
谢谢分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表