久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
51單片機讀寫RC522卡(LCD12864)RFID開發程序與原理圖
[打印本頁]
作者:
之文組合
時間:
2018-1-2 14:59
標題:
51單片機讀寫RC522卡(LCD12864)RFID開發程序與原理圖
RFID RC522程序及原理
RC522原理圖1.png
(165.44 KB, 下載次數: 99)
下載附件
2018-1-2 14:58 上傳
單片機源程序如下:
#include "reg52.h"
#include "main.h"
#include "mfrc522.h"
#include "LCD12864.h"
#include <string.h>
#include <stdio.h>
sbit BEEP=P0^1 ;
#define SET_BEEP BEEP = 0
#define CLR_BEEP BEEP = 1
//M1卡的某一塊寫為如下格式,則該塊為錢包,可接收扣款和充值命令
//4字節金額(低字節在前)+4字節金額取反+4字節金額+1字節塊地址+1字節塊地址取反+1字節塊地址+1字節塊地址取反
unsigned char code data2[4] = {0x12,0,0,0};
unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
//unsigned char g_ucTempbuf[20];
unsigned char idata MLastSelectedSnr[4];
unsigned char idata RevBuffer[30];
//unsigned char data SerBuffer[20];
bit CmdValid;
unsigned char code ASCII_NUM[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
unsigned char idata LastKeyA[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};//NO.2卡
unsigned char idata NewKeyA[6]={0x19,0x84,0x07,0x15,0x76,0x14};//NO.2卡
unsigned char idata NewKey[16]={0x19,0x84,0x07,0x15,0x76,0x14,
0xff,0x07,0x80,0x69,
0x19,0x84,0x07,0x15,0x76,0x14};
unsigned char idata Read_Data[16]={0x00};
//unsigned char idata RevBuffer[30];
//unsigned char idata MLastSelectedSnr[4];
unsigned char data OperationCard;
uchar data bWarn,bPass;
#define REGCARD 0xa1
#define CONSUME 0xa2
#define READCARD 0xa3
#define ADDMONEY 0xa4
void KeyScan(void)
{
if(REGCARDBTN == 0)//注冊
{
delay_10ms(1);
if(REGCARDBTN == 0 )
OperationCard = REGCARD;
LCD_PutString(0,3,"注冊:");
}
if(CONSUMEBTN == 0)//消費
{
delay_10ms(1);
if(CONSUMEBTN == 0 )
OperationCard = CONSUME;
LCD_PutString(0,3,"消費: ");
}
if(ADDMONEYBTN == 0)//充值
{
delay_10ms(1);
if(ADDMONEYBTN == 0 )
OperationCard = ADDMONEY;
LCD_PutString(0,3,"充值: ");
}
if(READCARDBTN == 0)//讀卡信息
{
delay_10ms(1);
if(READCARDBTN == 0 )
OperationCard = READCARD;
LCD_PutString(0,3,"查詢: ");
}
}
/*
void delay(void)
{
uint i ;
for(i=0;i++;i<100)
;
}
void ShortBeep(void)
{
uint i;
for(i=0;i<3;i++)
{
SET_BEEP;
delay_10ms(3);
CLR_BEEP;
delay();
}
}
void LongBeep(void)
{
uint i;
for(i=0;i<20;i++)
{
SET_BEEP;
delay_10ms(5);
CLR_BEEP;
delay();
}
}
*/
void Warn(void)
{
uchar data ii;
for(ii=0;ii<3;ii++)
{
SET_BEEP;//ShortBeep();如果是有源蜂鳴器就一句SET_BEEP就ok了
delay_10ms(5);
CLR_BEEP;
delay_10ms(5);
}
}
void Pass(void)
{
SET_BEEP;//LongBeep();如果是有源蜂鳴器就一句SET_BEEP就ok了
delay_10ms(30);
CLR_BEEP;
}
void CtrlProcess(void)
{
// unsigned char idata Write_First_Data[16];
char string[]=" ";
unsigned char idata Write_Consume_Data[16];
signed long money_value;
float f_money_value;
unsigned char ii;
char status;
status=PcdRequest(PICC_REQIDL,&RevBuffer[0]);//尋天線區內未進入休眠狀態的卡,返回卡片類型 2字節
if(status!=MI_OK)
return;
for(ii=0;ii<2;ii++)
{
string[2*ii] = ASCII_NUM[(RevBuffer[ii]>>4)&0x0f];
string[2*ii+1] = ASCII_NUM[RevBuffer[ii]&0x0f];
}
string[4] = '\0';
LCD_PutString(3,1,string);//LCD顯示卡類型
status=PcdAnticoll(&RevBuffer[2]);//防沖撞,返回卡的序列號 4字節
if(status!=MI_OK)
return;
memcpy(MLastSelectedSnr,&RevBuffer[2],4);//4字節序列號 放到MLastSelectedSnr
for(ii=0;ii<4;ii++)
{
string[2*ii] = ASCII_NUM[(MLastSelectedSnr[ii]>>4)&0x0f];
string[2*ii+1] = ASCII_NUM[MLastSelectedSnr[ii]&0x0f];
}
string[9] = '\0';
LCD_PutString(3,2,string);// LCD顯示序列號
status=PcdSelect(MLastSelectedSnr);//選卡
if(status!=MI_OK)
return;
if(OperationCard==REGCARD)//注冊
{
status=PcdAuthState(PICC_AUTHENT1A,7,LastKeyA,MLastSelectedSnr);//
//DelayNS(1);
if(status!=MI_OK)
{
bWarn=1;
return;
}
status=PcdWrite(7,&NewKey[0]);
if(status!=MI_OK)
{
bWarn=1;
return;
}
for(ii=0;ii<16;ii++)
{
Write_Consume_Data[ii]=0xaa;//Write_First_Data
}
memset( Write_Consume_Data, 0, sizeof(Write_Consume_Data) );//Write_First_Data Write_First_Data
money_value = 5000;
memcpy( Write_Consume_Data, ( uchar * )&money_value, 4 ); //Write_First_Data
status=PcdWrite(4,&Write_Consume_Data[0]);//Write_First_Data
if(status!=MI_OK)
{
bWarn=1;
return;
}
LCD_PutString(0,3,"注冊: 成功");
bPass=1;
PcdHalt();
}
else if(OperationCard==READCARD)//讀卡
{
status=PcdAuthState(PICC_AUTHENT1A,7,NewKeyA,MLastSelectedSnr);//????KUAI4?
if(status!=MI_OK)
return;
status=PcdRead(4,Read_Data);
if(status!=MI_OK)
{
bWarn=1;
return;
}
memcpy( (uchar *)&money_value, Read_Data, 4 );
LCD_PutString(0,3,"查詢: ");
f_money_value = money_value * 1.0/100;
sprintf(string,"%5.2f",f_money_value);
LCD_PutString(3,4,string);
//ShowFloat816( 4, 5, ( f_money_value >= 0 ) ? ( ( f_money_value+0.5 )/100 ) : ( ( f_money_value-0.5 )/100 ) );
if(f_money_value<0)
bWarn=1;
bPass=1;
PcdHalt();
}
else if(OperationCard==CONSUME)//消費
{
status=PcdAuthState(PICC_AUTHENT1A,7,NewKeyA,MLastSelectedSnr);//
if(status!=MI_OK)
return;
status=PcdRead(4,Read_Data);
if(status!=MI_OK)
{
bWarn=1;
return;
}
memcpy( (uchar *)&money_value, Read_Data, 4 );
if(money_value<-10000)
money_value=-10000;
if(money_value<0)
money_value+=10000;
money_value=money_value-258;
memcpy( Write_Consume_Data, (uchar *)&money_value, 4 );
status=PcdWrite(4,&Write_Consume_Data[0]);
if(status!=MI_OK)
{
bWarn=1;
return;
}
//ShowFloat816(2,5,2.58);
LCD_PutString(0,3,"消費: 2.58 ");
f_money_value = money_value * 1.0/100;
sprintf(string,"%5.2f",f_money_value);
LCD_PutString(3,4,string);
//ShowFloat816(4,5,( f_money_value >= 0 ) ? ( ( f_money_value+0.5 )/100 ) : ( ( f_money_value-0.5 )/100 ));
if(money_value<0)
bWarn=1;
else
bPass=1;
PcdHalt();
}
else if(OperationCard==ADDMONEY)//充值
{
status=PcdAuthState(PICC_AUTHENT1A,7,NewKeyA,MLastSelectedSnr);//????KUAI4?
if(status!=MI_OK)
return;
status=PcdRead(4,Read_Data);
if(status!=MI_OK)
{
bWarn=1;
return;
}
memcpy( (uchar *)&money_value, Read_Data, 4 );
if(money_value<-10000)
money_value=-10000;
if(money_value<0)
money_value+=10000;
money_value=money_value+5000;
memcpy( Write_Consume_Data, (uchar *)&money_value, 4 );
status=PcdWrite(4,&Write_Consume_Data[0]);
if(status!=MI_OK)
{
bWarn=1;
return;
}
//ShowFloat816(2,5,50.00);
LCD_PutString(0,3,"充值: 50.00 ");
f_money_value = money_value * 1.0/100;
sprintf(string,"%5.2f",f_money_value);
LCD_PutString(3,4,string);
//ShowFloat816(4,5,( f_money_value >= 0 ) ? ( ( f_money_value+0.5 )/100 ) : ( ( f_money_value-0.5 )/100 ));
bPass=1;
PcdHalt();
}
OperationCard = 0;
}
void iccardcode()
{
unsigned char cmd;
unsigned char status;
cmd = RevBuffer[0];
switch(cmd)
{
case 1: // Halt the card //終止卡的操作
status= PcdHalt();;
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
case 2: // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
// 尋卡,防沖突,選擇卡 返回卡類型(2 bytes)+ 卡系列號(4 bytes)
status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
if(status!=0)
{
status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
if(status!=0)
{
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
}
}
RevBuffer[0]=3;
RevBuffer[1]=status;
break;
case 3: // 防沖突 讀卡的系列號 MLastSelectedSnr
status = PcdAnticoll(&RevBuffer[2]);
if(status!=0)
{
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
}
memcpy(MLastSelectedSnr,&RevBuffer[2],4);
RevBuffer[0]=5;
RevBuffer[1]=status;
break;
case 4: // 選擇卡 Select Card
status=PcdSelect(MLastSelectedSnr);
if(status!=MI_OK)
{
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
}
RevBuffer[0]=3;
RevBuffer[1]=status;
break;
case 5: // Key loading into the MF RC500's EEPROM
status = PcdAuthState(RevBuffer[1], RevBuffer[3], DefaultKey, MLastSelectedSnr);// 校驗卡密碼
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
case 6:
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
case 7:
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
case 8: // Read the mifare card
// 讀卡
status=PcdRead(RevBuffer[1],&RevBuffer[2]);
if(status==0)
{RevBuffer[0]=17;}
else
{RevBuffer[0]=1;}
RevBuffer[1]=status;
break;
case 9: // Write the mifare card
// 寫卡 下載密碼
status=PcdWrite(RevBuffer[1],&RevBuffer[2]);
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
case 10:
PcdValue(RevBuffer[1],RevBuffer[2],&RevBuffer[3]);
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
case 12: // 參數設置
PcdBakValue(RevBuffer[1], RevBuffer[2]);
RevBuffer[0]=1; //contact
RevBuffer[1]=0;
break;
}
}
/////////////////////////////////////////////////////////////////////
//系統初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem()
{
P0 = 0xFF; P1 = 0xFF; P3 = 0xFF;
ET2 = 0;
T2CON = 0x04; //TR2=1 LYF
PCON = 0x00;//0x80;
SCON = 0x70;//SMO SM1= 0 1 方式1,對于方式1,SM2=1,接收到有效的停止位時,將RI置1,REN置1時允許接收數據
TMOD = 0x21;//TMOD = 0x22; TIMER1:C/T=0,定時器,M1M0=10,T1為工作模式2,即8位自動重裝載模式
//TIMER0: C/T=0,定時器,M1M0=01,16位計數器
TH1 = BAUD_2400;
TL1 = TH1;
TR1 = 1; // T1 作為波特率發生器
TH0 = 0x60;
TL0 = 0x60;
TR0 = 0;
ET0=0;
ET1=0;
EA=1;
//EX0=1;
//IT0 = 1;
TR2=0;
ES = 1;
CmdValid=0;
LED_GREEN = 1;
PcdReset();
PcdAntennaOff();
PcdAntennaOn();
M500PcdConfigISOType( 'A' );
LED_GREEN = 0;
delay_10ms(10);
LED_GREEN = 1;
delay_10ms(10);
LED_GREEN = 0;
}
/////////////////////////////////////////////////////////////////////
//用T2做延時子程序
/////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
// 接收和發送中斷
///////////////////////////////////////////////////////////////////////
void isr_UART(void) interrupt 4 using 1
{
unsigned char len, i;
unsigned int j=0;
if(RI)
{
len=SBUF;
RI=0;
for(i=0;i<len;i++)
{
while(!RI)
{
j++;
if(j>1000)
{
break;
}
}
if(j<1000)
{
RevBuffer[i]=SBUF;
RI=0;
j=0;
}
else
{
break;
}
}
if(i==len)
{
REN=0;
CmdValid=1;
}
}
else if(!RI && TI)
{
TI=0;
len=RevBuffer[0];
for(i=0;i<len+1;i++)
{
SBUF=RevBuffer[i];
while(!TI);
TI=0;
}
REN=1;
}
}
void UartProcess(void)
{
unsigned char baud;
if(RevBuffer[0]==11) //為了加快相應速度 測試風鳴器
{
RevBuffer[2]=RevBuffer[1];
RevBuffer[0]=1; //contact
RevBuffer[1]=0;
CALL_isr_UART();
LED_GREEN = 1;
delay_10ms(RevBuffer[2]);
LED_GREEN = 0;
}
else if(RevBuffer[0]==13) //設置通訊波特率
{
switch(RevBuffer[1])
{
case 0:
baud=BAUD_9600;
break;
case 1:
baud=BAUD_14400;
break;
case 2:
baud=BAUD_19200;
break;
case 3:
baud=BAUD_28800;
break;
case 4:
baud=BAUD_38400;
break;
case 5:
baud=BAUD_57600;
break;
case 6:
baud=BAUD_115200;
break;
default:
baud=BAUD_9600;
break;
}
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
6-51讀寫卡程序(LCD12864).rar
(98.49 KB, 下載次數: 373)
2018-1-2 14:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
醒悟
時間:
2019-5-22 16:26
對于1602來說,這個程序適用嗎?
作者:
小白H
時間:
2019-6-18 12:13
原理圖用什么軟件畫的
作者:
203385918
時間:
2020-1-1 20:38
小白H 發表于 2019-6-18 12:13
原理圖用什么軟件畫的
AD軟件。。。。。。。。
作者:
小穎
時間:
2020-3-8 13:02
感謝分享
作者:
739004020
時間:
2020-4-14 20:03
樓主,怎么沒有顯示呢?
作者:
池淵
時間:
2020-5-24 01:01
能問一下樓主UartProccess跟iccardcode兩個函數的作用嗎?什么情況下會調用呢?
作者:
ylshu
時間:
2021-4-22 11:33
謝謝樓主分享。非常感謝,學習中
作者:
tarchen
時間:
2024-10-1 09:20
感謝分享,有空看看.
作者:
QEQWE123
時間:
2025-2-6 16:48
實測刷卡+顯示+按鍵都好用
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产精品成人国产乱一区
|
欧美无乱码久久久免费午夜一区
|
精精国产xxxx视频在线播放
|
欧美久操网
|
日韩二三区
|
在线观看中文字幕
|
国产资源网
|
欧美日韩在线一区二区
|
亚洲v日韩v综合v精品v
|
a在线观看
|
成人不卡
|
成人国产精品免费观看视频
|
精品日韩一区二区
|
夜夜骑综合
|
精品九九
|
欧美日韩国产一区二区
|
欧美亚洲视频
|
一区二区三区视频在线观看
|
欧美性受xxxx
|
免费观看日韩精品
|
中文字幕在线视频免费视频
|
亚洲黄色国产
|
久久久.com
|
隔壁老王国产在线精品
|
亚洲视频中文字幕
|
久久久男人的天堂
|
国产精品免费在线
|
天堂一区二区三区
|
四虎最新地址
|
一级爱爱片
|
免费国产一区二区
|
成人性生交大片免费看中文带字幕
|
一区二区三区在线播放视频
|
国产精品日日夜夜
|
亚洲最大的黄色网址
|
91在线视频网址
|
av网站在线播放
|
国产高清免费在线
|
国产一区二区三区视频免费观看
|
特黄毛片视频
|
日本精品视频一区二区三区四区
|