Мы знаем, что в офисах, торговых центрах и во многих других местах разрешено входить только человеку с авторизационной картой. Эти системы используют систему связи RFID. RFID используется в торговых центрах, чтобы остановить кражу, поскольку продукты маркируются RFID-чипом, и когда человек выходит из здания с RFID-чипом, автоматически включается тревога. RFID-метка представляет собой небольшую часть песка. Системы аутентификации RFID просты в разработке и дешевы. Некоторые школы и колледжи в настоящее время используют системы посещаемости на основе RFID.
В этом проекте мы собираемся разработать машину для голосования, которая считает только аутентифицированные голоса. Это делается с помощью тегов RFID (радиочастотная идентификация). Здесь мы собираемся написать программу для ATMEGA, позволяющую голосовать только авторизованным владельцам RFID-меток. (Также проверьте этот простой проект машины для голосования)
Необходимые компоненты
Аппаратное обеспечение: ATMEGA32, источник питания (5 В), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), конденсатор 100 мкФ (подключен к источнику питания), кнопка (пять штук), резистор 10 кОм (пять штук), конденсатор 100 нФ (пять штук), светодиод (две штуки), ЕМ-18 (модуль считывания RFID).
Софт: Atmel studio 6.1, прогисп или flash magic.
Принципиальная схема и объяснение
В схеме PORTA ATMEGA32 подключен к порту данных ЖК-дисплея. Здесь следует не забыть отключить связь JTAG в PORTC с ATMEGA, изменив байты предохранителя, если вы хотите использовать PORTC как обычный порт связи. В ЖК-дисплее 16x2 всего 16 контактов, если есть черный свет, если нет подсветки, будет 14 контактов. Можно включить или оставить контакты подсветки. Теперь в 14 контактах есть 8 контактов данных (7-14 или D0-D7), 2 контакта источника питания (1 и 2 или VSS и VDD или gnd & + 5v), 3- й контакт для контроля контрастности (VEE-контролирует толщину символов. показаны), 3 контрольных штифта (RS, RW и E)
В схеме вы можете заметить, что я взял только два управляющих контакта, это дает гибкость для лучшего понимания, бит контрастности и READ / WRITE не часто используются, поэтому их можно замкнуть на землю. Это переводит ЖК-дисплей в режим максимальной контрастности и чтения. Нам просто нужно управлять контактами ENABLE и RS, чтобы отправлять символы и данные соответственно.
Подключения, которые выполняются для ЖК-дисплея, приведены ниже:
PIN1 или VSS на землю
PIN2 или VDD или VCC на питание +5 В
PIN3 или VEE на землю (дает максимальный контраст для новичков)
PIN4 или RS (выбор регистра) к PD6 uC
PIN5 или RW (чтение / запись) на землю (перевод ЖК-дисплея в режим чтения упрощает взаимодействие для пользователя)
PIN6 или E (включить) к PD5 uC
PIN7 или D0 - PA0 uC
PIN8 или D1 - PA1 микроконтроллера
PIN9 или D2 - PA2 uC
PIN10 или D3 - PA3 uC
PIN11 или D4 - PA4 uC
PIN12 или D5 - PA5 uC
PIN13 или D6 - PA6 uC
PIN14 или D7 - PA7 uC
В схеме вы можете видеть, что мы использовали 8-битную связь (D0-D7). Однако это не обязательно, и мы можем использовать 4-битную связь (D4-D7), но с 4-битной коммуникацией программа становится немного сложной, поэтому я предпочел 8-битную связь.
Итак, просто наблюдая за таблицей выше, мы подключаем 10 контактов ЖК-дисплея к контроллеру, из которых 8 контактов являются контактами данных и 2 контакта для управления.
Прежде чем двигаться дальше, нам нужно понять, что такое последовательная связь. Здесь модуль RFID отправляет данные контроллеру последовательно. У него другой режим связи, но для удобства мы выбираем RS232. Вывод RS232 модуля подключен к выводу RXD ATMEGA.
Данные, отправляемые модулем RFID, выглядят так:
Теперь для интерфейса модуля RFID требуются следующие функции:
1. Должен быть включен вывод RXD (функция приема данных) контроллера.
2. Поскольку связь является последовательной, нам нужно знать, когда данные получены, чтобы мы могли остановить программу, пока не будет получен полный байт. Это делается путем разрешения прерывания приема данных.
3. RFID отправляет данные контроллеру в 8-битном режиме. Таким образом, контроллеру будут отправляться два символа одновременно. Это показано в блоке рисунка 3.
4. Из рисунка 3 видно, что в данных, отправленных модулем, нет битов четности, один стоповый бит.
Вышеупомянутые функции устанавливаются в регистрах контроллера; мы собираемся их кратко обсудить,
КРАСНЫЙ (RXEN): этот бит представляет функцию приема данных, этот бит должен быть установлен, чтобы данные от модуля были получены контроллером, он также включает вывод RXD контроллера.
КОРИЧНЕВЫЙ (RXCIE): этот бит должен быть установлен для получения прерывания после успешного приема данных. Включив этот бит, мы узнаем об этом сразу после получения 8-битных данных.
РОЗОВЫЙ (URSEL): этот бит должен быть установлен перед включением других битов в UCSRC, после установки других необходимых битов в UCSRC; URSEL должен быть отключен или обнулен.
ЖЕЛТЫЙ (UCSZ0, UCSZ1, UCSZ2): эти три бита используются для выбора количества битов данных, которые мы получаем или отправляем за один раз.
Поскольку данные, отправляемые модулем RFID, имеют 8-битный тип данных (РИСУНОК 3), мы должны установить UCSZ0, UCSZ1 в единицу и UCSZ2 в ноль.
ОРАНЖЕВЫЙ (UMSEL): этот бит устанавливается в зависимости от того, обменивается ли система асинхронно (обе используют разные часы) или синхронно (обе используют одинаковые часы),
Поскольку модуль и контроллер используют разные часы, этот бит должен быть установлен в ноль или оставлен в покое, поскольку по умолчанию все они установлены в ноль.
ЗЕЛЕНЫЙ (UPM1, UPM0): эти два бита настраиваются на основе битовой четности, которую мы используем при обмене данными.
Поскольку модуль RFID отправляет данные без контроля четности (РИСУНОК 3), мы установили оба UPM1 и UPM0 равными нулю, или их можно оставить в покое, поскольку все биты в любых регистрах по умолчанию установлены на ноль.
СИНИЙ (USBS): этот бит используется для выбора количества стоповых битов, которые мы используем во время связи.
Поскольку модуль RFID отправляет данные с одним стоповым битом (рисунок 3), нам просто нужно оставить бит USBS в покое.
Теперь, наконец, нам нужно установить скорость передачи, из рисунка 3 видно, что модуль RFID отправляет данные в контроллер со скоростью 9600 бит / с (бит в секунду).
Скорость передачи устанавливается в контроллере путем выбора соответствующего UBRRH,
Значение UBRRH выбирается путем перекрестной ссылки на скорость передачи данных и частоту кристалла процессора,
Таким образом, по перекрестной ссылке значение UBRR отображается как «6», и поэтому устанавливается скорость передачи.
Здесь присутствует пять кнопок, четыре для увеличения голосов кандидатов и пятая для обнуления голосов кандидатов. Конденсаторы, представленные здесь, предназначены для того, чтобы нейтрализовать эффект отскока кнопок. Если их удалить, контроллер может считать больше одного при каждом нажатии кнопки.
Резисторы, подключенные к контактам, предназначены для ограничения тока, когда кнопка нажата, чтобы опустить контакт к земле. Всякий раз, когда нажимается кнопка, соответствующий вывод контроллера опускается на землю, и, таким образом, контроллер распознает, что определенная кнопка нажата и соответствующее действие должно быть предпринято, он может увеличивать количество голосов кандидатов или сбрасывать голоса в зависимости от нажатой кнопки.
Когда кнопка, представляющая соответствующего человека, нажата, контроллер выбирает ее и увеличивает соответствующий номер человека в своей памяти, после того, как приращение показывает соответствующий счет людей на ЖК-дисплее 16x2.
Работу машины для голосования лучше всего объяснить пошагово с помощью кода C, приведенного ниже:
Код Пояснение
#include // заголовок для включения управления потоком данных на выводах
#define F_CPU 1000000 // сообщаем, что частота кристалла контроллера подключена
#включают
#define E 5 // присвоение имени «enable» 5- му выводу PORTD, так как он подключен к выводу включения ЖК-дисплея
#define RS 6 // присвоение имени «выбор регистра» 6- му выводу PORTD, так как он подключен к выводу RS LCD
void send_a_command (команда unsigned char);
void send_a_character (символ без знака);
void send_a_string (char * string_of_characters);
int main (пусто)
{
DDRA = 0xFF; // установка порта в качестве выходных контактов
DDRD = 0b11111110;
_delay_ms (50); // выдаем задержку 50 мс
DDRB = 0b11110000; // Принимаем несколько выводов portB в качестве входных.
UCSRB - = (1 <
// включение полного прерывания приема данных, включение вывода приема данных
UCSRC - = (1 <
// изменение других битов, сначала установив URSEL, установив 8-битную связь
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // установка скорости передачи
int16_t VOTEA = 0; // голос person1 сохраняет память
char A; // голос человека1, отображающий символ на ЖК-дисплее
int16_t VOTEB = 0;; // человек2 голоса хранит память
char B; // голос человека2, отображающий символ на ЖК-дисплее
int16_t VOTEC = 0;; // person3 голосов запоминание памяти
char C; // голос человека 3, отображающий символ на ЖК-дисплее
int16_t ГОЛОСОВАН = 0;; // person4 голоса хранят память
char D; / / person4 голоса, отображающие символ на ЖК-дисплее
// Следующее содержит идентификаторы тегов, они должны быть изменены для разных тегов, они должны быть обновлены для работы проекта
// После сброса программы в контроллер необходимо взять карты, которые должны быть авторизованы, и получить идентификаторы тегов, которые можно получить, поместив тег рядом с RFID-модулем, и этот идентификатор будет показан на экране. После получения идентификаторов программу необходимо обновить, заменив указанные ниже номера идентификаторов на новые.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Выше мы авторизуем только пять карт, их можно изменить на любое количество, Например, представьте, что программа по умолчанию выгружена в контроллер, получите карты, которые должны быть авторизованы, поместите одну за другой рядом с модулем, вы получите идентификатор для каждой как xxxxxxxx (907a4F87), Если у нас есть 7 тегов, то у нас будет 7 восьмибитных идентификаторов.
// теперь для семи карт это идет как // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // выделение памяти для отображения идентификатора, отправленного модулем int я = 0; int голос = 0; int k = 0; send_a_command (0x01); // Очистить экран 0x01 = 00000001 _delay_ms (50); send_a_command (0x38); // сообщаем ЖК-дисплею, что мы используем 8-битный режим команд / данных _delay_ms (50); send_a_command (0b00001111); // ЖК-ЭКРАН ВКЛЮЧЕН и бегун мигает char MEM; // выделяем память для хранения полного идентификатора тега send_a_string ("НОМЕР RFID"); // строка отправки send_a_command (0x80 + 0x40 + 0); // перемещение курсора на вторую строку пока (1) { в то время как (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR хранит полученные восьмибитные данные и принимает целое число. MEM = COUNTA; // первые два символа обновляются в памяти Итоа (COUNTA, SHOWA, 16); // команда для вывода номера переменной на ЖК-дисплей (номер переменной, в каком символе заменить, какая база является переменной (здесь десять, поскольку мы считаем число в базе10)) send_a_string (SHOWA); // сообщаем дисплею показывать символ (замененный номером переменной) второго человека после размещения бегунка на ЖК-дисплее в то время как (! (UCSRA & (1 <
{ } COUNTA = UDR; Итоа (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // третий и четвертый символы обновляются в памяти в то время как (! (UCSRA & (1 <
{ } COUNTA = UDR; Итоа (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // пятый и шестой символы обновляются в памяти в то время как (! (UCSRA & (1 <
{ } COUNTA = UDR; Итоа (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // седьмой и восьмой символы обновляются в памяти send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
для (я = 0; я <5; я ++) { если ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT)) {// проверка авторизации покупка сравнение двух символов одновременно с символами в памяти ПОРТБ - = (1 <
vote = 1; // если авторизовано установить VOTE } } if (vote == 0) // авторизация не удалась, если голосование не установлено { UCSRB - = (1 <
} while (vote == 1) // делаем этот цикл, пока не проголосуем, если авторизовано { send_a_command (0x80 + 0); // перейти в нулевую позицию в строке 1 send_a_string ("ГОЛОСОВАТЬ СЕЙЧАС"); // выводим строку if (bit_is_clear (PINB, 0)) // при нажатии первой кнопки { VOTEA ++; // увеличиваем память голосов от первого лица на единицу голосование = 0; // отпускаем цикл while после голосования } if (bit_is_clear (PINB, 1)) // при нажатии кнопки 2 { VOTEB ++; // увеличиваем память голосования 2- го человека на единицу голос = 0; } if (bit_is_clear (PINB, 2)) // при нажатии кнопки 3 { VOTEC ++; // увеличиваем память голосов 3- го человека на единицу голос = 0; } if (bit_is_clear (PINB, 3)) // при нажатии кнопки 4 { VOTED ++; // увеличиваем память голосования 4- го человека на единицу голос = 0; } if (vote == 0) // очищается после получения голоса { send_a_command (0x80 + 0); // перемещаемся в нулевую позицию строки1 send_a_string ("СПАСИБО ЗА ГОЛОСОВАНИЕ"); // выводим строку для (k = 0; k <10; k ++) { _delay_ms (220); } ПОРТБ & = ~ (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // отображение голосов всех четырех человек send_a_string ("A ="); send_a_command (0x80 + 2); итоа (VOTEA, A, 10); send_a_string (А); send_a_command (0x80 + 8); send_a_string ("B ="); send_a_command (0x80 + 10); итоа (VOTEB, B, 10); send_a_string (B); send_a_command (0x80 + 0x40 + 0); send_a_string ("C ="); send_a_command (0x80 + 0x40 + 2); итоа (VOTEC, C, 10); send_a_string (C); send_a_command (0x80 + 0x40 + 8); send_a_string ("D ="); send_a_command (0x80 + 0x40 + 10); itoa (ГОЛОСОВАНО, D, 10); send_a_string (D); send_a_command (0x80 + 0x40 + 16); для (k = 0; k <25; k ++) { _delay_ms (220); } UCSRB - = (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // перемещение в нулевую позицию send_a_string ("НОМЕР RFID"); // отправляем строку send_a_command (0x80 + 0x40 + 0); } } void send_a_command (команда без знака) { ПОРТА = команда; PORTD & = ~ (1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
ПОРТА = 0; } void send_a_character (символ без знака) { ПОРТА = персонаж; PORTD - = 1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
ПОРТА = 0; } void send_a_string (char * string_of_characters) { в то время как (* строка_символов> 0) { send_a_character (* строка_символов ++); } } |