8. «Микропроцессоры», Учебное пособие в 5-ти книгах, под редакцией В.А. Шахнова, Москва «Высшая школа», 1988.
9. www.microprocessor.by.ru „Програмування мікроконтроллера”
10. www.atmel.ru
ДОДАТКИ
Додаток 2
#DEFINE Z_SUP
#DEFINE LO(XXX) XXX & 0FFH
#DEFINE HI(XXX) (XXX >> 8) & 0FFH
CLK_KHZ = 10000 ;OSC частота, KГц
RTC_MS = 20 ;системний годинник, мс
RTCV = CLK_KHZ*RTC_MS
RTCV = RTCV/12
RTCV = - RTCV
RTCV = RTCV & 0FFFFH
; ------ Константи ------
STACK .EQU 056H ;розміщення стеку
V100MS .EQU 5 ;значення програмного таймера RTPCS 100mS/20mS=5
I2C_ADDR .EQU 0A0H ;I2C адреси для PCF8582 (A0,A1,A2=0)
SMPTMV .EQU 5 ;x20mS значення таймера термометрів
INKTMV .EQU 35 ;x20mS початкове ключове значення таймера повторення
KEYTMV .EQU 5 ;x20mS ключове значення таймера повторення
BRKTMV .EQU 2 ;x20mS ключове значення яскравості таймера повторення
TMOV20 .EQU 25 ;x20mS вихідне часове значення для DS1820
TMOV21 .EQU 100 ;x20mS вихідне часове значення для DS1821
INDTMV .EQU 50 ;x20mS значення затримки індикації
OFFTMV .EQU 50 ;x100mS вихідне значення затримки
PWM_MAX .EQU 230 ;MAX PWM значення
L_MAX .EQU 09AH ;MAX вхідна та вихідна межа
L_MIN .EQU 001H ;MIN вхідна та вихідна межа
; ------ Порти ------
SCAN0 .EQU P3.0 ;лінія сканування дисплею 0
SCAN1 .EQU P3.1 ;лінія сканування дисплею 1
SCAN2 .EQU P3.5 ;лінія сканування дисплею 2
SDA .EQU SCAN0 ;I2C SDA лінія
SCL .EQU SCAN1 ;I2C SCL лінія
OWP1 .EQU P3.2 ;1-порт 1 (зовнішній термометр)
OWP2 .EQU P3.7 ;1-порт 2 (внутрішній термометр)
RETL .EQU P3.4 ;лінія повернення клавіатури
CNTRL .EQU P3.3 ;лінія керування термостатом
;--------Змінні, бітова адресація, зовнішні дані---------------
PWVH .EQU R20 ;значення таймера PWM (в виключеному стані) high
PWVL .EQU R21 ;значення таймера PWM (в виключеному стані) low
PHVH .EQU R22 ;значення таймера PWM (у включеному стані) high
PHVL .EQU R23 ;значення таймера PWM (у включеному стані) low
RTPCS .EQU 021H ;програмний лічильник реального часу (100мс)
EXT_TH EQU 03CH ;дані від зовнішнього термометра (00H-відсутній, 20H-DS1820, 21H-DS1821)
INT_TH EQU 03DH ;дані від внутрішнього термометра (00H-відсутній, 20H-DS1820, 21H-DS1821)
SAVTM .EQU 046H ;збереження таймера затримки NVM
NOTSV .EQU 023H ;незбереження в NVM
OFFTM .EQU 049H ;відключення таймера
ACHTM .EQU 048H ;автозмінювання таймера
ACHR .EQU 028H ;автозмінювання EXT/INT
; ------ Основна програма ------
INIT: MOV SP,#STACK ;ініціалізація стеку
CLR A
MOV KEYTM,A ;обнулення ключового таймера повторення
MOV EXT_TH,A ;обнулення зовнішнього термометра
MOV INT_TH,A ; обнулення внутрішнього термометра
MOV OFFTM,#OFFTMV ;завершення завантаження таймера
ACALL GETPWM ;одержання значень PWM таймера
MOV ACHTM,ACHR
MOV TMOD,#11H ;ініціалізація таймера 0 та таймера 1
MOV TL0,#LO(RTCV) ;завантаження таймера 0
MOV TH0,#HI(RTCV)
MOV TL1,PHVL ;завантаження таймера 1
MOV TH1,PHVH
MOV RTPCS,#V100MS ;завантаження значення 100мс
SETB PT1 ;ініціалізація пріоритетів таймерів (0–low, 1 - high)
MOV IE,#8AH ;ініціалізація дозволу таймерів (ET0,ET1,EA=1)
ACALL AD_EXT ;автовизначення та запуск зовнішнього термометра
ACALL AD_INT ;автовизначення та запуск внутрішнього термометра
MOV SMPTM,#SMPTMV ;завантаження таймера зразка термометрів
MAIN: MOV A,INCODE ;місцева перевірка клавіатури
CPL A
JNZ MA10 ;стрибок, якщо є натискання
CLR FEN
CLR PRESS
SJMP MA20 ;стрибок, якщо немає натискання
MA10: MOV B,A ;зберігання коду клавіатури
ACALL DEL10 ;затримка доносу
MOV A,INCODE ;зчитування коду клавіатури
CPL A
CJNE A,B,MA20 ;відсутність натискання при відмінності кодів
MOV R7,A
MOV OFFTM,#OFFTMV ;завершення завантаження таймера
JB PRESS,SAME
;Аналіз контрольних функцій
DIF: CJNE R7,#KEY_SL,$+5H ;KEY SELECT
ACALL SEL
CJNE R7,#KEY_EX,$+5H ;KEY EXT/INT
ACALL EXT
SAME:CJNE R7,#KEY_UP,$+5H ;KEY UP
ACALL UP
CJNE R7,#KEY_DN,$+5H ;KEY DOWN
ACALL DN
CJNE R7,#KEY_UD,$+5H ;KEY UP+DOWN
ACALL UPDN
SETB PRESS ;встановлення натискання
;Завершення аналізу контрольних функцій
MA20: MOV A,SMPTM ;перевірка зразкового таймеру
JNZ MA24 ;стрибок, якщо немає таймерного переповнення
MOV SMPTM,#SMPTMV ;перезавантаження таймеру
ACALL CH_EXT ;перевірка зовнішнього термометра
JNZ MA21 ;стрибок, якщо „готово”
JNZ MA22
SJMP MA23 ;перехід до автовизначення
MA21: ACALL RD_EXT ;зчитування з зовнішнього термометра
ACALL LIM_CHK ;управління термостатом
MA23: ACALL AD_EXT ;автовизначення та старт
MA22: ACALL CH_INT ;перевірка зовнішнього термометра
JNZ MA25 ;стрибок, якщо „готово”
JNZ MA24
SJMP MA26 ;перехід до автовизначення
MA25: ACALL RD_INT ;зчитування з внутрішнього термометра
MA26: ACALL AD_INT ;автовизначення та старт
MA24: JB IND_SET,MA33 ;стрибок при встановленні моди
MOV A,ACHR
CLR C
SUBB A,#MIN_RT
JC MA40 ;стрибок при ACHR<MIN_RT
MOV A,ACHTM
JNZ MA40
MOV ACHTM,ACHR ;заміна перезавантаження таймера
CPL IND_INT
SJMP MA40
MA33: MOV A,DELTM ;перевіркаDELTM
JNZ MA40 ;стрибок, якщо немає таймерного переповнення
JBC IND_TH1,MA30 ;стрибок при індикації термометра 1
JBC IND_TH0,MA31 ;стрибок при індикації термометра 0
SJMP MA40
MA30: SETB IND_ONL ;встановлення ініціалізації межі
SJMP MA32
MA31: SETB IND_OFL
MA40: MOV A,SAVTM
JNZ MA100 ;стрибок, якщо немає збереженого таймерного переповнення
MOV A,NOTSV
JZ MA50 ;збереження пропуску за умови збереження всіх параметрів
ACALL SAVE
SJMP MA100
MA50: MOV A,OFFTM
JNZ MA100
MOV OFFTM,#OFFTMV ;завершення завантаження таймера
CLR RETL ;генерація імпульса 50mS
ACALL DEL50
SETB RETL
AJMP MAIN
.END