該程序為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)
2017-11-13 19:06 上傳
點擊文件名下載附件
|