'-------------------------- Описание проекта ---------------------------------
'Проект :Quartz analog 'Автор : MasterPIC
'
'Версия : 1.0.0 от 08.06.2009
'
'Описание : Определение влажности продукции путем выпаривания
' влаги при определенной температуре определенное
' время и взвешивании
'
'-------------------------- Опции компилятора --------------------------------
EData 160,5 'Запись начальных данных(температуры и времени в минутах) в EEPROM
Declare SHOW_SYSTEM_VARIABLES = OFF 'При симуляции в Proteus не показывать внутренние переменные
Declare FSR_CONTEXT_SAVE = On 'Не заботиться о сохранении содержимого регистра FSR
Declare REMINDERS = Off 'Выключить напоминания компилятора
Declare WARNINGS = On 'Выключить предупреждения компилятора
Declare OPTIMISER_LEVEL 4 ' Включить оптимизацию программы
;-------------------------- Общие настройки------------------------------------
Device = 16F877A ' Используемый микроконтроллер
XTAL = 4 ' Частота осциллятора 4 МГц
'-------------------------- Конфигурация программирования --------------------
Config HS_OSC, WDT_OFF,BODEN_OFF,PWRTE_ON,CP_OFF, LVP_OFF
'-------------------------- Настройки АЦП ------------------------------------
Declare ADIN_RES 10 ' Разрядность результата преобразования АЦП
Declare ADIN_TAD FRC ' Источник тактирования АЦП
Declare ADIN_STIME 100 ' Время на подготовку АЦП к новому измерению
'-------------------------- Настройки портов ---------------------------------
'-------------------------- Регистры специального назначения-------------------
'-------------------------- OPTION_REG ----------------------------------------
Symbol< PS0 = OPTION_REG.0 ' Бит установки предделителя TMR0
Symbol PS1 = OPTION_REG.1 ' Бит установки предделителя TMR0
Symbol PS2 = OPTION_REG.2 ' Бит установки предделителя TMR0
Symbol PSA = OPTION_REG.3 ' Выбор включения предделителя
Symbol T0SE = OPTION_REG.4 ' Выбор фронта приращения TMR0 при внешнем тактовом сигнале
Symbol T0CS = OPTION_REG.5 ' Выбор тактового сигнала для TMR0
Symbol INTEDG = OPTION_REG.6 ' Выбор активного фронта сигнала на входе внешнего прерывания INT
Symbol NOT_RBPU = OPTION_REG.7 ' Включение подтягивающих резисторов на PORTB
'-------------------------- INTCON --------------------------------------------
Symbol RBIF = INTCON.0 ' Флаг внешнего прерывания по PORTB.4-PORTB.7
Symbol INTF = INTCON.1 ' Флаг внешнего прерывания по PORTB.0(INT)
Symbol T0IF = INTCON.2 ' Флаг переполнения TMR0
Symbol RBIE = INTCON.3 ' Бит разрешения прерывания по PORTB.4-PORTB.7
Symbol INTE = INTCON.4 ' Бит разрешения прерывания по PORTB.0(INT)
Symbol T0IE = INTCON.5 ' Бит разрешения прерывания по переполнению TMR0
Symbol PEIE = INTCON.6 ' Бит разрешения прерывания от периферийных устройств
Symbol GIE = INTCON.7 ' Бит глобального разрешения прерываний
'-------------------------- PIE1, PIR1 ----------------------------------------------
Symbol TMR1IE = PIE1.0 ' Бит разрешения прерывания по переполнению TMR1
Symbol TMR1IF = PIR1.0 ' Флаг прерывания по переполнению TMR1
'-------------------------- T1CON ---------------------------------------------------
Symbol TMR1ON = T1CON.0 ' Бит включения модуля TMR1
Symbol TMR1CS = T1CON.1 ' Выбор источника тактового сигнала для TMR1
Symbol NOT_T1SYNC = T1CON.2 ' Синхронизация внешнего тактового сигнала
Symbol T1INSYNC = T1CON.2 ' Синхронизация внешнего тактового сигнала
Symbol T1SYNC = T1CON.2 ' Синхронизация внешнего тактового сигнала
Symbol T1OSCEN = T1CON.3 ' Включение тактового генератора TMR1
Symbol T1CKPS0 = T1CON.4 ' Выбор коэффициента деления предделителя TMR1
Symbol T1CKPS1 = T1CON.5 ' Выбор коэффициента деления предделителя TMR1
'-------------------------- ADCON0 -------------------------------------------------
Symbol ADON = ADCON0.0 ' Включение модуля АЦП
Symbol NOT_DONE = ADCON0.2 ' Статус модуля АЦП
Symbol GO_DONE = ADCON0.2 ' Статус модуля АЦП
Symbol CHS0 = ADCON0.3 ' Выбор аналогового канала
Symbol CHS1 = ADCON0.4 ' Выбор аналогового канала
Symbol CHS2 = ADCON0.5 ' Выбор аналогового канала
Symbol ADCS0 = ADCON0.6 ' Выбор источника тактового сигнала
Symbol ADCS1 = ADCON0.7 ' Выбор источника тактового сигнала
'-------------------------- ADCON1 -------------------------------------------------
Symbol PCFG0 = ADCON1.0 ' Настройка каналов АЦП
Symbol PCFG1 = ADCON1.1 ' Настройка каналов АЦП
Symbol PCFG2 = ADCON1.2 ' Настройка каналов АЦП
Symbol PCFG3 = ADCON1.3 ' Настройка каналов АЦП
Symbol ADFM = ADCON1.7 ' Формат результата преобразования
'-------------------------- Определение переменных ---------------------------
Dim BIG As DWord 'переменная для счета секунд
Dim BIG1 As BIG.HighWord
Dim RESULT As Word 'переменная для результата преобразования
Dim SRED As DWord
Dim MODE As Byte 'переменная значения режима работы
Dim COUNT_1 As Byte 'счетчик 1
Dim COUNT_2 As Byte 'счетчик 2
Dim COUNT_3 As Byte 'счетчик 3
Dim COUNT_4 As Byte 'счетчик 4
Dim DIGIT As Byte 'переменная для результата преобразования в 7-сегм. код
Dim SECUNDA As Byte 'переменная для значений секунд
Dim TEK_TEMP As Word 'переменная для хранения значения текущей температуры
Dim TEK_TIME As Byte 'переменная для хранения текущего времени
Dim SET_TEMP As Byte 'переменная для хранения установленного времени
Dim SET_TIME As Byte 'переменная для хранения установленного времени
Dim FLAGS As Byte 'Переменная хранения флагов
Dim adrTEMP As Byte 'Временная переменная для адреса записи
Dim VREMVAR As Byte 'Временная переменная
Dim UPDIAP As Byte 'Верхний диапазон для подпрограммы отображения установки
Dim DOWNDIAP As Byte 'Нижний диапазон
Dim tempdisp As Word 'Временная переменная
Dim temper As Byte 'Временная переменная
Dim flpress As Byte 'Флаг, указывающий на то, что была нажата кнопка
Dim rate As Byte 'Переменная заполнения ШИМ
Dim S_EN As Bit 'Флаг, разрешающий преобразование АЦП
Dim B_EN As Bit 'Флаг
Dim N_EN As Bit 'Флаг остановки отсчета
Dim AD_Result As Word 'Переменная для усреднения
Dim Average As Word 'Переменная для усреднения
Dim TEMPER_TEMP As Byte
Dim Samples As Byte
'-------------------------- Определение символов -----------------------------
Symbol LED = PORTC.0 'светодиод режима работы
Symbol POWER = PORTC.2 'управление нагрузкой
Symbol TEMPLED = PORTE.0 'светодиод показа температуры
Symbol TIMELED = PORTE.1 'светодиод показа времени
Symbol UP = PORTB.5 'кнопка "вверх"
Symbol DOWN = PORTB.6 'кнопка "вниз"
Symbol START_BUTTON = PORTB.7 'кнопка запуска
Symbol MODE_BUTTON = PORTB.0 'кнопка режима работы
Symbol WORK_MODE = MODE.0 'рабочий режим отображения
Symbol SET_TEMP_MODE = MODE.1 'режим установки температуры
Symbol SET_TIME_MODE = MODE.2 'режим установки времени
Symbol START = FLAGS.0 'Флаг, оповещающий о том, что начат отсчет времени
Symbol TIME_OR_TEMP = FLAGS.1 'Флаг, указывающий на текущий режим отображения
Symbol SETUP = FLAGS.2 'Флаг режима установок
Symbol EN_START = FLAGS.3 'Флаг набранной температуры
Symbol BUT_INT = FLAGS.4 'Флаг нажатой кнопки переключения режимов
Symbol BUT_START = FLAGS.5 'Флаг нажатой кнопки запуска
Symbol SEC = FLAGS.6 'Флаг, устанавливающийся при отсчете одной минуты
Symbol ad_action = ADCON0.2 'Бит запуска АЦП
'-------------------------- Начало -------------------------------------------
Clear 'Очистим все регистры
'-------------------------- ADCON0, ADCON1 -----------------------------------
'AN7-AN1 - цифровые порты ввода/вывода. AN0 - аналоговый вход. Vref+ = Vdd, Vref- = Vss.
ADCON0 = %11000001 ' Значение регистра ADCON0 для выбранного режима работы АЦП
ADCON1 = %10001110 ' Значение регистра ADCON1 для выбранного режима работы АЦП
'-------------------------- Настройка TMR0 для прерываний --------------------
OPTION_REG = %00000111
TMR0 = $00' Значение регистра TMR0 для формирования секундных интервалов по
'алгоритму Брезенхэма. Точность данного метода у меня составил 2 секунды за 10 мин
T0IE = 1 ' Разрешение прерывания при переполнении TMR0 с частотой 15,25878906 Гц
'-------------------------- Настройка TMR1 для прерываний --------------------
TMR1L = $DC ' Значение младшего регистра TMR1 для полусекундных интервалов
TMR1H = $0B ' Значение старшего регистра TMR1 для полусекундных интервалов
T1CON = %00110000 'Значение регистра T1CON для выбранного режима работы
TMR1IE = 1 ' Разрешение прерывания при переполнении TMR1 с частотой 2 Гц
SET_TEMP = ERead 0 'Считаем установленную ранее температуру
SET_TIME = ERead 1 'Считаем установленное ранее время
TEK_TIME = SET_TIME
TRISA = %00000001 'PORTA.0 - на вход. Меряем по нулевому каналу
TRISB = %11100001 'Одна кнопка PORTB.0 - на переключение режимов и три на
'установку и запуск
TRISC = %00000000 'PORTC - на выход. См. схему
TRISD = %00000000 'Управление сегментами индикатора
TRISE = %00000000 'Управление светодиодами
PORTD = %00000000 'Выключим индикаторы
PORTC = %11100000 'Выключим индикаторы, звук и нагрев
PORTE = %00000000 'Выключим светодиоды
BIG = 1000000 ' Запишем в BIG 1000000 для отсчета секундных интервалов
FLAGS = 0 'Сбросим все флаги
MODE = 1 'Включим режим попеременного отображения времени и температуры
PEIE = 1 ' Разрешение прерываний от периферийных устройств
GIE = 1 ' Разрешение глобального прерывания
TMR1ON= 1 'Запустим TMR1 для формирования полусек. интервалов
On_Interrupt Goto Int_Label 'При прерывании переходим на Int_Label
@ reset ;Сброс
Goto MainProgram 'На начало программы
'-------------------------- Подпрограмма прерывания--------------------------
Int_Label:
Context Save 'Сохраним значения системных регистров
'################### Расчет секундного интервала ############################
If T0IF = 1 Then 'Если сработал TMR0, то
big1 = big1 -1 ' отнимаем единицу из старшего байта переменной BIG1
'то же самое, что и вычесть 65536 из BIG , но занимает меньше места
If BIG < 0 Then 'Если BIG < 0 то значит прошла секунда
BIG = BIG + 1000000 'К этому отрицательному числу прибавляем 1000000
SECUNDA = SECUNDA + 1 'Инкрементируем секунды и устанавливаем
S_EN = 1 'флаг, разрешающий преобразование АЦП
Endif
T0IF = 0 'Сбросим флаг прерывания
Endif
'################### Нажатие кнопки "Режим" #################################
If INTF = 1 Then 'Если нажата кнопка переключения режимов
BUT_INT = 1 ' то установим флаг
INTF = 0 'Сбросим флаг прерывания
Endif
'#################### Расчет полусекундного интервала ######################
If TMR1IF = 1 Then 'если сработал TMR1, то значит прошло полсекунды
If START = 1 Then 'если запущен режим отсчета времени, то
Toggle LED 'индицируем этот режим миганием красного светодиода
Endif
If SET_TEMP_MODE = 1 Then 'Если в данный момент режим установки температуры,
Clear TIMELED 'то погасим светодиод времени
Toggle TEMPLED 'и мигаем светодиодом температуры
Endif
If SET_TIME_MODE = 1 Then 'Если же в данный момент режим установки времени,
Clear TEMPLED 'то погасим светодиод температуры
Toggle TIMELED ' и мигаем светодиодом времени
Endif
TMR1L = $DC ' Значение младшего регистра TMR1 для полусекундного интервала
TMR1H = $0B ' Значение старшего регистра TMR1
TMR1IF = 0 'сбросим флаг прерывания
Endif
Context Restore 'Вернем системные регистры к состоянию, которое было до входа
'прерывание
'-------------------------- Главная программа -------------------------
MainProgram:
If EN_START = 1 And START = 0 Then 'Если набрана температура и не запущен
'отсчет, то
If START_BUTTON = 0 Then 'если нажата кнопка запуска,
DelayMs 100 'устраняем дребезг
If START_BUTTON = 0 Then 'и если она все-то нажата,
If SETUP = 0 Then 'то если мы не в режиме установки
START = 1 'то устанавливаем флаг отсчета
TMR1ON= 0 'остановим TMR1
TMR1L = $DC ' Запишем значение младшего регистра TMR1
TMR1H = $0B ' Запишем значение старшего регистра TMR1
TMR1IE = 1 'Разрешим прерывания от TMR1
TMR1ON= 1 ' Запустим TMR1
SECUNDA = 0 'Секунды - в ноль
INTE = 0 'Запретим прерывания от кнопки переключения режимов
SEC = 0 'флаг минут - в ноль
Endif
Endif
Endif
Endif
If SECUNDA = 60 Then
SECUNDA = 0 'Если прошла минута, то секунды - в ноль
SEC = 1 'Устанавливаем флаг, что прошла минута
Endif
If BUT_INT = 1 Then 'Если была нажата кнопка выбора режимов
DelayMs 200 'то вводим некоторую задержку и устраняем дребезг
If START = 0 Then 'Если не запущен отсчет времени
MODE = MODE << 1 'то переключаем режим работы на следующий
If MODE >= 8 Then MODE = 1 'Всего три режима, и поэтому, если
'включается четвертый, то переходим на первый
Pulsout PORTC.3, 350, High 'Звуковое подтверждение нажатия
Endif
If SETUP = 1 And UP = 1 And DOWN = 1 Then ' Если мы входили в режим
'установки и не жмем ни одной кнопки в данный момент, то
EWrite adrTEMP,[VREMVAR] 'перепишем новые значения в EEPROM
SETUP = 0 'сбросим флаг режима установки
Endif
SECUNDA = 0 'Сбросим секунды на ноль
BUT_INT = 0 'сбросим флаг нажатия кнопки переключения режимов
Endif
Select SECUNDA
Case 0,7,14,21,28,35,42,49,56 'Пять секунд - на отображение температуры
TIME_OR_TEMP = 1
Case 5,12,19,26,33,40,47,54,59 'И две секунды на отображение времени
TIME_OR_TEMP = 0
EndSelect
If S_EN = 1 Then 'Если прошла секунда, то начинаем преобразование
Average = 0 'Сбросим переменную для подсчета среднего значения
AD_Result = TEK_TEMP 'Запишем предыдущее значение текущей температуры
For Samples = 0 To 9 'Десять раз
ad_action =1 ' запускаем преобразование
While ad_action=1 'если преобразование окончено
Wend
RESULT.HighByte = ADRESH 'считываем результат преобразования
RESULT.LowByte = ADRESL ' переменную RESULT
Average = Average + RESULT 'Складываем все значения в переменную Average
Next
TEK_TEMP = ((Average/10) */ 1250)/10 'Производим вычисления и делим на 10
AD_Result = (AD_Result + TEK_TEMP)/2 'Складываем со старым значением и
'делим на два
TEK_TEMP = AD_Result 'Получаем усредненное по максимуму значение температуры
Gosub Proverka 'Проверим термостатирование с новым значением
S_EN = 0 'Сбрасываем флаг разрешения преобразования
Clear PORTC.3 'Выключим пищалку, если она пищала при стабилизации температуры
Endif
If START = 1 Then 'Если запущен процесс отсчета, то
If MODE_BUTTON = 0 Then 'Если нажата кнопка переключения режимов
Inc flpress 'то отсчитываем за то время, пока она нажата
If flpress = 120 Then 'примерно 3 секунды
START = 0 'Если это время прошло и кнопка не отпускалась, то
N_EN = 0 'Останавливаем отсчет
PORTC.3 = 1 'Звуковой сигнал в динамик
DelayMs 100 'В течение 100 мС
PORTC.3 = 0
flpress = 0 'Сбросим в ноль
BUT_INT = 0 'Сбросим в ноль флаг нажатия кнопки режимов, на
'всякий случай
Endif
Else
flpress = 0 'Если кнопка отпускалась, то сбросим в ноль
Endif
Endif
If START = 1 Then 'Если запущен отсчет
WORK_MODE = 1 'то установим флаг рабочего режима №1
If SEC = 1 Then 'Если прошла минута
TEK_TIME = TEK_TIME - 1 'то вычитаем из текущего времени 1 минуту
If TEK_TIME = 0 Then 'Если текущее время кончилось, то
N_EN = 0 'Сбрасываем флаг конца счета
START = 0 'Сбрасываем флаг начала счета
INTE = 1 ' Разрешаем прерывания для переключения режимов
TEK_TIME = ERead 1 'Считываем установленное время
tempdisp = 0 'Временная переменная для отображения знаков [---]
For COUNT_4 = 1 To 5 'Издаем звуковой сигнал
PORTC.3 = 1 'Звук
For COUNT_3 = 1 To 30
Gosub SET_DISPLAY 'отображаем знаки [---]
Next
DelayMs 250 'Задержка для звука
PORTC.3 = 0 'Пауза
DelayMs 200 'Задержка для пауз звука
Next
Endif
SEC = 0 'Сбрасываем флаг минуты
Endif
Endif
'Нормальная работа
If WORK_MODE = 1 Then 'если включен нормальный режим
If TIME_OR_TEMP = 1 Then 'то, в зависимости от
Set TEMPLED 'секунд зажигаем светодиод температуры (5 сек)
Clear TIMELED 'и выключаем светодиод времени
tempdisp = TEK_TEMP 'во временную переменную - тек. температуру
Else
Set TIMELED 'или зажигаем светодиод времени (2 сек)
Clear TEMPLED 'и выключаем светодиод температуры
tempdisp = TEK_TIME 'во временную переменную - тек. время
Endif
For COUNT_1 = 1 To 12 'в течение 5 или 2 сек
Gosub SET_DISPLAY 'отображаем или время или температуру
Next
Endif
If SET_TEMP_MODE = 1 Then 'Если включен режим установки температуры, то
SETUP = 1 'устанавливаем флаг режима установки
VREMVAR = SET_TEMP 'во временную переменную - установленную температуру
UPDIAP = 200 'Максимальный диапазон установки температуры
DOWNDIAP = 100 'Минимальный диапазон установки температуры
adrTEMP = 0 'Адрес записи установленной температуры
Gosub BUTTON_STATE 'Проверяем нажатие кнопок установки (+ или -)
SET_TEMP = VREMVAR 'Возвращаем значение установленной температуры
tempdisp = SET_TEMP 'Во временную переменную - значение уст. температуры
For COUNT_1 = 1 To 12 'Отображаем
Gosub SET_DISPLAY 'установленную температуру
Next
Endif
If SET_TIME_MODE = 1 Then 'Если включен режим установки времени, то
SETUP = 1 'устанавливаем флаг режима установки
VREMVAR = SET_TIME 'во временную переменную - установленное время
UPDIAP = 20 'Максимальный диапазон установки времени
DOWNDIAP = 1 'Минимальный диапазон установки времени
adrTEMP = 1 'Адрес записи установленного времени
Gosub BUTTON_STATE 'Проверяем нажатие кнопок установки (+ или -)
SET_TIME = VREMVAR 'Возвращаем значение установленного времени
tempdisp = SET_TIME 'Во временную переменную - значение уст. времени
For COUNT_1 = 1 To 12 'Отображаем
Gosub SET_DISPLAY 'установленное время
Next
TEK_TIME = SET_TIME 'присваиваем текущему времени статус установленного
Endif
Goto MainProgram ' Возврат на начало основной программы
Proverka:
If START = 0 Then 'если не запущен отсчет времени, то
If TEK_TEMP <= SET_TEMP Then 'Если текущая температура меньше или равна установленной, то
temper = SET_TEMP - TEK_TEMP 'временная переменная содержит разницу между
'установленной и текущей температурой
Select temper 'В зависимости от этого значения
Case 30 To 200 'если разница составляет от 30 до 200 градусов
rate = 255 'то устанавливаем 100% заполнение ШИМ регулятора
Clear EN_START: Clear LED 'Темперетура не набрана, выключаем светодиод готовности
TEMPER_TEMP = 0 'сбрасываем на ноль переменную для стабилизации
Case 20 To 29 'Если разница от 20 до 29 градусов, то
rate = 191 'уменьшаем заполнение ШИМ
Clear EN_START: Clear LED 'Темперетура не набрана, выключаем светодиод готовности
TEMPER_TEMP = 0 'сбрасываем на ноль переменную для стабилизации
Case 15 To 19 'Если разница от 15 до 19 градусов, то
rate = 127 'устанавливаем ШИМ с 50% заполнения
Clear EN_START: Clear LED 'Темперетура не набрана, выключаем светодиод готовности
TEMPER_TEMP = 0 'сбрасываем на ноль переменную для стабилизации
Case 5 To 14 'Если разница от 5 до 14 градусов, то
rate = 64 'устанавливаем ШИМ с 25% заполнения
Clear EN_START: Clear LED 'Темперетура не набрана, выключаем светодиод готовности
TEMPER_TEMP = 0 'сбрасываем на ноль переменную для стабилизации
Case 2 To 4 'Если разница от 2 до 4 градусов, то
rate = 32 'устанавливаем ШИМ с 12,5% заполнения
Clear EN_START: Clear LED 'Темперетура не набрана, выключаем светодиод готовности
TEMPER_TEMP = 0 'сбрасываем на ноль переменную для стабилизации
Case 1 'Если разницав в 1 градус, то
rate = 12 'устанавливаем ШИМ с 5% заполнения
Set EN_START: Set LED 'Устанавливаем флаг набранной температуры и зажигаем светодиод
Inc TEMPER_TEMP 'Инкрементируем переменную для стабилизации
Case 0 'Если разницав в 0 градусов, то
rate = 7 'заполнение ШИМ - еще меньше
Set EN_START: Set LED 'Устанавливаем флаг набранной температуры
Inc TEMPER_TEMP 'Инкрементируем переменную для стабилизации
EndSelect
B_EN = 1 'Устанавливаем флаг о том, что требуется ШИМ
ElseIf TEK_TEMP > SET_TEMP Then 'Если текущая температура больше установленной, то
temper = TEK_TEMP - SET_TEMP 'временная переменная содержит разницу между
'текущей и установленной температурой
Select temper 'В зависимости от этого значения выбираем режим
Case 2 To 100 'Если разница от 2 до 100 градусов, то
Clear EN_START: Clear LED 'температура не набрана, гасим светодиод готовности
TEMPER_TEMP = 0 'сбрасываем на ноль переменную для стабилизации
Case 0 To 1 'Если разница от 0 до 1 градусов, то
Set EN_START: Set LED 'температура набрана, зажигаем светодиод
Inc TEMPER_TEMP 'Инкрементируем переменную для стабилизации
EndSelect
B_EN = 0 'Устанавливаем флаг о том, что ШИМ не требуется
Endif
Else 'Иначе, если запущен отсчет
If TEK_TEMP <= SET_TEMP Then 'и если тек. температура меньше установленной, то
temper = SET_TEMP - TEK_TEMP 'находим разницу между ними
Select temper 'В зависимости от этого значения выбираем режим
Case 30 To 200 'стабилизации
rate = 255 '100% заполнение ШИМ
Case 20 To 29
rate = 191 '75% заполнение ШИМ
Case 15 To 19
rate = 127 '50% заполнение ШИМ
Case 5 To 14
rate = 64 '25% заполнение ШИМ
Case 2 To 4
rate = 32 '12,5% заполнение ШИМ
Case 1
rate = 12 '5% заполнение ШИМ
Case 0
rate = 7 'Заполнение ШИМ еще меньше
EndSelect
B_EN = 1 'Иначе, если запущен отсчет
ElseIf TEK_TEMP > SET_TEMP Then 'если текущая температура больше установленной
B_EN = 0 'то ШИМ не требуется
Endif
Endif
If B_EN = 1 Then 'Если требуется ШИМ, то
HPWM 1,rate, 150 'запускаем с установленным заполнением и частотой 150 Гц
Else 'Если не требуется, то
HPWM 1,0,0 'выключаем ШИМ
Clear POWER 'выключаем нагрев
Endif
If TEMPER_TEMP = 120 And N_EN = 0 Then 'если прошло 2 минуты (120 сек), и счет не идет
'то значит температура стабилизировалась
Set PORTC.3 'Включим светодиод готовности
TEMPER_TEMP = 0 'Очистим переменную стабилизации
N_EN = 1 'Установим в единицу бит остановки счета
Endif
Return
Display:
PORTD = LookUp DIGIT,[63,6,91,79,102,109,125,7,127,111]
'Здесь выбираются значения кодов 7-сегментных индикаторов для отображения цифр
DelayMs 4 'Задержка для отображения
PORTD = 0 'Выключим индикатор
Return ' Возврат из подпрограммы
SET_DISPLAY:
PORTC.5 = 0 'Включим первый индикатор
PORTC.6 = 1 'Выключим второй индикатор
PORTC.7 = 1 'Выключим третий индикатор
DIGIT = Dig tempdisp, 2 'Извлекаем старшую цифру из временной переменной
Gosub Display
PORTC.5 = 1 'Выключим первый индикатор
PORTC.6 = 0 'Включим второй индикатор
PORTC.7 = 1 'Выключим третий индикатор
DIGIT = Dig tempdisp, 1 'Извлекаем среднюю цифру из временной переменной
Gosub Display
PORTC.5 = 1 'Выключим первый индикатор
PORTC.6 = 1 'Выключим второй индикатор
PORTC.7 = 0 'Включим третий индикатор
DIGIT = Dig tempdisp, 0 'Извлекаем младшую цифру из временной переменной
Gosub Display
Return 'Возврат
BUTTON_STATE:
If UP = 0 Then 'Если нажата кнопка "+"
Inc VREMVAR 'Прибавляем значение (температура или время)
If VREMVAR > UPDIAP Then VREMVAR = DOWNDIAP 'Если установка
'достигла верхнего предела, то переходим на нижний предел
Pulsout PORTC.3, 350, High 'Звуковое подтверждение нажатия
ElseIf DOWN = 0 Then 'Если нажата кнопка "-"
Dec VREMVAR 'то убавляем значение (температура или время)
If VREMVAR < DOWNDIAP Then VREMVAR = UPDIAP 'Если установка
'достигла нижнего предела, то переходим на верхний предел
Pulsout PORTC.3, 350, High 'Звуковое подтверждение нажатия
Endif
Return 'Возврат