Разработка термометра с автоматическим контролем температуры на базе микроконтроллера AТ90S2313 с применением термостата DS1620

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

***************

; программа переводит температуру в зависимости от режима

; и выводит на индикатор для индикации

; calckterm

outTmax:

movfbinL,TMAXL

movfbinH,TMAXH

rjmpoutterm

outTmin:

movfbinL,TMAXL

movfbinH,TMAXH

rjmpoutterm

calckterm:

movtemp,tmode

rcallSTRLCD

movfbinL,TNORML

movfbinH,TNORMH

cpitmode,1

breqoutTmin

cpitmode,2

breqoutTmax

lditemp,0xb

outterm:

ldiZH,high(DLCD+5)

ldiZL,low(DLCD+5)

lditemp2,0xb

sbrsfbinH,0

lditemp2,0x10

;lditemp3,0

;subtemp3,temp2

;rortemp3

stZ+,temp2

incZL

incZL

lditemp2,5

sbrsfbinL,0

lditemp2,0

stZ+,temp2

ldifbinH,0

clc

rorfbinL

rcallbin16BCD5

movtemp3,fbinH

movtemp2,fbinL

swaptemp2

anditemp3,0xf

anditemp2,0xf

anditemp,0xf

rcallgetcod

movtemp1,temp

set

bsttemp1,4

movtemp,temp2

rcallgetcod

movtemp2,temp

movtemp,temp3

rcallgetcod

movtemp3,temp

ldiZH,high(DLCD+6)

ldiZL,low(DLCD+6)

stZ+,temp3

stZ+,temp2

stZ+,temp1

rcallLCDOUT

;*************************************************************************

; программа возвращает код символа для индикатора

; значение temp заменяется на значение необходимое для отображения на

; индикаторе и оно помещается назад в ячейку temp

getcod:

ldiZH,high(LCDCG*2)

ldiZL,low(LCDCG*2);init Z-pointer

addZL,temp

lpm;get constant

movtemp,r0

ret

;*************************************************************************

; данные для отображения на индикаторе

LCDCG:;типкод

.DB 0xEE;число 0

.DB 0x60;число 1

.DB 0x2F;число 2

.DB 0x6D;число 3

.DB 0xE1;число 4

.DB 0xCD;число 5

.DB 0xCF;число 6

.DB 0x68;число 7

.DB 0xEF;число 8

.DB 0xED;число 9

.DB 0x10;символ. a

.DB 0x01;символ - b

.DB 0x87;символ t c

.DB 0x46;символ u d

.DB 0x67;символ d e

.DB 0x07;символ c f

.DB 0x00;символ blanck 10 пустой символ

;строка tc-

tcstr:

.DB 0x0c,0x0f,0x0b,0x10

;строка tu-

tustr:

.DB 0x0c,0x0d,0x0b,0x10

;cтрока td-

tdstr:

.DB 0x0c,0x0e,0x0b,0x10

;*************************************************************************

;*

;* PROGRAM RESET - главная программа

;*

;*************************************************************************

 

RESET:

lditemp,low(RAMEND)

outSPL,temp; настройка стека на верх памяти данных

rcall port_set; настроить порты

rcallCLRLCD

;*************************************************************************

;*

;* mainloop - главный цикл программы

;*

;*************************************************************************

mainloop:

lditemp1,250

movr5,temp1

mainloop1:

rcallKEYPRESS;определения нажатия кнопки

brnekeyis; переход если хотябы одна кнопка нажата

rjmpreturnin;возврат к основному цыклу

keyis:

lditemp1,250

movr5,temp1

cpitemp,1

rcallkey1press

cpitemp,2

rcallkey2press

cpitemp,3

rcallkey3press

returnin:

lditemp1,0xaa; чтениее текущей температуры термостата

rcallTERMIN

lditemp2,0xaa; инициализация термостата

rcallTERMIN

movTNORML,temp

movTNORMH,temp1

rcallcalckterm; расчет температуры

decr5

brnemainloop1; после ожиданжжия в течении минуты

lditmode,0; возвратиться в основной режим

rjmpmainloop

;*************************************************************************

;* обработка клавиши режима

key1press:

andtmode,tmode

brnek1setmax

dectmode

rjmpkeyret

k1setmax:

lditemp,2

movtmode,temp

keyret:

rcallcalckterm

rjmpKEYUP

;*************************************************************************

;* обработка клавиши изменения значения вверх

key2press:

cpitmode,1

brnekey2min

cpitmode,2

brnekey2max

rjmpkeyret

key2min:

sbrsTMINH,0

rjmpkey2minm

incTMINL

brmikey2mins

rjmpkeyret

key2mins:

ldiTMINH,0

rjmpkeyret

key2minm:

cpiTMINL,0xfa

brmikeyret

incTMINL

rjmpkeyret

key2max:

sbrsTMAXH,0

rjmpkey2maxm

incTMINL

brmikey2maxs

rjmpkeyret

key2maxs:

ldiTMAXH,0

rjmpkeyret

key2maxm:

cpiTMAXL,0xfa

brmikeyret

incTMAXL

rjmpkeyret

 

;*************************************************************************

;* обработка клавиши изменения значения вниз

key3press:

cpitmode,1

brnekey3min

cpitmode,2

brnekey3max

rjmpkeyret

key3min:

sbrcTMINH,0

rjmpkey3minm

decTMINL

brmikey3mins

rjmpkeyret

key3mins:

ldiTMINH,1

rjmpkeyret

key3minm:

cpiTMINL,0x92

brmikeyret

decTMINL

rjmpkeyret

key3max:

sbrcTMAXH,0

rjmpkey3maxm

decTMAXL

brmikey3maxs

rjmpkeyret

key3maxs:

ldiTMAXH,1

rjmpkeyret

key3maxm:

cpiTMAXL,0x92

brmikeyret

decTMAXL

rjmpkeyret

 

;*************************************************************************

;1. Текст программы "bin16BCD5"- преобразование 16-битного двоичного

;значения в упакованный BCD формат

;*************************************************************************

;* Количество слов кода:25 + возврат

;* Количество циклов:25/176 (Мин/Макс) + возврат

;* Использованные младшие регистры:нет

;* Использованные старшие регистры:4(fbinL,fbinH/tBCD0,tBCD1,tBCD2)

;* Использованные указатели:нет

;*************************************************************************

;***** Регистровые переменные подпрограммы

.def fbinL =r16;двоичное значение, младший байт

.def fbinH =r17;двоичное значение, старший байт

.def tBCD0 =r17;BCD значение, цифры 1 и 0

.def tBCD1 =r18;BCD значение, цифры 3 и 2

.def tBCD2 =r19;BCD значение, цифра 4

;Примечание: Переменные fbinH и tBCD0 должны размещаться в одном

;регистре.

;***** Код

;*************************************************************************

bin16BCD5:

ldi tBCD2, -1

bin16BCD5_loop_1:

inc tBCD2

subi fbinL, low(10000)

sbci fbinH, high(10000)

brsh bin16BCD5_loop_1

subi fbinL, low(-10000)

sbci fbinH, high(-10000)

ldi tBCD1, -0x11

bin16BCD5_loop_2:

subi tBCD1, -0x10

subi fbinL, low(1000)

sbci fbinH, high(1000)

brsh bin16BCD5_loop_2

subi fbinL, low(-1000)

sbci fbinH, high(-1000)

bin16BCD5_loop_3:

inc tBCD1

subi fbinL, low(100)

sbci fbinH, high(100)

brsh bin16BCD5_loop_3

subi fbinL, -100

ldi tBCD0, -0x10

bin16BCD5_loop_4:

subi tBCD0, -0x10

subi fbinL, 10

brsh bin16BCD5_loop_4

subi fbinL, -10

add tBCD0, fbinL

ret

;*************************************************************************