Скачиваний:
6
Добавлен:
17.01.2022
Размер:
60.88 Кб
Скачать

Цель работы: сформировать навыки использования МК для решения задач авторизации.

Задачи: написать программу реализующую задачу авторизации согласно индивидуальному заданию. Запрограммировать МК, отладить работу с использованием средств эмуляции.

Теоретическая часть

Виртуальный Терминал VSM дает возможность Вам использовать клавиатуру и экран вашего персонального компьютера, чтобы посылать и принимать по последовательному асинхронному интерфейсу RS232 данные, поступающие к и от имитируемой микропроцессорной системы. Это особенно полезно при отладке, где Вы можете использовать его, чтобы отобразить отлаживаемые/прослеживаемые сообщения, сформированные программным обеспечением, которое Вы разрабатываете.

Виртуальный терминал имеет следующие характеристики:

• Полный дуплекс — последовательно поступающие данные отображаются, как символы ASCII, в то время как нажатия клавиш передаются так же, как последовательные данные ASCII.

• Простой двухпроводный интерфейс данных: RXD для полученных данных и TXD для передаваемых данных.

• Простой двухпроводный аппаратный интерфейс установления связи: RTS (ready-to-send) — готов к передаче, и CTS (clear-to-send) — очищен для передачи.

• Скорость от 300 до 57 600 бодов.

• 7 или 8 информационных разрядов.

• Четность, нечетность или нет.

• 0, 1 или 2 стоповых бита.

• Процедура установления связи программного обеспечения XON/XOFF в дополнение к аппаратной процедуре установления связи.

• Нормальная или отрицательная полярность сигналов и для RX/TX, и для RTS/CTS.

Использование виртуального терминала

Чтобы подключить терминал к Вашей моделируемой системе:

1. Выберите значок мультиметра на правой панели, выберите Виртуальный Терминал (VIRTUAL TERMINAL) и разместите его на схеме.

2. Подключите выводы RX и TX к передающей и приёмной линиям тестируемой системы. RX — вход, TX — выход.

3. Если Ваша целевая система использует аппаратную процедуру установления связи, подключите выводы RTS и CTS к соответствующим шинам управления потоком. RTS — выход, сигнализирующий, что виртуальный терминал готов принять данные, а CTS — вход, на котором должен быть высокий уровень (или он должен висеть в воздухе), чтобы виртуальный терминал начал передачу.

4. Отредактируйте настройки виртуального терминала: скорость в бодах, длину слова, четность, управление потоком данных и полярности сигналов.

5. Запустите моделирование обычным способом. Терминал отобразит входящие данные, как только получит их; чтобы посылать символы в систему, удостоверьтесь, что фокус сейчас на окне терминала, а затем напечатайте требуемый текст на клавиатуре персонального компьютера.

6. Как только начнется моделирование, дальнейшие функциональные возможности будут доступны в контекстном меню, которое появится при клике правой кнопкой мыши на окне терминала. Это меню дает возможность Вам приостановить дисплей, и копировать и вставлять текст в буфер обмена и из него.

Практическая часть

Синтезирована следующая схема:

Рисунок 1 – Заданная схема

Код программы, реализующий работу заданной схемы:

#include <avr/io.h>

#include <stddef.h>

#include <util/delay.h>

#define LCD_Goto(x,y) LCD_WriteCom(((((y)& 1)*0x40)+((x)& 7))|128)

void LCD_WriteData(unsigned char data)

{

PORTB |= (1<<2);

PORTC = data;

PORTB |= (1<<4);

_delay_ms(40);

PORTB &= (~(1<<4));

}

void LCD_WriteCom(unsigned char command)

{

PORTB &= (~(1<<2));

PORTC = command;

PORTB |= (1<<4);

_delay_ms(2);

PORTB &= (~(1<<4));

_delay_ms(40);

}

void LCD_WriteString(char *string)

{

while(*string != NULL)

{

LCD_WriteData(*string);

string++;

}

}

void LCD_Init(void )

{

DDRB = 0xff;

DDRC = 0xff;

DDRB |= (1<<2)|(1<<4);

_delay_ms(40);

LCD_WriteCom(0x38);

LCD_WriteCom(0x0f);

_delay_ms(2);

LCD_WriteCom(0x06);

}

void USART_Init( void )

{

UBRRH = 0;

UBRRL = 51;

UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);

UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);

}

unsigned char USART_GetChar(void)

{

while((UCSRA & (1<<RXC)) == 0);

return UDR;

}

void USART_SendChar(unsigned char sym)

{

while(!(UCSRA & (1<<UDRE)));

UDR = sym;

}

void USART_Send_String(char *string)

{

while(*string != NULL)

{

while(!(UCSRA & (1<<UDRE)));

UDR = *string;

string++;

}

}

void USART_Get_String(char *string)

{

int i = 0;

char tmp;

while (i < 10)

{

tmp = USART_GetChar();

USART_SendChar(tmp);

if (tmp != '\r' && tmp != '\b')

{

*string = tmp;

string++;

i++;

}

else if( tmp == '\b'){}

else

break;

}

}

void USART_Get_String_password(char *string)

{

int i = 0;

char tmp;

while (i < 10)

{

tmp = USART_GetChar();

if (tmp != '\r' && tmp != '\b')

{

USART_SendChar('*');

*string = tmp;

string++;

i++;

}

else if( tmp == '\b'){}

else

{

USART_SendChar(tmp);

break;

}

}

}

void error()

{

USART_Send_String("Error");

LCD_Goto(0, 0);

LCD_WriteString("Error");

_delay_ms(1000000);

LCD_WriteCom(0x1);

USART_SendChar('\r');

}

enter()

{

USART_Send_String("Success");

LCD_Goto(0,0);

LCD_WriteString("Success");

_delay_ms(1000000);

LCD_WriteCom(0x1);

USART_SendChar('\r');

}

int stringCmp(char *string1, char *string2)

{

for (int i=0; i<6; i++)

{

if (string1[i] != string2[i])

{

return 1;

}

}

return 0;

}

int main( void )

{

char login_def [10];

char password_def [10];

char login [10];

char password [10];

char Operation[1];

LCD_Init();

USART_Init();

DDRB = 0xff;

PORTB = 0xf0;

DDRA = 0x03;

while(1)

{

Label:

USART_Send_String("0 - registration\r1 - authorization\r");

USART_Get_String(Operation);

if (Operation[0] == '0')

{

USART_Send_String("Login: ");

USART_Get_String(login_def);

USART_SendChar('\r');

USART_Send_String("Password: ");

USART_Get_String(password_def);

USART_SendChar('\r');

USART_Send_String("Try again password: ");

USART_Get_String(password_def);

USART_SendChar('\r');

USART_Send_String("Registration Success\r");

USART_SendChar('\r');

}

else if (Operation[0]== '1')

{

USART_Send_String("Login: ");

USART_Get_String(login);

int error_login= stringCmp(login_def, login);

if (error_login==0)

{

USART_Send_String("Password: ");

USART_Get_String_password(password);

int error_password = stringCmp(password_def, password);

if (error_password == 0)

{

enter();

goto Label;

}

else

{

error();

goto Label;

}

}

else

{

error();

goto Label;

}

return 0;

}

}

}

На рисунке 2 показан результат работы первой схемы, введенные буквы инвертируют свой регистр на ЖК-дисплее, другие символы отображаются прочерком.

Рисунок 3 – Результат работы первой схемы

Вывод: в ходе выполнения данной лабораторной работы были сформированы практические навыки программирования и отладки работы микроконтроллеров. Изучение типовой периферии МК.