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

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

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

def keyc=r21;Счетчик для прграммы обработки нажатия клавиши

.defTMIN=r22;ячейка с содержимым минимальной температуры термостата

.defTMINL=r22;младший

.defTMINH=r23;старший

.defTMAX=r24;ячейка с содержимым максимальной температуры термостата

.defTMAXL=r24;младший

.defTMAXH=r25;старший

.defTNORM=r26;ячейка с содержимым текущей температуры термостата

.defTNORML=r26;младший

.defTNORMH=r27;старший

.equDLCD=$66;стартовый адрес SRAM для буфера индикатора

;маладшая ячейка соответствует левому символу

;на дисплее

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

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

;биты портов

.equ K1=3;бит первой кнопки

.equ K2=4;бит второй кнопки

.equ K3=5;бит третьей кнопки

.equ WR1=5;бит WR1

.equ WR2=6;бит WR2

.equ A0=7;бит A0

.equ DQ=0;бит DQ канал данных термостата

.equ CLK=1;бит CLK канал синхронизации данных

 

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

;*

;* PROGRAM START - программа начинает выполняться с этого места

;*

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

.cseg

.org $0000

rjmp RESET;Reset handle

.org $0020

RETI

RETI

RETI

RETI

RETI

RETI

RETI

RETI

RETI

RETI

 

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

; настройка констант

SETCONST:

lditemp,20

movTMINL,temp

lditemp,0

movTMINH,temp

lditemp,25

movTMAXL,temp

lditemp,0

movTMAXH,temp

ret

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

; передача констант

OUTCONST:

movtemp,TMINl

movtemp1,TMINH

lditemp2,2;запись нижней температуры

rcallTERMOUT2

movtemp,TMAXL

movtemp1,TMAXH

lditemp2,1;запись нижней температуры

rcallTERMOUT2

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

rcallTERMOUT1

ret

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

; Натройка портов ввода вывода

port_set:

ldi result,$ff;PORTB настраивается на вывод

out DDRB,result;для работы с индикатором

ldi result,$00;все биты устанавливаются в ноль

out PORTB,result;PORTD настраивается для работы

ldi result,0b01000011; с клавиатурой и

out DDRD,result;микросхемой термометра

ldi result,0b11111001; с клавиатурой и

out PORTD,result;микросхемой термометра

ret

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

;*очистка буфера ЖКИ

CLRLCD:

ldiramsize,10;очистка буфера индикатора

lditemp,0

ldiZH,high(DLCD)

ldiZL,low(DLCD)

clrlcdloop:

stZ+,temp

decramsize

brneclrlcdloop;если не закончили повторить

rjmpLCDOUT

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

; Вывод содержимого буфера на индикатор

LCDOUT:

lditemp,low(DLCD);установить Z как указатель на буфер

movZL,temp;индикатора

lditemp,high(DLCD)

movZH,temp

ldiramsize,10

LCDOUT1:

movtemp,ramsize;запись в индикатор адреса символа

anditemp,0b00001111

outPORTB,temp

cbiPORTB,A0

sbiPORTB,WR1

cbiPORTB,WR1

 

ldtemp1,Z+; получить байт из DLCD

movtemp,temp1

anditemp,0b00001111;получить младшую тетраду

sbrstemp,A0

outPORTB,temp

sbiPORTB,WR1

cbiPORTB,WR1

 

movtemp,temp1

swaptemp

anditemp,0b00001111;получить старшую тетраду

sbrstemp,A0

outPORTB,temp

sbiPORTB,WR1

cbiPORTB,WR1

decramsize;

brneLCDOUT1;если не закончили повторить

ret

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

;*вывод готовой строки в буфер и вывод буфера на ЖКИ

;* temp - номер строки

;* ramsize - количество выводимых символов

STRLCDD:

ldiYH,high(tcstr)

ldiYL,low(tcstr)

addtemp,temp

addtemp,temp

addYL,temp

ldiramsize,4

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

;*вывод готовой строки в буфер и вывод буфера на ЖКИ

;* Y - указатель на строку temp - положение

;* ramsize - количество выводимых символов

STRLCD:

ldiZH,high(DLCD)

ldiZL,low(DLCD)

strtolcdloop:

ldtemp,Y+

stZ+,temp

decramsize

brnestrtolcdloop;если не закончили повторить

rjmpLCDOUT

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

;* получение данных из термостата

;* temp2 - команда temp - первые 8 бит temp1 - 9-ый бит

TERMIN:

ldiramsize,8

terminloop:

sbiPIND,DQ

sbrctemp2,0

cbiPIND,DQ

sbiPIND,CLK

cbiPIND,CLK

rortemp2

decramsize

brneterminloop;если не закончили повторить

ldiramsize,0x8

sbiDDRD,DQ

termindloop:

sbiPIND,DQ

sbrctemp,0

cbiPIND,DQ

sbiPIND,CLK

cbiPIND,CLK

rortemp2

decramsize

brnetermindloop;если не закончили повторить

sbiPIND,DQ

sbrctemp1,0

cbiPIND,DQ

sbiPIND,CLK

cbiPIND,CLK

cbiDDRD,DQ

ret

 

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

;*передача одного байта данных на термостат

;* temp2 - команда

TERMOUT1:

ldiramsize,8

termout1loop:

sbiPIND,DQ

sbrctemp2,0

cbiPIND,DQ

sbiPIND,CLK

cbiPIND,CLK

rortemp2

decramsize

brnetermout1loop;если не закончили повторить

ldiramsize,0x8

ret

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

;*передача одного байта данных на термостат и 9 бит

;* temp2 - команда temp - первые 8 бит temp1 - 9-ый бит

TERMOUT2:

ldiramsize,8

termout2loop:

sbiPIND,DQ

sbrctemp2,0

cbiPIND,DQ

sbiPIND,CLK

cbiPIND,CLK

rortemp2

decramsize

brnetermout2loop;если не закончили повторить

ldiramsize,0x8

termout2loopdat:

clc

sbiPIND,CLK

sbicPIND,DQ

sec

cbiPIND,CLK

rortemp2

decramsize

brnetermout2loopdat;если не закончили повторить

lditemp1,0

sbiPIND,CLK

sbicPIND,DQ

lditemp1,1

cbiPIND,CLK

cbiDDRD,DQ

ret

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

;*получение кода нажатой клавиши если она нажата более 20 мс

;* код кнопки находится в регистре key если сброшен бит Z

KEYPRESS:

lditemp1,20;количество попыток для гашения

;дребезга контактов

keyloop:

intemp,PIND

anditemp,0b00111000

breqkeynopress

sbicPIND,K1

ldikey,1

sbicPIND,K2

ldikey,2

sbicPIND,K3

ldikey,3

dectemp1

brnekeyloop;если не закончили повторить

keynopress:

andkey,key

ret

 

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

;*ожидание отпускания клавиши

KEYUP:

lditemp1,20;количество попыток для гашения

;дребезга контактов

keyuloop:

intemp,PIND

anditemp,0b001110000

brequnpress

dectemp1

brneKEYUP;если не закончили повторить

unpress:

andkey,key

ret

 

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