射頻識別 (RFID)使用射頻來讀取存儲在 RFID 卡或標簽中的信息。在這個項目中,我們將連接EM-18 RFID閱讀器與8051微控制器,并在16* 2 LCD顯示屏上顯示RFID卡號。這種無線射頻識別用于許多系統,如基于RFID的考勤系統,安全系統,投票機等。
所需組件:
8051微控制器
EM-18 無線射頻識別讀寫器
16*2液晶顯示屏
射頻識別卡/標簽
電位計
跳線
電路圖:
8051 微控制器:
8051微控制器是一款8位微控制器,具有128字節的片上RAM,4K字節的片上ROM,兩個定時器,一個串行端口和四個8位端口。8052微控制器是微控制器的擴展。下表顯示了8051名家庭成員的比較。
特征 | 8051 | 8052 |
只讀存儲器(以字節為單位) | 4K | 8K |
內存(字節) | 128 | 256 |
定時器 | 2 | 3 |
I/O 引腳 | 32 | 32 |
串行端口 | 1 | 1 |
中斷源 | 6 | 8 |
16x2 液晶顯示器:
16 * 2 LCD是嵌入式應用中廣泛使用的顯示器。以下是有關16 * 2液晶顯示器的引腳和工作的簡要說明。LCD內部有兩個非常重要的寄存器。它們是數據寄存器和命令寄存器。命令寄存器用于發送清晰顯示、光標在家鄉等命令,數據寄存器用于發送要在16*2 LCD上顯示的數據。下表顯示了16 * 2 LCD的引腳說明。
針 | 象征 | I/O | 描述 |
1 | VSS | - | 地 |
2 | Vdd | - | +5V電源 |
3 | V形 | - | 用于控制對比度的電源 |
4 | RS | 我 |
RS=0 為命令寄存器 , RS=1 用于數據寄存器 |
5 | 烏爾曼 | 我 | R/W=0 表示寫入,R/W=1 表示讀取 |
6 | E | I/O | 使 |
7 | D0 | I/O | 8位數據總線 |
8 | D1 | I/O | 8位數據總線 |
9 | D2 | I/O | 8位數據總線 |
10 | D3 | I/O | 8位數據總線 |
11 | D4 | I/O | 8位數據總線 |
12 | D5 | I/O | 8位數據總線 |
13 | D6 | I/O | 8位數據總線 |
14 | D7 | I/O | 8位數據總線 |
15 | 一個 | - | +5V背光 |
16 | K | - | 地 |
下表顯示了常用的液晶屏命令代碼。
代碼(十六進制) | 描述 |
01 | 清晰的顯示屏 |
06 | 遞增光標(右移) |
0安 | 顯示關閉,光標打開 |
0C | 顯示打開,光標關閉 |
0F | 顯示于 ,光標閃爍 |
80 | 強制光標從 1 開始圣線 |
C0 | 強制光標到開頭 2德·線 |
38 | 2行和5 * 7矩陣 |
EM-18 無線射頻識別讀寫器:
EM-18 RFID閱讀器的工作頻率為125 KHz,并配有片上天線,可采用5V電源供電。它提供串行輸出以及 weigand 輸出。范圍約為8-12厘米。串行通信參數為9600bps,8個數據位,1個停止位。其應用包括身份驗證、電子收費公路定價、公共交通電子票務、考勤系統等。在此處查看所有 RFID 項目。
EM-18 RFID閱讀器提供的輸出為12位ASCII格式。在 12 位數字中,前 10 位數字是卡號,后兩位數字是卡號的異或結果。最后兩位數字用于錯誤檢查。
例如,從讀卡器讀取的卡號是0200107D0D62,那么卡上的卡號將如下所示。
02 – 序言
00107D0D = 十進制1080589。
62 是 (02 XOR 00 XOR 10 XOR 7D XOR 0D) 的 XOR 值。
因此,卡上的數字是0001080589。
工作和代碼說明:
該項目的完整C 程序和演示視頻在本項目結束時給出。代碼被分成有意義的小塊,并在下面解釋。
對于與8051微控制器的16 * 2 LCD接口,我們必須定義16 * 2 LCD連接到8051微控制器的引腳。16*2 LCD 的 RS 引腳連接到 P3.7,16*2 LCD 的 RW 引腳連接到 P3.6,16*2 LCD 的 E 引腳連接到 P3.5。數據引腳連接到 8051 微控制器的端口 1。
sbit rs=P3^7;
sbit rw=P3^6;
sbit en=P3^5;
接下來,我們必須定義一些在程序中使用的函數。延遲功能用于創建指定的時間延遲。Cmdwrt功能用于向16 * 2 LCD顯示器發送命令。Datawrt功能用于將數據發送到16 * 2 LCD顯示器。Rxdata功能用于從串口接收數據。
void delay(unsigned int) ;
void cmdwrt(unsigned char);
void datawrt(unsigned char);
char rxdata(void);
在代碼的這一部分中,我們將配置8051微控制器進行串行通信。
TMOD寄存器加載了定時器1模式2(自動重新加載)的0x20。SCON 寄存器加載了 8 個數據位、1 個停止位和接收啟用的0x50。TH1寄存器加載了波特率為每秒9600位的0xfd。TR1=1 用于啟動計時器。
TMOD= 0x20;
SCON=0x50;
TH1=0xfd;
TR1=1;
在代碼的這一部分,我們將命令發送到 16*2 lcd。清除顯示、遞增光標、強制光標到開頭 1 等命令圣線在一段時間后一一發送到16 * 2液晶顯示器。
for(i=0;i<5;i++)?
{
cmdwrt (cmd[i]);
delay (1);
}
在代碼的這一部分,我們通過8051微控制器的串行接口接收EM-18 RFID閱讀器的輸出并存儲在變量中。計數用于跟蹤接收的字節數。一旦收到所有12字節的數據,接下來我們必須將其顯示在16 * 2 LCD顯示屏上。這個過程永遠重復,以便讀取不同的卡片。
while(1)
{
count=0;
cmdwrt(0xC2);
while(count<12)?
{
input[count]=rxdata();
count++;
}
for(i=0;i<12;i++)
{
datawrt(input[i]);
delay(1);
}
delay(100);
}
在代碼的這一部分中,我們將命令發送到 16*2 LCD 顯示器。該命令將復制到 8051 微控制器的端口 1。對于命令寫入,RS 設置為低電平。對于寫入操作,RW 設置為低電平。在使能 (E) 引腳上施加高到低脈沖以啟動命令寫入操作。
void cmdwrt (unsigned char x)
{
P1=x;
rs=0;
rw=0;
en=1;
delay(1);
en=0;
}
在代碼的這一部分,我們將數據發送到16 * 2 LCD顯示器。數據被復制到 8051 微控制器的端口 1。RS 設置為高,用于命令寫入。對于寫入操作,RW 設置為低電平。在使能(E)引腳上施加高到低脈沖以啟動數據寫入操作。
void datawrt (unsigned char y)
{
P1=y;
rs=1;
rw=0;
en=1;
delay(1);
en=0;
在代碼的這一部分,我們將數據發送到16 * 2 LCD顯示器。數據被復制到 8051 微控制器的端口 1。RS 設置為高,用于命令寫入。對于寫入操作,RW 設置為低電平。在使能(E)引腳上施加高到低脈沖以啟動數據寫入操作。
void datawrt (unsigned char y) { P1=y; rs=1; rw=0; en=1; delay(1); en=0; }
*this program is for interfacing RFID reader with 8051 microcontroller and to display card number on 16*2 lcd display*/
#include
sbit rs=P3^7; //Register Select(RS) pin of 16*2 lcd
sbit rw=P3^6; //Read/Write(RW) pin of 16*2 lcd
sbit en=P3^5; //Enable(E) pin of 16*2 lcd
char count = 0; // count = 0
char input[12]; // character array of size 12
char ch;
void delay(unsigned int) ; //function for creating delay
void cmdwrt(unsigned char); //function for sending commands to 16*2 lcd display
void datawrt(unsigned char); //function for sending data to 16*2 lcd display
char rxdata(void); //function for receiving a character through serial port of 8051
microcontroller
void main(void)
{
unsigned char cmd[]={0x38,0x01,0x06,0x0c,0x80}; //16*2 lcd initialization commands
unsigned char msg[]={"RFID card Number"};
unsigned char i;
TMOD=0x20; //timer 1 , mode 2 , auto reload
SCON=0x50; //8bit data , 1 stop bit , REN enabled
TH1=0xfd; //timer value for 9600 bits per second(bps)
TR1=1; //start the timer
for(i=0;i<5;i++) //send commands to 16*2 lcd display one command at a time
{
cmdwrt(cmd[i]); //function call to send commands to 16*2 lcd display
delay(1);
}
for(i=0;i<16;i++) //send data to 16*2 lcd display one character at a time
{
datawrt(msg[i]); //function call to display message on 16*2 lcd display
delay(1);
}
while(1)
{
count=0;
cmdwrt(0xC2);
while(count<12) //repeat for 12 times
{
input[count]=rxdata(); //receive serial data and store it.
count++;
}
for(i=0;i<12;i++) //send data to 16*2 lcd display one character at a time
{
datawrt(input[i]); //function call to display rfid card number on 16*2 lcd display
delay(1);
}
delay(100);
}
}
void cmdwrt (unsigned char x)
{
P1=x; //send the command to Port 1 on which 16*2 lcd is connected
rs=0; //make RS = 0 for command
rw=0; //make RW = 0 for write operation
en=1; //send a HIGH to LOW pulse on Enable(E) pin to start commandwrite operation
delay(1);
en=0;
}
void datawrt (unsigned char y)
{
P1=y; //send the data to Port 1 on which 16*2 lcd is connected
rs=1; //make RS = 1 for command
rw=0; //make RW = 0 for write operation
en=1; //send a HIGH to LOW pulse on Enable(E) pin to start datawrite operation
delay(1);
en=0;
}
char rxdata()
{
while(RI==0); //wait till RI becomes HIGH
RI=0; //make RI low
ch=SBUF; //copy received data
return ch; //return the received data to main function.
}
void delay(unsigned int z)
{
unsigned int p,q;
for(p=0;p
{
for(q=0;q<1375;q++); //repeat for 1375 times
}
}
-
微控制器
+關注
關注
48文章
7542瀏覽量
151316 -
RFID
+關注
關注
388文章
6142瀏覽量
237749 -
無線射頻
+關注
關注
4文章
205瀏覽量
27020
發布評論請先 登錄
相關推薦
評論