осковский
ордена Октябрьской
Революции и
ордена Трудового
Красного Знамени
институт Стали
и Сплавов
кафедра электротехники
Курсовая
работа
“Микропроцессорная
техника. Микроконтроллер
в двухпозиционном
регуляторе”
Выполнил
студент: Денисов
А.В.
подпись:
Группа: МПП97-1В
Задание:
разработка
структурной
и электрической
схемы микроконтроллера
на базе заданных
в варианте
микропроцессорных
интегральных
схем и его
программирование
для работы с
двухпозиционным
регулятором
по заданному
закону регулирования.
Данные
варианта №4:
Карта
памяти: Адрес
таймера и интерфейса:
0000-3FFF | СВОБОДНО | 16К | CT | 74h,75h,76h,77h | |
4000-47FF | RAM | 2К | |||
4800-F7FF | СВОБОДНО | 44К | IO | C8h,C9h,CAh,CBh | |
F800-FFFF | ROM | 2К |
ОЗУ
512х8
ПЗУ
1024х8
Закон
регулирования
Краткое
описание:
контроллер
выполнен на
микропроцессорном
комплекте серии
К580. Микросхемы,
входящие в
состав комплекта,
образуют полный
набор, необходимый
для построения
несложных
программно
управляемых
микроконтроллеров.
Набор
микросхем:
КР580ВМ80А
- микропроцессор
КР580ВК28
- системный
контроллер
КР580ВВ55А
- программируемый
контроллер
ввода-вывода
КР580ВИ53
- программируемый
таймер
КР580ГФ24
- генератор
тактовых импульсов
К555ИД3
- дешифратор
4 в 16
К555ИД7
- дешифратор
3 в 8
К505РЕ3
– динамическое
ОЗУ 512х8
Микросхемы
ПЗУ иностранного
производства
Микросхемы
ОЗУ и ПЗУ подключены
к шине адреса
ЦПУ согласно
карте памяти,
при этом двоичные
адреса каждой
из
микросхем
показаны в
таблице 1.
Контроллер
ввода-вывода
и системный
таймер подключены
к младшим 8 адресным
линиям (0-7), так
как пространство
ввода-вывода
для процессора
серии 580 допускает
обращение
только к 256 устройствам.
Программное
обеспечение:
Контроллер
управляется
программно.
Среднее время
выполнения
команды микропроцессором
составляет
максимально
около 10 тактов
(на самых сложных
участках), что
при частоте
тактирующих
импульсов 2 МГц
даёт около
200000 операций в
секунду. При
частоте опроса
внешних устройств
1000 Гц длина основного
цикла программы
может составлять
до 200 команд. Такое
быстродействие,
а также объём
памяти 2048 байт
позволяют
строить программу
с модульной
архитектурой,
что значительно
облегчает её
отладку и
сопровождение.
Для компиляции
программы
применён Borland
Turbo
Assembler
v4.0,
команды подмножества
Intel
8085 обрабатываются
при помощи
подключаемого
файла макроопределений
MACROS80.ASM.
Подобный подход
позволяет
получать исполняемые
файлы 8085 на машинах
класса IBM
PC,
наиболее доступных
в настоящее
время.
В данном
исполнении
контроллер
может поддерживать
температуру
[0..255] градусов
Цельсия с точностью
до 1 градуса во
временном
интервале
[1..65,53] секунды при
линейном изменении
или неограниченно,
если температура
постоянна.
Точность измерения
температуры
объекта ограничена
разрядностью
АЦП и сопряжённого
с ним порта A
контроллера
ввода-вывода.
Программа
управления
приведена ниже.
ИМС | АДРЕС | АДРЕС BIN, БИТЫ | |||||||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
RAM 1 | 4000 41FF | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||
RAM 2 | 4200 43FF | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||
RAM 3 | 4400 45FF | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||
RAM 4 |
47FF | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||
УСТРОЙСТВО НА ШИНЕ | DC1 | DC2 | RAM | ||||||||||||||
ROM 1 | F800 FBFF | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||
ROM 2 | FCFF FFFF | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||
УСТРОЙСТВО НА ШИНЕ | DC4 | DC3 | ROM | ||||||||||||||
IO | C8 C9 CA CB | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | ||
УСТРОЙСТВО НА ШИНЕ | НЕ ПОДКЛЮЧЕНЫ | DC5 | DC6 | IO | |||||||||||||
CT |
77 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | ||
У табл СТРОЙСТВО НА ШИНЕ | НЕ ПОДКЛЮЧЕНЫ | DC5 | DC6 | CT |
рис
1 схема
контроллера
электрическая
принципиальная
INCLUDE
MACROS80.ASM
;
======================================================================
;
-------------------------------------------------------------
;
Константы:
;
----------------------------------------------------------------------
;
;
Адреса запуска
программ в ОЗУ
и ПЗУ
CONST:
RAM_BASE
EQU 04000h ; Адрес
запуска
в ОЗУ
ROM_BASE
EQU 0F800h ; Адрес запуска
в ПЗУ
IO_BASE
EQU 0C8h ; Адрес
програмируемого
интерфейса
CT_BASE
EQU 074h ; Адрес
таймера
;
----------------------------------------------------------------------
;
Программируемый
интерфейс IO
;
----------------------------------------------------------------------
;
Режимы работы
программируемого
интерфейса
- биты байта
состояния
IOSB_SETMODE
EQU 10000000b ; IO STATUS BITS
IOSB_SETCBITS
EQU 00000000b
IOSB_AMODE0
EQU 00000000b
IOSB_AMODE1
EQU 00100000b
IOSB_AMODE2
EQU 01000000b
IOSB_A70IN
EQU 00010000b
IOSB_A70OUT
EQU 00000000b
IOSB_C74IN
EQU 00001000b
IOSB_C74OUT
EQU 00000000b
IOSB_BMODE0
EQU 00000000b
IOSB_BMODE1
EQU 00000100b
IOSB_B70IN
EQU 00000010b
IOSB_B70OUT
EQU 00000000b
IOSB_C30IN
EQU 00000001b
IOSB_C30OUT
EQU 00000000b
;
Адреса портов
программируемого
интерфейса
(IO)
IO_MODE_PORT
EQU IO_BASE+03h ; Порт программирования
IO
IO_C_PORT
EQU IO_BASE+02h ; Порт
C
IO_B_PORT
EQU IO_BASE+01h ; Порт
B
IO_A_PORT
EQU IO_BASE+00h ; Порт
A
;
Константы для
работы с IO
IO_MODE
= IOSB_SETMODE+IOSB_AMODE0+IOSB_A70IN+IOSB_C74IN+IOSB_BMODE0
IO_MODE
= IO_MODE+IOSB_B70OUT+IOSB_C30OUT
;
----------------------------------------------------------------------
;
Таймер CT:
;
----------------------------------------------------------------------
;
Режимы работы
таймеров - биты
байта состояния
CTSB_TIMER0
EQU 00000000b ; CT STATUS BITS
CTSB_TIMER1
EQU 01000000b
CTSB_TIMER2
EQU 10000000b
CTSB_STOP
EQU 00000000b
CTSB_LOWBYTE
EQU 00010000b
CTSB_HIGHBYTE
EQU 00100000b
CTSB_TWOBYTES
EQU 00110000b
CTSB_MODE0
EQU 00000000b
CTSB_MODE1
EQU 00000010b
CTSB_MODE2
EQU 00000100b
CTSB_MODE3
EQU 00000110b
CTSB_MODE4
EQU 00001000b
CTSB_MODE5
EQU 00001010b
CTSB_BINCODE
EQU 00000000b
CTSB_BINDECCODE
EQU 00000001b
;
Адреса портов
таймера (CT)
CT_MODE_PORT
EQU CT_BASE+03h ; Порт
программирования
CT
CT_TIMER2_PORT
EQU CT_BASE+02h ; Таймер
2
CT_TIMER1_PORT
EQU CT_BASE+01h ; Таймер
1
CT_TIMER0_PORT
EQU CT_BASE+00h ; Таймер
0
;
Константы для
работы с таймерами
TIMER_MODE_PORT
EQU CT_MODE_PORT
TIMER_STATE_PORT
EQU IO_C_PORT
TIMER0_FREQUENCY
EQU 1000 ; Задание
основного
тактирования
по T0, Гц
TIMER0_DELAY
EQU 2000000 / TIMER0_FREQUENCY
TIMER0_MODE
= CTSB_TIMER0+CTSB_TWOBYTES+CTSB_MODE2+CTSB_BINDECCODE
TIMER1_MODE
= CTSB_TIMER1+CTSB_TWOBYTES+CTSB_MODE0+CTSB_BINCODE
TIMER2_MODE
= CTSB_TIMER2+CTSB_TWOBYTES+CTSB_MODE0+CTSB_BINCODE
;
----------------------------------------------------------------------
;
Прочие константы
;
----------------------------------------------------------------------
;
Константы для
работы с нагревателем
HEATER_MODE_PORT
EQU IO_C_PORT
HEATER_STATE_PORT
EQU IO_A_PORT
HEATER_ON
EQU 1
HEATER_OFF
EQU 0
;
======================================================================
;
----------------------------------------------------------------------
;
ОСНОВНАЯ ПРОГРАММА
;
----------------------------------------------------------------------
;
См. входные
параметры
подпрограмм
ORG
RAM_BASE ; Эта программа
находится в
ОЗУ
mvi
a,IO_MODE ; Инициализация
контроллера
ввода-вывода
out
IO_MODE_PORT
xra
a ; Очистка
аккумулятора
call
Restart_Timer ; Запуск
таймера
0
;
=== Работа на участке
1 (dT=-50C, dt=5сек)
mvi
a,200 ; Начальная
температура
mvi
b,TIMER0_FREQUENCY * 5 SHR 4 ; Время
регулировки
5 секунд
mvi
c,TIMER0_FREQUENCY * 5 AND 0FFh
mvi
d,TIMER0_FREQUENCY * 5 / 50 SHR 4 ; Время
изменения
T
mvi
e,TIMER0_FREQUENCY * 5 / 50 AND 0FFh ; на
1 градус
mvi
h,-1 ; Уменьшать
температуру
call
reg
;
=== Работа на участке
2 (dT=0, dt=5сек)
mvi
a,150 ; Начальная
температура
mvi
b,TIMER0_FREQUENCY * 5 SHR 4 ; Время
регулировки
5 секунд
mvi
c,TIMER0_FREQUENCY * 5 AND 0FFh
mvi
d,0FFh ; Время
изменения
температуры
mvi
e,0FFh ; велико
(T = const)
mvi
h,0 ; температура
постоянна
call
reg
;
=== Работа на участке
3 (dT=-100C, dt=2сек)
mvi
a,150 ; Начальная
температура
mvi
b,TIMER0_FREQUENCY * 2 SHR 4 ; Время
регулировки
2 секунды
mvi
c,TIMER0_FREQUENCY * 2 AND 0FFh
mvi
d,TIMER0_FREQUENCY * 2 / 100 SHR 4 ; Время
изменения
температуры
mvi
e,TIMER0_FREQUENCY * 2 / 100 AND 0FFh ; на
1 градус
mvi
h,-1 ; Уменьшать
температуру
call
reg
;
=== Отключение
нагревателя
call
Off_Heater
;
=== Завершение
программы
hlt
;
----------------------------------------------------------------------
;
Подпрограммы
для работы с
нагревателем
;
----------------------------------------------------------------------
;
;
On_Heater и Off_Heater: включить
и выключить
нагреватель
соответственно
;
ВХОД: НЕТ
;
ВЫХОД: НЕТ
;
РЕГИСТРЫ: НЕ
ИЗМЕНЯЕТ
;
ФЛАГИ: НЕ ИЗМЕНЯЕТ
On_Heater:
push
b
mov
b,a
mvi
a,HEATER_MODE_PORT
out
HEATER_ON
mov
a,b
pop
b
ret
Off_Heater:
push
b
mov
b,a
mvi
a,HEATER_MODE_PORT
out
HEATER_OFF
mov
a,b
pop
b
ret
;
;
Heater_Control: подпрограмма
поддержки
заданной температуры.
Если
;
температура
больше или
равна заданной,
выключает
нагреватель,
;
иначе включает.
;
ВХОД: a - заданная
температура
;
ВЫХОД: если
нагреватель
включен CF=1, иначе
CF=0
;
РЕГИСТРЫ: НЕ
ИЗМЕНЯЕТ
;
ФЛАГИ: CF
Heater_Control:
push
b
mov
b,a
in
HEATER_STATE_PORT
cmp
b
jnc
Temperature_Is_Normal
call
On_Heater
jmp
Exit_Heater_Control
Temperature_Is_Normal:
call
Off_Heater
Exit_Heater_Control:
mov
a,b
pop
b
ret
;
----------------------------------------------------------------------
;
Подпрограммы
для работы с
таймерами
;
----------------------------------------------------------------------
;
;
Restart_Timer - запуск таймера
на отсчёт N отрезков.
;
ВХОД: a - номер
таймера
;
b,c - число отрезков
для отсчёта
для таймеров
1 или 2
;
ВЫХОД: НЕТ
;
РЕГИСТРЫ: НЕ
ИЗМЕНЯЕТ
;
ФЛАГИ: НЕ ИЗМЕНЯЕТ
Restart_Timer:
push
psw
jnz
IsTimer1
mvi
a,TIMER0_MODE
; Инициализация
таймера 0
out
TIMER_MODE_PORT
mvi
a,TIMER0_DELAY AND 0FFh ; Ввод младнего
байта величины
задержки
out
CT_TIMER0_PORT
mvi
a,TIMER0_DELAY SHR 4 ; Ввод
старшего
байта
out
CT_TIMER0_PORT
jmp
Exit_Restart_Timer
IsTimer1:
dcr
a
jnz
IsTimer2
mvi
a,TIMER1_MODE
out
TIMER_MODE_PORT
mov
a,c
out
CT_TIMER1_PORT
mov
a,b
out
CT_TIMER1_PORT
jmp
Exit_Restart_Timer
IsTimer2:
dcr
a
jnz
Exit_Restart_Timer
mvi
a,TIMER2_MODE
out
TIMER_MODE_PORT
mov
a,c
out
CT_TIMER2_PORT
mov
a,b
out
CT_TIMER2_PORT
Exit_Restart_Timer:
pop
psw
ret
; Check_Timers -
проверить, не
было ли срабатывания
таймера
;
ВХОД: НЕТ
;
ВЫХОД: если
сработал таймер
1, установит
бит 1 аккумулятора,
;
если таймер
2 - бит 2 (т.е. 1 - таймер
1, 2 - таймер 2)
;
кроме того,
если таймер
сработал, установит
флаг CF
;
РЕГИСТРЫ: a
;
ФЛАГИ: CF
Check_Timers:
stc
push
b
push
psw
in
TIMER_STATE_PORT
ani
11000000b
jnz
TimeOut
pop
psw
pop
b
cmc
ret
TimeOut:
rlc
; Rotate bits to positions 0 and 1
rlc
mov
b,a
pop
psw
mov
a,b
pop
b
ret
;
----------------------------------------------------------------------
;
Подпрограмма
регулирования
температуры
;
----------------------------------------------------------------------
;
;
Reg: регулирование
температуры
;
ВХОД: a - начальная
температура
;
b,c - тактов таймера
0 до окончания
регулирования
;
d,e - тактов таймера
0 до изменения
уставки по T
;
h - направление
изменения T -
+1, -1 или 0
;
ВЫХОД: НЕТ
;
РЕГИСТРЫ: НЕ
ИЗМЕНЯЕТ
;
ФЛАГИ: НЕ ИЗМЕНЯЕТ
Reg:
push
b ; Сохранить
все основные
регистры
push
d
push
h
push
psw
push
psw ; Запустить
таймер 2 на счёт
времени
mvi
a,2 ; регистры
b,c уже установлены,
см. ВХОД
call
Restart_Timer
pop
psw
push
d ; Регистровую
пару (d,e) поместить
в (b,c)
pop
b
mov
d,a ; Store temperature in d
T_Changed:
mvi
a,1 ; Таймер
1...
call
Restart_Timer ; ... запустить
на подсчёт
времени до
новой уставки
Reg_Next:
mov
a,d ; Восстановим
уставку T
call
Heater_Control ; Подрегулируем
температуру
call
Check_Timers ; Проверим,
не сработал
ли таймер
jnc
Reg_Next
cpi
1
jnc
Exit_Reg ; Если сработал
таймер 2 (ВРЕМЯ)
- на выход
mov
a,d
add
h ; Иначе изменим
уставку по
температуре,
mov
d,a ; сохраним
её
jmp
T_Changed ; и перезапустим
подсчёт времени
уставки
Exit_Reg:
pop
psw ; restore general registers
pop
h
pop
d
pop
b
ret
ENDALL