Chúng tôi biết ở các văn phòng, trung tâm mua sắm và nhiều nơi khác, chỉ người có thẻ ủy quyền mới được phép vào phòng. Các hệ thống này sử dụng hệ thống liên lạc RFID. RFID được sử dụng trong các trung tâm mua sắm để ngăn chặn hành vi trộm cắp vì các sản phẩm được gắn thẻ chip RFID và khi một người rời khỏi tòa nhà với chip RFID, báo động sẽ tự động được nâng lên. Thẻ RFID được thiết kế nhỏ như một phần cát. Hệ thống xác thực RFID dễ thiết kế và chi phí rẻ. Một số trường học và cao đẳng ngày nay sử dụng hệ thống điểm danh dựa trên RFID.
Trong dự án này, chúng tôi sẽ thiết kế một máy bỏ phiếu chỉ đếm các phiếu bầu đã được xác thực. Điều này được thực hiện bằng cách sử dụng thẻ RFID (Nhận dạng tần số vô tuyến). Ở đây chúng tôi sẽ viết một chương trình cho ATMEGA để chỉ cho phép những người có thẻ RFID được ủy quyền bỏ phiếu. (Cũng kiểm tra dự án máy bỏ phiếu đơn giản này)
Thành phần bắt buộc
Phần cứng: ATMEGA32, nguồn điện (5v), BỘ LẬP TRÌNH AVR-ISP, JHD_162ALCD (16x2LCD), tụ điện 100uF (kết nối qua nguồn điện), nút (năm miếng), điện trở 10KΩ (năm miếng), tụ điện 100nF (năm miếng), LED (hai mảnh), EM-18 (mô-đun đọc RFID).
Phần mềm: Atmel studio 6.1, progisp hoặc flash magic.
Sơ đồ mạch và giải thích
Trong mạch PORTA của ATMEGA32 được kết nối với cổng dữ liệu của LCD. Ở đây ta nên nhớ vô hiệu hóa giao tiếp JTAG trong PORTC thành ATMEGA bằng cách thay đổi các byte cầu chì, nếu muốn sử dụng PORTC như một cổng giao tiếp thông thường. Trong LCD 16x2 tổng thể có 16 chân nếu có đèn đen, nếu không có đèn nền sẽ có 14 chân. Người ta có thể cấp nguồn hoặc để lại các chân đèn sau. Bây giờ trong 14 chân có 8 dữ liệu ghim (7-14 hoặc D0-D7), 2 chân cung cấp điện (1 & 2 hoặc VSS & VDD hoặc GND & + 5V), 3 thứ pin cho điều khiển độ tương phản (VEE-điều khiển như thế nào dày các nhân vật nên được hiển thị), 3 chân điều khiển (RS & RW & E)
Trong mạch, bạn có thể quan sát thấy tôi chỉ lấy hai chân điều khiển, điều này cho sự linh hoạt của sự hiểu biết tốt hơn, bit tương phản và READ / WRITE không được sử dụng thường xuyên nên chúng có thể được nối đất. Điều này đặt LCD ở chế độ đọc và độ tương phản cao nhất. Chúng ta chỉ cần điều khiển các chân ENABLE và RS để gửi các ký tự và dữ liệu cho phù hợp.
Các kết nối được thực hiện cho LCD được đưa ra dưới đây:
PIN1 hoặc VSS để nối đất
PIN2 hoặc VDD hoặc VCC đến nguồn + 5v
PIN3 hoặc VEE nối đất (mang lại độ tương phản tối đa tốt nhất cho người mới bắt đầu)
PIN4 hoặc RS (Lựa chọn đăng ký) đến PD6 của uC
PIN5 hoặc RW (Đọc / Ghi) nối đất (đặt màn hình LCD ở chế độ đọc giúp giảm bớt giao tiếp cho người dùng)
PIN6 hoặc E (Bật) đến PD5 của uC
PIN7 hoặc D0 đến PA0 của uC
PIN8 hoặc D1 đến PA1 của uC
PIN9 hoặc D2 đến PA2 của uC
PIN10 hoặc D3 đến PA3 của uC
PIN11 hoặc D4 đến PA4 của uC
PIN12 hoặc D5 đến PA5 của uC
PIN13 hoặc D6 đến PA6 của uC
PIN14 hoặc D7 đến PA7 của uC
Trong mạch, bạn có thể thấy chúng tôi đã sử dụng giao tiếp 8bit (D0-D7). Tuy nhiên đây không phải là điều bắt buộc và chúng ta có thể sử dụng giao tiếp 4bit (D4-D7) nhưng với giao tiếp 4 bit chương trình trở nên phức tạp một chút, vì vậy tôi thích giao tiếp 8 bit hơn.
Vì vậy, từ quan sát bảng trên, chúng ta đang kết nối 10 chân của LCD với bộ điều khiển trong đó 8 chân là chân dữ liệu và 2 chân để điều khiển.
Trước khi tiếp tục, chúng ta cần hiểu về giao tiếp nối tiếp. Mô-đun RFID ở đây gửi dữ liệu nối tiếp đến bộ điều khiển. Nó có phương thức giao tiếp khác nhưng để giao tiếp dễ dàng, chúng tôi chọn RS232. Chân RS232 của mô-đun được kết nối với chân RXD của ATMEGA.
Dữ liệu do mô-đun RFID gửi đi như sau:
Bây giờ đối với giao diện mô-đun RFID, các tính năng sau được yêu cầu:
1. Chân RXD (tính năng nhận dữ liệu) của bộ điều khiển phải được bật.
2. Vì giao tiếp là nối tiếp, chúng ta cần biết bất cứ khi nào nhận được dữ liệu tạm biệt, để chúng ta có thể dừng chương trình cho đến khi nhận được byte hoàn chỉnh. Điều này được thực hiện bằng cách cho phép ngắt hoàn toàn nhận dữ liệu.
3. RFID gửi dữ liệu đến bộ điều khiển ở chế độ 8bit. Vì vậy, hai ký tự sẽ được gửi đến bộ điều khiển tại một thời điểm. Điều này được thể hiện trong khối của hình 3
4. Từ hình 3, không có bit chẵn lẻ, một bit dừng trong dữ liệu được gửi bởi mô-đun.
Các tính năng trên được thiết lập trong thanh ghi bộ điều khiển; chúng ta sẽ thảo luận ngắn gọn về chúng,
ĐỎ (RXEN): Bit này đại diện cho tính năng nhận dữ liệu, bit này phải được thiết lập để dữ liệu từ mô-đun được bộ điều khiển nhận, nó cũng kích hoạt chân RXD của bộ điều khiển.
BROWN (RXCIE): Bit này phải được đặt để nhận ngắt sau khi nhận dữ liệu thành công. Bằng cách kích hoạt bit này, chúng ta sẽ biết, ngay sau khi nhận dữ liệu 8 bit.
PINK (URSEL): Bit này phải được đặt trước khi bật các bit khác trong UCSRC, sau khi đặt các bit cần thiết khác trong UCSRC; URSEL phải bị vô hiệu hóa hoặc đưa về 0.
VÀNG (UCSZ0, UCSZ1, UCSZ2): Ba bit này được sử dụng để chọn số lượng bit dữ liệu mà chúng tôi đang nhận hoặc gửi trong một lần.
Vì dữ liệu được gửi bởi mô-đun RFID là kiểu dữ liệu 8bit (FIGURE3), chúng tôi phải đặt UCSZ0, UCSZ1 thành một và UCSZ2 thành không.
ORANGE (UMSEL): Bit này được đặt dựa trên việc hệ thống đang giao tiếp không đồng bộ (cả hai sử dụng đồng hồ khác nhau) hay đồng bộ (cả hai sử dụng cùng một đồng hồ),
Vì mô-đun và bộ điều khiển sử dụng xung nhịp khác nhau, nên bit này phải được đặt thành 0 hoặc để riêng vì chúng đều được đặt thành 0 theo mặc định.
GREEN (UPM1, UPM0): Hai bit này được điều chỉnh dựa trên tính chẵn lẻ của bit mà chúng ta đang sử dụng trong giao tiếp.
Vì mô-đun RFID gửi dữ liệu không có tính chẵn lẻ (HÌNH3), chúng tôi đã đặt cả UPM1, UPM0 thành 0 hoặc chúng có thể được để riêng vì tất cả các bit trong bất kỳ thanh ghi nào được đặt thành 0 theo mặc định.
BLUE (USBS): Bit này được sử dụng để chọn số lượng bit dừng mà chúng tôi đang sử dụng trong quá trình giao tiếp.
Vì mô-đun RFID gửi dữ liệu với một bit dừng (hình 3), chúng ta chỉ cần để lại bit USBS.
Bây giờ cuối cùng chúng ta cần đặt tốc độ truyền, từ hình 3 rõ ràng là mô-đun RFID gửi dữ liệu đến bộ điều khiển với tốc độ truyền là 9600bps (bit trên giây).
Tốc độ truyền được đặt trong bộ điều khiển bằng cách chọn UBRRH thích hợp,
Giá trị UBRRH được chọn bằng tốc độ truyền tham chiếu chéo và tần số tinh thể CPU,
Vì vậy, theo tham chiếu chéo, giá trị UBRR được xem là '6', và do đó tốc độ truyền được đặt.
Có năm nút hiện diện ở đây, bốn nút để tăng số phiếu bầu của các ứng cử viên và nút thứ năm là để đặt lại số phiếu bầu của ứng viên về 0. Các tụ điện hiện diện ở đây là để vô hiệu hóa hiệu ứng nảy của các nút. Nếu chúng bị loại bỏ, bộ điều khiển có thể đếm nhiều hơn một mỗi lần nhấn nút.
Các điện trở được kết nối cho các chân là để hạn chế dòng điện, khi nhấn nút để kéo chân cắm xuống đất. Bất cứ khi nào một nút được nhấn, chốt tương ứng của bộ điều khiển sẽ được kéo xuống đất và do đó bộ điều khiển nhận ra rằng một số nút nhất định được nhấn và hành động tương ứng sẽ được thực hiện, nó có thể tăng số phiếu ứng cử viên hoặc đặt lại phiếu bầu tùy thuộc vào nút được nhấn.
Khi nhấn nút đại diện cho một người tương ứng, bộ điều khiển sẽ chọn nó và tăng số người tương ứng trong bộ nhớ của nó sau khi tăng, nó sẽ hiển thị điểm số của những người tương ứng trên màn hình LCD 16x2.
Hoạt động của máy bỏ phiếu được giải thích tốt nhất theo từng bước của mã C được đưa ra dưới đây:
Giải thích mã
#include // header để bật kiểm soát luồng dữ liệu qua các chân
#define F_CPU 1000000 // cho biết tần số tinh thể bộ điều khiển được đính kèm
#include
#define E 5 // đặt tên "enable" cho chân thứ 5 của PORTD, vì nó được kết nối với chân kích hoạt LCD
#define RS 6 // đặt tên "thanh ghi" cho chân thứ 6 của PORTD, vì được kết nối với chân LCD RS
void send_a_command (unsigned char command);
void send_a_character (ký tự char không dấu);
void send_a_string (char * string_of_characters);
int main (void)
{
DDRA = 0xFF; // đặt porta làm chân đầu ra
DDRD = 0b11111110;
_delay_ms (50); // có độ trễ 50ms
DDRB = 0b11110000; // Lấy một số chân portB làm đầu vào.
UCSRB - = (1 <
// cho phép nhận dữ liệu ngắt hoàn toàn, cho phép ghim nhận dữ liệu
UCSRC - = (1 <
// thay đổi các bit khác bằng cách đặt URSEL đầu tiên, cài đặt cho giao tiếp 8 bit
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // thiết lập tốc độ truyền
int16_t VOTEA = 0; // person1 phiếu lưu trữ bộ nhớ
char A; // phiếu bầu person1 hiển thị ký tự trên màn hình LCD
int16_t VOTEB = 0;; // phiếu person2 lưu trữ bộ nhớ
char B; // phiếu bầu person2 hiển thị ký tự trên màn hình LCD
int16_t VOTEC = 0;; // phiếu person3 lưu trữ bộ nhớ
char C; // phiếu người 3 hiển thị ký tự trên màn hình LCD
int16_t VOTED = 0;; // phiếu người 4 lưu trữ bộ nhớ
char D; / / person4 phiếu hiển thị ký tự trên màn hình LCD
// Phần sau chứa ID của các thẻ, các thẻ này phải được thay đổi cho các thẻ khác nhau, Các thẻ này phải được cập nhật để dự án hoạt động
// Sau khi kết xuất chương trình trong bộ điều khiển, người ta phải lấy các thẻ phải được cấp phép và lấy ID thẻ, chúng có được bằng cách đặt thẻ gần mô-đun RFID và ID sẽ được hiển thị trên màn hình. Sau khi nhận được các ID, chương trình phải được cập nhật bằng cách thay thế các số ID bên dưới bằng các số ID mới.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Bây giờ ở trên, chúng tôi chỉ cho phép năm thẻ, chúng có thể được thay đổi thành bất kỳ số nào, Ví dụ: hãy xem xét chương trình mặc định được kết xuất trong bộ điều khiển, lấy các thẻ phải được ủy quyền lần lượt ở gần mô-đun, bạn sẽ nhận được ID cho mỗi thẻ là xxxxxxxx (907a4F87), Nếu chúng ta có 7 thẻ, thì chúng ta sẽ có 7 ID tám bit.
// bây giờ đối với bảy thẻ nó giống như // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // phân bổ bộ nhớ để hiển thị ID gửi theo mô-đun int i = 0; int phiếu bầu = 0; int k = 0; send_a_command (0x01); // Xóa màn hình 0x01 = 00000001 _delay_ms (50); send_a_command (0x38); // nói với LCD rằng chúng tôi đang sử dụng chế độ dữ liệu / lệnh 8bit _delay_ms (50); send_a_command (0b00001111); // MÀN HÌNH LCD BẬT và bộ ghép nối nhấp nháy char MEM; // phân bổ bộ nhớ để lưu ID đầy đủ của thẻ send_a_string ("RFID NUMBER"); // chuỗi gửi send_a_command (0x80 + 0x40 + 0); // chuyển courser sang dòng thứ hai trong khi (1) { trong khi (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR lưu trữ dữ liệu tám bit nhận được và được đưa vào một số nguyên. MEM = COUNTA; // hai ký tự đầu tiên được cập nhật vào bộ nhớ itoa (COUNTA, SHOWA, 16); // lệnh để đặt số biến trong màn hình LCD (số biến, ký tự nào cần thay thế, cơ số nào là biến (ở đây là mười vì chúng ta đang đếm số trong cơ số 10)) send_a_string (SHOWA); // thông báo cho màn hình hiển thị ký tự (được thay thế bằng số biến) của người thứ hai sau khi định vị bộ ghép nối trên màn hình LCD trong khi (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // ký tự thứ ba và thứ tư được cập nhật vào bộ nhớ trong khi (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // ký tự thứ năm và thứ sáu được cập nhật vào bộ nhớ trong khi (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // ký tự thứ bảy và tám được cập nhật vào bộ nhớ send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
cho (i = 0; i <5; i ++) { if ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT)) {// kiểm tra ủy quyền mua so sánh hai ký tự cùng một lúc với các ký tự trong bộ nhớ PORTB - = (1 <
vote = 1; // nếu được ủy quyền đặt VOTE } } if (vote == 0) // ủy quyền không thành công nếu phiếu bầu không được đặt { UCSRB - = (1 <
} while (vote == 1) // thực hiện vòng lặp này cho đến khi được bình chọn, nếu được phép { send_a_command (0x80 + 0); // chuyển đến vị trí 0 trên line1 send_a_string ("VOTE NGAY"); // hiển thị chuỗi if (bit_is_clear (PINB, 0)) // khi nút một được nhấn { VOTEA ++; // tăng bộ nhớ bầu chọn của người đầu tiên lên một vote = 0; // bỏ qua vòng lặp while sau khi bỏ phiếu } if (bit_is_clear (PINB, 1)) // khi nút 2 được nhấn { VOTEB ++; // tăng bộ nhớ bỏ phiếu của người thứ 2 lên từng người một phiếu bầu = 0; } if (bit_is_clear (PINB, 2)) // khi nút 3 được nhấn { VOTEC ++; // tăng bộ nhớ bỏ phiếu của người thứ 3 lên từng người một phiếu bầu = 0; } if (bit_is_clear (PINB, 3)) // khi nút 4 được nhấn { VOTED ++; // tăng bộ nhớ bỏ phiếu của người thứ 4 lên từng người một phiếu bầu = 0; } if (vote == 0) // bị xóa sau khi nhận được phiếu bầu { send_a_command (0x80 + 0); // di chuyển đến vị trí 0 của dòng 1 send_a_string ("THANK U FOR VOTE"); // chuỗi hiển thị for (k = 0; k <10; k ++) { _delay_ms (220); } PORTB & = ~ (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // hiển thị phiếu bầu của cả bốn người send_a_string ("A ="); send_a_command (0x80 + 2); itoa (VOTEA, A, 10); send_a_string (A); send_a_command (0x80 + 8); send_a_string ("B ="); send_a_command (0x80 + 10); itoa (VOTEB, B, 10); send_a_string (B); send_a_command (0x80 + 0x40 + 0); send_a_string ("C ="); send_a_command (0x80 + 0x40 + 2); itoa (VOTEC, C, 10); send_a_string (C); send_a_command (0x80 + 0x40 + 8); send_a_string ("D ="); send_a_command (0x80 + 0x40 + 10); itoa (ĐÃ BỎ QUA, D, 10); send_a_string (D); send_a_command (0x80 + 0x40 + 16); cho (k = 0; k <25; k ++) { _delay_ms (220); } UCSRB - = (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // di chuyển đến vị trí 0 send_a_string ("RFID NUMBER"); // gửi một chuỗi send_a_command (0x80 + 0x40 + 0); } } void send_a_command (unsigned char command) { PORTA = lệnh; PORTD & = ~ (1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_character (ký tự char không dấu) { PORTA = ký tự; PORTD - = 1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_string (char * string_of_characters) { while (* string_of_characters> 0) { send_a_character (* string_of_characters ++); } } |