. В процесі коректування цих параметрів постійно зчитується температура і вологість з датчиків і посилає сигнали(якщо температура чи вологість достатня тоді виключити обігрів, охолодження чи полив)
. Якщо натиснута клавіша S1 -
система виключається.
Рисунок 5.1 - Алгоритм роботи програми
5. Написання текстів програми
$include(mod51)0 :p1,#0; очистка p1p3,#0 ; очистка p3p0.2 ; перевірка світлодіодівp0.3p0.4p0.5p0.6p0.7p2.0 ;очистити p2.0p2.1 ;очистити p p2.1 p2.2 ;очистити p2.2
;початок роботи
start:p2.3,wait ; включення схеми p0.7 ; подача сигналу на світлодіодp2.4,nok1 ; якщо натиснута s2 то перейти по мітці
jb bitkl1,nok11bitkl1r1,#5,no01 ;перевірка значення в акумуляторі і перехід по мітціnok11:r1 ; інкримент регістра r1nok11:bitkl1:p2.5,nok2bitkl2,nok22bitkl2r1,#1,no02 ;перевірка значення в акумуляторі і перехід по мітціnok22:r1 ; декримент регістра r1nok22:bitkl2:r1,#1,ex11 ; включення 1-го режиму і відповідного світлодіодаp0.2p0.3st:r1,#2,ex2 ; включення 2-го режиму і відповідного світлодіодаp0.3p0.2p0.4st:r1,#3,ex3 ; включення 3-го режиму і відповідного світлодіодаp0.4p0.3p0.5st:r1,#4,ex4 ; включення 4-го режиму і відповідного світлодіодаp0.5p0.4p0.6st:p0.6 ; включення 5-го режиму і відповідного світлодіодаp0.5:T_1WIRE_1 ; переіхід до 1 - го датчикаT_1WIRE_2 ; переіхід до 2 - го датчикаtype_dat ;вибір 1 - го датчикаGetTemp ; отримати температуруtype_dat ;вибір 2 - го датчикаGetTemp ; отримати температуруstart
Зчитування і передача значення з датчика температури на індикатор виконується
;======================================================:type_dat, next1_1Reset_1Wire_1next1_2_1: call Reset_1Wire_2_2:a, #0CCh; Посилаємо команду Skip ROM [CCh].RW_Bytea, #044h; Посилаемо команду Convert T [44h].RW_Byte
; Дальше 8 непотрібних байти (зчитуємо тільки для формування CRC).A,#0FFhRW_Byte ; byte 2.DO_CRCA,#0FFhRW_Byte ; byte 3.DO_CRCA,#0FFhRW_Byte ; byte 4.DO_CRCA,#0FFhRW_Byte ; byte 5.DO_CRCA,#0FFhRW_Byte ; byte 6.DO_CRCA,#0FFhRW_Byte ; byte 7.DO_CRC
; Зчитуємо CRC.A,#0FFhRW_Byte ; byte 8 (CRC).CA,CRC ; A = A - CRCGT_CRC_OKA,#10Big_DelayCRC_OKGT_exit_CRC_OK: ; Якщо CRC - ok.CRC_OK
;перетворення і вивід температури. 0-99градусів
; якщо температура буде від'ємна - в регістрі fTEMPER_h буде значення FF
; значення після коми зберігаються в молодшій тетраді регістра fTEMPER_la, fTEMPER_la, #0f0h ;множимо на маску, позбавлючись значень після комиa ;значення молодшого байту - в молодших розрядах акумцлятораfTEMPER_l, a ;нове значення температуриa, fTEMPER_h b, #16 ;значення старшого байту AB ;перемножуємо на множник - 16, - результат в акумуляторіa, fTEMPER_l ;додаю значення молодшого байту
.1 Проведення
аналізу даних із температурного датчика
jb type_dat, nnext7_1next7_1_1:r0,ar1,#1,no11a,#17 e1no1p2.0p2.2 GT_exno1:a,#6e1no2p2.2p2.0GT_exno2:p2.2p2.0GT_ex:r1,#2,no21a,#19e2no1p2.0 p2.2GT_exno1:a,#5e2no2p2.0p2.2GT_exno2:p2.2p2.0GT_ex:r1,#3,no31a,#18e3no1p2.0p2.2 GT_exno1:a,#4e3no2p2.2p2.0Gt_exno2:p2.2p2.0GT_ex:r1,#4,no41a,#21e4no1p2.0p2.2 GT_exno1:a,#4e4no2p2.0p2.2Gt_exno2:p2.2p2.0GT_ex:a,#25e5no1p2.2p2.0 GT_exno1:a,#6e5no2p2.0p2.2GT_exno2:p2.0p2.2_ex:a,r0
b, #10 ;розбиваю значення ab ;на два числаa ;збираю значення a, b ;докупи в акумуляторіp1, a
;виводжу в порт на індикатор 1GT_exit
.2 Проведення
аналізу даних із датчика вологості
next7_1:r0,ar1,#1,no1a,#30e1nop2.1 GT_exit1 no:p2.1GT_exit1:r1,#2,no2a,#60e2nop2.1 GT_exit1no:p2.1Gt_exit1:r1,#3,no3a,#35e3nop2.1 GT_exitno:p2.1Gt_exit1:r1,#4,no4a,#70e4nop2.1 GT_exitno:p2.1Gt_exit:a,#40e5nop2.1 GT_exit1no:p2.1_exit1:a,r0b, #10 ;розбиваю значення ab ;на два числаa ;збираю значення a, b ;докупи в акумуляторіp3, a ;виводжу в порт на індикатор 2_exit:; вихід з GetTemp:
;======================================================_1Wire_1: ; Скидаємо лінію на час, біля 500 мкс. == 1 datchikT_1WIRE_1A,#165 ; (500 - 4) / 3 = 165delayT_1WIRE_1
; Пропускаємо імпульс присутностіA,#165 ; (500 - 4) / 3 = 165delay
;-----------------------------------------------------------------------------_1Wire_2: ; Скидаємо лінію на час, біля 500 мкс. == 2 datchikT_1WIRE_2A,#165 ; (500 - 4) / 3 = 165delayT_1WIRE_2
; Пропускаємо імпульс присутностіA,#165 ; (500 - 4) / 3 = 165delay
;------------------------------------------------------------------------------:fCOUNTER,A_Loop36:; 1 us.fCOUNTER,D_Loop36 ; 2 us.
;-----------------------------------------------------------------------------_delay: ;=770*x+1 x=(delay-5)/770 Враховуючи виконання call и return.fCOUNTER2,AfCOUNTER,#0_Loop94:; 1 us.fCOUNTER,BD_Loop94 ; 2 us.fCOUNTER2,BD_Loop94 ; 2 us.
;======================================================
; Ф-ція вводу/виводу на лінию 1-Wire. по черзі, зсуваючи вправо значення в А зчитуємо лінію і формуємо байт
; Виводимо з A и зчитуємо в A._Byte:fTEMP,AR2,#8
;--------------------------- цикл :A,fTEMP ; повертаємо значення в акумуляторtype_dat, next2_1T_1WIRE_1 ; Обнуляємо вихід. 1 datnext2_2_1: clr T_1WIRE_2 ; Обнуляємо вихід. 2 dat_2:ACC.0,RB_Skip01type_dat, next3_1T_1WIRE_1 ; Встановлюємо вихід. 1 datnext3_2_1: setb T_1WIRE_2 ; Встановлюємо вихід. 2 dat_2:_Skip01:AACC.7 ; Приймаємо в той самий TEMP, з якого передаємоtype_dat, next4_1T_1WIRE_1, RB_Skip02next4_2_1: jnb T_1WIRE_2, RB_Skip02_2:ACC.7_Skip02:fTEMP,A ; зберігаємо значення
; дальше даємо час на звільнення лінії веденим девайсом(release = до 45 мкс.) A,#14 ; (60 - 4) / 3 = 18delay
; Відпускаємо лінію.type_dat, next5_1T_1WIRE_1next5_2_1: setb T_1WIRE_2_2:
; трішки відпочиваємо (на всякий пожарний).A,#1 delay
; Якщо 8 біт, то виходимо з циклу.R2,RBLoop ; послідовно зчитуємо 8 біт (лічильник рег.R2)
;------------------ цикл
; прийнятий байт.A,fTEMP ; записуємо значення сформованого байту в акумулятор;
;======================================================
; Процедура обновлення CRC. Параметр в A._CRC: PUSH ACC ;save accumulatorB ;save the B registerACC ;save bits to be shiftedB,#8 ;set shift = 8 bits ;_LOOP: XRL A,CRC ;calculate CRCA ;move it to the carryA,CRC ;get the last CRC valueZERO ;skip if data = 0A,#18H ;update the CRC value
;: RRC A ;position the new CRCCRC,A ;store the new CRCACC ;get the remaining bitsA ;position the next bitACC ;save the remaining bitsB,CRC_LOOP ;repeat for eight bitsACC ;clean up the stackB ;restore the B registerACC ;restore the accumulator
;-------------------------------------------------------------------------------
Висновок
В процесі виконання курсового проекту було розроблено систему управління мікрокліматом теплиці. Під час виконання даної роботи, я навчився створювати та описувати структурні і принципові схеми, складати алгоритми та програми на мові асемблера для мікропроцесора AT89С 51. Модель мікропроцесорної системи було спроектовано в програмному комплексі Proteus Professional 7.7.
Література
1. В.В. Сташин А.В. УРУСОВ О.Ф. Мологонцева Проектирование цифровых устройств на однокристальных микроконтроллерах Москва Энергоатомиздат 1990г.
2. А.С. Басманов "МП и ОЭВМ", Москва, "Мир", 1988.
. "Микропроцессоры", Учебное пособие в 5-ти книгах, под редакцией В.А. Шахнова, Москва "Высшая школа", 1988.
. Фрунзе "Микроконтроллеры? Это же просто!"
. Магда Ю.С. "Микроконтроллеры серии 8051: практический подход"
6. https://sites.google.com/site/laboratoria101/mps
7. http://www.teplitsa-urojay.ru/rasta/ogurtsy/
8. http://www.zooclub.ru/flora/rouse/14.shtml
9. http://www.greeninfo.ru/vegetables/capsicum_annuum.html/Article/_/aID/335
. http://www.sadovod.spb.ru/TextShablon.php?LinkPage=222
11. http://www.gaw.ru/
Додаток 1.
Текст програми
$include(mod51)0
;*************************************************************
; Порт 0._1WIRE_1 bit P0.0 _1WIRE_2 bit P0.1 _dat bit 01h bit 7fhbit 7eh
;*************************************************************
fCOUNTER EQU 19hEQU 1AhEQU 1BhEQU 1Ch
; Температура._L EQU 36h _H EQU 37h _OK BIT 00h.
;-------------------------------------------------------------r1,#1:p1,#0p3,#0p0.2p0.3p0.4p0.5p0.6p0.7p2.0p2.1p2.2:p2.3,waitp0.7p2.4,nok1bitkl1,nok11bitkl1r1,#5,no01nok11:r1nok11:bitkl1:p2.5,nok2bitkl2,nok22bitkl2r1,#1,no02nok22:r1nok22:bitkl2:r1,#1,ex11p0.2p0.3st:r1,#2,ex2p0.3p0.2p0.4st:r1,#3,ex3p0.4p0.3p0.5st:r1,#4,ex4p0.5p0.4p0.6st:p0.6p0.5:T_1WIRE_1T_1WIRE_2type_dat GetTemp type_dat GetTemp start
;======================================================:type_dat,
next1_1Reset_1Wire_1next1_2_1: call Reset_1Wire_2_2:a, #0CCh;RW_Bytea,
#044h;RW_Byte
; затримка, не менше 750 мсA,#0Big_delayBig_delayBig_delayBig_delay
type_dat, next6_1Reset_1Wire_1next6_2_1: call Reset_1Wire_2_2:A,#165 ; (500 - 4) / 3 = 165delaya, #0CCh;RW_Byte a, #0BEh;RW_Byte
a, #1hdelay
CRC,#0
A,#0FFhRW_Byte ;byte 0.fTEMPER_L,A DO_CRCA,#0FFhRW_Byte ; byte 1.fTEMPER_H, A DO_CRCA,#0FFhRW_Byte ; byte 2.DO_CRC
A,#0FFhRW_Byte ; byte 3.DO_CRCA,#0FFhRW_Byte ; byte 4.
DO_CRCA,#0FFhRW_Byte ; byte 5.
DO_CRCA,#0FFhRW_Byte ; byte 6.DO_CRCA,#0FFhRW_Byte ; byte 7.DO_CRCA,#0FFhRW_Byte ; byte 8 (CRC).
CA,CRC ; A = A - CRCGT_CRC_OKA,#10Big_Delay
CRC_OK
GT_exit
_CRC_OK:
a, fTEMPER_la, #0f0h a fTEMPER_l, a a, fTEMPER_h b, #16 AB a, fTEMPER_l type_dat, nnext7_1next7_1_1:r0,ar1,#1,no11a,#17e1no1p2.0p2.2 GT_exno1:a,#6e1no2p2.2p2.0GT_exno2:p2.2p2.0GT_ex:r1,#2,no21a,#19e2no1p2.0 p2.2GT_exno1:a,#5e2no2p2.0p2.2GT_exno2:p2.2p2.0GT_ex:r1,#3,no31a,#18e3no1p2.0p2.2 GT_exno1:a,#4e3no2p2.2p2.0Gt_exno2:p2.2p2.0GT_ex:r1,#4,no41a,#21e4no1p2.0p2.2 GT_exno1:a,#4e4no2p2.0p2.2Gt_exno2:p2.2p2.0GT_ex:a,#25e5no1p2.2p2.0 GT_exno1:a,#6e5no2p2.0p2.2GT_exno2:p2.0p2.2_ex:a,r0
b, #10 ab a p1, a
GT_exit_1:r0,ar1,#1,no1a,#30e1nop2.1 GT_exit1no:p2.1GT_exit1:r1,#2,no2a,#60e2nop2.1 GT_exit1no:p2.1Gt_exit1:r1,#3,no3a,#35e3nop2.1 GT_exitno:p2.1Gt_exit1:r1,#4,no4a,#70e4nop2.1 GT_exitno:p2.1Gt_exit:a,#40e5nop2.1 GT_exit1no:p2.1_exit1:a,r0
b, #10 ab a a, b p3, a _exit:
;-----------------------------------------------------------------------------_1Wire_2: clr T_1WIRE_2A,#165 ; (500 - 4) / 3 = 165delayT_1WIRE_2A,#165 ; (500 - 4) / 3 = 165delay
;------------------------------------------------------------------------------:fCOUNTER,A_Loop36:; 1 us.fCOUNTER,D_Loop36 ; 2 us.
;-----------------------------------------------------------------------------_delay: ;=770*x+1 x=(delay-5)/770 Враховуючи виконання call и return.fCOUNTER2,AfCOUNTER,#0_Loop94:; 1 us.fCOUNTER,BD_Loop94 ; 2 us.fCOUNTER2,BD_Loop94 ; 2 us.
;======================================================_Byte:fTEMP,AR2,#8
;--------------------------- цикл :A,fTEMP type_dat, next2_1T_1WIRE_1 ; Обнуляємо вихід. 1 datnext2_2_1: clr T_1WIRE_2 ; Обнуляємо вихід. 2 dat_2:ACC.0,RB_Skip01
type_dat, next3_1T_1WIRE_1 ; Встановлюємо вихід. 1 datnext3_2_1: setb T_1WIRE_2 ; Встановлюємо вихід. 2 dat_2:_Skip01:AACC.7 type_dat, next4_1T_1WIRE_1, RB_Skip02next4_2_1: jnb T_1WIRE_2, RB_Skip02_2:ACC.7_Skip02:fTEMP,A
) A,#14 ; (60 - 4) / 3 = 18delaytype_dat, next5_1T_1WIRE_1next5_2_1: setb T_1WIRE_2_2:A,#1 delay
.R2,RBLoop A,fTEMP ;
;======================================================
; Процедура обновлення CRC. Параметр в A._CRC: PUSH ACC ;save accumulatorB ;save the B registerACC ;save bits to be shiftedB,#8 ;set shift = 8 bits ;_LOOP: XRL A,CRC ;calculate CRCA ;move it to the carryA,CRC ;get the last CRC valueZERO ;skip if data = 0A,#18H ;update the CRC value
;: RRC A ;position the new CRCCRC,A ;store the new CRCACC ;get the remaining bitsA ;position the next bitACC ;save the remaining bitsB,CRC_LOOP ;repeat for eight bitsACC ;clean up the stackB ;restore the B registerACC ;restore the accumulator
;-------------------------------------------------------------------------------
Додаток 2.
Hex-файл
програми
:10000000790175900075B000D282D283D284D285F6
:10001000D286D287C2A0C2A1C2A220A3E5C28720F5
:10002000A40F207F0ED27FB905030200330902001E
:1000300033C27F20A50F207E0ED27EB901030200BD
:100040004719020047C27EB90107C282D28302006B
:1000500079B90209C283D282D284020079B9030934
:10006000C284D283D285020079B90409C285D284C0
:10007000D286020079C286D285D280D281D2011284
:100080000089C201120089809130010612024202E9
:10009000009512025174CC120274744412027474EA
:1000A000001202671202671202671202673001062D
:1000B0001202420200B912025174A512026074CCFD
:1000C00012027474BE1202747401120260751B0075
:1000D00074FF120274F5361202C074FF120274F536
:1000E000371202C074FF1202741202C074FF1202AF
:1000F000741202C074FF1202741202C074FF120262
:10010000741202C074FF1202741202C074FF120251
:10011000741202C074FF120274C3951B600A740A41
:10012000120267C200020241D200E53654F0C4F563
:1001300036E53775F010A425362001030201E7F8F3
:10014000B9011D94115007D2A0C2A20201DA94068F
:100150005007C2A2C2A00201DAD2A2C2A00201DAF2
:10016000B9021D94135007D2A0C2A20201DA94056D
:100170005007C2A0C2A20201DAD2A2C2A00201DAD2
:10018000B9031D94125007D2A0C2A20201DA94044E
:100190005007C2A2C2A00201DAD2A2C2A00201DAB2
:1001A000B9041D94155007D2A0C2A20201DA94042A
:1001B0005007C2A0C2A20201DAD2A2C2A00201DA92
:1001C00094195007C2A2D2A00201DA94065007C2C5
:1001D000A0C2A20201DAC2A0D2A2E875F00A84C4C9
:1001E00025F0F590020241F8B9010E941E5005D297
:1001F000A1020237C2A1020237B9020E943C500597
:10020000D2A1020237C2A1020237B9030E942350D1
:1002100005D2A1020241C2A1020237B9040E9446DE
:100220005005D2A1020241C2A10202419428500508
:10023000D2A1020237C2A1E875F00A84C425F0F504
:10024000B022C28074A5120260D28074A51202602E
:1002500022C28174A5120260D28174A512026022AA
:10026000F51900D519FC22F51A75190000D519FCED
:10027000D51AF922F51C7A08E51C300105C2800266
:100280000284C2810030E00A300105D2800202926D
:10029000D28103C2E700000000300106308008026E
:1002A00002A5308102D2E7F51C740E5160300105C1
:1002B000D2800202B7D28174015160DABBE51C2200
:1002C000C0E0C0F0C0E075F008651B13E51B5002EC
:1002D000641813F51BD0E003C0E0D5F0ECD0E0D0FB
:0402E000F0D0E02258
:00000001FF