Курсовой проект
на тему:
«Разработка термометра с автоматическим контролемтемпературы
на базе микроконтроллера 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 1SHOTX любое 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. Если микросхема должна принимать данные,они также загружаются под управлением тактовых импульсов./> /> /> /> /> /> /> /> />
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.Алгоритм решения задачи
/>
/> /> /> /> /> /> /> /> />
/>
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
;*************************************************************************