QC

RFID Interfacing with 8051 Microcontroller

Trong phần này của mã, chúng tôi đang gửi dữ liệu đến màn hình LCD 16 * 2. Dữ liệu được sao chép vào cổng 1 của vi điều khiển 8051. RS được tạo ra ở mức cao để ghi lệnh. RW được đặt ở mức thấp cho hoạt động ghi. Xung từ cao xuống thấp được áp dụng trên chân bật (E) để bắt đầu hoạt động ghi dữ liệu. RFID Interfacing with 8051 Microcontroller

  Nhận dạng tần số vô tuyến (RFID) sử dụng tần số vô tuyến để đọc thông tin được lưu trữ trong thẻ hoặc thẻ RFID. Trong dự án này, chúng ta sẽ đi đến đầu đọc RFID Giao diện EM-18 với vi điều khiển 8051 và hiển thị số thẻ RFID trên màn hình LCD 16 * 2. Nhận dạng RF không dây này được sử dụng trong nhiều hệ thống như Hệ thống chấm công dựa trên RFID, hệ thống an ninh, máy bỏ phiếu, v.v. Dự án này cũng sẽ đóng vai trò là giao diện thích hợp của LCD 16 * 2 với vi điều khiển 8051.

Components Required:

  • 8051 microcontroller
  • EM-18 RFID reader
  • 16*2 LCD display
  • RFID cards/tags
  • Potentiometer
  • Jumper wires

Circuit Diagram:


8051 Microcontroller:

Vi điều khiển 8051 là vi điều khiển 8 bit có 128 byte RAM trên chip, 4K byte ROM trên chip, hai bộ định thời, một cổng nối tiếp và bốn cổng 8 bit. Vi điều khiển 8052 là một phần mở rộng của vi điều khiển. Bảng dưới đây cho thấy sự so sánh của các thành viên gia đình 8051.
              Feature80518052
ROM (in bytes)4K8K
RAM (bytes)128256
Timers23
I/O pins3232
Serial port11
Interrupt sources68


16x2 LCD:

Màn hình LCD 16 * 2 là màn hình được sử dụng rộng rãi cho các ứng dụng nhúng. Dưới đây là giải thích ngắn gọn về các chân và hoạt động của màn hình LCD 16 * 2. Có hai thanh ghi rất quan trọng bên trong màn hình LCD. Chúng là thanh ghi dữ liệu và thanh ghi lệnh. Thanh ghi lệnh được sử dụng để gửi các lệnh như hiển thị rõ ràng, con trỏ ở nhà, v.v., thanh ghi dữ liệu được sử dụng để gửi dữ liệu sẽ được hiển thị trên màn hình LCD 16 * 2. Bảng dưới đây cho thấy mô tả chân của màn hình LCD 16 * 2.


PinSymbolI/ODescription
1Vss-Ground
2Vdd-+5V power supply
3Vee-Power supply to control contrast
4RSIRS=0 for command register , RS=1 for data register
5RWIR/W=0 for write , R/W=1 for read
6EI/OEnable
7D0I/O8-bit data bus(LSB)
8D1I/O8-bit data bus
9D2I/O8-bit data bus
10D3I/O8-bit data bus
11D4I/O8-bit data bus
12D5I/O8-bit data bus
13D6I/O8-bit data bus
14D7I/O8-bit data bus(MSB)
15A-+5V for backlight
16K-Ground


Bảng dưới đây hiển thị các mã lệnh LCD thường được sử dụng.


Code(hex)Description
01Clear display screen
06Increment cursor (right shift)
0ADisplay off , cursor on
0CDisplay on , cursor off
0FDisplay on , cursor blinking
80Force the cursor to beginning of 1st line
C0Force the cursor to beginningof 2nd line
382 lines and 5*7 matrix


EM-18 RFID Reader:

Đầu đọc RFID EM-18 hoạt động ở 125 KHz và nó đi kèm với một ăng-ten trên chip và nó có thể được cấp nguồn với nguồn điện 5V. Nó cung cấp đầu ra nối tiếp cùng với đầu ra cân và đầu ra. Phạm vi là khoảng 8-12cm. thông số giao tiếp nối tiếp là 9600bps, 8 bit dữ liệu, 1 bit dừng. Các ứng dụng của nó bao gồm Xác thực, thu phí đường bộ điện tử, bán vé điện tử cho phương tiện giao thông công cộng, hệ thống tham dự, v.v. Kiểm tra tất cả các Dự án RFID tại đây.

Đầu ra do đầu đọc RFID EM-18 cung cấp ở định dạng ASCII 12 chữ số. Trong số 12 chữ số, 10 chữ số đầu tiên là số thẻ và hai chữ số cuối cùng là kết quả XOR của số thẻ. Hai chữ số cuối cùng được sử dụng để kiểm tra lỗi.



Ví dụ, số thẻ là 0200107D0D62 đọc từ đầu đọc thì mã số thẻ trên thẻ sẽ như bên dưới.


02 - lời mở đầu


00107D0D = 1080589 ở dạng thập phân.


62 là giá trị XOR cho (02 XOR 00 XOR 10 XOR 7D XOR 0D).


Do đó, số trên thẻ là 0001080589.

Working and Code explanation:



Chương trình C hoàn chỉnh và Video trình diễn cho dự án này được đưa ra ở phần cuối của dự án này. Mã được chia thành các đoạn nhỏ có ý nghĩa và được giải thích bên dưới.

Đối với giao tiếp LCD 16 * 2 với vi điều khiển 8051, chúng ta phải xác định các chân mà trên đó LCD 16 * 2 được kết nối với vi điều khiển 8051. Chân RS của LCD 16 * 2 được kết nối với P3.7, chân RW của LCD 16 * 2 được kết nối với P3.6 và chân E của LCD 16 * 2 được kết nối với P3.5. Các chân dữ liệu được kết nối với cổng 1 của vi điều khiển 8051.

sbit rs=P3^7;               
sbit rw=P3^6;              
sbit en=P3^5;       
Tiếp theo, chúng ta phải xác định một số hàm được sử dụng trong chương trình. Hàm Delay được sử dụng để tạo thời gian trễ được chỉ định. Chức năng cmdwrt được sử dụng để gửi lệnh đến màn hình LCD 16 * 2. Hàm datawrt được sử dụng để gửi dữ liệu đến màn hình LCD 16 * 2. Hàm Rxdata được sử dụng để nhận dữ liệu từ cổng nối tiếp.

void delay(unsigned int)  ;              
void cmdwrt(unsigned char);              
void datawrt(unsigned char);           
char rxdata(void);                
Trong phần mã này, chúng ta sẽ cấu hình vi điều khiển 8051 cho giao tiếp nối tiếp.

Thanh ghi TMOD được tải với 0x20 cho bộ định thời 1, chế độ 2 (tự động tải lại). Thanh ghi SCON được tải với 0x50 cho 8 bit dữ liệu, 1 bit dừng và kích hoạt nhận. Thanh ghi TH1 được tải với 0xfd cho tốc độ truyền 9600 bit mỗi giây. TR1 = 1 được sử dụng để khởi động bộ định thời.

TMOD= 0x20;
SCON=0x50; 
TH1=0xfd; 
TR1=1;
Trong phần này của mã, chúng tôi đang gửi các lệnh tới màn hình LCD 16 * 2. Các lệnh như hiển thị rõ ràng, con trỏ tăng dần, buộc con trỏ đến đầu dòng đầu tiên được gửi lần lượt đến màn hình LCD 16 * 2 sau một số thời gian trễ được chỉ định.

for(i=0;i<5;i++)              
 {
         cmdwrt (cmd[i]);
         delay (1);
   }


Trong phần mã này, chúng ta đang nhận đầu ra của đầu đọc RFID EM-18 thông qua giao diện nối tiếp của vi điều khiển 8051 và được lưu trữ trong một biến. Đếm được sử dụng để theo dõi số byte nhận được. Khi tất cả 12byte dữ liệu được nhận, tiếp theo chúng ta phải hiển thị nó trên màn hình LCD 16 * 2. Quá trình này được lặp lại mãi mãi để đọc các thẻ khác nhau.

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);
}
Trong phần này của mã, chúng tôi đang gửi các lệnh đến màn hình LCD 16 * 2. Lệnh được sao chép vào cổng 1 của vi điều khiển 8051. RS được đặt ở mức thấp để ghi lệnh. RW được đặt ở mức thấp cho hoạt động ghi. Xung từ cao xuống thấp được áp dụng trên chân bật (E) để bắt đầu thao tác ghi lệnh.
void cmdwrt (unsigned char x)
{
   P1=x; 
   rs=0; 
   rw=0; 
   en=1; 
   delay(1);
   en=0;
}

Trong phần này của mã, chúng tôi đang gửi dữ liệu đến màn hình LCD 16 * 2. Dữ liệu được sao chép vào cổng 1 của vi điều khiển 8051. RS được tạo ra ở mức cao để ghi lệnh. RW được đặt ở mức thấp cho hoạt động ghi. Xung từ cao xuống thấp được áp dụng trên chân bật (E) để bắt đầu hoạt động ghi dữ liệu.
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<reg51.h>
 
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<z;p++)    //repeat for 'z' times
  {
    for(q=0;q<1375;q++);   //repeat for 1375 times
  }
}
















Nap Code vào PY32F003 dùng Stlink

 Nap Code vào PY32F003 dùng Stlink Bước 1: Cài đặt  KeilC v5.39 theo link sau ( chú ý 5.39 keil c mới nạp ok). https://edge07.111.ir.cdn.ir/...