Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Приложение 1 ;основная программа

 

bank0             EQU 00000000B;коды банков памяти

bank1             EQU 00001000B

bank1             EQU 00010000B

bank2             EQU 00110000B

              DSEG

              ORG 30H

LoopCnt: DS 1           ;счетчик задержки

bufLAN: DS 8           ;буфер для приема данных из MicroLAN

bufLAN2: DS 8           ;буфер для Туст

bufLAN3: DS 1           ;счетчик рабочих циклов кондиционера

              ORG 60H      ;начало стека

stack:              DS 20H      ;глубина стека

main: mov bufLAN2, #18H       ;начальное значение Туст=24 градуса Цельсия

    call inkl

    jz in3                       ;если клавиши не нажаты переход

in1: cjne a, #11B, in2     ;если обе клавиши нажаты переход

    inc bufLAN             ;Туст увеличить на 1

    jmp in3

in2: dec bufLAN2

in3: call eclr1                  ;вывод Туст

    mov a, #2

    call ecur1

    call prtmu               ;Туст на ЖКИ №1

    call eclr2

    mov a, #2

    call ecur2

    call sttmp                ;запуск преобразования Тпм

    call rdtmp               ;чтение Тпм

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

    mov a, bufLAN+1            ;записьТпм в аккумулятор

    swap a

    anl a, #0F0H

    mov R5, a

    mov a, bufLAN

    swap a

    anl a, #0FH

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

    mov a, #LE(a, bufLAN2)           ;сравнение Тпм<=Туст

    mov bufLAN3, #0            ;обнуление счетчика циклов работы кондиционера

    cjne a, #0FFFFH, in5       ;обработкаусловия Тпм<=Туст

in4: call reob

    jmp in6

in5: call reoh

in6: mov b, a

    mov a, EQ(b, #1)

    cjne a, #0FFFFH, in7

    jmp in1

in7: mov a, EQ(b, #4)

    cjne a, #0FFFFH, in5

    jmp in4

;Подпрограмма ввода с клавиатуры (0 бит аккумулятора – за S2, 1 бит – за S1)

inkl: setb P0.0                 ;установка 1 на линиях клавиатуры

    setb P0.1

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

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

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

ret

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

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

setb P2.4

clr P2.4

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

setb P2.4

clr P2.4

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

setb P2.4

clr P2.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

clr P3.4

ret

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

eclr1: call eres1                 ;сброс экрана

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

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

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

clr P2.4

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

    ret

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

eclr2: call eres2

mov P3, #01000000B

mov R0, #20

c21: set P3.4

clr P3.4

    djnz R0, c21

    ret

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

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

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

setb P2.4

clr P2.4

ret

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

ecur2:    anl a, #0FH

mov P3,a

setb P3.4

clr P3.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:   push DPL                ;сохранение регистров в стеке

push DPH

push b

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

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

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

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

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

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

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

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

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

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

clr P2.4

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

swap a

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

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

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

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

clr P2.4

pop b

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

pop DPL

ret

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

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

push DPH

push b

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

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

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

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

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

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

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

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

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

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

clr P3.4

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

swap a

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

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

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

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

clr P3.4

pop b

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

pop DPL

ret

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

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

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

ps1: mov a, #0

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

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

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

ret

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

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

jmp ps1

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

prErr:    push acc

    call eclr2                  ;очистка экрана

    mov a, #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                   ;опрос клавиатуры

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

call eclr2                 ;вывод Тпм

mov a, #2

call ecur2

call sttmp

call rdtmp

call prtmp

djnz R1, za2

djnz R2, za1

mov a, #0

ret

za5: mov a, #1

    ret

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

sttmp:   push psw

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

stm1: call resLAN                      ;сброс

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

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

    call wr8LAN

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

call wr8LAN

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

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

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

    ret

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

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

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

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

rdtmp:   push psw

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

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

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

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

    call wr8LAN

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

    call wr8LAN

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

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

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

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

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

    ret

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

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

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

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

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

rst1: call Delay

    djnz LoopCnt, rst1

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

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

rst2: call Delay

    djnz LoopCnt, rst2

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

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

    ret

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

rst4: call Delay

    djnz LoopCnt, rst4

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

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

    ret

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

    ret

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

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

    nop

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

    call Delay                ;задержка 13 мкс

    call Delay

    nop

    nop

    nop

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

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

msl1: call Delay

    djnz LoopCnt, msl1

    ret

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

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

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

mwl1:    call Delay

    djnz LoopCnt, mwl1

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

    ret

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

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

    call Delay                ;задержка 5 мкс

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

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

mwh1:   call Delay

    djnz LoopCnt, mwh1

    ret

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

Delay:   nop

    ret

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

wr8LAN:

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

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

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

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

    jmp wb3

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

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

    ret

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

wr1LAN:

jc wb4                              ;если бит = 0

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

    jmp wb5

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

wb5:

    ret

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

rd8LAN:

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

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

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

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

    ret

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

rd1LAN:

call mrslot

    ret

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

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

    call prch2

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

    swap a                              ;обмен тетрад

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

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

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

    swap a                              ;обмен тетрад

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

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

    mov b, #10              ;деление на 10

    div ab

    call prch2                ;вывод десятков

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

call prch2                ;вывод единиц

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

call prch2

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

call prch2

ret

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

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

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

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

    call zader

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

    ret

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

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

    call zader

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

    ret

re3: mov a, bufLAN+1

    swap a

    anl a, #0F0H

    mov R5, a

    mov a, bufLAN

    swap a

    anl a, #0FH

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

    mov b, bufLAN2

    mov b, #b-2

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

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

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

    mov a, #GT(bufLAN3, 2)

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

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

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

    ret

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

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

    ret

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

    end

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...