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

Курсовой проект

на тему:

«Разработка термометра с автоматическим контролемтемпературы

на базе микроконтроллера AТ90S2313 с применением термостатаDS1620»


Введение

Измерение, контроль ирегулирование температуры является одной из неотъемлемых и важных задач всовременном мире. Такая задача стоит и перед промышленностью, и перед сельскимхозяйством, и в быту и даже в области высоких технологий. В разных случаяхзадача регулирования температуры имеет свою индивидуальную цель и методрешения.

Регулирование температурыразличных газообразных, сыпучих и жидких сред, в том числе воздуха и водыявляется задачей и для дорожно–строительной отрасли промышленности. Примеромможет служить регулирование температуры приготовления битумной смеси, асфальта ит.д.

Возлагать на человеказадачу контроля и регулирования температуры технологических процессов в эпохувысоких компьютерных технологий просто не рационально. На помощь человекупришли различные цифровые датчики и регуляторы температуры с использованиеммикропроцессорной техники.

В данном курсовом проектерассматривается проектирование и создание цифрового регулятора температуры набазе микросхемы-термометра DS1620, который совмещает температурный датчик,схему управления и АЦП в одном кристалле, и микроконтроллера фирмы Atmel AT90S2313.


1. Анализ задачи. Выборкомпонентов

 

Наша задача состоит вподдержании температуры в заданном диапазоне значений. Коридор значенийтемпературы задается оператором с клавиатуры. На ЖКИ необходимо выводить данныео текущей температуре, о верхнем пределе и о нижнем пределе (поочередно, взависимости от выбранного оператором режима). Температурный датчик долженсообщать о нахождении температуры в заданном коридоре свечением светодиода наодном из своих выводов (Tcom). Также цифровой термостат будет осуществлятьуправление исполнительными устройствами (нагревателем и охладителем) подачейсигнала высокого уровня на соответствующие выводы (Thigh и Tlow). Одновременновключенными оба исполнительных механизма быть не должны. Задачи по управлениютермостатом, по выводу информации на ЖКИ, по обработке информации с термостатаи с клавиатуры оператора возлагаются на микроконтроллер.

1.1 Микроконтроллер

AT90S2313 — экономичный 8битовый КМОП микроконтроллер, построенный с использованием расширенной RISCархитектуры AVR. Исполняя по одной команде за период тактовой частоты,AT90S2313 имеет производительность около 1MIPS на МГц, что позволяетразработчикам создавать системы оптимальные по скорости и потребляемоймощности.

В основе ядраAVR лежит расширенная RISC архитектура, объединяющая развитый набор команд и 32регистра общего назначения. Все 32 регистра непосредственно подключены карифметико-логическому устройству (АЛУ), что дает доступ к любым двум регистрамза один машинный цикл.

Подобнаяархитектура обеспечивает десятикратный выигрыш в эффективности кода посравнению с традиционными CISC микроконтроллерами.

AT90S2313 предлагаетследующие возможности: 2кБ загружаемой флэш памяти; 128 байт EEPROM; 15 линийввода/вывода общего назначения; 32 рабочих регистра; настраиваемыетаймеры/счетчики с режимом совпадения; внешние и внутренние прерывания;программируемый универсальный последовательный порт; программируемый сторожевойтаймер со встроенным генератором; SPI последовательный порт для загрузкипрограмм; два выбираемых программно режима низкого энергопотребления. Холостойрежим (Idle Mode) отключает ЦПУ, оставляя в рабочем состоянии регистры,таймеры/счетчики, SPI порт и систему прерываний. Экономичный режим (Power DownMode) сохраняет содержимое регистров, но отключает генератор, запрещая функционированиевсех встроенных устройств до внешнего прерывания или аппаратного сброса.

Микросхемыпроизводятся с использованием технологии энергонезависимой памяти высокойплотности фирмы Atmel. Загружаемая флэш память на кристалле может бытьперепрограммирована прямо в системе через последовательный интерфейс SPI илидоступным программатором энергонезависимой памяти. Объединяя на одном кристаллеусовершенствованный 8-битовый RISC процессор с загружаемой флэш–памятью,AT90S2313 является мощным микроконтроллером, который позволяет создаватьдостаточно гибкие и эффективные по стоимости устройства. AT90S2313поддерживается полной системой разработки, включающей в себя макроассемблер,программный отладчик/симулятор, внутрисхемный эмулятор и отладочный комплект.


1.2 Цифровойдатчик-термометр DS1620

 

Для измерениятемпературы в цифровых устройствах необходимы температурный датчик, схемауправления и АЦП. Последние модели температурных датчиков совмещают этикомпоненты в одном кристалле.

МикросхемаDS1620 (Dallas RS218-3810) – это девятиразрядный термометр и термостат, служащийдля измерения и отображения температуры (рис. 1). Он имеет три выхода,которые используются при работе микросхемы в режиме термостата. Настройкивыходного сигнала можно запрограммировать и сохранить во внутреннейэнергонезависимой памяти. Устройство измеряет температуру от –55 до +12˚С шагом 0,5˚С, преобразованиезанимает 1 с.

/>


Передачаданных от микросхемы к внешнему устройству осуществляется по трехпроводнойпоследовательной шине: СLK/СОNV (контакт 2), DQ (контакт 1) и RЕSЕТ(контакт 3). Эти выходы совместимы с уровнями ТТЛ. Тhigt (контакт 7) – выходтриггера высокой температуры. Если температура превышает установленный верхнийпорог, то выход Тhigt сигнализирует об этом высоким уровнем и остается в такомсостоянии до тех пор, пока температура не упадет ниже заданного порога. Тlow(контакт 6) – выход триггера низкой температуры. Если температура опускаетсяниже определенного нижнего предела, то на нем появляется сигнал высокогоуровня, сохраняющийся до тех пор, пока температура не поднимется вышеуказанного предела. Тсоm (контакт 5) – это выход комбинированного триггера высокой инизкой температуры. Тсоm=1, когда температура превышает верхний предел, Тсоm=0, когда она опускаетсяниже нижнего предела. Контакты 4 и 8 соединены с отрицательным и положительнымпроводами источника питания. Потребляемый ток в режиме ожидания равен 1 мкА, врабочем режиме — 1 мА.

Управлениеустройством осуществляется в два этапа: сначала команды управленияпоследовательно загружаются в микросхему, а затем девятиразрядное число,соответствующее температуре, либо считывается, либо записывается. Микросхемаимеет девять команд:

1. Read temp (AАh): чтение значения регистра,содержащего результат последнего измерения.

2. Start conversion T (EЕh): запуск процессаизмерения температуры. Данные не передаются.

3. Stop convert T (22h): остановка измерения.Данные не передаются.

4. Write TH (01h): запись верхнего предела втриггер высокой температуры – 9 бит данных.

5. Write TL (01h): запись нижнего предела в триггервысокой температуры – 9 бит данных.

6. Read TH (A1h): чтение содержимоготриггера высокой температуры – 9 бит данных.

7. Read TL (A2h): чтение содержимоготриггера низкой температуры – 9 бит данных.

8. Write configuratioin (0Ch): запись настроечныхданных в регистр настройки – 8 бит данных.

9. Read configuratioin (ACh): чтение настроечныхданных из регистра настройки – 8 бит данных.

Настроечноеслово управляет режимами работы микросхемы DS1620. Оно сохраняется врегистре настройки. Функции битов регистра пиведены ниже:

DONETHF TLF XXX CPU 1SHOT

X любое DONE 0 – идет преобразование 1 – преобразование завершено THF флаг высокой температуры. Если температура равна или выше верхнего предела, то бит ТНF=1. Он остается в единичном состоянии до тех пор, пока его не сбросят, записав ноль, или не отключат питание устройства TLF флаг низкой температуры. Если температура равна или ниже нижнего/предела, то бит ТLF=1. Он остается в единичном состоянии до тех пор, пока его не сбросят, записав ноль, или не отключат питание устройства CPU если СРU=0, то вход СLK/СОNV управляет началом цикла измерения; в противном случае микросхема работает в режиме обмена информацией с внешним устройством 1SHOT если 1SНОТ=1, микросхема производит один цикл измерения после поступления команды; в противном случае ИС настроена н непрерывное измерение температуры

Данные отемпературе имеют девятибитовый формат.

Дискретностьпредставления температуры равна 1/2˚С. Некоторые соотношения междузначениями температуры и выходными данными приведены ниже:

+125˚С 0 11111010 (00FA) +25˚С 0 00110010 (0032) +1/2˚C 0 00000001 (0001)  0˚C 0 00000000 (0000) –1/2˚C 1 11111111 (00FF) –25˚С 1 11001110 (01CE) –55˚С 1 10010010 (0192)

Временныедиаграммы передачи данных представлены на рис 2. Передача начинается припоступлении положительного фронта на вход RST (контакт 3). Если наэтот вход подать 0, то передача прекращается. Процессами чтения и записиуправляет тактирующий вход микросхемы. Один тактовый цикл состоит изотрицательного фронта и следующего за ним положительного. При записи информациисостояние битов данных должно оставаться неизменным во время прохожденияположительного фронта. При считывании данные выводятся из устройства по каждомуотрицательному фронту тактовых импульсов. Когда на тактовом входе высокийуровень, выход DQ (контакт 1) имеет высокое сопротивление. При чтении данныхмладший бит передается первым. Через этот контакт можно как принимать, так ипередавать данные. Схема с использованием термометра DS1620, подключенного кэкспериментальной плате параллельного порта, приведена на рис. 3.

Посколькувывод DQ, может использоваться как для чтения, так и для записи, а на экспериментальной платепараллельного порта таких двунаправленных линий нет, необходимо применятьтранзистор. Базатранзистора соединена с тактом D1. Когда ИС настроена на прием информации, данные поступаютиз ком пьютера на контакт D1, а затем черезтранзистор в инверсном виде – на микросхему. Когда она передает информацию, транзистордолжен быть закрыт (это достигается подачей низкого уровня на его базу черезтот же контакт), и данные поступают на контакт S1. Входы СLК/СОNV и RSТ соединены с контактамиС1 и С2. Послепрохождения положительного фронта по входу RST микросхема настраиваетсяна прием управляющей информации. Необходимые данные считываются с линии С1под управлением тактовых импульсов. Если DS1620 настраивается навывод данных, то после загрузки в нее управляющей команды D1 переходит в нулевоесостояние, а биты данных последовательно выводятся под управлением тактовыхимпульсов и поступают на контакт S1. Если микросхема должна принимать данные,они также загружаются под управлением тактовых импульсов.

/> /> /> /> /> /> /> /> <td/> />

1.3Жидкокристаллический индикатор mt-10t7-7

Данныйиндикатор может отображать 10 знакомест с точкой. Любой сегмент любогознакоместа можно включать и выключать независимо от остальных сегментов.


/>/> 

/>

/>


Регистрыданных в БИС делятся на две тетрады: SGx(L) и SGx(H). Запись данных в знакоместо производится за два такта:сначала в младшую тетраду, затем в старшую. Младшая тетрада отвечает засегменты g,e, d, a, а старшая – за сегментыh, b, c, d. (см. рис.).

/>


Запись Нвызывает высвечивание соответствующего сегмента, а запись L- его гашение.

Контрастностьиндикатора зависит от напряжения питания модуля. Управление контрастностьюпроизводится подключением внешнего резистора на вывод V0.

Rвнеш.=0 – МАХконтрастность.

Rвнеш.=¥(нет резистора) –MIN контрастность.

/>


Описание интерфейса ЖКИмодуля

Сначала нашине выставляется адрес необходимого знакоместа, который фиксируется в регистреадреса при низком уровне на входе WRx (см.таблицу). Входы WR1 и ^WR2 защелкивают информацию,стоящую на шине, во внутренних регистрах статического типа. Внутри БИС этивходы объединены по схеме WR1 & ^WR2. Таким образом,информация запишется только при WR1 = “H” и ^WR2 = “L” одновременно. Такое решение осуществить функциюCS (выбор кристалла) прибольшом количестве модулей на шине, или если на шине имеются другие устройства.

При записиадреса знакоместа указатель тетрады сбрасывается в положение SGx(L). Запись данныхпроизводится в младшую тетраду при высоком уровне сигнала на входе А0 сигналом WRx. По этому же сигналууказатель тетрады данных переключается в положение SGx(H), сохраняя при этом тотже адрес знакоместа. Данные в старшую тетраду SGx(H) записываются аналогичномладшей тетраде SGx(L).После записи второй тетрады содержимое регистра адрема инкрементируется и можнозаписывать данные в следующее знакоместо без записи адреса.

По адресу 0Fh расположен триггерблокировки шины. Запись в него DB0=”L” вызывает блокировку записи в БИС адресов и данных на 30сигналов WRx. Разблокировка шины производится записью DB=”H” по адресу 0Fh.

После подачипитания содержимое регистров SGx не определено, поэтому при включении питаниянеобходимо делать программную очистку регистров. Состояние триггера блокировкитоже не определено, поэтому перед началом вывода информации на индикаторнеобходимо произвести разблокировку шины. Разблокировка шины производится записьюDB0=”H” по адресу 0Fh.

/>


/>

/>

/>

/>/>


2. Схемысопряжения (функциональная и принципиальная)

 

2.1Структурная схема

/>


2.2Принципиальная схема

 

/>


3.Алгоритм решения задачи

 

/>


/> /> /> /> /> <td/> /> /> /> />

/>



3. Разработка программы

Разработкапрограммы производится на языке Assembler c параллельной отладкойсредствами AVR Studio.

 


Вывод

 

В ходе даннойкурсовой работы был разработан цифровой регулятор температуры на базетермостата DS1620 и микроконтроллера AT90S2313 с рабочим диапазоном температур -55˚С до 125˚С. Поддерживаетсязаданная температура с помощью двух исполнительных органов: «нагревателя» и«охладителя». Текущая температура, а также значение верхнего и нижнего значениятемпературного коридора отображается на ЖКИ в градусах по Цельсию с точностью0,5˚С.

 


Списоклитературы.

 

1. Научно- техническийжурнал «Схемотехника» №2, 2001–2002 гг.

2. Пособие «Средствасопряжения с ПК»

3.Internet:

www.atmel.ru

www.telesys.users.ru

www.kulakov.ru

www.platan.ru

www.sensorsmag.com

www.ferrite.ru


Приложение: программа на языке Assembler

 

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

;* Термостатна базе микроконтроллера AT90S2313 *

;* сиспользованием микросхемы термодатчика DS1620 *

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

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

;* Название:                 Цифровойрегулятор температуры

;* Датаразработки:     20.06.02

;* Объект:            AVRмикроконтроллер AT90S2313 и термостат DS1620

;* Автор:             БендюкМаксим Сергеевич

;*

;*

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

.include«2313DEF.INC»

;*****Константы

.equpreset=192   ;T/C0 Preset constant (256-64)

.defresult=r16     ;Result and intermediate data

.def temp=r16     ; временныйрегистр

.def temp1=r17   ; временныйрегистр

.def temp2=r18   ; временныйрегистр

.def temp3=r19   ; временныйрегистр

.def ramsize=r19 ; размерблока

.def tmode=r22   ; Регистррежима

.def key=r20                 ; Регистрнажатой клавиши

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

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

.def    TMINL=r22        ; младший

.def    TMINH=r23       ; старший

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

.def    TMAXL=r24      ; младший

.def    TMAXH=r25     ; старший

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

.def    TNORML=r26   ; младший

.def    TNORMH=r27   ; старший

.equ   DLCD=$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 канал синхронизации данных

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

;*

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

;*

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

.cseg

.org$0000

rjmpRESET;Reset handle

.org$0020

RETI

RETI

RETI

RETI

RETI

RETI

RETI

RETI

RETI

RETI

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

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

SETCONST:

ldi     temp,20

mov  TMINL,temp

ldi     temp,0

mov  TMINH,temp

ldi     temp,25

mov  TMAXL,temp

ldi     temp,0

mov  TMAXH,temp

ret

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

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

OUTCONST:

mov  temp,TMINl

mov  temp1,TMINH

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

rcall   TERMOUT2

mov  temp,TMAXL

mov  temp1,TMAXH

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

rcall   TERMOUT2

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

rcall   TERMOUT1

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:

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

ldi     temp,0

ldi     ZH,high(DLCD)

ldi     ZL,low(DLCD)

clrlcdloop:

st       Z+,temp

dec    ramsize

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

rjmp  LCDOUT

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

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

LCDOUT:

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

mov  ZL,temp    ; индикатора

ldi     temp,high(DLCD)

mov  ZH,temp

ldi     ramsize,10

LCDOUT1:

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

andi   temp,0b00001111

out    PORTB,temp

cbi     PORTB,A0

sbi     PORTB,WR1

cbi     PORTB,WR1

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

mov  temp,temp1

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

sbrs   temp,A0

out    PORTB,temp

sbi     PORTB,WR1

cbi     PORTB,WR1

mov  temp,temp1

swap temp

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

sbrs   temp,A0

out    PORTB,temp

sbi     PORTB,WR1

cbi     PORTB,WR1

dec    ramsize                ;

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

ret

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

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

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

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

STRLCDD:

ldi     YH,high(tcstr)

ldi     YL,low(tcstr)

add    temp,temp

add    temp,temp

add    YL,temp

ldi     ramsize,4

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

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

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

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

STRLCD:

ldi     ZH,high(DLCD)

ldi     ZL,low(DLCD)

strtolcdloop:

ld      temp,Y+

st       Z+,temp

dec    ramsize

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

rjmp  LCDOUT

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

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

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

TERMIN:

ldi     ramsize,8

terminloop:

sbi     PIND,DQ

sbrc   temp2,0

cbi     PIND,DQ

sbi     PIND,CLK

cbi     PIND,CLK

ror     temp2

dec    ramsize

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

ldi     ramsize,0x8

sbi     DDRD,DQ

termindloop:

sbi     PIND,DQ

sbrc   temp,0

cbi     PIND,DQ

sbi     PIND,CLK

cbi     PIND,CLK

ror     temp2

dec    ramsize

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

sbi     PIND,DQ

sbrc   temp1,0

cbi     PIND,DQ

sbi     PIND,CLK

cbi     PIND,CLK

cbi     DDRD,DQ

ret

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

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

;*temp2 — команда

TERMOUT1:

ldi     ramsize,8

termout1loop:

sbi     PIND,DQ

sbrc   temp2,0

cbi     PIND,DQ

sbi     PIND,CLK

cbi     PIND,CLK

ror     temp2

dec    ramsize

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

ldi     ramsize,0x8

ret

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

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

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

TERMOUT2:

ldi     ramsize,8

termout2loop:

sbi     PIND,DQ

sbrc   temp2,0

cbi     PIND,DQ

sbi     PIND,CLK

cbi     PIND,CLK

ror     temp2

dec    ramsize

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

ldi     ramsize,0x8

termout2loopdat:

clc

sbi     PIND,CLK

sbic   PIND,DQ

sec

cbi     PIND,CLK

ror     temp2

dec    ramsize

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

ldi     temp1,0

sbi     PIND,CLK

sbic   PIND,DQ

ldi     temp1,1

cbi     PIND,CLK

cbi     DDRD,DQ

ret

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

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

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

KEYPRESS:

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

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

keyloop:

in      temp,PIND

andi   temp,0b00111000

breq  keynopress

sbic   PIND,K1

ldi     key,1

sbic   PIND,K2

ldi     key,2

sbic   PIND,K3

ldi     key,3

dec    temp1

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

keynopress:

and    key,key

ret

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

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

KEYUP:

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

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

keyuloop:

in      temp,PIND

andi   temp,0b001110000

breq  unpress

dec    temp1

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

unpress:

and    key,key

ret

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

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

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

;calckterm

outTmax:

mov  fbinL,TMAXL

mov  fbinH,TMAXH

rjmp  outterm

outTmin:

mov  fbinL,TMAXL

mov  fbinH,TMAXH

rjmp  outterm

calckterm:

mov  temp,tmode

rcall   STRLCD

mov  fbinL,TNORML

mov  fbinH,TNORMH

cpi     tmode,1

breq  outTmin

cpi     tmode,2     

breq  outTmax

ldi     temp,0xb

outterm:

ldi     ZH,high(DLCD+5)

ldi     ZL,low(DLCD+5)

ldi     temp2,0xb

sbrs   fbinH,0               

ldi     temp2,0x10

;                  ldi     temp3,0

;                  sub    temp3,temp2

;                  ror     temp3

st       Z+,temp2

inc     ZL

inc     ZL

ldi     temp2,5

sbrs   fbinL,0

ldi     temp2,0

st       Z+,temp2

ldi     fbinH,0

clc

ror     fbinL

rcall   bin16BCD5

mov  temp3,fbinH

mov  temp2,fbinL

swap temp2

andi   temp3,0xf

andi   temp2,0xf

andi   temp,0xf

rcall   getcod

mov  temp1,temp

set

bst     temp1,4

mov  temp,temp2

rcall   getcod

mov  temp2,temp

mov  temp,temp3

rcall   getcod

mov  temp3,temp

ldi     ZH,high(DLCD+6)

ldi     ZL,low(DLCD+6)

st       Z+,temp3

st       Z+,temp2

st       Z+,temp1

rcall   LCDOUT

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

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

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

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

getcod:

ldi     ZH,high(LCDCG*2)

ldi     ZL,low(LCDCG*2);initZ-pointer

add    ZL,temp

lpm                      ;getconstant

mov  temp,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:

.DB0x0c,0x0f,0x0b,0x10

; строка tu-

tustr:

.DB0x0c,0x0d,0x0b,0x10

;cтрока td-

tdstr:

.DB0x0c,0x0e,0x0b,0x10

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

;*

;* PROGRAMRESET — главная программа

;*

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

RESET:

ldi     temp,low(RAMEND)

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

rcallport_set      ; настроить порты

rcall   CLRLCD

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

;*

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

;*

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

mainloop:

ldi     temp1,250

mov  r5,temp1

mainloop1:

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

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

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

keyis:

ldi     temp1,250

mov  r5,temp1

cpi     temp,1

rcall   key1press

cpi     temp,2

rcall   key2press

cpi     temp,3

rcall   key3press

returnin:

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

rcall   TERMIN

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

rcall   TERMIN

mov  TNORML,temp

mov  TNORMH,temp1

rcall   calckterm   ;расчет температуры

dec    r5

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

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

rjmp  mainloop

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

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

key1press:

and    tmode,tmode

brne  k1setmax

dec    tmode

rjmp  keyret

k1setmax:

ldi     temp,2

mov  tmode,temp

keyret:

rcall   calckterm

rjmp  KEYUP

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

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

key2press: 

cpi     tmode,1

brne  key2min

cpi     tmode,2

brne  key2max

rjmp  keyret

key2min:

sbrs   TMINH,0

rjmp  key2minm

inc     TMINL

brmi  key2mins

rjmp  keyret

key2mins:

ldi     TMINH,0

rjmp  keyret

key2minm:

cpi     TMINL,0xfa

brmi  keyret

inc     TMINL

rjmp  keyret

key2max:

sbrs   TMAXH,0

rjmp  key2maxm

inc     TMINL

brmi  key2maxs

rjmp  keyret

key2maxs:

ldi     TMAXH,0

rjmp  keyret

key2maxm:

cpi     TMAXL,0xfa

brmi  keyret

inc     TMAXL

rjmp  keyret

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

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

key3press: 

cpi     tmode,1

brne  key3min

cpi     tmode,2

brne  key3max

rjmp  keyret

key3min:

sbrc   TMINH,0

rjmp  key3minm

dec    TMINL

brmi  key3mins

rjmp  keyret

key3mins:

ldi     TMINH,1

rjmp  keyret

key3minm:

cpi     TMINL,0x92

brmi  keyret

dec    TMINL

rjmp  keyret

key3max:

sbrc   TMAXH,0

rjmp  key3maxm

dec    TMAXL

brmi  key3maxs

rjmp  keyret

key3maxs:

ldi     TMAXH,1

rjmp  keyret

key3maxm:

cpi     TMAXL,0x92

brmi  keyret

dec    TMAXL

rjmp  keyret

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

;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:

inctBCD2

subifbinL, low(10000)

sbcifbinH, high(10000)

brshbin16BCD5_loop_1

subifbinL, low(-10000)

sbcifbinH, high(-10000)

ldi tBCD1,-0x11

bin16BCD5_loop_2:

subitBCD1, -0x10

subifbinL, low(1000)

sbcifbinH, high(1000)

brshbin16BCD5_loop_2

subifbinL, low(-1000)

sbcifbinH, high(-1000)

bin16BCD5_loop_3:

inctBCD1

subifbinL, low(100)

sbcifbinH, high(100)

brshbin16BCD5_loop_3

subifbinL, -100

lditBCD0, -0x10

bin16BCD5_loop_4:

subitBCD0, -0x10

subifbinL, 10

brshbin16BCD5_loop_4

subifbinL, -10

addtBCD0, fbinL

ret

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

еще рефераты
Еще работы по коммуникациям и связям