Смекни!
smekni.com

Разработка системы управления кондиционером (стр. 9 из 9)

setbP0.1

mova, P0 ;считывание порта p0

anla, #00000011B ;обнуление лишних разрядов

xrla, #00000011B ;инвертирование

ret

;подпрограмма сброса ЖКИ №1

eres1: movP2, #0FH ;засылаем адрес регистра блокировки

setbP2.4

clrP2.4

movP2, #01000001B ;записываем код снятия блокировки

setbP2.4

clrP2.4

movP2, #0 ;устанавливаем адрес на первый разряд

setbP2.4

clrP2.4

ret

; подпрограмма сброса ЖКИ №2

eres2: mov P3, #0FH

setb P3.4

clr P3.4

mov p3, #01000001B

setb P3.4

clr P3.4

mov P3, #0

setb P3.4

clrP3.4

ret

;подпрограмма очистки ЖКИ №1

eclr1: calleres1 ;сброс экрана

movP2, #01000000B ;установка управляющего кода

movR0, #20 ;инициализация счетчика разрядов

c11: setP2.4 ;импульс записи

clrP2.4

djnzR0, c11 ;оператор цикла

ret

; подпрограмма очистки ЖКИ №2

eclr2: calleres2

mov P3, #01000000B

mov R0, #20

c21: set P3.4

clr P3.4

djnz R0, c21

ret

;подпрограмма установки курсора для ЖКИ №1 по аккумулятору

ecur1: anla, #0FH ;отделяем биты адреса

movP2, a ;устанавливаем адрес на первый разряд

setbP2.4

clrP2.4

ret

; подпрограмма установки курсора для ЖКИ №2 по аккумулятору

ecur2: anl a, #0FH

mov P3,a

setbP3.4

clrP3.4

ret

;таблица символов

ORG 0600H

ts: DB 0EEH ;0

DB 060H ;1

DB 02FH ;2

DB 06DH ;3

DB 0E1H ;4

DB 0CDH ;5

DB 0CFH ;6

DB 068H ;7

DB 0EFH ;8

DB 0EDH ;9

DB 0EBH ;A

DB 0C7H ;b

DB 08EH ;C

DB 067H ;d

DB 08FH ;E

DB 08BH ;F

DB 000H ;

DB 0A9H ;°

DB 001H ;-

DB 003H ;r

DB 047H ;o

;подпрограмма вывода символа на ЖКИ №1 через аккумулятор

prch1: pushDPL ;сохранение регистров в стеке

pushDPH

pushb

movDPTR, #ts ;начало таблицы символов

movc, acc.7 ;сохраняем значение точки

clracc.7 ;сбрасываем значение бита

movca, @a+DPTR ;получаем выводимый код

movacc.4, c ;восстанавливаем значение точки

movb, a ;сохраняем его в b

anla, #0FH ;отделяем младший полубайт

movP2, a ;выводим его на индикатор

setbP2.6 ;вкл. Режим вывода данных

setbP2.4 ;импульс записи

clrP2.4

mova, b ;восстанавливаем выводимый код

swapa

anla, #0FH ;отделяем старший полубайт

movp2, a ;выводим его на индикатор

setbp2.6 ;вкл. Режим вывода данных

setbP2.4 ;импульс записи

clrP2.4

popb

popDPH ;восстановление регистров

popDPL

ret

;подпрограмма вывода символа на ЖКИ №2 через аккумулятор

prch2: pushDPL ;сохранение регистров в стеке

pushDPH

pushb

movDPTR, #ts ;начало таблицы символов

movc, acc.7 ;сохраняем значение точки

clracc.7 ;сбрасываем значение бита

movca, @a+DPTR ;получаем выводимый код

movacc.4, c ;восстанавливаем значение точки

movb, a ;сохраняем его в b

anla, #0FH ;отделяем младший полубайт

movP3, a ;выводим его на индикатор

setbP3.6 ;вкл. Режим вывода данных

setbP3.4 ;импульс записи

clrP3.4

mova, b ;восстанавливаем выводимый код

swapa

anla, #0FH ;отделяем старший полубайт

movP3, a ;выводим его на индикатор

setbP3.6 ;вкл. Режим вывода данных

setbP3.4 ;импульс записи

clrP3.4

popb

popDPH ;восстановление регистров

popDPL

ret

;подпрограмма вывода сообщения на ЖКИ №2

prstr2: pushpsw ;сохранение регистра psw

movpsw, #bank3 ;включаем банк 3

ps1: mova, #0

movca, @a+DPTR ;получение очередного символа

cjnea, #0, ps2 ;если это не последний выводим

poppsw ;завершение подпрограммы

ret

ps2: callprch2 ;вывод символа на экран

incDPTR ;увеличиваем значение указателя

jmpps1

;подпрограмма вывода сообщения об ошибке

prErr: pushacc

calleclr2 ;очистка экрана

mova, #2 ;курсор в позицию 2

call ecur2

mov DPTR, #serr ;вывестинадпись «Error»

call prst2

pop acc

call prch2 ;выводномераошибки

ret

;сообщение «Error»

ORG 0680H

Serr: DB 14, 19, 19, 20, 19, 0 ;сообщение «Error», 0 в конце – признак окончания слова

;подпрограмма вывода Туст на ЖКИ №1

prtmu: mov a, #16

call prch1

mov a, bufLAN2

mov b, #10

div ab

call prch1

mov a, b

call prch1

mov a, #17

call prch

mov a, #0CH

call prch1

ret

;подпрограмма с длительностью выполнения примерно 3 мин. опроса клавиатуры и вывода Тпм

zader: mov R2, #7

za1: mov R1, #255

za2: mov R0, #56;

za3: mov LoopCnt, #255

za4: call Delay

djnz LoopCnt, za4

djnz R0, za3

call inkl ;опросклавиатуры

jnzza5 ;переход при нажатии

calleclr2 ;вывод Тпм

mov a, #2

call ecur2

call sttmp

call rdtmp

call prtmp

djnz R1, za2

djnz R2, za1

mov a, #0

ret

za5: mova, #1

ret

;подпрограмма запуска процесса измерения температуры

sttmp: pushpsw

movpsw, #bank2 ;выбор банка 2 памяти

stm1: callresLAN ;сброс

cjnea, #0, stm6 ;если ошибка переход

mov a, #0CCH ;пропускПЗУ

call wr8LAN

mov a, #44H ;запускпреобразования

call wr8LAN

stm4: callrd1LAN ;запрос об окончании преобразования

jnestm4 ;если не готово / повторить

stm5: poppsw ;выход из подпрограммы

ret

stm6: callprErr ;если ошибка, печать

jmpstm1 ;перейти в начало

;подпрограмма чтения температуры

;выходные параметры – температура в bufLAN - младший байт, в bufLAN+1 - старший байт

rdtmp: pushpsw

movpsw, #bank2 ;выбор банка 2 памяти

callresLAN ;вызов процедуры сброса

cjnea, #0, rtm2 ;если ошибка

mov a, #0CCH ;пропускПЗУ

call wr8LAN

mov a, #0BEH ;выдатькоманду

call wr8LAN

call rd8LAN ;чтениемладшегобайта

mov bufLAN, a ;записьвбуфер

callrd8LAN ;чтение старшего байта

movbufLAN+1, a ;запись в буфер

poppsw ;завершение программы

ret

rtm2: callprErr ;если ошибка, вывести на экран

jmprtm1 ;перейти в начало

;подпрограмма формирования сигнала начального сброса

resLAN:clrP1.1 ;закорачиваем линию

movLoopCnt, #100 ;задержка 700 мкс

rst1: call Delay

djnz LoopCnt, rst1

setb P1.1 ;отпускаемлинию

mov LoopCnt, #9 ;задержка 65 мкс

rst2: call Delay

djnz LoopCnt, rst2

jnbP1.1, rst3 ;проверка сигнала присутствия

mova, #1 ;код ошибки «нет датчика»

ret

rst3: mov LoopCnt, #71 ;задержка 500 мкс

rst4: call Delay

djnz LoopCnt, rst4

jbP1.1, rst5 ;если на линии 1 переход

mova, #2 ;код ошибки «КЗ в линии»

ret

rst5: mova, #0 ;код нормального завершения

ret

;подпрограмма чтения слота (через признак переноса)

mrslot: clrP1.1 ;закоротить линию

nop

setbP1.1 ;отпустить линию

callDelay ;задержка 13 мкс

callDelay

nop

nop

nop

movC, P1.1 ;прочитать и сохранить бит

mov LoopCnt, #8 ;задержка 60 мкс

msl1: call Delay

djnzLoopCnt, msl1

ret

;подпрограмма записи 0 в слот

mwlow: clrP1.1 ;закоротить линию

movLoopCnt, #11 ;задержка 80 мкс

mwl1: call Delay

djnz LoopCnt, mwl1

setbP1.1 ;отпустить линию

ret

;подпрограмма записи 1 в слот

mwhi: clrP1.1 ;закоротить линию

callDelay ;задержка 5 мкс

setbP1.1 ;отпустить линию

movLoopCnt, #11 ;задержка 75 мкс

mwh1: call Delay

djnz LoopCnt, mwh1

ret

;процедура задержки 5 мкс (при тактовой частоте 12МГц)

Delay: nop

ret

;программа записи байта через аккумулятор

wr8LAN:

movR1, #8 ;инициализация счетчика разрядов

wb1: rrcA ;младший бит в C

jcwb2 ;если текущий бит = 0

callmwlow ;запись 0 в слот

jmpwb3

wb2: callmwhi ;запись 1 в слот

wb3: djnzR1, wb1 ;продолжать, если не последний

ret

;подпрограмма записи бита, который передается через С

wr1LAN:

jcwb4 ;если бит = 0

callmwlow ;запись 0 в слот

jmpwb5

wb4: callmwhi ;запись 1 в слот

wb5:

ret

;подпрограмма чтения байта

rd8LAN:

movR1, #8 ;счетчик количества битов

rb1: callmrslot ;чтение очередного бита

rrcA ;сдвиг битов младшим разрядом вперед

djnzR1, rb1 ;продолжать, если не последний

ret

;подпрограмма чтения бита

rd1LAN:

call mrslot

ret

;выводТпмнаЖКИ №2

prtmp: mov a, #16 ;выводпробела

call prch2

mova, bufLAN+1 ;считываем старший байт

swapa ;обмен тетрад

anla, #0F0H ;получили старший полубайт

movR5, a ;временно записываем в R5

mova, bufLAN ;считываем младший байт

swapa ;обмен тетрад

anla, #0FH ;получили младший полубайт

adda, R5 ;складываем полубайты

movb, #10 ;деление на 10

divab

callprch2 ;вывод десятков

mova, b ;берем остаток от деления

callprch2 ;вывод единиц

mova, #17 ;вывод символа «градус»

call prch2

mov a, #0CH ;выводбуквы «С»(Цельсия)

call prch2

ret

;подпрограмма режима охлаждения

reoh: clrP0.2 ;выкл. Нагревательный элемент

setbP0.4 ;вкл. компрессор

setbP0.3 ;вкл. вентелятор

callzader

jzre4 ;переход при нажатой клавише

ret

re4: clrP0.4 ;выкл. компрессор

clrP0.3 ;выкл. вентелятор

callzader

jzre3 ;переход при нажатой клавише

ret

re3: mov a, bufLAN+1

swap a

anl a, #0F0H

mov R5, a

mov a, bufLAN

swap a

anl a, #0FH

adda, R5 ;в аккумуляторе байт Тпм

mov b, bufLAN2

mov b, #b-2

mova, #LE(a, b) ;сравнение Тпм<=Туст-2

cjnea, #0FFFFH, re1 ;переход, если не истина

incbufLAN3 ;счетчик циклов режима увеличить на 1

mova, #GT(bufLAN3, 2)

cjnea, #0FFFFH, re2 ;сравнение «счетчик циклов>=2»

movbufLAN3, #0 ;обнуление счетчика

mova, #4 ;в режим обогрева

ret

re1: movbufLAN3, #0 ;обнуление счетчика

re2: mova, #5 ;режим охлаждения

ret

;конец программы

end