Материал: MPU_SU_Laboratornaya_rabota_5_Avramenok_Pshebelskaya

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

МиНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра систем автоматического управления

Лабораторная работа №5

по дисциплине

«Микропроцессорный устройства систем управления»

Вариант 9

Студенты гр. 8491

Авраменок Д.А.

Пшебельская Р.С.

Преподаватель

Голик С.Е.

Санкт-Петербург

2020

Цель работы: Программирование процедур вывода символьной информации на жидкокристаллический индикатор с использованием параллельного порта МК.

Задание: Цифровая реализация хорошо апробированных на практике непрерывных законов управления в микропроцессорных автоматических системах может быть осуществлена различными методами, среди которых одним из наиболее простых является метод численного интегрирования Эйлера. При его использовании предполагается, что дифференциальное уравнение, описывающее непрерывный закон управления, задано в виде

dy/dt = f(y,u),

где f – заданная функция; y – сигнал управления; а u – входное воздействие.

Дискретизация этого уравнения по методу Эйлера приводит к следующему рекуррентному соотношению

y(k + 1) = y(k) + T f[y(k),u(k)],

где u(k) и y(k) – значения входного воздействия и управляющего сигнала в дискретные моменты времени t = kT, где T – период прерывания (шаг расчета). В данной лабораторной работе необходимо реализовать это соотношение в виде программы для расчета управляющего сигнала y(k) на пяти шагах при начальном условии y(0) = 0 и известных значениях u(k) на каждом шаге.

Для индикации полученных значений y(k) необходимо на каждом шаге выводить их на индикатор, сопровождая каждый вывод трехсекундной задержкой.

Формат вывода: Результат: Y(k) = X, где X – выводимое число, а k – номер шага. Для вариантов с четными номерами вывод производится в первой строке ЖКИ, а с нечетными – во второй. Задание представлено в таблице 1.

Таблица 1

варианта

Функции

Т

Значения u(k)

0

1

2

3

4

9

f = 7y + 3u – 2

3

1

-6

-13

-20

-27

  1. Схема макета, относящегося к заданию:

Рис.1. Схема макета.

  1. Блок-схема алгоритма программы:

void LCD_cmd(unsigned char cmd):

Назначение: запись кодов в регистр команд ЖКИ.

Входные параметры: cmd - код команды.

//все разряды PORTC на выход

//выбор регистра команд RS=0

//разряды PORTD на выход

//записать команду в порт PORTC

//сформировать на выводе E строб 1-0

//передачи команды

void LCD_data(unsigned char data)

//все разряды PORTC на выход

//разряды PORTD на выход

//выбор регистра команд RS=1

//записать команду в порт PORTC

//сформировать на выводе E строб 1-0

//передачи команды

void LCD_init(void)

Назначение: инициализация ЖКИ

//все разряды PORTC на выход

// инкремент курсора, без сдвига экрана

//вывод трех команд 0x30

//разряды PORTD на выход

//включить ЖКИ и курсор, без мерцания

// очистить экран, курсор в начало

unsigned char Digit(unsigned int d, unsigned char m)

Функция, которая проверяет количество разрядов числе.

//выделяем очередной разряд

//выделен заданный разряд - уходим

//уменьшаем число в 10 раз

void showMe(unsigned char *what)

Функция, которая вывода на дисплей текста с помощью указателя.

Б

1

//перемещение указателя на 64 ячейку дисплея

лок-схема основной части кода:

1

// запись порядкового номера числа в регистр данных дисплея

//проверка на количество символов в числе

// запись i-того числа в регистр данных дисплея

//очистка экрана

  1. Текст программы на языке С:

#include <mega128a.h>

#include <delay.h>

#define RS 7 // выбор регистра

#define E 6 // строб передачи

void LCD_cmd(unsigned char cmd)

{

//[]--------------------------------------------------[]

//| Назначение: запись кодов в регистр команд ЖКИ |

//| Входные параметры: cmd - код команды |

//[]--------------------------------------------------[]

DDRC = 0xFF; // все разряды PORTC на выход

DDRD |= ((1<<E)|(1<<RS)); // разряды PORTD на выход

PORTD &= ~(1<<RS); // выбор регистра команд RS=0

PORTC = cmd; // записать команду в порт PORTC

PORTD |= (1<<E); // \ сформировать на

delay_us(5); // | выводе E строб 1-0

PORTD &= ~(1<<E); // / передачи команды

delay_ms(100); // задержка для завершения записи

}

void LCD_data(unsigned char data)

{

DDRC = 0xFF; // все разряды PORTC на выход

DDRD |= ((1<<E)|(1<<RS)); // разряды PORTD на выход

PORTD |= (1<<RS); // выбор регистра data RS=1

PORTC = data; // записать команду в порт PORTC

PORTD |= (1<<E); // \ сформировать на

delay_us(5); // | выводе E строб 1-0

PORTD &= ~(1<<E); // / передачи команды

delay_ms(1); // задержка для завершения записи

}

void LCD_init(void)

{

//[]--------------------------------------------------[]

//| Назначение: инициализация ЖКИ |

//[]--------------------------------------------------[]

DDRC = 0xFF; // все разряды PORTC на выход

DDRD |= ((1<<E)|(1<<RS)); // разряды PORTD на выход

delay_ms (100); // задержка для установления

// напряжения питания

LCD_cmd(0x30); // \ вывод

LCD_cmd(0x30); // | трех

LCD_cmd(0x30); // / команд 0x30

LCD_cmd(0x38); // 8 разр.шина, 2 строки, 5 ? 7 точек

LCD_cmd(0x0E); // включить ЖКИ и курсор, без мерцания

LCD_cmd(0x06); // инкремент курсора, без сдвига экрана

LCD_cmd(0x01); // очистить экран, курсор в начало

}

unsigned char Digit(unsigned int d, unsigned char m)

{

unsigned char i=5,a; //функция, которая проверяет количество разрядов в числе

while(i)

{

a = d%10; //выделяем очередной разряд

if(i-- == m) break; //выделен заданный разряд - уходим

d /= 10; //уменьшаем число в 10 раз

}

return (a);

}

void showMe(unsigned char *what) //функция, которая вывода на дисплей текста с помощью указателя

{

while(*what)

{

LCD_data(*what++);

}

}

void main()

{

unsigned char word[] = {"Y(0) = 0"};

signed char T=3, result[]={0,0,0,0,0,0}, u[]={1,-6,-13,-20,-27},i,j;

LCD_init();

while(1)

{

LCD_cmd((1 << 7) | 64); //перемещение указателя на 64 ячейку дисплея

showMe(word);

delay_ms(1000);

for(i=1;i<=5;i++) //цикл подсчета

{

result[i]=result[i-1]+T*((7*result[i-1])+(3*u[i-1])-2);

LCD_cmd((1 << 7) | 66); //перемещение указателя на 66 ячейку дисплея

LCD_data(i+'0'); // запись порядкового номера числа в регистр данных дисплея

LCD_cmd((1 << 7) | 71); //перемещение указателя на 71 ячейку дисплея

if(result[i] >= 10) //проверка на количество символов в числе

{

for(j=4;j<=5;j++)

{

LCD_data(Digit(result[i], j) + '0'); // запись i-того числа в регистр данных дисплея

}

}

else

{

LCD_data(result[i] + '0'); // запись i-того числа в регистр данных дисплея

}

delay_ms(1000);

}

LCD_cmd(1); //очистка экрана

}

}

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