Файл: Отчет о выполнении лабораторной работы 4 студент Гр. 19ИВ1бп Махсудов Ф. Ф. г. Пенза, 2023 г.docx
Добавлен: 22.11.2023
Просмотров: 60
Скачиваний: 4
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
МИНОБРНАУКИ РОССИИФедеральное государственное бюджетное образовательное учреждениевысшего образования«Пензенский государственный технологический университет»(ПензГТУ)Факультет автоматизированных информационных технологийКафедра «Программирование»Отчето выполнении лабораторной работы № 4Выполнил: студент Гр. 19ИВ1бп Махсудов Ф. Ф.г. Пенза, 2023 г.Цель работы: Необходимо реализовать циклическое поочередное зажигание светодиодов. Три светодиода подключаются к трем линиям ввода/вывода (конкретные линии ввода/вывода определяются индивидуально). Для переключения светодиодов использовать подключенную кнопку. Использовать микроконтроллер ATmega48 из семейства AVR. Язык программирования С. Реализовать устранение «дребезга» кнопки.Ход работы:Для устранения «дребезга» кнопки используется «усыпление» контроллера через функцию _delay_ms(n); из библиотеки
По прошествии задержки повторно проверяем состояние кнопки. К этому моменту «дребезг» закончился и, если кнопка всё ещё нажата – регистрируем клик и выполняем переключение светодиода.
Код программы:
#include
#include // Включаем функцию задержек
int i = -1;
int state = 0;
int lastState = 0;
void ChangeLed(){
i++;
if(i == 0)
PORTB = 0b00000010;
else if (i == 1)
PORTB = 0b00000100;
else if (i == 2){
PORTB = 0b00001000;
i = -1;
}
}
int canRead = 1;
int main(void)
{
DDRB = 0b00001110;
PORTB = 0b00000000;
DDRD = 0b00000000; ////Настраиваем все разряды порта D на режим "Вход"
PORTD = 0b11111111;
/* Replace with your application code */
while (1)
{
//Проверяем: если состояние PD1 лог.«1» то кнопка нажата
if ((PIND&0b0000010)){
_delay_ms(50);
if ((PIND&0b0000010)){
state = 1;
if((state == 1) & (lastState == 0))
ChangeLed();
}
else
state = 0;
}
else{
state = 0;
}
lastState = state;
}
}
Результат работы программы:
Рис. 1 – собранная схема с тремя светодиодами и кнопкой
Вывод: Используя микроконтроллер ATmega48 из семейства AVR, язык программирования С я реализовал циклическое поочередное зажигание светодиодов по нажатию кнопки.
По прошествии задержки повторно проверяем состояние кнопки. К этому моменту «дребезг» закончился и, если кнопка всё ещё нажата – регистрируем клик и выполняем переключение светодиода.
Код программы:
#include
#include
int i = -1;
int state = 0;
int lastState = 0;
void ChangeLed(){
i++;
if(i == 0)
PORTB = 0b00000010;
else if (i == 1)
PORTB = 0b00000100;
else if (i == 2){
PORTB = 0b00001000;
i = -1;
}
}
int canRead = 1;
int main(void)
{
DDRB = 0b00001110;
PORTB = 0b00000000;
DDRD = 0b00000000; ////Настраиваем все разряды порта D на режим "Вход"
PORTD = 0b11111111;
/* Replace with your application code */
while (1)
{
//Проверяем: если состояние PD1 лог.«1» то кнопка нажата
if ((PIND&0b0000010)){
_delay_ms(50);
if ((PIND&0b0000010)){
state = 1;
if((state == 1) & (lastState == 0))
ChangeLed();
}
else
state = 0;
}
else{
state = 0;
}
lastState = state;
}
}
Результат работы программы:
Рис. 1 – собранная схема с тремя светодиодами и кнопкой
Вывод: Используя микроконтроллер ATmega48 из семейства AVR, язык программирования С я реализовал циклическое поочередное зажигание светодиодов по нажатию кнопки.