Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторные работы готовые / Лабораторная работа 1 Инструкции микроконтроллеров AVR. Подсистема ввода-вывода

.docx
Скачиваний:
0
Добавлен:
21.06.2024
Размер:
185.78 Кб
Скачать

Задание 1

Программа

;

; AssemblerApplication1.asm

;

; Created: 14.02.2024 12:07:28

; Author : RIIT_05_410

;

; Replace with your application code

.include "m32def.inc" ;подключение библиотеки для работы с ATmega32

.cseg ;выбор сегмента программного кода

.org 0 ;установка текущего адреса на ноль

;--------------------------------------------

;настройка порта D на ввод

ldi r16,0x00 ;записываем ноль в регистр r16

out DDRD,r16 ;записываем r16 в DDRD

;настройка порта B на вывод

ldi r16,0xFF ;записываем 0xff=0b11111111 в регистр r16

out DDRB,r16 ;записываем r16 в DDRB

out PORTB,r16 ;записываем r16 в PORTB(погасить светодиод)

out PORTD,r16 ;записываем r16 в PORTD(включаем внутренний резистор)

;---------------------------------------------

metka:

in r16,PIND ;читаем содержимое порта D

out PORTB,r16 ;пересылаем в порт B

rjmp metka ;переходим по метке к началу цикла

Результат Proteus

Ответы

Состояние портов изменяется в момент нажатия кнопки при нажатии кнопки информация записывается с порта Д в регистр, оттуда состояния передаются на порт Б.

Изменение состояния порта Д ведет к изменению работы светодиода.

Задание 2

Разработать программу на языках Assembler и C для устройства, выполняющего действия в соответствии с заданным алгоритмом:

Программа

.include "m32def.inc" ;подключение библиотеки ATmega32

.cseg ;выбор сегмента программного кода

.org 0 ;установка текущего адреса на ноль

reset: ;инициализация портов ввода/вывода

ldi r16,0xFF

out DDRA,r16 ;установка Pt2 на вывод информации

out DDRC,r16 ;установка Pt3 на вывод информации

out PORTB,r16 ;включение подтягивающих резисторов

clr r16

out DDRB,r16 ;установка Pt1 на ввод информации

in r16,PINB ;ввод значения Pt1 в Rd1

mov r18,r22 ;копирование Rd1 в Rd2

;3E

;0011 1110

cbi PORTA,8

cbi PORTA,7

sbi PORTA,6

sbi PORTA,5

sbi PORTA,4

sbi PORTA,3

sbi PORTA,2

sbi PORTA,1

cbi PORTA,0

out PORTA,r22 ;установка K2 на Pt3

Задание 3

Разработать программу на языке Assembler и C для устройства, позволяющего управлять состояниями светодиодов в зависимости от нажатой кнопки. Смоделировать схему в Proteus и проверить работоспособность программы.

К порту С подключено 8 светодиодов. Если нажата кнопка 1, то должны загораться светодиоды с нечетными номерами, а если кнопка 2, то с четными. Проверить работу.

Программа

;

; Practica2_2.asm

;

; Created: 28.02.2024 12:03:58

; Author : RIIT_05_410

;

.include "m32def.inc" ;подключение библиотеки ATmega32

.cseg ;выбор сегмента программного кода

.org 0 ;установка текущего адреса на ноль

.org 0x0000;

;ldi r16, 0xFF

;out SPH, r16

;ldi r16, 0x00

;out SPL, r16

ldi r16, 0b00000000

out DDRA,r16

out DDRB, r16

ldi r16, 0xFF

out DDRC, r16

; Replace with your application code

start:

in r17, PINA

in r18, PINB

andi r17, 0b00000001

andi r18, 0b00000001

cpi r17, 1

breq button1_pressed

rjmp button2_check

button1_pressed:

ldi r16, 0b01010101

out PORTC, r16

rjmp end

button2_check:

cpi r18,1

brne end

ldi r16, 0b10101010

out PORTC, r16

rjmp end

end:

rjmp start

Программа C

#include <avr/io.h>

int main(void) {

DDRD = 0x00;

DDRB = 0xFF;

PORTD = 0xFF;

PORTB = 0xFF;

unsigned char r17 = 0b01010101;

unsigned char r18 = 0b10101010;

while (1) {

if (PIND & (1 << PD0)) {

metkaA:

PORTB = r17;

} else if (PIND & (1 << PD1)) {

metkaB:

PORTB = r18;

}

}

return 0;

}

Результат Proteus

Задание 4

Разработать программу на языке Assembler и C для устройства, выполняющего решение логического уравнения. Минимизация выражения не требуется.

Программа

.include "m32def.inc" ;подключение библиотеки для работы с ATmega32

.def A=r20 ;объявление переменных и присвоение их имен

.def B=r21 ;регистрам общего назначения r20...r23

.def C=r22

.def D=r23

.def NA=r24

.cseg ;выбор сегмента программного кода

.org 0 ;установка текущего адреса на ноль

;--------------------------------------------

reset:

ldi r16,0x01

out DDRD,r16 ;записываем r16 в DDRB

ldi r16,0x0FF

out PORTA,r16 ;записываем r16 в PORTB(погасить светодиод)

clr r16

out DDRA,r16 ;записываем r16 в PORTD(включаем внутренний резистор)

main:

in r19,PINA ;ввод значения PINA в РОН r16

mov A,r19 ;копирование r16 в регистры A, B, C

mov B,r19

mov C,r19

andi A,0x01 ;выделение бита числа A

andi B,0x02 ;выделение бита числа B

andi C,0x04 ;выделение бита числа C

lsr B

lsr C

lsr C

; 1 часть вычисления

mov NA,A;присваиванм А

com NA;не а

andi NA,0x01

or NA,C ;не а или с

and A,B; а и б

com NA;не (а и б)

andi NA,0x01

and A,NA; итог

; вывод

out PORTD,A ;вывод результата на PORTD0

rjmp main ;возврат на main

Программа C

#include <avr/io.h>

int main(void)

{

DDRD=0x01;// настройка порта D на вывод

DDRA=0x00;// настройка порта A на ввод

PORTA=0xFF;// включение подтягивающих резисторов

// объявление переменных с указанием на выделение в файле регистров

register unsigned char x, A, NA, NB, NC, B, C;

while (1)

{

x=PINA;// опрос PINC с занесением результата в x

A=x;// копирование введенной информации в переменные

B=x;

C=x;

A &= 0x01;// выделение бита числа A

B &= 0x02;// выделение бита числа B

C &= 0x04;// выделение бита числа C

B>>=1;// сдвиг B на 1 позицию

C>>=2;

NA=(~A)&0x01;

NB=(~B)&0x01;

NC=(~C)&0x01; // формирование !А

x=NA | NB & (NA | C); // расчет логического выражения

// ne(A) | ne(B) & (ne(A) | C)

PORTD=x;// вывод результата на PORTD

}

}

Таблица истинности

A

B

C

F

A

0

0

0

1

1

1

0

0

0

1

1

1

1

0

0

1

0

1

1

1

0

0

1

1

1

1

1

0

1

0

0

0

1

0

1

1

0

1

1

1

1

1

1

1

0

0

0

0

1

1

1

1

1

0

0

1