
- •Курсова робота
- •Анотація
- •Аннотация
- •1Будова мікроконтролера at90s2313:, огляд алгоритмів,схемних та програмних рішень поставленої задачі
- •Огляд архітектури at90s2313
- •Будовамікроконтролера at90s2313
- •1.2.1 Файл регістрів загального призначення
- •1.2.2 Арифметико-логічний пристрій – алп
- •1.2.3 Статичне озу даних
- •1.2.4 Покажчик стека sp
- •1.2.5 Сторожовий таймер
- •1.2.6 Аналоговий компаратор
- •1.2.7 Регістр управління і стану аналогового компаратора (acsr).
- •Порти введення / виводу–порт
- •1.2.9 Порти введення / виводу - порт d
- •1.2.10 Програмування флеш пам'яті і eeprom
- •1.2.11 ПрограмуванняFlаshпам'яті
- •1.2.12 Програмуванняпам'яті даних
- •1.2.13 Читання пам’яті програм
- •1.2.14 Читання памяті даних
- •Особливості мікроконтролера at90s2313:
- •2 Розробка схем структурної,принципової та алгоритму програми
- •2.1 Структурна схема
- •2.2 Схема електрична принципова
- •2.3 Алгоритм роботи програми
- •3 Розробка програми на мові програмування assembler
- •4 Розробка програми на мові програмування с
- •Моделювання в proteusvsm
- •Висновки
- •Перелік посилань
- •Додаток а Розробка програми на мові програмування Assembler
- •Додаток б Розробка програми на мові програмування с
Додаток а Розробка програми на мові програмування Assembler
.include "2313def.inc" ;підключення бібліотеки МК
.list ;генерація лістинга
.def temp=r16 ;іменуємо головний робочий регістр
.def loop1=r17 ;іменуємо регістр першого циклу затримки
.def loop2=r18 ;іменуємо регістр другог циклу затримки
.def loop3=r19 ;іменуємо регістр третього циклу затримки
.def speed=r20 ;іменуємо регістр зміни швидкості
.def count=r21 ;іменуємо регістр змінної для швидкості
.def count1=r22 ;іменуємо додатковий регістр
.cseg ;вибір сегменту програмного коду
.org 0 ;встановлення даного адреса в 0
;---------------------------------------------------------------------
;Ініціалізація програми
rjmp Init
Init:
ldi temp,low(RAMEND) ;вибір вершини стека
out SPL,temp ;запис регістр стека
clr temp ;очищуємо temp
out DDRD,temp ;порт для кнопок
ser temp ;temp=0xff
out DDRB,temp ;порт для светодиодов
out PORTD,temp ;подаємо 1 на виводи порта D
out PIND,temp ;заповнюємо порт D
ldi temp, 0x80
out ACSR,temp ;включаємо компаратор
ldi speed,2 ;початкова швидкість
clr temp ;очищуємо temp
;---------Запуск програми
main:
sbis PIND,PD0 ;перевіряємо стан кнопки, тобто коли нажмуть
rjmp Line ;переходимо до Line
rjmp main ;інакше назад на main
;---------Підпрограма бігаючого вогника
Line:
cpi temp,0 ;перевіряємо чи рівне temp 0
brne m1 ;якщо ні то преходимо на m1
ldi temp,0b00000001 ;інакше задаємо перший світодіод
m1:
out PORTB,temp ;виводимо стан temp в порт В
rcall wt ;преходимо до затримки
lsl temp ;двигаємо біт вліво
brcc PC+2 ;якщо відбувся перехід
ldi temp,0b00000001 ;то задаємо перший світодіод
sbis PIND, PD1 ;перевіряємо кнопку тормозу
rcall Down ;якщо нажата то переходимо до Down
rjmp m1 ;інакше переходимо на m1
;---------Підпрограма зменьшення швидкості в 1,8(1,75) раз
Down:
mov count1,speed ;копіюємо значення швидкості в count1
mov count,speed ;та count
j1:
inc speed ;збільшуємо speed на 1
dec count ;зменшуємо count на 1
cpi count,0 ;чи count=0, якщо ні
brne j1 ;то преходимо на мітку j1, тобто продовжуємо збільшувати speed
j2:
dec speed ;зменьшуємо speed на 1
dec count1 ;зменшуємо count1 на 1
cpi count1,0 ;чи count=0, якщо так
breq Downr ;то преходимо на мітку Downr
dec count1 ;інакше ще зменшуємо count1 на 1
cpi count1,0 ;чи count=0, якщо ні
brne j2 ;то преходимо на мітку j2, тобто зменьшуємо speed на 1/4
Downr:
sbis PIND,PD1 ;чекаємо доки відіжмуть кнопку
rjmp Downr
rjmp wt ;преходимо до затримки
;--------Підпрограма затримки
wt:
push loop1 ;встановлюємо в стек loop1
push loop2 ;встановлюємо в стек loop2
push loop3 ;встановлюємо в стек loop3
mov loop3, speed ;встановлюємо швидкість
wt1:
dec loop3 ;зменьшуємо loop3 на 1
breq wt4 ;якщо loop3=0, то преходимо на wt4
ldi loop2,100 ;інакше задаємо loop2
wt2:
dec loop2 ;зменьшуємо loop2 на 1
breq wt1 ;якщо loop2=0, то преходимо на wt1
ldi loop1,100 ;інакше задаємо loop1
wt3:
dec loop1 ;зменьшуємо loop2 на 1
brne wt3 ;якщо loop1=0, то преходимо на wt3
rjmp wt2 ;інакше преходимо на wt2
wt4:
pop loop1 ;зчитуємо з стека в loop1
pop loop2 ;зчитуємо з стека в loop2
pop loop3 ;зчитуємо з стека в loop3
ret ;повертаємося із підпрограми