该程序为51单片机的FM1702代码
单片机源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #include <FM1702.h>
- #include <STDIO.H>
- #define PAUSE_INT EA=0;
- #define START_INT EA=1;
- #define uchar unsigned char
- #define uint unsigned int
- #define TRUE 1
- #define FALSE 0
- sbit rst =P0^7;
- sbit cs =P0^6;
- sbit si =P0^5;
- sbit sck =P0^4;
- sbit so =P0^3;
- sbit led =P1^3;
- sbit beep=P3^7;
- sbit K1=P1^0;
- sbit K2=P1^1;
- uchar flag=0;
- unsigned char date;
- unsigned char TxData[5];
- void UART_Init();
- uchar Receive();
- void Send(unsigned char back);
- void send_char_com(uchar ch);
- void send_string_com(uchar *str, uchar strlen);
- /////变量定义///////////////
- uchar RevBuffer[24]; /* FM1702命令发送接收缓冲区 */
- uchar UID[5]; /* 序列号 */
- uchar Secnr; /* 块号 */
- #define m1erea 0x01 //要操作的扇区号
- uint pay=1; //刷卡扣取的金额,2个字节,65535
- uint put=100; //刷卡充值的金额,每刷一次充值100元
- uint ctime,cctime;
- uchar ctimeH,ctimeL;
- uchar lcd[5];
- bit ICValueFlag=1; //IC卡分值为0标志位
- bit payflag=0;
- /////变量定义///////////////
- ////////////////////// 子函声明 /////////////////////////////
- uchar SPIRead(char reg_ad);
- void SPIWrite(char reg_ad,char reg_data);
- void Write_FIFO(uchar count, uchar *buff);
- uchar Clear_FIFO(void);
- uchar Judge_Req(uchar *buff);
- uchar Command_Send(uchar count, uchar *buff, uchar Comm_Set);
- uchar Request(uchar mode);
- void delay(uint x);
- uchar Read_FIFO(uchar *buff);
- //void Save_UID(uchar row, uchar col, uchar length);
- uchar AntiColl();
- uchar Check_UID();
- //void Set_BitFraming(uchar row, uchar col);
- uchar Select_Card();
- char M500HostCodeKey( uchar *uncoded, uchar *coded);
- uchar Load_key_CPY(uchar *buff);
- void keyto();
- uchar block_numset(uchar block_num);
- uchar MIF_Write(uchar *buff, uchar Block_Adr);
- uchar Read_E2(uchar lsb, uchar msb, uchar count, uchar *buff);
- uchar CRCrdadandset(uchar * buff,uchar RW);
- void initial_LCD();
- void DispalyLcd();
- void LCD_Data(uchar LCDbyte );
- void WriteCommand(uchar a);
- void displayUid();
- void displaymun(uchar temp1,uchar temp2,uchar temp3,uchar temp5,uchar buff1,uchar buff2,uchar buff3);
- void dis_Request1();
- void dis_Request2();
- void dis_Request3();
- void LCD_PutString(unsigned char x,unsigned char y,uchar *s);
- ////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////
- void Init_FM1702()
- {
- uchar temp;
- uint i;
- sck = 1;
- so = 1;
- si = 1;
- rst = 1; /* FM1702复位 */
- for(i = 0; i < 0xff; i++)
- {
- _nop_(); /*等待约140ms, 11.0592*/
- }
- rst = 0;
- for(i = 0; i < 0xff; i++)
- {
- _nop_();
- }
- /////////// init_spi ///////////////////////////////////////////////
- while(temp = SPIRead(Command) != 0) /* 等待Command = 0,FM1702复位成功 */
- {
- _nop_();
- }
- ////////////////////////////////////////////////////////////////////////////
- SPIWrite(Page_Sel,0x80); //往PAG里面写0X80初始化SPI接口
- for(i = 0; i < 0xff; i++) /* 延时 */
- {
- if(temp=SPIRead(Command) == 0x00) //如果Command为0表示初始化SPI接口成功
- {
- SPIWrite(Page_Sel,0x00); //往PAG里面写0开使用SPI接口
- }
- }
- ////////// init_FM1702 ///////////////////////////////////////
- SPIWrite(InterruptEn,0x7f); //address 06H /* 中断使能/禁止寄存器 */off
- SPIWrite(Int_Req,0x7f); //address 07H /* 中断请求标识寄存器 */清0
- SPIWrite(TxControl,0x5b); //address 11H /* 发送控制寄存器 */
- SPIWrite(RxControl2,0x01); //address 1EH 设置接收控制寄存器
- SPIWrite(RxWait,0x07); //address 21H 设置接收和发送之间的时间间隔
- SPIWrite(TypeSH,0x00); //0:TYPEA模式*//* 1:TYPEB模式*//* 2:上海模式*/
- }
- ////////////////////////////////////////////////////////////////////////////
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
- //名称: spi_byte_transceive //
- //功能: 该函数实现SPI通讯的数据收发 //
- // //
- //输入: //
- // 发送数据 //
- // //
- //输出: //
- // 接收数据 //
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
- char spi_byte_transceive(char sendbyte)
- {
- char i,temp;
- for(i=0;i<8;i++)
- {
- sck=0;
- if(sendbyte & 0x80) //位运算,判断最高位是否为1
- {
- si=1;
- }
- else
- {
- si=0;
- }
- sendbyte <<= 1;
- sck=1;
- temp <<= 1;
- if(so)
- temp |= 0x01;
- }
- sck=0;
- _nop_();
- _nop_();
- si=0;
- return (temp);
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
- //名称: rc531_register_write //
- //功能: 该函数实现通过SPI接口对RC531中一个寄存器写入值 //
- // //
- //输入: //
- // RC531目标寄存器地址和写入值 //
- // //
- //输出: //
- // N/A //
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
- void SPIWrite(char reg_ad,char reg_data)
- {
- sck=0; //时钟
- reg_ad <<= 1;
- cs=0; //接口选通
- reg_ad &= 0x7F; //最高位为0表示写
- spi_byte_transceive(reg_ad); //写地址
- spi_byte_transceive(reg_data); //写数据
- cs=1;
- return;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
- //名称: rc531_register_read //
- //功能: 该函数实现通过SPI接口读取RC531中一个寄存器的值 //
- // //
- //输入: //
- // RC531目标寄存器地址 //
- // //
- //输出: //
- // 目标寄存器的值 //
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
- uchar SPIRead(char reg_ad)
- { char temp;
- sck=0; //时钟
- _nop_();
- _nop_();
- cs=0; //接口选通开
- reg_ad <<= 1; //reg_ad左移一位付值给reg_ad
- reg_ad |= 0x80; //reg_ad跟“0X80”或运算后付值给reg_ad 最高位为1表示读
-
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
读卡器程序.zip
(91.34 KB, 下载次数: 118)
|