logo
Система управления микроволновой печью

7. Программа

7.1 Структура программы

Написание и отладка программы производились в программе ProView фирмы Franklin Software Inc.

ProView фирмы Franklin Software Inc. - интегрированная среда разработки программного обеспечения для однокристальных микроконтроллеров семейства Intel 8051 и его клонов. Она включает в себя всё, что нужно для создания, редактирования, компиляции, трансляции, компоновки, загрузки и отладки программ:

- стандартный интерфейс Windows,

- полнофункциональный редактор исходных текстов с выделением синтаксических элементов цветом,

- организатор проекта,

- транслятор с языка C,

- ассемблер,

- отладчик,

- встроенную справочную систему.

Среда разработки подобна Visual C++ Microsoft и Borland C++ для Windows.

ProView объединяет все этапы разработки прикладной программы в единый рекурсивный процесс, когда в любой момент времени возможен быстрый возврат к любому предыдущему этапу.

Программу можно поделить на 4 блока:

1. Инициализация данных.

2. Основной бесконечный цикл.

3. Обработка прерывания по таймеру Т/С 0.

4. Обработка прерывания по таймеру Т/С 1.

В 1-м блоке инициализируются данные и запускается таймер Т/С 0, отвечающий за обновление индикаторов и опрос клавиатуры.

Основной бесконечный цикл отвечает за обновление 3-х байтов, в которых содержится визуальное значение мощности.

Главная же часть программы содержится в 3-м блоке. Прерывание вызывается с частотой 700 Гц, чтобы обеспечить своевременное обновление значений на 7-ми индикаторах (3 индикатора отвечают за мощность, остальные отображают время), не заметное для человеческого глаза.

Параллельно с обновлением значений производится опрос клавиатуры. Если клавиша была нажата, то определяется, какая и допустимо ли действие, которое должно быть вызвано нажатием данной кнопки (например, нельзя увеличить максимальную мощность). Если действие допустимо, то оно производится. Возможные действия: увеличение/уменьшение мощности, увеличение времени, включение микроволновой печи, выключение, сброс времени. В случае включения печи, происходит запуск таймера Т/С 1, который отвечает за обратный отсчет времени, в течение работы микроволновой печи.

4-й блок занимается непосредственно режимом работы. В нем происходит обратный отсчет, регулировка выходной мощности печи. А также изменение визуального значения времени.

7.2 Исходный текст программы

При написании программы использовалась учебная литература. [6].

NAME Microwave

PROGSEGMENTCODE

CONSTSEGMENTCODE

VAR1SEGMENTDATA

BITVARSEGMENTBIT

STACKSEGMENTIDATA

RSEG STACK

DS 10H ; 16 Bytes Stack

CSEG AT 0

USING0 ; Register-Bank 0

JMP START

CSEG AT 03h

reti

CSEG AT 0Bh

ljmpm_TF0

CSEG AT 13h

reti

CSEG AT 1Bh

ljmpm_TF1

CSEG AT 23h

reti

RSEG PROG

START:MOV SP,#STACK-1

; инициализация данных

mov R3, #0h

mov 21h, #00000111b ; задаем начальную мощность

mov 22h, #00010000b ; задаем байт шага (изменяется сдвигом от 10000 до 00001)

mov 30h, #3h ; задаем визуальные начальные значения мощности

mov 31h, #6h

mov 32h, #0h

mov 33h, #0h ; задаем визуальные начальные значения времени

mov 34h, #0h

mov 35h, #0h

mov 36h, #0h

mov 40h, #00111111b ; задаем матрицу цифр, для вывода на индикатор

mov 41h, #00000110b

mov 42h, #01011011b

mov 43h, #01001111b

mov 44h, #01100110b

mov 45h, #01101101b

mov 46h, #01111101b

mov 47h, #00000111b

mov 48h, #01111111b

mov 49h, #01101111b ; задали матрицу цифр, для вывода на индикатор

; 50h код кнопки

mov 55h, #0h ; байт периодов по 10с

mov 56h, #0h ; байт отсчета 10с

mov 57h, #40 ; байт отсчета 2-х секунд (40*0,05)

; инициализация и пуск таймеров

mov TMOD, #00010001b

mov TL0, #LOW(NOT(1428))

mov TH0, #HIGH(NOT(1428))

setb PT0

setb PT1

setb EA

setb ET0

setb ET1

setb TR0

mm:

mov R7, 21h

cjne R7, #1Fh, v_4

mov 30h, #6

mov 31h, #0

mov 32h, #0

sjmp mm

v_4:

mov R7, 21h

cjne R7, #0Fh, v_3

mov 30h, #4

mov 31h, #8

mov 32h, #0

sjmp mm

v_3:

mov R7, 21h

cjne R7, #7, v_2

mov 30h, #3

mov 31h, #6

mov 32h, #0

sjmp mm

v_2:

mov R7, 21h

cjne R7, #3, v_1

mov 30h, #2

mov 31h, #4

mov 32h, #0

sjmp mm

v_1:

mov R7, 21h

cjne R7, #1, mm

mov 30h, #1

mov 31h, #2

mov 32h, #0

sjmp mm

; R3-номер текущего отображаемого индикатора

m_TF0: ;обработка прерывания по 1-му таймеру

mov TH0, #HIGH(NOT(1428))

mov TL0, #LOW(NOT(1428))

;изменение визуальных значений мощности и времени

mov23h, R3

movC, 18h

movP3.3, C

movC, 19h

movP3.4, C

movC, 1Ah

movP3.5, C

cjneR3, #0, m_1; если она не 0, то переходим на m_1

movA, 30h ;вывод цифры на соответствующий индикатор

addA, #40h

movR0, A

movP1, @R0

sjmpm_end

m_1:cjneR3, #1, m_2

movA, 31h

addA, #40h

movR0, A

movP1, @R0

sjmpm_end

m_2:cjneR3, #2, m_3

movA, 32h

addA, #40h

movR0, A

movP1, @R0

sjmpm_end

m_3:cjneR3, #3, m_4

movA, 33h

addA, #40h

movR0, A

movP1, @R0

sjmpm_end

m_4:cjneR3, #4, m_5

movA, 34h

addA, #40h

movR0, A

movP1, @R0

sjmpm_end

m_5:cjneR3, #5, m_6

movA, 35h

addA, #40h

movR0, A

movP1, @R0

sjmpm_end

m_6:movA, 36h

addA, #40h

movR0, A

movP1, @R0

m_end:

jbP3.2, key ;

mov 50h, R3 ; Опрос клавиатуры

sjmpm_13 ; в 50h - код полученной кнопки

key: mov 50h, #80h

m_13:

movR6, 50h

cjne R6, #80h, m_20

ljmp m_11

m_20:

movR6, 50h

cjneR6, #0h, m_21 ;обработка кнопки + время

jbTR1, m_11

movR6, 55h

cjneR6, #240, m_30

sjmpm_11

m_30:

movR6, 56h

cjneR6, #10, mw

inc55h

sjmpm_11

mw:

mov56h, #10

sjmpm_11

m_21:

movR6, 50h

cjneR6, #1h, m_22 ;обработка кнопки + мощность

movA, 21h ; проверка тек. состояния мощности

anlA, #00010000b ; если максимальное,

cjneA, #10000b, m_31 ; то игнорируем

sjmpm_11

m_31:setbC

movA, 21h

RLCA

mov21h, A

sjmpm_11

m_22:

movR6, 50h

cjneR6, #2h, m_23 ; обработка кнопки - мощность

movR6, 21h

cjneR6, #1h, m_32 ; тек. мощность минимальна?

sjmpm_11

m_32:clrC

movA, 21h

RRCA

mov21h, A

sjmpm_11

m_23:

movR6, 50h

cjneR6, #3h, m_24 ; обработка кнопки старт

jbTR1, m_11

movR6, 55h

cjneR6, #0, m_33

movR6, 56h

cjneR6, #0, m_33

sjmpm_11

m_33: movTL1, #LOW(NOT(50000))

movTH1, #HIGH(NOT(50000))

setbTR1

clrP3.0

sjmpm_11

m_24: ; Обработка кнопки стоп

jbTR1, m_34

mov55h, #0h

mov56h, #0h

mov57h, #40

mov22h, #00010000b

sjmpm_11

m_34: clrTR1

setbP3.0

m_11:incR3

cjneR3, #7, m_12

movR3, #0

m_12:reti

m_TF1:

movTH1, #HIGH(NOT(50000))

movTL1, #LOW(NOT(50000))

movA, 21h

anlA, 22h

cjneA, #0, iz_0

setbP3.1

sjmpdc

iz_0:clrP3.1

dc:dec57h ;декремент байта осчета 2-х секунд

movR5, 57h

cjneR5, #20, t_1 ;если 20 то надо -1с

dec56h

sjmpt_end

t_1:

movR5, 57h

cjneR5, #0, t_end ;если 0 то смена шага + проверка на окончание работы и пр.

dec56h

movR5, 22h

cjneR5, #1, t_10

mov22h, #00010000b

movR5, 55h

cjneR5, #0, t_2 ; проверка на 0 интервалов по 10 с

clrTR1

mov22h, #00010000b

setbP3.0

setbP3.1

sjmpt_end

t_2:dec55h

mov56h, #10

sjmpt_11

t_10:movA, 22h ;

RRA

mov22h, A

t_11:mov57h, #40

t_end:

movA, 55h

movR5, 56h

cjneR5, #10, d__

incA

mov36h, #0

sjmpd_1

d__:mov36h, 56h

d_1:movB, #6

divAB

mov35h, B

movB, #6

divAB

mov34h, B

mov33h, A

reti

END