Turbo51
Модули цифровых термометров
DS1621
//Модуль для работы с термометром DS1621
unit ds1621;
{$O-}
{$xdata}
{$idata}
interface
procedure SetCR1621;
procedure ConvertTemp1621;
procedure ReadTemp1621;
procedure Start1621;
procedure Stop1621;
procedure Read1621;
var
temperature:real xdata; //вещественное значение температуры
tl,th:byte; //буферы чтения байтов, содержащих
//значение температуры
implementation
uses i2c,declare;
const
adrgt=%10010000; //групповой адрес измерителей температуры
//(такой же, что и у АЦП)
adrgtu=%10011110; //конкретный адрес DS1621 --> 7, для исключения
//путаницы с АЦП.
//===============================================
//Процедура преобразования считанной температуры
//в вещественное число
procedure ConvertTemp1621;
begin
asm
mov vali,tl
mov vali+1,th
end;
vali:=vali shr 7;
if (vali and %0000000100000000)<>0 then vali:=vali or %1111111100000000;
temperature:=vali/2;
end;
//===============================================
//Процедура выдачи адреса устройства
procedure OutAdr1621(readu:boolean);
begin
acc:=adrgtu;
//if readu then acc:=acc or 1;
//if readu then cy:=true else cy:=false;
cy:=readu;
I2CADR;
end;
//===============================================
//Процедура установки контрольного регистра
procedure SetCR1621;
begin
OutAdr1621(false);
acc:=$AC;
I2CWB;
I2CANS;
acc:=1; //прерывный режим работы
I2CWB;
I2CANS;
i2cstop;
end;
//===============================================
//Процедура чтения температуры из DS1621
procedure ReadTemp1621;
begin
OutAdr1621(false);
acc:=$AA;
I2CWB;
I2CANS;
//i2cstop;
OutAdr1621(true);
i2crb;
I2CANSM;
th:=acc;
i2crb;
//I2CANSM;
tl:=acc;
I2CNOANSM;
i2cstop;
end;
//===============================================
//Процедура запуска измерения температуры
procedure Start1621;
begin
OutAdr1621(false);
acc:=$EE;
I2CWB;
I2CANS;
i2cstop;
end;
//===============================================
//Процедура остановки измерения температуры
procedure Stop1621;
begin
OutAdr1621(false);
acc:=$22;
I2CWB;
I2CANS;
i2cstop;
end;
//===============================================
//Процедура чтения и преобразования температуры
procedure Read1621;
begin
ReadTemp1621;
ConvertTemp1621;
end;
//===============================================
end.
{
Работа с термометром:
1. Выполняется процедура SetCR1621 - инициализация.
2. Выполняется процедура Start1621 - запуск измерения.
После этого в любом случае пауза не менее 750 мс
для завершения процесса преобразования.
3. В нужный момент выполняется Read1621, получаем значение температуры.
}
DS1820-12
unit ds1820_12;
{$O-}
{$xdata}
{$idata}
interface
procedure start20;
procedure Read20;
implementation
uses ports;
//===============================================
procedure TReset;assembler;
label treset0,waitl1,wh1,hl1,short1;
asm
//ПОДПРОГРАММА СБРОСА МИКРОСХЕМЫ
CLR DATA20
MOV B,#120
TRESET0: NOP
NOP
DJNZ B,TRESET0
SETB DATA20
MOV B,#120
CLR C
WAITL1: JB DATA20,WH1
DJNZ B,WAITL1
sjmp SHORT1
WH1: MOV B,#120
HL1: ORL C,/DATA20
DJNZ B,HL1
SHORT1: RET
end;
//===============================================
procedure Touchby1;assembler;
label tb10;
asm
//ПОДПРОГРАММА ОБМЕНА БИТОМ
CLR EA
CLR DATA20
NOP
NOP
NOP
NOP
MOV DATA20,C
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV C,DATA20
SETB EA
PUSH B
MOV B,#20
TB10: DJNZ B,TB10
POP B
SETB DATA20
RET
end;
//===============================================
procedure TouchBy;assembler;
label b_loop1;
asm
//ПОДПРОГРАММА ОБМЕНА БАЙТОМ
PUSH B
MOV B,#8
B_LOOP1: RRC A
LCALL TOUCHBY1
DJNZ B,B_LOOP1
RRC A
POP B
RET
end;
//===============================================
procedure For18b20;assembler;
label FOR18B200,FOR18B20R;
asm
MOV A,R4
JB ACC.7,FOR18B20R
MOV R0,#3
FOR18B200:
CLR C
MOV A,R3
RRC A
MOV R3,A
MOV A,R2
RRC A
MOV R2,A
DJNZ R0,FOR18B200
FOR18B20R:MOV C,F0
RET
end;
//===============================================
procedure start20;assembler;
label STR20;
asm
//ПОДПРОГРАММА ПЕРЕДАЧИ КОДА НА ПРЕОБРАЗОВАНИЕ
//ТЕМПЕРАТУРЫ
LCALL TRESET
JNC STR20
MOV A,#0CCH
LCALL TOUCHBY
MOV A,#44H
LCALL TOUCHBY
SETB C
STR20: RET
end;
//===============================================
procedure Read20;assembler;
label RDR20;
asm
//ПОДПРОГРАММА СЧИТЫВАНИЯ ТЕМПЕРАТУРЫ
MOV R2,#0
MOV R3,#0
LCALL TRESET
JNC RDR20
MOV A,#0CCH
LCALL TOUCHBY
//MOV A,#44H
//LCALL TOUCHBY
MOV A,#0BEH
LCALL TOUCHBY
MOV A,#0FFH
LCALL TOUCHBY
MOV R2,A
MOV A,#0FFH
LCALL TOUCHBY
MOV R3,A
MOV A,#0FFH
LCALL TOUCHBY
MOV A,#0FFH
LCALL TOUCHBY
MOV A,#0FFH
LCALL TOUCHBY
MOV R4,A
MOV A,#0FFH
LCALL TOUCHBY
MOV A,#0FFH
LCALL TOUCHBY
//MOV R4,A
MOV A,#0FFH
LCALL TOUCHBY
//MOV R5,A
SETB C
MOV F0,C
LCALL FOR18B20
RDR20: RET
end;
//===============================================
end.
DS1820-24
unit ds1820_24;
{$O-}
{$xdata}
{$idata}
interface
procedure start20;
procedure Read20;
procedure RT;
implementation
uses ports,declare;
//===============================================
procedure TReset;assembler;
label treset0,waitl1,wh1,hl1,short1;
asm
//ПОДПРОГРАММА СБРОСА МИКРОСХЕМЫ
CLR DATA20
MOV B,#240
TRESET0: NOP
NOP
DJNZ B,TRESET0
SETB DATA20
MOV B,#240
CLR C
WAITL1: JB DATA20,WH1
DJNZ B,WAITL1
sjmp SHORT1
WH1: MOV B,#240
HL1: ORL C,/DATA20
DJNZ B,HL1
SHORT1:
end;
//===============================================
procedure Touchby1;assembler;
label tb10;
asm
//ПОДПРОГРАММА ОБМЕНА БИТОМ
CLR EA
CLR DATA20
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV DATA20,C
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV C,DATA20
SETB EA
PUSH B
MOV B,#40
TB10: DJNZ B,TB10
POP B
SETB DATA20
end;
//===============================================
procedure TouchBy;assembler;
label b_loop1;
asm
//ПОДПРОГРАММА ОБМЕНА БАЙТОМ
PUSH B
MOV B,#8
B_LOOP1: RRC A
LCALL TOUCHBY1
DJNZ B,B_LOOP1
RRC A
POP B
end;
//===============================================
procedure For18b20;assembler;
label FOR18B200,FOR18B20R;
asm
MOV A,R4
JB ACC.7,FOR18B20R
MOV R0,#3
FOR18B200:
CLR C
MOV A,R3
RRC A
MOV R3,A
MOV A,R2
RRC A
MOV R2,A
DJNZ R0,FOR18B200
FOR18B20R:MOV C,varbit
end;
//===============================================
procedure start20;assembler;
label STR20;
asm
//ПОДПРОГРАММА ПЕРЕДАЧИ КОДА НА ПРЕОБРАЗОВАНИЕ
//ТЕМПЕРАТУРЫ
LCALL TRESET
JNC STR20
MOV A,#0CCH
LCALL TOUCHBY
MOV A,#44H
LCALL TOUCHBY
SETB C
STR20:
end;
//===============================================
procedure Read20;assembler;
label RDR20;
asm
//ПОДПРОГРАММА СЧИТЫВАНИЯ ТЕМПЕРАТУРЫ
MOV R2,#0
MOV R3,#0
LCALL TRESET
JNC RDR20
MOV A,#0CCH
LCALL TOUCHBY
//MOV A,#44H
//LCALL TOUCHBY
MOV A,#0BEH
LCALL TOUCHBY
MOV A,#0FFH
LCALL TOUCHBY
MOV R2,A //0
MOV A,#0FFH
LCALL TOUCHBY
MOV R3,A //1
MOV A,#0FFH
LCALL TOUCHBY //2
MOV A,#0FFH
LCALL TOUCHBY //3
MOV A,#0FFH
LCALL TOUCHBY //4
MOV R4,A
MOV A,#0FFH
LCALL TOUCHBY //5
MOV A,#0FFH
LCALL TOUCHBY
//MOV R4,A //6
MOV A,#0FFH
LCALL TOUCHBY
//MOV R5,A //7
SETB C
MOV varbit,C
LCALL FOR18B20
RDR20:
end;
//===============================================
procedure RT;
begin
bar2:=ar2;
bar3:=ar3;
if not cy then
valr:=127
else
begin
if bar3<>0 then
begin
asm
MOV A,baR2
CLR C
SUBB A,#1
CPL A //ПРЕОБРАЗОВАНИЕ ДОПОЛНИТЕЛЬНОГО КОДА
mov bar2,a
end;
valr:=bar2;
valr:=-valr/2;
end
else
begin
valr:=bar2;
valr:=valr/2;
end;
end;
temp0:=valr;
end;
//===============================================
end.